某些智能合约没有在 etherscan 验证源代码,也就无法轻易获取其 ABI,针对这样的“半开源”合约,可以有一些简单的方法,实现 Web3 调用
注:本文来自@gm365 推特,MarsBit整理如下:
半开源合约的 Web3 调用
某些智能合约没有在 etherscan 验证源代码,也就无法轻易获取其 ABI
但“诡异”的是,调用某些合约函数,却可以在网页上完整显示调用的函数名、参数名、具体参数值
针对这样的“半开源”合约,可以有一些简单的方法,实现 Web3 调用
之前写过一个,关于《未开源智能合约的调用》,方法主要是在网站前端扒拉 JS 代码,定位到 ABI 代码,然后实现调用
https://twitter.com/gm365/status/1521058983838380032
这个方法当然可以用来实现“半开源”合约调用,但这个方法实在有些反人类,疯狂扒拉JS代码也很费眼神,我们暂时先跳过
没有开源的合约,为何可以在 etherscan 显示详细的调用参数信息(小狐狸钱包也能显示)?
其实秘密都在这个 4 bytes signature 上
如果其他已开源合约有相同的“签名”,那么面对一个未开源合约,但签名相同的函数,etherscan和小狐狸会直接判定为同一函数并尝试解析
解决方案
针对这类能被正常显示的函数,其实有一个相对简单的方法:
通过函数信息反向生成 ABI 代码
15行代码,代码出自人类好帮手:chatGPT 4
经过测试与对照,和原始 ABI 一字不差(当然,output 可能有区别,但不影响使用)
签名库
如果 etherscan 上未显示,还可以先去这个签名库碰碰运气
https://4byte.directory/signatures/
注意:这个4四节签名是有可能重名的!某些小狐狸钓鱼合约,使用的就是这个“漏洞”。
同一个签名,可能对应多个函数,正常使用还得自行判断