通过16进制调用闭源合约

在日常我们与合约交互的时候,通常是走网页前端弹出钱包,确认交易进行的;

但是如果网页卡住了,那么往往会错过一些重要的机会;

这个时候我们其实也可以直接在链上与合约交互;

-如图所示:

1️⃣进入区块浏览器;2️⃣输入合约地址;3️⃣选择交易的函数;4️⃣填入交易的参数,5️⃣点write就可以了!

post image

但是有些时候,合约可能是闭源的,比如 fourmeme平台公售UPTOP代币 那次

post image

这种就没有办法,像调用开源合约一样去调用合约了;

但是 依旧是可以调用 的;

1️⃣第一步:我们可以先去区块浏览器,找到别人成功调用的哈希(也可以自己手动调用一次)

2️⃣第二步:查看哈希最下面的input Data

比如这个哈希,是关于UPTOP的退款调用
比如这个哈希,是关于UPTOP的退款调用

通过这个哈希的input data,我们就知道了:

调用了0xfa89401a这个方法 + 传入了一个参数

这个时候 我们可以点进合约,多看几个别人的哈希,会发现:

别人调用的哈希input data都一样;那就说明,所有人传入的参数都一样;

这种时候我们复制这段16进制data,向合约地址转账0BNB,携带这段16进制,就可以成功调用了

但是有一些时候,合约是闭源的,同时大家传入的16进制data也不一样的时候,这种时候怎么办呢?

其实 依旧是有办法的,就是需要我们去通过16进制 calldata去 猜参数

比如这个哈希,是当时公售UPTOP代币那次的哈希
比如这个哈希,是当时公售UPTOP代币那次的哈希

依旧按照同样的方法找到input data:

“0xf581463e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a0db359c38414b5f145f65cc1c69d9253067c4300000000000000000000000000000000000000000000003635c9adc5dea00000000000000000000000000000000000000000000000000000e492fea5dcb6cdb100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000”

通过解析可以大概分析出 包含6️⃣个参数 (怎么解析后面会说~)

1️⃣:0

2️⃣:0x8a0db359c38414b5f145f65cc1c69d9253067c43 (UPTOP代币合约地址)

3️⃣:1000

4️⃣:16.47050677557335

5️⃣:0

6️⃣:0

通过这6️⃣个参数,我们大概可以猜出

1️⃣ 、 5️⃣ 、 6️⃣号参数 都是固定的为: 0

2️⃣号参数代表 UPTOP合约地址 ,也是固定的

3️⃣号参数代表 购买的UPTOP代币数量,也可以是固定的

那么4️⃣号参数就是唯一一个不固定的参数,我们就可以分析,这代表什么意思

因为UPTOP代币的价格是波动的,越来越高,所以我们可以大概猜出4️⃣号参数是类似 “滑点” 、 最多接受使用多少USD1的一个参数

那么如果我们把这个值直接改到20(公售的最高价) 代表最多接受使用20USD1 去 购买1000UPTOP,那么这个参数也可以被固定住了;

修改以后的16进制为:

0xf581463e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a0db359c38414b5f145f65cc1c69d9253067c4300000000000000000000000000000000000000000000003635c9adc5dea00000000000000000000000000000000000000000000000000001158e460913d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

向合约转账0BNB,携带这段16进制data,就可以完成与合约的交互啦


最后:简单类型的 16进制数据解析 和 修改器 网站:

https://calldata-evm.vercel.app/

总结:

面对闭源合约时 ,如果16进制一样,那么直接复制 inputdata 调用即可

如果是简单的参数,可以通过分析修改器,解析修改,然后调用

如果是复杂的参数 ,比如一些bytes tuple[] 类型的参数,就有点复杂了….放弃吧

最后欢迎大家关注我的推特:

https://x.com/GZY499G