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.