ERC-7730:解析签名 _

发布时间:2026/6/26 1:21:53
ERC-7730:解析签名 _ 背景交易签名一直以来都是安全的兵家必争之地从直接签名转账到签名授权再到签名 permit2 内容以及 ERC-3009 的 authorization 内容钓鱼黑客总能够在不同的签名场景中寻找到薄弱之处让用户签下那笔“不明不白”的交易。而这个“防御”的任务通常是依赖于钱包的签名解析功能将用户签名的十六进制内容根据合约的函数参数进行复原告诉用户你签的内容到底是什么。但是这也会存在一个问题的呀合约的实现层出不穷灵活多变验签的内容和方法也在不断更新依赖钱包解析被动地去覆盖各种签名场景这本身就存在一定的滞后性这还是在钱包团队积极跟进的前提下。所以为了解决这个签名难的问题让用户签得明白、签得安全ERC-7730 应运而生。概括性介绍ERC-7730 的目标是通过引入一套标准化的 JSON 描述符格式解决以太坊生态中长期存在的盲签问题用户在签署智能合约交易或结构化消息时面对钱包中显示的十六进制数据或晦涩的函数调用无法理解真实交易意图从而极易遭受钓鱼攻击和资产损失。而 ERC-7730 的实现依赖于合约项目方或社区贡献者提供能够真实反映签名意图的 JSON 描述文件这样钱包就将函数签名和参数映射为人类可读的字段标签、格式化数值以及意图描述实现签名内容与用户预期一致的目标。详细介绍下面以最熟知的 ERC20 transfer 函数作为例子下面是它对应的 JSON 解析规则内容。{ $schema: https://eips.ethereum.org/assets/eip-7730/erc7730-v2.schema.json, context: { $id: Example ERC-20, contract : { deployments: [ { chainId: 1, address: 0xdAC17F958D2ee523a2206206994597C13D831ec7 }, { chainId: 137, address: 0xc2132D05D31c914a87C6611C10748AEb04B58e8F }, { chainId: 42161, address: 0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9 } ] } }, metadata: { owner: Example, contractName: Example Token, info: { url: https://example.io/, deploymentDate: 2017-11-28T12:41:21Z } }, display: { formats: { transfer(address to,uint256 value): { intent: Send, interpolatedIntent: Send {value} to {to}, fields: [ { path: value, label: Amount, format: tokenAmount, params: { tokenPath: .to } }, { path: to, label: To, format: addressName } ] } } } }主体内容其中$schema对应的是引用的解析规则版本号。剩余部分为内容主体包括contextmetadata和display三种类型。章节作用context绑定约束定义该解析文件适用的合约范围 1. 合约交易通过chainIdaddress定位适用的合约 2. EIP-712 消息通过domain或deployments绑定。钱包在根据解析文件对签名内容进行解析之前必须先验证约束是否满足。metadata元信息定义合约/项目方名称、官网、部署日期等展示信息。这部分的内容可以被display章节引用。display格式化指令核心解析逻辑 1.definitions可复用的字段格式定义 2.formats针对每个函数或 EIP-712 消息类型的具体解析规则引用符号为了准确地定义每个字段的数据属性与来源ERC-7730 还定义了三种引用符号$文件内容引用该符号用来引用 ERC-7730 文件中的值比如案例中的$schema除此以外还可以用来引用metadata、definitions等内容。使用案例$.metadata.enums.interestRateMode $.display.definitions.minReceiveAmount交易参数引用该符号用来引用交易或消息的参数。使用案例.to .value .chainId#结构化参数引用该符号用来引用数据结构中的内容范围包括函数参数中的结构化数据以及 EIP-712 字段中的内容。使用案例#.params.amountIn #.data.path.[0].path.[-1].to案例展示之前已经通过 ERC20 transfer 函数作为案例介绍了解析文件的设计与构成接下来提供一些在不同场景的案例作为参考。代币转账{ intent: Send, interpolatedIntent: Send {value} to {to}, fields: [ {path: to, format: addressName}, {path: value, format: tokenAmount, params: {tokenPath: .to}} ] }输出内容“Send 100 USDT to cyberdrk.eth