Alert Source Discuss
Standards Track: ERC

ERC-6239: 语义灵魂绑定代币

向 ERC-5192 代币元数据添加 RDF 三元组以捕获社会意义

Authors Jessica Chang (@JessicaChg)
Created 2022-12-30
Requires EIP-165, EIP-721, EIP-5192

摘要

本提案通过引入资源描述框架(RDF)三元组到灵魂绑定代币(’SBTs’)的元数据中,扩展了 ERC-721ERC-5192

动机

灵魂绑定代币代表了账户的承诺、凭证和隶属关系。RDF 是万维网联盟(’W3C’)开发的标准数据模型,用于以结构化格式表示信息。语义 SBT 构建在现有的 ERC-721ERC-5192 标准之上,包括在元数据中包含 RDF 三元组,以捕获和存储社会元数据的含义,将其作为一个账户和属性网络。

语义 SBT 提供了一个基础,用于发布、链接和集成来自多个来源的数据,并能够查询和检索跨这些来源的信息,使用推理从现有的社会关系中发现新的见解。例如,形成链上统一的社会图谱,为社会恢复分配信任联系人,并支持公平治理。

虽然 SBT 的存在可以创建一个去中心化的社会框架,但仍然需要指定一个通用的数据模型,以无需信任的方式管理链上的社会元数据,以互连的方式描述社会元数据,使其易于交换、集成和发现。为了进一步推动 SBT 生态系统的繁荣,我们需要一种自下而上和去中心化的方式来维护人们的社会身份相关信息。

语义 SBT 通过将社会元数据、证明和访问权限存储在链上来解决这个问题,从而在以太坊上原生引导社会身份层和链接数据层,并为链上的大量数据带来语义含义。

连接性

语义 SBT 以 主语-谓语-宾语 格式将社交数据存储为 RDF 三元组,从而可以轻松地在帐户和属性之间创建关系。 RDF 是一种用于数据交换的标准,用于表示高度互连的数据。 以 RDF 三元组表示数据使自动化系统更容易识别、阐明和连接信息。

链接数据

语义 SBT 允许链上大量社交数据以标准格式(RDF)提供,并且可访问和可管理。 链上相互关联的数据集可以创建链接数据层,允许社交数据在不同的应用程序之间混合、暴露和共享,从而提供一种方便、廉价和可靠的数据检索方式,而无需考虑用户数量。

社会身份

语义 SBT 允许人们以自下而上和去中心化的方式发布或证明他们自己的身份相关数据,而无需依赖任何中心化中介,同时解放各方。数据在每个语义 SBT 中都是分散的,并且在社会上相互关联。 RDF 三元组支持构建在顶部的各种社区检测算法。

本提案概述了 SBT 的语义数据建模,允许实施者对语义 SBT 之间的社会关系进行建模,尤其是在社会领域。

规范

本文档中的关键词“必须”、“不得”、“必需”、“应该”、“不应”、“推荐”、“可以”和“可选”应按照 RFC 2119 中的描述进行解释。

  • 该代币必须实现以下接口:
    1. ERC-165ERC165 (0x01ffc9a7)
    2. ERC-721ERC721 (0x80ac58cd)
    3. ERC-721ERC721Metadata (0x5b5e139f)
    4. ERC-5192ERC5192 (0xb45a3c0e)

RDF 声明

RDF 声明有多种格式,我们选择了六种最常用的格式:nt(N-Triples),ttl(Turtle),rdf(RDF/XML),rj(RDF/JSON),nq(N-Quads)trig(TriG)

RDF 声明的完整格式:

rdfStatements = {[format]}<statements>

在以下章节中,用 {} 字符括起来的片段是 OPTIONAL。

在以下章节中,用 <> 字符括起来的片段是 REQUIRED。

format: nt/ttl/rdf/rj/nq/trig

未选择任何格式时:statements = [ttl]statements

  • nt(n-triples)

nt 使用空格分隔三元组的主语、谓语、宾语,并使用句点 . 表示三元组的结尾。

基本结构是:

subject predicate object .

在这种格式中,主语的格式为 IRIREF 或 BLANK_NODE_LABEL,谓语的格式为 IRIREF,宾语的格式为 IRIREF、BLANK_NODE_LABEL 或 STRING_LITERAL_QUOTE。

例如:

<http://example.org/entity/user1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/entity/User> .
<http://example.org/entity/user1> <http://example.org/property/name> "Alice" .
  • ttl(Turtle)

nt 相比,ttl 使用前缀来简化 IRIREF 格式,并且同一主题下的相同谓词可以合并而无需重复。”a” 可用于表示 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>

例如:

@prefix : <http://example.org/entity/> .
@prefix p: <http://example.org/property/> .

:user1 a :User;
       p:name ”Alice” .
  • rdf(RDF/XML)

rdf 以 XML 格式描述 RDF,使用 rdf:RDF 作为顶级元素,并使用 xmlns 描述前缀。 rdf:Description 开始描述一个节点,rdf:about 定义要描述的节点,rdf:resource 以 IRI 格式填充属性值。 如果属性值为字符串,则可以直接将属性值写为属性节点的文本。

基本结构是:

<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/ 02/22-rdf-syntax-ns#">

 <rdf:Description rdf:about="subject" >
  <predicate rdf:resource="object"/>
   <predicate >object</predicate>
 </rdf:Description>
</rdf:RDF>

例如:

<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/ 02/22-rdf-syntax-ns#"
           xmlns:p="http://example.org/property/">

 <rdf:Description rdf:about="http://example.org/entity/user1" >
   <rdf:type rdf:resource="http://example.org/entity/"/>
  <p:name >Alice</p:name>
 </rdf:Description>
</rdf:RDF>
  • rj(RDF/JSON)

rj 以 JSON 格式描述 RDF。 三元组描述如下:

  {"subject":{"predicate":[object]}}

请注意,每个根对象都是唯一的键,不允许重复。 不会有重复的主题作为键,并且在单个主题下不会有重复的谓词。

例如:

   {
 "http://example.org/entity/user1": {
   "http://www.w3.org/1999/02/22-rdf-syntax-ns#type": [
     "http://example.org/entity/User"
   ],
   "http://example.org/property/name": [
     "Alice"
   ]
 }
}

  • nq(N-Quads)

nq 基于 nt,但包含一个图标签,用于描述 RDF 三元组所属的数据集。 图标签的格式可以是 IRIREF 或 BLANK_NODE_LABEL。

基本结构是:

subject predicate object graphLabel.

例如:

<http://example.org/entity/user1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/entity/User> <http://example.org/graphs/example> .
<http://example.org/entity/user1> <http://example.org/property/name> "Alice" <http://example.org/graphs/example> .
  • trig(TriG)

trigttl 的扩展,包含一个图标签,用于描述 RDF 三元组所属的数据集。 三元组语句包含在花括号 {} 中。

例如:

@prefix : <http://example.org/entity/> .
@prefix p: <http://example.org/property/> .

<http://example.org/graphs/example>
  {
       :user1 a :User;
              p:name ”Alice” .

   }

在合约事件:CreateRDFUpdateRDFRemoveRDFrdfOf method 中,默认情况下,rdfStatementsttl 格式使用。 如果使用上面列出的其他格式,则需要添加格式标识符以进行识别。

格式标识符以 [ 开头,以 ] 结尾,格式位于中间,即 [format]

例如,nt 格式的 rdfStatements 应包含前缀 [nt]

[nt]subject predicate object .

合约接口

/**
 * @title 语义灵魂绑定代币
 * 注意:此接口的 ERC-165 标识符为 0xfbafb698
 */
interface ISemanticSBT{
    /**
     * @dev 这会在铸造语义灵魂绑定代币时发出。
     * @param tokenId 语义灵魂绑定代币的标识符。
     * @param rdfStatements 语义灵魂绑定代币的 RDF 声明。
     */
    event CreateRDF (
        uint256 indexed tokenId,
        string  rdfStatements
    );
    /**
     * @dev 这会在更新语义灵魂绑定代币的 RDF 数据时发出。 RDF 数据是 RDF 声明的集合,用于表示有关资源的信息。
     * @param tokenId 语义灵魂绑定代币的标识符。
     * @param rdfStatements 语义灵魂绑定代币的 RDF 声明。
     */
    event UpdateRDF (
        uint256 indexed tokenId,
        string  rdfStatements
    );
    /**
     * @dev 这会在销毁或撤销语义灵魂绑定代币时发出。
     * @param tokenId 语义灵魂绑定代币的标识符。
     * @param rdfStatements 语义灵魂绑定代币的 RDF 声明。
     */
    event RemoveRDF (
        uint256 indexed tokenId,
        string  rdfStatements
    );
    /**
     * @dev 返回语义灵魂绑定代币的 RDF 声明。
     * @param tokenId 语义灵魂绑定代币的标识符。
     * @return rdfStatements 语义灵魂绑定代币的 RDF 声明。
     */
    function rdfOf(uint256 tokenId) external view returns (string memory rdfStatements);
}

ISemanticRDFSchema 是 ERC-721 Metadata 的扩展,对于此标准是 OPTIONAL 的,它用于获取 RDF 数据的 Schema URI。

interface ISemanticRDFSchema{
    /**
     * @notice 获取此合约的 schema 的 URI。
     * @return 指向配置文件的合约的 URI。
     */
    function schemaURI() external view returns (string memory);
}

方法规范

rdfOf (uint256 tokenId):通过 tokenId 查询语义灵魂绑定代币的 RDF 数据。 返回的 RDF 数据格式符合 W3C RDF 标准。 RDF 数据是 RDF 语句的集合,用于表示有关资源的信息。 RDF 语句,也称为三元组,是 RDF 数据模型中的信息单元。 它由三个部分组成:主语、谓语和宾语。

schemaURI():此 OPTIONAL 方法用于查询 RDF 数据的 schema 的 URI。 RDF Schema 是基本 RDF 词汇的扩展,并为 RDF 数据提供数据建模词汇。 RECOMMENDED 将 RDF Schema 存储在 Arweave 或 IPFS 等去中心化存储中。 然后将 URI 存储在合约中,并且可以通过此方法查询。

事件规范

CreateRDF:在铸造语义灵魂绑定代币时,MUST 触发此事件,以通知监听器使用创建的 RDF 数据执行操作。 调用事件时,输入的 RDF 数据 MUST 是 RDF 语句,这些语句是由三个部分组成的信息单元:主语、谓语和宾语。

UpdateRDF:在更新语义灵魂绑定代币的 RDF 数据时,MUST 触发此事件,以通知监听器根据更新的 RDF 数据执行相应的更新操作。 调用事件时,输入的 RDF 数据 MUST 是 RDF 语句,这些语句是由三个部分组成的信息单元:主语、谓语和宾语。

RemoveRDF:在销毁或撤销语义灵魂绑定代币时,MUST 触发此事件,以通知监听器对语义 SBT 的已删除 RDF 数据执行操作。 调用事件时,输入的 RDF 数据 MUST 是 RDF 语句,这些语句是由三个部分组成的信息单元:主语、谓语和宾语。

理由

RDF 是一种灵活且可扩展的数据模型,基于创建主语-谓语-宾语关系,由于其语义 Web 标准、链接数据概念、灵活性和查询功能,通常用于对图形数据建模。 RDF 允许图形数据轻松地与 Web 上的其他数据源集成,从而可以创建更全面和可互操作的模型。 使用 RDF 进行语义描述的优势在于,它可以描述更丰富的信息,包括术语、类别、属性和关系。 RDF 使用标准格式和语言来描述元数据,使语义信息的表达更加标准化和统一。 这有助于建立更准确和可靠的语义网络,促进不同系统之间的互操作性。 此外,RDF 支持语义推理,这允许系统根据现有数据自动推断社交图中节点之间的其他关系和连接。

RDF 语句有多种格式。 我们在 EIP 中列出了六种最广泛采用的 RDF 语句格式:TurtleN-TriplesRDF/XMLRDF/JSONN-QuadsTriG。 这些格式在表达、存储和解析 RDF 语句方面具有不同的优势和适用性。 其中,Turtle 是 RDF 语句中的一种流行格式,因为它具有良好的人工可读性和简洁性。 它通常用作本 EIP 中 RDF 语句的默认格式。 使用 Turtle 格式可以使 RDF 语句更易于理解和维护,同时减少存储需求,适用于表示复杂的 RDF 图。

向后兼容性

此提案与 ERC-721ERC-5192 完全向后兼容。

安全考虑

没有与该标准的实施直接相关的安全考虑因素。

版权

通过 CC0 放弃版权和相关权利。

Citation

Please cite this document as:

Jessica Chang (@JessicaChg), "ERC-6239: 语义灵魂绑定代币," Ethereum Improvement Proposals, no. 6239, December 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-6239.