Alert Source Discuss
🚧 Stagnant Standards Track: ERC

ERC-2193: dType 别名扩展 - 去中心化类型系统

Authors Loredana Cirstea (@loredanacirstea), Christian Tzurcanu (@ctzurcanu)
Created 2019-07-16
Discussion Link https://github.com/ethereum/EIPs/issues/2192
Requires EIP-155, EIP-1900, EIP-2157

简单总结

我们提议 Alias - 一种语义标准,用于通过人类可读的限定符标识链上资源,支持任何类型的数据。

摘要

dType 别名是一个系统,用于为链上内容提供人类可读的资源标识符。资源标识符基于数据类型(由 dType 提供,EIP-1900)和数据内容(由 dType 存储合约提供,EIP-2157)。这是一种通用的内容寻址方式,支持任何类型的数据。

动机

目前有一些标准可以满足将人类可读的标识符附加到以太坊账户的需求,例如 EIP-137。这些标准试图将域名引入以太坊,遵循与 DNS 相同的格式:subdomain.domain.tld。这种叶 -> 根格式不直观,并且与 . 在编程语言中的语义含义相矛盾,后者是根 -> 叶连接(例如,在 OOP 中,访问对象的属性时)。一种更直观且广泛使用的方法是根 -> 叶格式,用于文件浏览器、分层菜单,甚至用于其他去中心化系统,这些系统为资源提供唯一标识符(例如,Libra 中的 0x56.Currency.TCoin)。

此外,EIP-137 不够灵活,无法处理智能合约内容,智能合约内容可能包含属于各种账户的异构数据。例如,PaymentChannel 智能合约可以有一个域名。但是,智能合约内部的 Alice-Bob 通道数据不能有子域名。拥有唯一标识的细粒度资源为在以太坊之上创建人类和机器可读的协议开辟了道路。它也为基于函数式编程的协议提供了基础。

此 ERC 提出了一组分隔符,这些分隔符保持其语义含义,并提供了一种寻址任何类型资源的方式 - 从以太坊地址到智能合约内部的单个 struct 实例。

想象一下以下 dType 类型:SocialNetworkProfile,以及与用户配置文件相关的存储数据。可以使用数据内容的别名访问此类配置文件:alice@socialnetwork.profile。对于 PaymentChannel 类型,Alice 可以使用 alice-bob.paymentchannel 来引用她与 Bob 的通道。 此别名系统可以脱链使用,以基于 dType 类型的元数据,用确定性和机器可读的方式显示内容,从而取代旧的 DNS 系统。

规范

dType 注册表将为资源类型提供域名和子域名。子域名可以递归地归因于 dType 类型,这些类型在其组成中包含其他复杂类型。

我们定义了一个 Alias 注册合约,用于跟踪 dType 存储合约中存在的数据资源的人类可读标识符。 只要签署别名数据的以太坊地址在 dType 存储合约中拥有该资源的所有权,任何人都可以设置 Alias 注册表中的别名。存储合约数据所有权将在 EIP-2157 中详细说明。所有者可以随时更新或删除别名。

interface Alias {

    event AliasSet(bytes32 dtypeIdentifier, bytes1 separator, string name, bytes32 indexed identifier);

    function setAlias(bytes32 dtypeIdentifier, bytes1 separator, string memory name, bytes32 identifier, bytes memory signature) external;

    function getAliased(bytes1 separator, string memory name) view external returns (bytes32 identifier);
}
  • dtypeIdentifier: 来自 dType 注册表的类型标识符,用于确保 dType 类型的 name 的唯一性。检查 dtypeIdentifier 以查看它是否存在于 dType 注册表中。dType 注册表还会链接该类型的数据存储合约,在其中检查 identifier 的存在性和所有权。
  • name: 用户为 identifier 引用的资源定义的人类可读名称
  • separator: 充当名称和别名其余部分之间分隔符的字符。允许的值:
    • .: 通用域分隔,使用根 -> 叶语义。例如 domain.subdomain.leafsubdomain.resource
    • @: 识别与参与者相关的数据,例如用户配置文件,使用叶 -> 根语义。例如 alice@socialnetwork.profilealice@dao@eth
    • #: 识别概念,使用根 -> 叶语义。例如 topicX#postY
    • /: 通用资源路径定义,使用根 -> 叶语义。例如 resourceRoot/resource
  • identifier: 来自与 dType 链接的智能合约的资源标识符
  • signature: dtypeIdentifieridentifiernameseparatornoncealiasAddresschainId 上的别名所有者签名。
    • nonce: 单调递增的计数器,用于防止重放攻击
    • aliasAddress: Alias 合约的以太坊地址
    • chainId: 部署 Alias 合约的链,如 EIP-155 中所述,用于在更新别名的 identifier 时防止重放攻击。

内容可寻址性可以通过以下方式完成:

  • 直接使用 bytes32 标识符,例如 0x0b5e76559822448f6243a6f76ac7864eba89c810084471bdee2a63429c92d2e7@0x9dbb9abe0c47484c5707699b3ceea23b1c2cca2ac72681256ab42ae01bd347da
  • 使用人类标识符,例如 alice@socialnetwork

以上两个示例都将解析为相同的内容。

理由

目前解决内容可寻址性的尝试,例如 EIP-137,仅针对以太坊账户。这些尝试基于 HTTP 和 DNS 的继承概念,这些概念对机器不友好。

使用 EIP-1900EIP-2157,可以实现通用内容可寻址性。 dType 提供类型信息以及对存储类型实例的智能合约的引用。此外,Alias 使用子域分隔符的语义含义来具有 直观的顺序规则

可以将多个别名分配给单个资源。可以通过使用不同的 name 或通过使用不同的 separator 来实现。每个 separator 都可以根据其语义含义具有用于显示和处理数据的特定标准。

向后兼容性

将被添加。

测试用例

将被添加。

实现

一个正在进行中的实现可以在 https://github.com/pipeos-one/dType/blob/master/contracts/contracts/Alias.sol 找到。 当就规范达成共识时,此提案将使用适当的实现进行更新。

版权

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

Citation

Please cite this document as:

Loredana Cirstea (@loredanacirstea), Christian Tzurcanu (@ctzurcanu), "ERC-2193: dType 别名扩展 - 去中心化类型系统 [DRAFT]," Ethereum Improvement Proposals, no. 2193, July 2019. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2193.