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 类型:SocialNetwork
和 Profile
,以及与用户配置文件相关的存储数据。可以使用数据内容的别名访问此类配置文件: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.profile
或alice@dao@eth
#
: 识别概念,使用根 -> 叶语义。例如topicX#postY
/
: 通用资源路径定义,使用根 -> 叶语义。例如resourceRoot/resource
identifier
: 来自与 dType 链接的智能合约的资源标识符signature
:dtypeIdentifier
、identifier
、name
、separator
、nonce
、aliasAddress
、chainId
上的别名所有者签名。nonce
: 单调递增的计数器,用于防止重放攻击aliasAddress
:Alias
合约的以太坊地址chainId
: 部署Alias
合约的链,如 EIP-155 中所述,用于在更新别名的identifier
时防止重放攻击。
内容可寻址性可以通过以下方式完成:
- 直接使用
bytes32
标识符,例如0x0b5e76559822448f6243a6f76ac7864eba89c810084471bdee2a63429c92d2e7@0x9dbb9abe0c47484c5707699b3ceea23b1c2cca2ac72681256ab42ae01bd347da
- 使用人类标识符,例如
alice@socialnetwork
以上两个示例都将解析为相同的内容。
理由
目前解决内容可寻址性的尝试,例如 EIP-137,仅针对以太坊账户。这些尝试基于 HTTP 和 DNS 的继承概念,这些概念对机器不友好。
使用 EIP-1900 和 EIP-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.