# 如何通过 rpc协议来交互 Base的存款 **Published by:** [junjie9021](https://paragraph.com/@junjie9021-3/) **Published on:** 2023-03-08 **URL:** https://paragraph.com/@junjie9021-3/rpc-base ## Content 跟大家分享一下通过rpc协议交互base网络的存款,我是如何分析并用代码实现的。 首先,我们先用跨链桥手动完整的跑一下交互流程。现在我要存0.01个eth。存款界面确认我们的存款,拿到返回的hash,打开浏览器。View交易已经打包上链,注意 这里点开Click to show more, 我们要找到Input Data字段交易详情重要: 大家做好笔记,做好理解,我们会对data 进行解读input dataMethodId - 函数做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 ethimport 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 往期代码交互教程scroll alpha test bridge代码交互aave gho稳定币项目代码交互教程base 存款代码交互教程sui mint nft 代码交互教程我的 推特 Lens Link3 Github ## Publication Information - [junjie9021](https://paragraph.com/@junjie9021-3/): Publication homepage - [All Posts](https://paragraph.com/@junjie9021-3/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@junjie9021-3): Subscribe to updates