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

By [junjie9021](https://paragraph.com/@junjie9021-3) · 2023-03-08

---

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

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

![存款界面](https://storage.googleapis.com/papyrus_images/ed5e8f52a53fdd7eb317227f4672314fb71085b44ec8c80ce32133a951c131e8.png)

存款界面

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

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

View

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

![交易详情](https://storage.googleapis.com/papyrus_images/855a833085fac34dc20ddc50f7b2632e16c6ef50a6b8bc6ac82d924b4bee7d20.png)

交易详情

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

![input data](https://storage.googleapis.com/papyrus_images/a74712434d924477b4f0b10132d46f40e7fde74131b1922c2742e7809426d2dd.png)

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](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代码交互](https://mirror.xyz/0x7b52FD04cC45B26F5bdea1CD7c8c56A00A3F859B/O04bGQYMc6H7fhYiCBdbpOAJl_ygG50ehW6LQRsRsvg)
    
*   [aave gho稳定币项目代码交互教程](https://mirror.xyz/0x7b52FD04cC45B26F5bdea1CD7c8c56A00A3F859B/tdjYv4dEnsQry_U44kj0sbDa5htuRBYHpUf45w8v-qc)
    
*   [base 存款代码交互教程](https://mirror.xyz/0x7b52FD04cC45B26F5bdea1CD7c8c56A00A3F859B/IeEw0Qp3MYbwFZx111fi1J25Dm8JLcm6avEHv_72R-0)
    
*   [sui mint nft 代码交互教程](https://mirror.xyz/0x7b52FD04cC45B26F5bdea1CD7c8c56A00A3F859B/XHRTueAW7jk13TOHVdPchzkM38PnDxidsJqY2TCnqTQ)
    

我的 [推特](https://twitter.com/junjie9021) [Lens](https://lenster.xyz/u/0x049) [Link3](https://link3.to/junjie9021) [Github](https://github.com/junjie9021/simple-airdrop-demo)

---

*Originally published on [junjie9021](https://paragraph.com/@junjie9021-3/rpc-base)*
