实用工具
包含在 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 签名
账户(即智能合约钱包或智能账户)特别可能由多个签名者控制。因此,确保签名是:
-
仅对预期的域和帐户有效。
-
以最终签名者可读的方式进行验证。
一方面,确保帐户签名仅对特定的智能合约(即应用程序)有效是很困难的,因为它需要验证一个签名的域是应用程序,而且是帐户本身。因此,社区开发了 ERC-7739;一种防御性的再哈希机制,使用嵌套的 EIP-712 方法(即包装另一个 EIP-712 类型结构的 EIP-712)将签名绑定到单个域。
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 合约向后兼容,同时支持新型密钥。