# 通过16进制调用闭源合约

By [GZY499](https://paragraph.com/@gzy499) · 2025-06-27

---

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

**_但是如果网页卡住了，那么往往会错过一些重要的机会；_**

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

\-如图所示：

**_1️⃣进入区块浏览器；2️⃣输入合约地址；3️⃣选择交易的函数；4️⃣填入交易的参数，5️⃣点write_**就可以了！

![](https://storage.googleapis.com/papyrus_images/d10095713132d1ec8d389794fb43e085b1b861d6eb86009f1258edb126d79b8f.png)

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

![](https://storage.googleapis.com/papyrus_images/17e2939e8fa864423abd8f252144922d4aebbbfa77348afd68720235990c677b.png)

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

但是 **依旧是可以调用** 的；

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

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

![比如这个哈希，是关于UPTOP的退款调用](https://storage.googleapis.com/papyrus_images/f0f332648ed9a86454d3b1a813fa3b9f0b5e06df30b5e29652b0d6e4e673b35f.png)

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

通过这个哈希的input data，我们就知道了：

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

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

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

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

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

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

![比如这个哈希，是当时公售UPTOP代币那次的哈希](https://storage.googleapis.com/papyrus_images/1587293e71246a540741e14d720a6e42e7c343cff7d786c65f2fc5843f2cb233.png)

比如这个哈希，是当时公售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/](https://calldata-evm.vercel.app/)

**总结：**

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

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

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

**_最后欢迎大家关注我的推特：_**

[https://x.com/GZY499G](https://x.com/GZY499G)

---

*Originally published on [GZY499](https://paragraph.com/@gzy499/16)*
