ERC-7506: 可信提示注册表
一个用于管理链上元数据的系统,能够验证生态系统声明。
Authors | Philipp Bolte (@strumswell), Dennis von der Bey (@DennisVonDerBey), Lauritz Leifermann (@lleifermann) |
---|---|
Created | 2023-08-31 |
Discussion Link | https://ethereum-magicians.org/t/eip-trusted-hint-registry/15615 |
Requires | EIP-712 |
摘要
本 EIP 标准化了一个用于管理链上元数据(提示)的系统,从而能够解释、提高可靠性和验证声明。它在定义的命名空间和列表中构建这些提示,从而实现结构化的组织和检索,以及许可的写入访问。该系统允许命名空间所有者委托提示管理任务,从而增强运营灵活性。它通过启用 EIP-712 的签名实现了安全的元交易,并提供可选的 ENS 集成,用于信任验证和可发现性。该接口配备了针对提示修改等活动发出特定事件的功能,从而便于轻松追踪提示的更改。这种设置旨在为管理声明和生态系统相关的元数据提供一个强大、标准化的框架,这对于维护去中心化环境中的完整性和可信度至关重要。
动机
在日益互联和去中心化的环境中,实体之间信任的形成仍然是一个关键问题。生态系统,无论是链上的还是链下的——跨越企业、社会倡议和其他有组织的框架——经常为其网络中的实体发布声明。这些声明是信任的基础要素,促进了本质上不值得信任的环境中的互动和交易。虽然去中心化运动带来了关于无需信任技术的重大改进,但构建在这些技术之上的许多生态系统需要能够在其领域内建立信任的技术。现实世界的应用程序表明,仅凭可验证的声明不足以实现此目的。此外,还需要一个链上元数据支持层来支持这些声明的可靠交换和验证。
缺少一种结构化的机制来管理链上声明元数据,这对在生态系统参与实体间形成和维护信任构成了一个重大障碍。这就需要引入一个链上元数据层,它可以协助可靠地验证和解释这些声明。在本规范中称为“提示”的这些元数据可以多种方式使用,每种方式都有助于增强生态系统声明的完整性和可靠性。提示可以执行各种任务,例如提供撤销详细信息、识别受信任的发行者或提供时间戳哈希。这些仅仅是几个例子,它们使生态系统能够验证和认证声明,以及验证随时间推移的数据完整性。
提出的“可信提示注册表”旨在为管理此类提示提供一个强大、灵活和标准化的接口。该注册表允许任何地址管理多个提示列表,其功能集不仅使创建和管理这些提示更容易,而且还提供了将这些功能委托给受信任实体的灵活性。在实践中,这使提示列表变成了适应不同需求和用例的动态工具。此外,该接口的设计非常注重互操作性,考虑了现有 W3C 关于去中心化标识符和可验证凭证的规范,并与以太坊认证服务等链上项目保持一致。
通过为提示管理提供标准化的智能合约接口,本规范在启用和扩展去中心化生态系统中的信任方面发挥着不可或缺的作用。它提供了一个基础层,可以在其上可靠地发布、验证和解释链上和链下的声明,从而成为任何去中心化生态系统可信运行的重要组成部分。因此,“可信提示注册表”不仅仅是对生态系统的补充,而且是去中心化信任复杂拓扑结构中必要的演变。
规范
本文档中的关键词“MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“MAY”和“OPTIONAL”应按照 RFC 2119 中的描述进行解释。
本 EIP 指定了一个名为 TrustedHintRegistry
的合约,并标准化了一组 REQUIRED 核心提示函数,同时还提供了一组常见的 OPTIONAL 管理函数,从而实现各种协作提示管理方式。生态系统 MAY 使用此规范来构建他们自己的具有生态系统特定、非标准化功能的提示注册表合约。治理被有意地排除在本 ERC 之外,并且 MAY 根据生态系统的需求来实现。
定义
claim
:声明是指一个实体对另一个实体所做的陈述。hint
:“提示”指的是一小段信息,可以提供见解,帮助解释、提高可靠性或验证去中心化生态系统数据。namespace
:命名空间是注册表中以太坊地址的表示,该地址与其所有者的地址相对应。命名空间包含用于不同用例的提示列表。hint list
:提示列表由一个唯一值标识,该唯一值包含多个解析为提示值的提示键。例如,撤销键解析为撤销状态。hint key
:提示键是一个解析为提示值的唯一值。例如,受信任的发行者标识符可以解析为该标识符的信任状态。hint value
:提示值表示生态系统中关于实体的数据。delegate
:已被其所有者授予对提示列表的写入权限的以太坊地址。
接口
提示管理
getHint
MUST 实现具有以下签名的方法,该方法返回命名空间的提示列表中的提示值。
function getHint(address _namespace, bytes32 _list, bytes32 _key) external view returns (bytes32);
setHint
MUST 实现具有以下签名的方法,该方法更改命名空间的提示列表中的提示值。MAY 实现具有附加 bytes calldata _metadata
参数的重载方法,以设置与提示值一起的元数据。
function setHint(address _namespace, bytes32 _list, bytes32 _key, bytes32 _value) public;
setHintSigned
MAY 实现具有以下签名的方法,该方法使用原始签名更改命名空间的提示列表中的提示值。MUST 按照元交易部分生成原始签名。MAY 实现具有附加 bytes calldata _metadata
参数的重载方法,以设置与提示值一起的元数据。
function setHintSigned(address _namespace, bytes32 _list, bytes32 _key, bytes32 _value, address _signer, bytes calldata _signature) public;
类型哈希值 MUST 是 SetHintSigned(address namespace,bytes32 list,bytes32 key,bytes32 value,address signer,uint256 nonce)
的 keccak256 哈希值,或者是调用元数据变体时 SetHintSigned(address namespace,bytes32 list,bytes32 key,bytes32 value,bytes metadata,address signer,uint256 nonce)
的哈希值。
setHints
MUST 实现具有以下签名的方法,该方法更改命名空间的提示列表中的多个提示值。MAY 实现具有附加 bytes[] calldata _metadata
参数的重载方法,以设置与提示值一起的元数据。
function setHints(address _namespace, bytes32 _list, bytes32[] calldata _keys, bytes32[] calldata _values) public;
setHintsSigned
MUST 实现具有以下签名的方法,该方法使用原始签名更改命名空间的提示列表中的多个提示值。MUST 按照元交易部分生成原始签名。MAY 实现具有附加 bytes[] calldata _metadata
参数的重载方法,以设置与提示值一起的元数据。
function setHintsSigned(address _namespace, bytes32 _list, bytes32[] calldata _keys, bytes32[] calldata _values, address _signer, bytes calldata _signature) public;
类型哈希值 MUST 是 SetHintsSigned(address namespace,bytes32 list,bytes32[] keys,bytes32[] values,address signer,uint256 nonce)
的 keccak256 哈希值,或者是调用元数据变体时 SetHintsSigned(address namespace,bytes32 list,bytes32[] keys,bytes32[] values,bytes[] metadata,address signer,uint256 nonce)
的哈希值。
委托提示管理
命名空间所有者可以将委托地址添加到其命名空间中的特定提示列表。这些委托 SHALL 有权通过一组特定的方法写入特定列表。
setHintDelegated
MAY 实现具有以下签名的方法,该方法为预先批准的委托更改命名空间的提示列表中的提示值。MAY 实现具有附加 bytes calldata _metadata
参数的重载方法,以设置与提示值一起的元数据。
function setHintDelegated(address _namespace, bytes32 _list, bytes32 _key, bytes32 _value) public;
setHintDelegatedSigned
MAY 实现具有以下签名的方法,该方法使用原始签名为预先批准的委托更改命名空间的提示列表中的提示值。MUST 按照元交易部分生成原始签名。MAY 实现具有附加 bytes calldata _metadata
参数的重载方法,以设置与提示值一起的元数据。
function setHintDelegatedSigned(address _namespace, bytes32 _list, bytes32 _key, bytes32 _value, address _signer, bytes calldata _signature) public;
类型哈希值 MUST 是 SetHintDelegatedSigned(address namespace,bytes32 list,bytes32 key,bytes32 value,address signer,uint256 nonce)
的 keccak256 哈希值,或者是调用元数据变体时 SetHintDelegatedSigned(address namespace,bytes32 list,bytes32 key,bytes32 value,bytes metadata,address signer,uint256 nonce)
的哈希值。
setHintsDelegated
MAY 实现具有以下签名的方法,该方法为预先批准的委托更改命名空间的提示列表中的多个提示值。MAY 实现具有附加 bytes[] calldata _metadata
参数的重载方法,以设置与提示值一起的元数据。
function setHintsDelegated(address _namespace, bytes32 _list, bytes32[] calldata _keys, bytes32[] calldata _values) public;
setHintsDelegatedSigned
MAY 实现具有以下签名的方法,该方法使用原始签名在命名空间的提示列表中为预先批准的委托提供多个提示值。MUST 按照元交易部分生成原始签名。MAY 实现具有附加 bytes[] calldata _metadata
参数的重载方法,以设置与提示值一起的元数据。
function setHintsDelegatedSigned(address _namespace, bytes32 _list, bytes32[] calldata _keys, bytes32[] calldata _values, address _signer, bytes calldata _signature) public;
类型哈希值 MUST 是 SetHintsDelegatedSigned(address namespace,bytes32 list,bytes32[] keys,bytes32[] values,address signer,uint256 nonce)
的 keccak256 哈希值,或者是调用元数据变体时 SetHintsDelegatedSigned(address namespace,bytes32 list,bytes32[] keys,bytes32[] values,bytes[] metadata,address signer,uint256 nonce)
的哈希值。
提示列表管理
setListStatus
MAY 实现具有以下签名的方法,该方法更改提示列表的有效状态。吊销列表 CAN 用于使列表中的所有提示值无效。
function setListStatus(address _namespace, bytes32 _list, bool _revoked) public;
setListStatusSigned
MAY 实现具有以下签名的方法,该方法修改提示列表的有效性状态,并带有原始签名。撤销列表 CAN 用于使列表中的所有提示值失效。
function setListStatusSigned(address _namespace, bytes32 _list, bool _revoked, address _signer, bytes calldata _signature) public;
生成签名时,类型哈希 MUST 为 SetListStatusSigned(address namespace,bytes32 list,bool revoked,address signer,uint256 nonce)
的 keccak256 哈希。
setListOwner
MAY 实现具有以下签名的方法,该方法将信任列表的所有权转移到另一个地址。更改列表的所有者 SHALL NOT 更改提示列表所在的命名空间,以保留对提示值的路径的引用。
function setListOwner(address _namespace, bytes32 _list, address _newOwner) public;
setListOwnerSigned
MAY 实现具有以下签名的方法,该方法使用原始签名将信任列表的所有权转移到另一个地址。MUST 按照元交易部分生成原始签名。更改列表的所有者 SHALL NOT 更改提示列表所在的命名空间,以保留对提示值的路径的引用。
function setListOwnerSigned(address _namespace, bytes32 _list, address _newOwner, address _signer, bytes calldata _signature) public;
生成签名时,类型哈希 MUST 为 SetListOwnerSigned(address namespace,bytes32 list,address newOwner,address signer,uint256 nonce)
的 keccak256 哈希。
addListDelegate
MAY 实现具有以下签名的方法,用于将委托添加到命名空间中所有者的提示列表。
function addListDelegate(address _namespace, bytes32 _list, address _delegate, uint256 _untilTimestamp) public;
addListDelegateSigned
MAY 实现以下签名的方法,以添加带有原始签名的命名空间中所有者的提示列表的委托。MUST 遵循元交易部分生成原始签名。
function addListDelegateSigned(address _namespace, bytes32 _list, address _delegate, uint256 _untilTimestamp, address _signer, bytes calldata _signature) public;
生成签名时,类型哈希 MUST 为 AddListDelegateSigned(address namespace,bytes32 list,address delegate,uint256 untilTimestamp,address signer,uint256 nonce)
的 keccak256 哈希。
removeListDelegate
MAY 实现具有以下签名的方法,用于从命名空间中所有者的提示列表中删除委托。
function removeListDelegate(address _namespace, bytes32 _list, address _delegate) public;
removeListDelegateSigned
MAY 实现具有以下签名的方法,用于从命名空间中所有者的提示列表中删除带有原始签名的委托。MUST 遵循元交易部分生成原始签名。
function removeListDelegateSigned(address _namespace, bytes32 _list, address _delegate, address _signer, bytes calldata _signature) public;
生成签名时,类型哈希 MUST 为 RemoveListDelegateSigned(address namespace,bytes32 list,address delegate,address signer,uint256 nonce)
的 keccak256 哈希。
元数据管理
getMetadata
MAY 实现具有以下签名的方法来检索提示的元数据。
function getMetadata(address _namespace, bytes32 _list, bytes32 _key, bytes32 _value) external view returns (bytes memory);
setMetadata
MAY 实现具有以下签名的方法来设置提示的元数据。
function setMetadata(address _namespace, bytes32 _list, bytes32 _key, bytes32 _value, bytes calldata _metadata) public;
setMetadataSigned
MAY 实现具有以下签名的方法,以使用原始签名来设置提示的元数据。MUST 按照元交易部分生成原始签名。
function setMetadataSigned(address _namespace, bytes32 _list, bytes32 _key, bytes32 _value, bytes calldata _metadata, address _signer, bytes calldata _signature) public;
生成签名时,类型哈希 MUST 为 SetMetadataSigned(address namespace,bytes32 list,bytes32 key,bytes32 value,bytes metadata,address signer,uint256 nonce)
的 keccak256 哈希。
setMetadataDelegated
MAY 实现具有以下签名的方法,以作为提示列表的预先批准的委托来设置提示的元数据。
function setMetadataDelegated(address _namespace, bytes32 _list, bytes32 _key, bytes32 _value, bytes calldata _metadata) public;
setMetadataDelegatedSigned
MAY 实现具有以下签名的方法,以作为提示列表的预先批准的委托来使用原始签名设置提示的元数据。MUST 按照元交易部分生成原始签名。
function setMetadataDelegatedSigned(address _namespace, bytes32 _list, bytes32 _key, bytes32 _value, bytes calldata _metadata, address _signer, bytes calldata _signature) public;
生成签名时,类型哈希 MUST 为 SetMetadataDelegatedSigned(address namespace,bytes32 list,bytes32 key,bytes32 value,bytes metadata,address signer,uint256 nonce)
的 keccak256 哈希。
事件
HintValueChanged
当提示值已更改时 MUST 发出。
event HintValueChanged(
address indexed namespace,
bytes32 indexed list,
bytes32 indexed key,
bytes32 value
);
HintListOwnerChanged
当列表的所有者已更改时 MUST 发出。
event HintListOwnerChanged(
address indexed namespace,
bytes32 indexed list,
address indexed newOwner
);
HintListDelegateAdded
当委托已添加到提示列表时 MUST 发出。
event HintListDelegateAdded(
address indexed namespace,
bytes32 indexed list,
address indexed newDelegate
);
HintListDelegateRemoved
当委托已从提示列表中删除时 MUST 发出。
event HintListDelegateRemoved(
address indexed namespace,
bytes32 indexed list,
address indexed oldDelegate
);
HintListStatusChanged
当提示列表的有效性状态已更改时 MUST 发出。
event HintListStatusChanged(
address indexed namespace,
bytes32 indexed list,
bool indexed revoked
);
元交易
本节使用以下术语:
transaction signer
(交易签名者):一个以太坊地址,用于签署任意数据以供合约执行,BUT 不提交交易。transaction sender
(交易发送者):一个以太坊地址,用于从 transaction signer 获取签名数据,并将其作为方法调用的一部分在交易中提交给智能合约。
transaction signer MAY 能够将带符号的 payload 带外传递给 transaction sender,该 transaction sender 启动与智能合约的以太坊交互。签名的 payload MUST 仅限于使用一次(请参阅签名哈希和随机数)。
签名哈希
transaction signer 的签名 MUST 符合 EIP-712。这有助于用户理解他们所签署的 payload 由什么组成,并提供针对重放攻击的保护。
随机数
本 EIP RECOMMENDS 使用 专用的随机数映射 用于元交易。如果验证了此 transaction sender 的签名及其元内容,则合约将增加 transaction signer 的一个随机数。这有效地消除了任何其他发送者使用另一个钱包再次执行同一笔交易的可能性。
通过 ENS 建立信任锚
使用以太坊域名服务 (ENS) 域的生态系统可以通过使用 ENS 条目来共享有关提示列表注册表的信息来提高信任度。此方法利用了 ENS 域的已建立信誉,从而更容易找到域实体的提示注册表合约,以及为特定生态系统需求定制的适当命名空间和提示列表。通过 ENS 实现信任锚是 OPTIONAL 的。
对于每个用例,都 SHALL 创建一个或一组特定的 ENS 子域。每个子域都应被视为一个原子实体,用于存放一组单一的命名空间-列表-键-值 TEXT 记录。应设置以下记录:
- ADDRESS ETH - 可信提示注册表合约的地址
- TEXT - 键: “hint.namespace”; 值: 命名空间的所有者地址
可以设置以下记录 MAY:
- TEXT - 键: “hint.list”; 值: 提示列表的 bytes32 键
- TEXT - 键: “hint.key”; 值: 提示键的 bytes32 键
- TEXT - 键: “hint.value”; 值: 提示值的 bytes32 键
- ABI - 可信提示注册表合约的 ABI
要创建双向连接,命名空间所有者 SHALL 设置引用完整 ENS 子域哈希的元数据。元数据 SHALL 在所有者的命名空间中设置,其中提示列表和提示键值为 0x0
,其中提示值是 ENS 子域 keccak256 哈希。
通过建立此连接,可以为生态系统内的信任和发现奠定坚实的基础。
理由
检查方法签名可以发现此 ERC 中经过深思熟虑的架构和数据层次结构:命名空间地址映射到提示列表,提示列表又映射到提示键,然后提示键显示提示值。
// namespace hint list hint key hint value
mapping(address => mapping(bytes32 => mapping(bytes32 => bytes32))) hints;
此结构旨在隐式建立给定命名空间下所有列表的初始所有权,从而无需后续声明操作。因此,它简化了验证和强制执行写入权限的过程,从而减少了潜在的攻击面。必须为委托管理和提示列表的所有权转移等功能建立和验证其他数据结构。这些结构不会影响主命名空间布局;相反,它们充当权限检查的辅助机制。
此 ERC 的主要目标之一是包含管理功能,因为这些功能会极大地影响提示列表的协作和可维护性。这些功能还使平台能够在提供用户友好的界面时隐藏复杂性。具体来说,元交易的使用允许用户在将繁重的技术工作外包给平台的同时,保持对其私钥的控制,这只需签署 EIP-712 payload 即可实现。
向后兼容性
未发现任何向后兼容性问题。
安全注意事项
元交易
已签名交易的签名可能会在实现此 ERC 的不同链或已部署注册表版本上重放。通过使用 EIP-712 来解决此安全问题。
权限管理
不同角色及其固有的权限旨在防止未经授权实体的更改。提示列表所有者应始终完全控制其提示列表以及谁有权对其进行写入。
治理
人们认识到,生态系统可能已制定了也可能适用于提示列表更改的流程。此 ERC 明确为注册表的实施者或用户留出了应用符合其生态系统需求的流程的空间。可能的解决方案可以是扩展具有围绕特定方法的治理功能的合约、使用多重签名钱包或由实体强制执行的链下流程。
版权
版权和相关权利通过 CC0 放弃。
Citation
Please cite this document as:
Philipp Bolte (@strumswell), Dennis von der Bey (@DennisVonDerBey), Lauritz Leifermann (@lleifermann), "ERC-7506: 可信提示注册表 [DRAFT]," Ethereum Improvement Proposals, no. 7506, August 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7506.