在社交关系中,除了前面提到的点对点关系,还有个重要的属性是群组关系。将一些有共同兴趣爱好或关注同一话题的用户聚集在一起,进行内容分享、交流和互动等活动。
在Relation Protocol中,Dao具有以下意义:
提供一个Dao社交功能
通过Dao,用户可以创建一个群组,并邀请其他用户加入,从而实现一个有共同兴趣爱好或关注同一话题的社交群组。这种社交功能可以提供一个平台,让用户可以与其他用户分享、交流和互动。
提供Dao管理功能
在Relation Protocol中,Dao提供了一些群组管理功能,例如群组创建者可以对群组进行管理、添加或删除成员等。这些功能可以帮助群组管理者更好地管理群组,保持群组的秩序和稳定性。
增强用户互动和参与度
通过Dao,用户可以更加方便地参与到社交群组中,与其他用户互动,分享自己的经验、知识和见解,从而增强用户的互动和参与度。
Schema
DaoRegister
DaoRegister对应的schema 以ttl文件的形式保存至Arweave,交易哈希将作为schemaURI,在初始化合约时传入,参数示例:
ar://7mRfawDArdDEcoHpiFkmrURYlMSkREwDnK3wYzZ7-x4
用于描述由某个地址创建的Dao合约,完整的rdf示例如下:
:Soul_0x0000000000000000000000000000000000000011 p:daoContract :Contract_0x1110000000000000000000000000000000000022 .
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#>
: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." .
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 以ttl文件的形式保存至Arweave,交易哈希将作为schemaURI,在初始化合约时传入,参数示例:
ar://UTbYdbPy5Ov2bZ1ikWm_4RhMT5GJPvasE57qtSfL1oQ
描述某个地址加入了当前dao,完整的rdf示例如下:
:Soul_0x0000000000000000000000000000000000000022 p:join :Dao_0x0000000000000000000000000000000000000011 .
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#>
:Soul表示加入群组的成员地址, :Dao表示群组
:Soul a rdfs:Class ;
rdfs:label "Soul" ;
rdfs:comment "A soul." .
:Dao a rdfs:Class ;
rdfs:label "Dao" ;
rdfs:comment "A dao." .
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
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
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);
}
完整的合约代码可访问: