由于 web3.py 在速度上无法满足我的需求,所以决定自己封装一下。
- JSON RPC API
- How to call a contract method using the eth_call JSON-RPC API
- Python用以太坊JSON-RPC请求对智能合约进行部署和交易
使用 curl 通过 rpc 进行访问
curl https://bsc-dataseed.binance.org/ -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest", false],"id":56}' -x 127.0.0.1:1087
注意看上面的引号。
使用 python 进行协程封装
由于 web3.py 的部分底层并不是协程,所以,想要发挥全部的方法,只能通过多线程。但是,多线程一个是不优雅,另一个就是耗费的资源过多,这里用协程自己封装一套 SDK。
这里仅仅举两个例子。后面看情况,要不要开源相关的轮子。
get_block_info
1 | import asyncio |
注意看 post
的传递数值的方式是 json
。
RPC 和自己的合约做交互
不耗费 gas 的 eth_call
生成 data
的其他方式请参考
使用 ganache
部署一个简单合约。
1 | // SPDX-License-Identifier: MIT |
这里假设合约地址是: 0x5CF5F2dAFDF7998D9085ffafF5beB1B2b6e4c13c
交互脚本为
1 | import requests |
ps: 2022-09-16
这里要提示一下,通过 json-rpc 调用返回的数据,需要自己进行解析,举一个简单的例子。
下面是我调用某一个合约返回的数据。
1 | 0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000cfcc03efdd344811f5a90000000000000000000000000000000000000000000000bff77b8447ab536e2400000000000000000000000000000000000000000000016ff8d994f69a7293c900000000000000000000000000000000000000000000000156abcf0f93ab3e4f |
进行拆开
1 | 0x |
然后根据你的合约情况进行相应的解析。
耗费 gas 的合约交互
1 | import json |
上述代码只是用来展示用,其主要是与 tomoon | cex2dex 合约再次优化 进行交互。
struct 进行交互
solidity
的代码如下
1 | pragma solidity ^0.8.4; |
交互如下
1 | import json |