# Dao

在社交关系中，除了前面提到的点对点关系，还有个重要的属性是群组关系。将一些有共同兴趣爱好或关注同一话题的用户聚集在一起，进行内容分享、交流和互动等活动。

在Relation Protocol中，Dao具有以下意义：

* 提供一个Dao社交功能

  通过Dao，用户可以创建一个群组，并邀请其他用户加入，从而实现一个有共同兴趣爱好或关注同一话题的社交群组。这种社交功能可以提供一个平台，让用户可以与其他用户分享、交流和互动。
* 提供Dao管理功能

  在Relation Protocol中，Dao提供了一些群组管理功能，例如群组创建者可以对群组进行管理、添加或删除成员等。这些功能可以帮助群组管理者更好地管理群组，保持群组的秩序和稳定性。
* 增强用户互动和参与度

  通过Dao，用户可以更加方便地参与到社交群组中，与其他用户互动，分享自己的经验、知识和见解，从而增强用户的互动和参与度。

## Schema

### DaoRegister

DaoRegister对应的[schema](https://arweave.net/7mRfawDArdDEcoHpiFkmrURYlMSkREwDnK3wYzZ7-x4) 以ttl文件的形式保存至Arweave，交易哈希将作为schemaURI，在初始化合约时传入，参数示例：

```
ar://7mRfawDArdDEcoHpiFkmrURYlMSkREwDnK3wYzZ7-x4
```

用于描述由某个地址创建的Dao合约，完整的rdf示例如下：

```
:Soul_0x0000000000000000000000000000000000000011 p:daoContract :Contract_0x1110000000000000000000000000000000000022 .
```

schema的组成如下：

* schema 前缀列表

```
PREFIX : <http://relationlabs.ai/entity/>
PREFIX p: <http://relationlabs.ai/property/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
```

* Class

:Soul表示接受和绑定域名解析的地址;:Contract用于表示Dao合约的地址

```

:Soul a rdfs:Class ;
    rdfs:label "Soul" ;
    rdfs:comment "A soul." .

:Contract a rdfs:Class ;
    rdfs:label "Contract" ;
    rdfs:comment "A contract." .
```

* Predicate

p:daoContract用于描述某个地址持有的Dao合约地址

```
p:daoContract a rdf:Property ;
    rdfs:label "daoContract" ;
    rdfs:comment "The dao contract." ;
    rdfs:domain :Soul ;
    rdfs:range :Contract .
```

### Dao

Dao合约对应的[schema](https://arweave.net/UTbYdbPy5Ov2bZ1ikWm_4RhMT5GJPvasE57qtSfL1oQ) 以ttl文件的形式保存至Arweave，交易哈希将作为schemaURI，在初始化合约时传入，参数示例：

```
ar://UTbYdbPy5Ov2bZ1ikWm_4RhMT5GJPvasE57qtSfL1oQ
```

描述某个地址加入了当前dao，完整的rdf示例如下：

```
:Soul_0x0000000000000000000000000000000000000022 p:join :Dao_0x0000000000000000000000000000000000000011 .
```

schema的组成如下：

* schema 前缀列表

```
PREFIX : <http://relationlabs.ai/entity/>
PREFIX p: <http://relationlabs.ai/property/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
```

* Class

:Soul表示加入群组的成员地址， :Dao表示群组

```
:Soul a rdfs:Class ;
    rdfs:label "Soul" ;
    rdfs:comment "A soul." .

:Dao a rdfs:Class ;
    rdfs:label "Dao" ;
    rdfs:comment "A dao." .
```

* Predicate

p:join 描述地址与群组的关系,p:daoURI 描述dao的资源地址

```
p:join a rdf:Property ;
    rdfs:label "join" ;
    rdfs:comment "Join a dao." ;
    rdfs:domain :Soul ;
    rdfs:range :Dao .

p:daoURI a rdf:Property ;
    rdfs:label "daoURI" ;
    rdfs:comment "The daoURI of a dao." ;
    rdfs:domain :Dao ;
    rdfs:range xsd:string .

```

## 合约

Dao模块由DaoRegister合约和Dao合约组成，我们把DaoRegister作为工厂合约和注册中心，用于部署和记录用户创建的Dao合约。

### DaoRegister

```solidity
interface IDaoRegister is ISemanticSBT {

    /**
      * 部署Dao合约
      * @param to 接受dao合约的地址
      * @param name dao合约的名称
     * @return tokenId 
     */
    function deployDaoContract(address to,string memory name) external returns (uint256);

    /**
     * 查询dao信息
     * @param tokenId 
     * @return owner Dao合约的创建者 
     * @return contractAddress Dao合约地址 
     */
    function daoOf(uint256 tokenId) external view returns (address owner, address contractAddress);
}
```

### Dao

```solidity
interface IDao is ISemanticSBT {

    //初始化合约，由daoRegister合约调用进行合约初始化
    function initialize(
        address owner,
        address minter,
        string memory name_,
        string memory symbol_,
        string memory baseURI_,
        string memory schemaURI_,
        string[] memory classes_,
        Predicate[] memory predicates_
    ) external;

    /**
     * 设置daoURI
     * @param daoURI  将dao的信息存放至arweave上，把arweave的哈希作为daoURI
     */
    function setDaoURI(string memory daoURI) external;
    /**
     * 是否开放加入
     * @param isFreeJoin true-开放加入；false-非开放，需要dao的创建者将成员拉入dao
     */
    function isFreeJoin() external view returns (bool);

    /**
     * 将指定地址加入dao
     * @param addr 待加入的成员地址
     */
    function addMember(address[] memory addr) external;
    /**
     * 自己主动加入dao
     * @param tokenId 
     */
    function join() external returns (uint256);

    /**
       * 将地址移除dao
       * @param addr 被移除的地址 
      * @return tokenId 
     */
    function remove(address addr) external returns (uint256);

    /**
       * 是否为dao的成员
       * @param addr 被查询的地址 
      * @return isMember 
     */
    function isMember(address addr) external view returns (bool);

}
```

完整的合约代码可访问：

* [DaoRegister](https://github.com/relationlabs/semanticSBT/blob/main/contracts/template/DaoRegister.sol)
* [Dao](https://github.com/relationlabs/semanticSBT/blob/main/contracts/template/Dao.sol)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://relationlabs.gitbook.io/protocol/protocol-zh/contract-open-standard/relationship/dao.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
