> For the complete documentation index, see [llms.txt](https://relationlabs.gitbook.io/protocol/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://relationlabs.gitbook.io/protocol/protocol-zh/contract-open-standard/relationship/dao.md).

# 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)
