跟大家分享一下通过rpc协议交互base网络的存款,我是如何分析并用代码实现的。
首先,我们先用跨链桥手动完整的跑一下交互流程。现在我要存0.01个eth。
确认我们的存款,拿到返回的hash,打开浏览器。
交易已经打包上链,注意 这里点开Click to show more, 我们要找到Input Data字段
重要: 大家做好笔记,做好理解,我们会对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