Cover photo

如何通过 rpc协议来交互 Base的存款

跟大家分享一下通过rpc协议交互base网络的存款,我是如何分析并用代码实现的。

首先,我们先用跨链桥手动完整的跑一下交互流程。现在我要存0.01个eth。

存款界面
存款界面

确认我们的存款,拿到返回的hash,打开浏览器。

View
View

交易已经打包上链,注意 这里点开Click to show more, 我们要找到Input Data字段

交易详情
交易详情

重要: 大家做好笔记,做好理解,我们会对data 进行解读

input data
input data

MethodId - 函数做KECCAK256hash计算,然后取计算结果的前四个字节,也就是hash值的前八位,然后拼接0x,就是这个方法的ID.

"""
Function: depositTransaction(address _to,uint256 _value,uint64 _gasLimit,bool _isCreation,bytes _data)

"""
import sha3

def keccak256_hash(text):
    k = sha3.keccak_256()
    k.update(text.encode('utf-8'))
    return k.hexdigest()

func = "depositTransaction(address,uint256,uint64,bool,bytes)"
print('0x' + keccak256_hash(func)[:8])

[0]: 000000000000000000000000b0a25771c5f7aa7772d9f6ea048ba80124c12d89

其实是自己的钱包地址

address = "0xa25771c5f7aa7772d9f6ea048ba80124c12d89"
print(address[2:].rjust(64, '0'))

[1]: 000000000000000000000000000000000000000000000000002386f26fc10000 存款的数量0.01 eth

import math

value = 0.01
amount = int(value * math.pow(10, 18)) # 注意 eth 主币的精度是18位
print(hex(amount)[2:].rjust(64, '0'))

[2]: 00000000000000000000000000000000000000000000000000000000000186a0 gaslimit, 在打包上链时候传入的gaslimit。一般可以通过小狐狸拿下或者看其他人的交易。或者通过 rpc method eth_estimateGas来查询(有的合约不支持)

import math

gaslimit = 100000
print(hex(gaslimit)[2:].rjust(64, '0'))

[3]: 0000000000000000000000000000000000000000000000000000000000000000 [4]: 00000000000000000000000000000000000000000000000000000000000000a0 [5]: 0000000000000000000000000000000000000000000000000000000000000000

这些可以理解为固定参数, 暂时不需要强行理解它们。

通过这6个数据分析,我们发现这个方法主要要于前3个数据的变量传入,地址 address, 数量 amount, gas gaslimit,剩下的参数都是固定值。组装好这些数据,我们就可以直接跟合约交互,要修改状态的这种交互,统一用 transfer 来交互,如果不只是查询代币余额这些不改变状态的可以用 eth_call 方法来交互。

以下为完整脚本

https://mirror.xyz/0x7b52FD04cC45B26F5bdea1CD7c8c56A00A3F859B/IeEw0Qp3MYbwFZx111fi1J25Dm8JLcm6avEHv_72R-0

总结

  • 用好浏览器工具,浏览器已经扫好了块,并解析好了tx

  • 多测多看,看看合约相同methodId的inputdata数据,找不同点

  • 理解 rpc 协议的交互

像浏览器一样的打印inputdata数据

data = "0xe9e05c42000000000000000000000000b0a25771c5f7aa7772d9f6ea048ba80124c12d89000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000" # 这里放入inputdata值, 推文限制长度了,所以自己改下
start = 10
print('MethodId:' + data[:10])
for i in range(int(len(data[10:])/64)):
    msg = '[%d]: %s' % (i, data[start:start+64])
    print(msg)
    start += 64

往期代码交互教程

我的 推特 Lens Link3 Github