实用工具

包含在 OpenZeppelin Contracts 社区版本中的多个库和通用实用工具。这些只是一组实用工具合约。有关完整列表,请查看 API 参考

密码学

验证类型化数据签名

有关如何在链上验证签名的事前知识,请查看 OpenZeppelin Contracts 文档

与验证纯文本消息相反,可以让用户签署结构化数据(即类型化值),并且仍然可以在他们的钱包上读取。这可以通过实现 EIP712 来实现,这是一种将结构化数据编码为类型化数据哈希的标准方法。

要开始验证已签名的类型化结构,只需验证 类型化数据哈希

Unresolved include directive in modules/ROOT/pages/utilities.adoc - include::api:example$utils/cryptography/MyContractDomain.sol[]

作为消息的一部分,EIP-712 要求实施者包括一个域分隔符,这是一个包含当前智能合约地址和部署它的链 ID 的哈希。这样,智能合约可以确保结构化消息是为其特定域签名的,从而避免智能合约中签名的可重放性。

验证嵌套的 EIP-712 签名

账户(即智能合约钱包或智能账户)特别可能由多个签名者控制。因此,确保签名是:

  1. 仅对预期的域和帐户有效。

  2. 以最终签名者可读的方式进行验证。

一方面,确保帐户签名仅对特定的智能合约(即应用程序)有效是很困难的,因为它需要验证一个签名的域是应用程序,而且是帐户本身。因此,社区开发了 ERC-7739;一种防御性的再哈希机制,使用嵌套的 EIP-712 方法(即包装另一个 EIP-712 类型结构的 EIP-712)将签名绑定到单个域。

如果您的智能合约验证签名,则使用 ERC7739 签名者将实现 IERC1271 接口,以按照 ERC-7739 建议的方法验证智能合约签名:

Unresolved include directive in modules/ROOT/pages/utilities.adoc - include::api:example$utils/cryptography/ERC7739SignerECDSA.sol[]

ERC-7913 签名验证器

ERC-7913 扩展了签名验证的概念,以支持没有自己的 Ethereum 地址的密钥。这对于将非 Ethereum 加密曲线、硬件设备或其他身份系统集成到智能帐户中特别有用。

该标准定义了一个验证器接口,可以实现该接口来支持不同类型的密钥。签名者表示为一个 bytes 对象,该对象连接了一个验证器地址和一个密钥:verifier || key

ERC7913Utils 提供了使用与 ERC-7913 兼容的验证器验证签名的函数:

using ERC7913Utils for bytes;

function _verify(bytes memory signer, bytes32 hash, bytes memory signature) internal view returns (bool) {
    return signer.isValidSignatureNow(hash, signature);
}

验证过程如下:

  • 如果 signer.length < 20:验证失败

  • 如果 signer.length == 20:使用 SignatureChecker 完成验证

  • 否则:使用 ERC-7913 验证器完成验证。

这允许与 EOA 和 ERC-1271 合约向后兼容,同时支持新型密钥。