未开源智能合约的调用原理、方法及实现代码
https://twitter.com/gm365/status/1521058983838380032
对于未开源的智能合约,是否就束手无策,无法调用了呢?
并不完全是。
如果你在项目官网可以用 Metamask 正常调用这个智能合约,那么通过一定的策略,你也可以用 Web3 .py 的方式来调用
本文的一些思路、工具来自于 @MrsZaaa 的教学视频,感谢
1、未开源合约的调用原理
1. 在官网源代码中搜索”ABI”代码(一般存储在JS文件中)
2. 反向解析4字节的 “函数选择器”
3. 解析若干32字节的函数参数
4. 根据解码程度选择对应的调用方式
2、解析4字节的“函数选择器”
所谓函数选择器,其实是对“函数原型”的签名的前4字节(用16进制表示则为8个字符)。
注意,这4个字节是不可逆的。所以,所谓的“反向解析”其实就类似于“MD5”破解用的彩虹表。
“4 byte directory” 就是其中一个相对知名的查询网站
3、4字节函数选择器库
除了 http://4byte.directory 这个网站可以查询外,Github 上海有一个叫 4bytes 的库,截至目前已经收录了 533,583 条信息。通过 curl 即可查询
curl https://raw.githubusercontent.com/ethereum-lists/4bytes/master/signatures/a9059cbbhttps://github.com/ethereum-lists/4bytes
4、反查 4bytes 函数选择器获取函数及参数信息
通过上述方式,反查函数选择器的4字节信息,幸运的情况下,可以查到对应函数的名字、每个参数的类型。
如果参数较少,比如普通的 mint NFT 函数只有 amount和address参数,直接调用即可。
如果参数较多,则需要进一步研究才能确定每个参数的具体含义
5、搜索网站源码中的ABI信息
有了函数名(比如 mint),接下来就可以从网站源码里搜索名称来查找 ABI 信息了。
因为不管是你从官网 mint NFT 还是执行其他操作,最终都需要具体的 ABI 来告诉钱包应用如何调用函数。
一般情况,ABI 会存储在某个JS文件中。建议用Safari浏览器的Sources面板,效率更高
7、ABI 信息解析工具
还有另一个好用的ABI信息在线解析工具。
https://abi.hashex.org
输入 ABI 信息后,点击 Parse,即可在下方看到所有支持函数的名字和对应的参数。
选择对应函数,填入参数,最下方会自动给出编码好的 16进制 input data。再对照钱包应用中的 input data数据,看二者是否一致
8、通过 Python 调用智能合约
经过前面的步骤,相信你已经掌握了合约调用最重要的两项信息:函数名和对应参数
接下来可以使用之前一个 🧵 中提到的方法来调用,这里不再赘述。比如图中 Stake SYNC 的 deposit 函数调用
https://twitter.com/gm365/status/1519957366888083456
9、反编译未开源合约
一般情况下,并不需要使用反编译合约的方法。
但对于那些不容易在网站源码找到ABI信息的,复制合约的原始字节码,粘贴到网站进行反编译,再从已解出的部分已知函数名入手搜索,会大大加速这一进程。
https://ethervm.io/decompile
10、总结
未开源合约的调用,重点在于如何锁定调用的函数名及对应参数信息
先从 4byte directory 网站搜索,未果的情况下再从网站源码找到完整 ABI 信息后,和 input data 交叉比对,即可快速锁定函数名及参数
特殊情况下,可选择反编译合约的原始字节码,来加速前述进程
发表回复