Alert Source Discuss
🚧 Stagnant Standards Track: ERC

ERC-5719: 签名替换接口

非交互式地替换因配置更改而过期的智能合约钱包签名。

Authors Agustin Aguilar (@Agusx1211)
Created 2022-09-26
Discussion Link https://ethereum-magicians.org/t/erc-signature-replacing-for-smart-contract-wallets/11059
Requires EIP-1271

摘要

智能合约钱包的签名消息可能会过期,这意味着曾经有效的签名可能在任何时候都变得无效。

签名可能由于以下原因而过期:

  • 内部签名者集合已更改
  • 钱包使签名可过期
  • 合约已更新为新的实现

以下标准允许智能合约钱包公开一个 URI,客户端可以使用该 URI 将过期的签名替换为有效的签名。

动机

与 EOA 签名相比,EIP-1271 签名不一定是幂等的;它们可能在任何时间点都变得无效。 这对依赖于签名在较长时间内保持有效的协议提出了挑战。

由于以下情况之一,签名可能需要被修改:

  1. 钱包删除了参与签署初始消息的签名者。
  2. 钱包使用 Merkle 树来存储签名者,添加新的签名者。
  3. 钱包使用 Merkle 树来存储签名,添加新的签名。
  4. 钱包已更新为新的实现,并且签名模式已更改。

非交互式签名替换应该是可能的,因为最初签署消息的钱包在需要验证签名时可能不可用。 一个用例是在使用链下订单簿的交易所中结算交易。

规范

钱包合约必须实现以下函数:

function getAlternativeSignature(bytes32 _digest) external view returns (string);

返回的字符串必须是一个 URI,指向具有以下 JSON 模式的 JSON 对象:

{
    "title": "Signature alternative",
    "type": "object",
    "properties": {
        "blockHash": {
            "type": "string",
            "description": "A block.hash on which the signature should be valid."
        },
        "signature": {
            "type": "string",
            "description": "The alternative signature for the given digest."
        }
    }
}

客户端替换签名的流程

客户端是持有签名并打算验证它的实体,可以用于链下或链上。 要使用智能合约钱包签名,客户端必须执行以下操作:

1) 尝试使用 EIP-1271 验证签名;如果签名有效,则可以按原样使用该签名。 2) 如果签名无效,则调用 getAlternativeSignature(_digest),传递与旧签名相对应的 digest。 3) 如果调用失败,未返回 URI,或者 URI 的内容无效,则必须认为签名无效。 4) 尝试使用 EIP-1271 验证新的签名;如果签名有效,则可以将其用作原始签名的直接替代品。 5) 如果验证失败,请从步骤 (2) 重复该过程(注意:如果 URI 返回相同的签名,则必须认为签名无效)。

客户端在获取备用签名时必须实施重试限制。 此限制由客户端自行定义。

原理

选择 URI 是因为它能够适应集中式和去中心化解决方案。 例如,服务器可以为 Merkle 证明实现实时重新编码,或者 IPFS 链接可以指向包含所有预先计算的签名修改的目录。

getAlternativeSignature 方法指向链下源,因为预计智能合约钱包不包含所有已签名摘要的链上记录,如果情况如此,则此类合约不需要使用此 EIP,因为它可以在 isValidSignature 上直接验证 digest,忽略过期的签名。

向后兼容性

未实现 getAlternativeSignature 方法的现有钱包仍然可以签名消息而无需任何更改;如果任何签名失效,客户端将在步骤 (3) 中将其删除。

安全注意事项

某些应用程序使用签名作为密钥;如果 EIP 公开签名,这些应用程序将有泄露此类密钥的风险。

版权

版权及相关权利通过 CC0 放弃。

Citation

Please cite this document as:

Agustin Aguilar (@Agusx1211), "ERC-5719: 签名替换接口 [DRAFT]," Ethereum Improvement Proposals, no. 5719, September 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-5719.