Alert Source Discuss
🚧 Stagnant Standards Track: ERC

ERC-926: 地址元数据注册表

Authors Nick Johnson <nick@ethereum.org>
Created 2018-03-12
Requires EIP-165

摘要

本 EIP 规定了一个地址元数据注册表,允许合约和外部账户向链上和链下调用者提供关于自身的元数据。这使得诸如通用授权、提供代币接受设置和声明注册表等用例成为可能。

动机

越来越多的用例需要存储与地址相关的元数据;例如,参见 EIP 777 和 EIP 780,以及 EIP 181 中的 ENS 反向注册表。目前,每个用例都定义了自己的专用注册表。为了防止专用注册表合约的激增,我们建议使用一个单一的标准化注册表,该注册表使用可扩展的架构,允许未来的标准实施他们自己的元数据标准。

规范

元数据注册表具有以下接口:

interface AddressMetadataRegistry {
  function provider(address target) view returns(address);
  function setProvider(address _provider);
}

setProvider 指定要与调用者地址关联的元数据注册表,而 provider 返回提供的地址的元数据注册表的地址。

元数据注册表将使用商定的 Solidity 版本进行编译,并使用无需信任的部署机制部署到可以在所有链上复制的固定地址。

提供者规范

提供者可以实现此处指定的元数据记录类型的任何子集。如果记录类型规范要求提供者提供多个函数,则提供者必须实现所有或不实现任何函数。如果使用不支持的函数 ID 调用,提供者必须抛出异常。

提供者有一个强制性函数:

function supportsInterface(bytes4 interfaceID) constant returns (bool)

supportsInterface 函数记录在 EIP-165 中,如果提供者实现了提供的 4 字节标识符指定的接口,则返回 true。接口标识符由该接口提供的函数的函数签名哈希的 XOR 组成;在单函数接口的退化情况下,它简单地等于该函数的签名哈希。如果提供者为 supportsInterface() 返回 true,则它必须实现该接口中指定的函数。

supportsInterface 必须始终为 0x01ffc9a7 返回 true,这是 supportsInterface 本身的接口 ID。

所有提供者函数的第一个参数必须是被查询的地址;这有助于创建多用户提供者合约。

当前标准化的提供者接口在下表中指定。

| 接口名称 | 接口哈希 | 规范 | | — | — | — |

EIP 可以定义要添加到此注册表的新接口。

理由

对于通用元数据注册表,有两种显而易见的方法:此处采用的间接方法,或广义的键/值存储。虽然间接会产生额外的合约调用成本,并且需要提供者随着时间的推移而改变,但它也提供了比键/值存储显着增强的灵活性;因此,我们选择了这种方法。

向后兼容性

没有向后兼容性问题。

实施

元数据注册表的规范实现如下:

contract AddressMetadataRegistry {
  mapping(address=>address) public provider;
  
  function setProvider(address _provider) {
    provider[msg.sender] = _provider;
  }
}

版权

CC0 下放弃版权及相关权利。

Citation

Please cite this document as:

Nick Johnson <nick@ethereum.org>, "ERC-926: 地址元数据注册表 [DRAFT]," Ethereum Improvement Proposals, no. 926, March 2018. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-926.