如何通过 rpc协议来交互 Base的存款
March 8th, 2023

跟大家分享一下通过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 方法来交互。

以下为完整脚本

总结

  • 用好浏览器工具,浏览器已经扫好了块,并解析好了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

Subscribe to junjie9021
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.
More from junjie9021

Skeleton

Skeleton

Skeleton