ERC-5539: 撤销列表注册表
用于撤销任意数据的撤销列表注册表。
Authors | Philipp Bolte (@strumswell), Lauritz Leifermann (@lleifermann), Dennis von der Bey (@DennisVonDerBey) |
---|---|
Created | 2022-08-26 |
Discussion Link | https://ethereum-magicians.org/t/eip-5539-revocation-list-registry/10573 |
Requires | EIP-712 |
Table of Contents
摘要
本 EIP 提出了一组方法和标准,用于基于角色的指标注册表,旨在用于撤销。
动机
撤销是在传统的中心化和去中心化凭证证明中普遍需要的构造。本 EIP 旨在提供一个接口,以标准化在合约注册表中管理和解析撤销状态的去中心化方法。
传统撤销列表的最大问题是它们的中心化方面。世界上大多数 CRL 都依赖 HTTP 服务器以及缓存,因此容易受到传统网络空间中已知攻击媒介的攻击。这一方面严重削弱了当前 PKI 系统中底层强大的非对称密钥架构。
此外,现有 CRL 方法中的颁发者需要托管其公共撤销列表的自有实例,因为共享或中心化实例存在被控制实体滥用的风险。 这促使发行者将这一责任转移给第三方,从而增加了生态系统更加中心化的风险(参见 Cloudflare、AWS)。 理想情况下,发行者应该能够专注于其专业领域,包括对其可撤销材料的所有权,而不是担心基础设施。
我们看到了互联网的未来价值,即任何人都可以成为可验证信息的发行者。该提案为任何人拥有此信息的生命周期奠定了基础,从而在生态系统中建立信任。
规范
本文档中的关键词“必须”,“禁止”,“需要”,“应”,“不应”,“应该”,“不应该”,“推荐”,“可以”和“可选”应解释为 RFC 2119 中所述。
本 EIP 指定了一个名为 EthereumRevocationRegistry
的合约,该合约部署一次,然后可以由所有人通用使用。 默认情况下,以太坊地址 MAY 拥有和管理命名空间中的多个撤销列表,该命名空间 MUST 包含一组撤销密钥的撤销状态。
命名空间的所有者 MAY 允许委托管理其一个或多个撤销列表。 委托 MUST 可由相应列表的所有者移除。 在某些情况下,所有者 MAY 可能还希望将命名空间中的撤销列表及其管理权限转移给新的所有者。
定义
namespace
:命名空间是在注册表中表示以太坊地址,该地址对应于其所有者的地址。 命名空间中的所有撤销列表最初都由命名空间的所有者地址拥有。revocation list
:命名空间可以包含多个撤销列表。 每个撤销列表都由 bytes32 类型的唯一密钥标识,该密钥可用于与命名空间地址结合使用以寻址它。revocation key
:撤销列表可以包含多个 bytes32 类型的撤销密钥。 与命名空间地址和撤销列表密钥结合使用,它会解析为一个布尔值,该值指示撤销密钥是否被撤销。owner
:一个以太坊地址,该地址对其自身和可能外部命名空间中的撤销列表具有修改权限。 所有者可以通过将所有权转移到另一个地址来放弃对其命名空间中撤销列表的修改权限。delegate
:一个以太坊地址,该地址已获得对命名空间中撤销列表的临时访问权限。 必须由相关撤销列表的当前所有者授予。
撤销管理
isRevoked
MUST 实现一个函数,该函数返回命名空间撤销列表中特定撤销密钥的撤销状态。 它 MAY 还会考虑撤销列表的撤销状态。
function isRevoked(address namespace, bytes32 list, bytes32 key) public view returns (bool);
changeStatus
MUST 实现一个函数来更改命名空间撤销列表中特定撤销密钥的撤销状态
function changeStatus(bool revoked, address namespace, bytes32 revocationList, bytes32 revocationKey) public;
changeStatusSigned (参见元交易)
OPTIONAL 实现一个函数,用于使用原始签名更改命名空间撤销列表中特定撤销密钥的撤销状态。
function changeStatusSigned(bool revoked, address namespace, bytes32 revocationList, bytes32 revocationKey, address signer, bytes calldata signature) public;
changeStatusDelegated
OPTIONAL 实现一个函数,用于通过撤销列表的委托来更改命名空间撤销列表中特定撤销密钥的撤销状态。
function changeStatusDelegated(bool revoked, address namespace, bytes32 revocationList, bytes32 revocationKey) public;
changeStatusDelegatedSigned (参见元交易)
OPTIONAL 实现一个函数,用于使用原始签名更改命名空间撤销列表中特定撤销密钥的撤销状态。
function changeStatusDelegatedSigned(bool revoked, address namespace, bytes32 revocationList, bytes32 revocationKey, address signer, bytes calldata signature) public;
changeStatusesInList
OPTIONAL 实现一个函数,以一次更改命名空间撤销列表中的多个撤销状态。
function changeStatusesInList(bool[] memory revoked, address namespace, bytes32 revocationList, bytes32[] memory revocationKeys) public;
changeStatusesInListSigned (参见元交易)
OPTIONAL 实现一个函数,用于使用原始签名一次更改命名空间撤销列表中的多个撤销状态。
function changeStatusesInListSigned(bool[] memory revoked, address namespace, bytes32 revocationList, bytes32[] memory revocationKeys, address signer, bytes calldata signature) public;
changeStatusesInListDelegated
OPTIONAL 实现一个函数,用于通过撤销列表的委托一次更改命名空间撤销列表中的多个撤销状态。
function changeStatusesInListDelegated(bool[] memory revoked, address namespace, bytes32 revocationList, bytes32[] memory revocationKeys) public;
changeStatusesInListDelegatedSigned (参见元交易)
OPTIONAL 实现一个函数,用于使用由撤销列表的委托生成的原始签名一次更改命名空间撤销列表中的多个撤销状态。
function changeStatusesInListDelegatedSigned(bool[] memory revoked, address namespace, bytes32 revocationList, bytes32[] memory revocationKeys, address signer, bytes calldata signature) public;
撤销列表管理
#### OPTIONAL 实现一个函数,该函数返回命名空间中特定撤销列表的撤销状态。
function listIsRevoked(address namespace, bytes32 revocationList) view public returns (bool);
changeListStatus
OPTIONAL 实现一个函数来更改撤销列表本身的撤销状态。 如果撤销列表被撤销,则其所有密钥也被视为已撤销。
function changeListStatus(bool revoked, address namespace, bytes32 revocationList) public;
changeListStatusSigned (参见元交易)
OPTIONAL 实现一个函数,用于使用原始签名更改撤销列表本身的撤销状态。 如果撤销列表被撤销,则其所有密钥也被视为已撤销。
function changeListStatusSigned(bool revoked, address namespace, bytes32 revocationList, address signer, bytes calldata signature) public;
所有者管理
changeListOwner
OPTIONAL 实现一个函数来更改撤销列表的撤销状态。 如果撤销列表被撤销,则其中的所有密钥都被视为已撤销。
function changeListOwner(address newOwner, address namespace, bytes32 revocationList) public;
changeListOwnerSigned (参见元交易)
OPTIONAL 实现一个函数来使用原始签名更改撤销列表的撤销状态。 如果撤销列表被撤销,则其中的所有密钥都被视为已撤销。
function changeListOwnerSigned(address newOwner, address namespace, bytes32 revocationList, address signer, bytes calldata signature) public;
委托管理
addListDelegate
OPTIONAL 实现一个函数,用于将委托添加到命名空间中所有者的撤销列表。
function addListDelegate(address delegate, address namespace, bytes32 revocationList) public;
addListDelegateSigned (参见元交易)
OPTIONAL 实现一个函数,用于使用原始签名将委托添加到命名空间中所有者的撤销列表。
function addListDelegateSigned(address delegate, address namespace, bytes32 revocationList, address signer, bytes calldata signature) public;
removeListDelegate
OPTIONAL 实现一个函数,用于从命名空间中所有者的撤销列表中删除委托。
function removeListDelegate(address delegate, address owner, bytes32 revocationList) public;
removeListDelegateSigned (参见元交易)
OPTIONAL 实现一个函数,用于使用原始签名从命名空间中所有者的撤销列表中删除委托。
function removeListDelegateSigned(address delegate, address namespace, bytes32 revocationList, address signer, bytes calldata signature) public;
事件
RevocationStatusChanged
当 changeStatus
、changeStatusSigned
、changeStatusDelegated
、changeStatusDelegatedSigned
、changeStatusesInList
、changeStatusesInListSigned
、changeStatusesInListDelegated
或 changeStatusesInListDelegatedSigned
成功执行时,MUST 发出。
event RevocationStatusChanged(
address indexed namespace,
bytes32 indexed revocationList,
bytes32 indexed revocationKey,
bool revoked
);
RevocationListOwnerChanged
当 changeListOwner
或 changeListOwnerSigned
成功执行时,MUST 发出。
event RevocationListOwnerChanged(
address indexed namespace,
bytes32 indexed revocationList,
address indexed newOwner
);
RevocationListDelegateAdded
当 addListDelegate
或 addListDelegateSigned
成功执行时,MUST 发出。
event RevocationListDelegateAdded(
address indexed namespace,
bytes32 indexed revocationList,
address indexed delegate
);
RevocationListDelegateRemoved
当 removeListDelegate
或 removeListDelegateSigned
成功执行时,MUST 发出。
event RevocationListDelegateRemoved(
address indexed namespace,
bytes32 indexed revocationList,
address indexed delegate
);
RevocationListStatusChanged
当 changeListStatus
或 changeListStatusSigned
成功执行时,MUST 发出。
event RevocationListStatusChanged(
address indexed namespace,
bytes32 indexed revocationlist,
bool revoked
);
元交易
本节使用以下术语:
transaction signer
:一个以太坊地址,用于签署任意数据以供合约执行,BUT 不提交交易。transaction sender
:一个以太坊地址,用于从 transaction signer 获取签名数据,并将其与自己的签名一起包装并提交给智能合约。
一个地址(transaction signer)MAY 能够将签名的 payload 带外传递给另一个地址(transaction sender),该地址启动与智能合约的以太坊交互。 签名的 payload MUST 仅限于使用一次(Signed Hash + nonces)。
签名哈希
transaction signer 的签名 MUST 符合 EIP-712。 这有助于用户了解他们签名的 payload 由什么组成,并且可以提高针对重放攻击的保护。
Nonce
本 EIP RECOMMENDS 使用 dedicated nonce mapping 进行元交易。 如果验证了 transaction sender 的签名及其元内容,则合约会增加此 transaction signer 的 nonce。 这有效地消除了任何其他发送者使用另一个钱包再次执行同一交易的可能性。
理由
为什么要有命名空间的概念?
这为每个以太坊地址提供了一个保留空间,而无需在合约中主动声明它。 最初,地址仅在他们自己的命名空间中具有所有者访问权限。
为什么命名空间始终代表初始所有者地址?
列表所有者的变更不应破坏与其中撤销密钥的链接,因为已经存在的链下数据可能依赖于此链接。
向后兼容性
未发现向后兼容性问题。
安全注意事项
元交易
签名交易的签名可能会在实现此 ERC 的不同链或已部署的注册表版本上重放。 此安全注意事项通过使用 EIP-712 解决。
权限管理
不同的角色及其固有的权限旨在防止未经授权的实体进行更改。 撤销列表所有者应始终完全控制其撤销列表以及谁有权对其进行写入。
版权
版权及相关权利通过 CC0 放弃。
Citation
Please cite this document as:
Philipp Bolte (@strumswell), Lauritz Leifermann (@lleifermann), Dennis von der Bey (@DennisVonDerBey), "ERC-5539: 撤销列表注册表 [DRAFT]," Ethereum Improvement Proposals, no. 5539, August 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-5539.