弹窗背后的一条解码链路
钱包弹窗里那句“向某地址转账某代币”,不是链上本来就有的文字。链上交易的输入数据字段是一串十六进制:前四个字节是方法选择器,后面按三十个字节的槽位排参数。钱包要把它变成人话,需要一份叫 ABI 的接口说明书,告诉你哪个四字节对应哪个方法名、每个参数是什么类型。选择器和槽位的机制在 交易的输入数据字段怎么读:四字节选择器、参数槽位与解不出来的情况 里讲过。问题在于 ABI 从哪来:钱包可以按合约地址去数据库里匹配已验证源码,但链上有几千万合约,验证率有限,很多地址钱包手里根本没有对应的接口描述。
让应用把说明书一起交来
EIP-7896 的思路简单直接:既然应用最清楚自己在让你签什么,就让它把 ABI 随请求一起交上来。规范给批量调用请求的 capabilities 字段增加了一个名为 interfaces 的能力键,应用在其中按合约地址附上接口规格,钱包据此可靠地解码请求里的 calldata。这份提案 2025 年 2 月创建,依附于批量调用标准 EIP-5792,目前状态为停滞——它只定义了“说明书可以随件附来”,没有规定钱包必须采信。它的安全考量一节原文只写了“需要讨论”四个字,意味着规范本身没有为这份附件提供任何防伪机制。
附件的信任边界
不采信是对的。应用递来的 ABI 描述的是“这串字节应该被读成什么”,它不是链上事实,完全可能与合约真实接口不符:同一个四字节选择器,用真实 ABI 解出来是“把抵押品取回”,用一份伪造 ABI 解出来可以是“给地址转账”。钱包端正确的顺序是:附件只作为解码提示,凡目标合约在链上有已验证源码的,以链上源码生成的接口为准;对不上时以字节原文呈现并警告,而不是选一份好看的解释。对用户来说,这条边界意味着“弹窗很好读”本身不是安全信号——字越流畅、越像模板,越值得回头核对目标地址、金额和代币合约是不是你发起这笔操作时预期的那几个。
对得上号的产品差异
实践中各家钱包的解码来源本来就有层级:内置的知名协议词典、区块浏览器验证过的源码库、用户自定义的合约列表,最后才是应用附件。有清晰设计的选择是把这些来源标出来,例如注明这个弹窗的文字来自“协议模板”还是“应用提供的接口描述”。这也是为什么同一笔批量请求在不同钱包里,一个显示得清清楚楚、另一个只显示原始字节加一串问号——后者未必更笨,它可能只是更诚实地承认自己解不出来。
还要理解一层成本账:链上源码验证本身依赖有人把编译后的字节码和源文件对应关系提交给浏览器并完成比对,热门协议合约几乎全覆盖,长尾合约和升级后的新代理地址则经常滞后。这意味着即便钱包完全忽略应用附件、只信链上验证库,同一个协议在合约刚升级的头几天里也可能退化为原始字节显示。这种短暂“变笨”恰恰是链路健康的表现:宁可暂时读不懂,也不用一份来路不明的说明书抢跑。反过来,如果某个陌生地址在没有任何已验证源码的情况下弹窗文字却异常完整流畅,唯一合理的解释就是文字来自随件附件,采信等级要立刻降档。
遇到模糊弹窗的动作清单
综合下来,给普通用户四步。第一步,把注意力从文字挪到数字:目标地址、金额、代币符号、NFT 编号,这几个字段任何钱包都无法替你美化,错了就是错了。第二步,凡是弹窗文字与你在网站上点下的操作对不上,或出现了“未知方法”加陌生合约地址的组合,停手。第三步,去区块浏览器把这笔调用的输入数据贴进解码工具,用链上已验证的合约接口交叉核对一次。第四步,批量请求里如果只有一条要求人工可读、其余全显示原始字节,重点审那串原始字节——攻击者最省事的伪装方式,就是在九条正常操作里夹一条没人看的。本文为机制说明,不构成任何投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。