未开源智能合约的调用原理、方法及实现代码

未开源智能合约的调用原理、方法及实现代码

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/a9059cbb

https://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 交叉比对,即可快速锁定函数名及参数

特殊情况下,可选择反编译合约的原始字节码,来加速前述进程

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注