python通过testrpc访问以太坊数据入门
来源:互联网 发布:今日热点是什么软件 编辑:程序博客网 时间:2024/05/29 12:16
搭建基于python的以太坊客户端和testrpc的开发环境
系统:Ubuntu 16.04
1.安装nodejs
testrpc的安装需要使用nodejs中的npm命令。所以要先安装nodejs。
下载:
nodejs官网:http://www.nodejs.org/
从官网上找到对应的版本下载。笔者编写本文时最新的ubuntu64位版本为6.11.0.
依赖安装:
安装nodeJS之前,如果没有安装g++及 libssl-dev,则先要安装好,安装方法如下:
$ sudo apt-get install g++
$ sudo apt-get install libssl-dev
nodejs安装:
tar -xvf node-v6.11.0-linux-x64.tar.xz
为node和npm建立两个软连接,使之可以全局运行:
ln –s 解压后nodejs文件夹路径/bin/node /usr/local/bin/nodeln –s 解压后nodejs文件夹路径/bin/npm /usr/local/bin/npm
验证:
node –v: 可显示nodejs版本
npm-v:可显示npm版本
2.安装testrpc
testrpc是在本地使用内存模拟的一个以太坊环境,对于开发调试来说,更为方便快捷。
安装Ethereum客户端来支持JSON RPC API调用开发环境,推荐使用EthereumJS。
安装命令:sudo npm install -g ethereumjs-testrpc
3.安装基于python的以太坊客户端
sudo apt install python-pipsudo pip install ethereumsudo pip install ethjsonrpcsudo pip install sha3
通过testrpc访问以太坊数据
ethjsonrpc
ethjsonrpc的github地址:https://github.com/ConsenSys/ethjsonrpc
ethjsonrpc是使用JSON-RPC接口的python以太坊客户端,项目正在开发中,其中实现的接口并不稳定,一些尚需测试。
ethjsonrpc源文件的client.py文件中实现了jsonrpc的一些接口,为了方便我们可以在client.py定义的类中直接添加方法创建我们自己的api。
实现接口:
1.write_json :向链上传递一个json字典
用到的jsonrpc api:
eth_sendTransaction:它可以创建一个携带信息的交易。
访问https://github.com/ethereum/wiki/wiki/JSON-RPC可以了查看接口的参数
我们只需用到其中的from,to和data就可以实现向链上传输数据,返回交易的hash。接口代码如下:
def write_json(self, from_, address, data): tran_hash = self.eth_sendTransaction(from_address=from_,to_address=address,data=data) return tran_hash
2.read_json_from_address:给定一个接收地址,读取该接收地址中所有transaction携带的json,返回jsonlist。
用到的jsonrpc api:
eth_blockNumber:返回最近的区块号
eth_getBlockTransactionCountByNumber:通过区块号返回此区块的交易数
eth_getTransactionByBlockNumberAndIndex:通过区块号和交易序号返回交易信息
其中eth_getBlockTransactionCountByNumber接口调用出现错误,查看源文件中此方法的定义:
发现在该方法返回时将结果从16进制转换成十进制,而得到的结果本来就是十进制的,所以报错。我们只需将方法的最后一行去掉hex_to_dec函数,变为return self._call('eth_getBlockTransactionCountByNumber', [block])就可正常调用。
api实现方法:
遍历每一个block中的每一个交易,判断交易信息中的接收地址与传入的接收地址是否相同,相同就将该交易携带的信息提取出来。
接口代码:
def read_json_from_address(self,toaddr): latestblocknum = self.eth_blockNumber() jsonlist = [] for i in xrange(1,latestblocknum+1): tran_count = self.eth_getBlockTransactionCountByNumber(i) for index in xrange(tran_count): traninfo = self.eth_getTransactionByBlockNumberAndIndex(i,index) if traninfo['to'] == toaddr: inp = traninfo.get('input')[2:].decode('hex')[2:] inp_json = json.loads(inp) jsonlist.append(inp_json) return jsonlist
测试接口
from myapi import EthJsonRpc #将接口文件放在myapi文件下import json compiled = '606060405261020f806100136000396000f30060606040526000357c01000000000000000000000000000000000000000000000000000000009004806375d74f3914610044578063e7aab290146100bd57610042565b005b61004f600450610191565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f1680156100af5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61010d6004803590602001906004018035906020019191908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050905061010f565b005b806000600050908051906020019082805482825590600052602060002090601f01602090048101928215610160579182015b8281111561015f578251826000505591602001919060010190610141565b5b50905061018b919061016d565b80821115610187576000818150600090555060010161016d565b5090565b50505b50565b60206040519081016040528060008152602001506000600050805480601f0160208091040260200160405190810160405280929190818152602001828054801561020057820191906000526020600020905b8154815290600101906020018083116101e357829003601f168201915b5050505050905061020c565b9056'c = EthJsonRpc('127.0.0.1', 8545) contract_tx = c.create_contract(c.eth_coinbase(), compiled, gas=300000) #创建合约contract_addr = c.get_contract_address(contract_tx) #合约地址json1 = json.dumps({'c':'x'})json2 = json.dumps({'a':3})json3 = json.dumps({'b':5})c.write_json(c.eth_coinbase(), contract_addr, json1) #传入json数据c.write_json(c.eth_coinbase(), contract_addr, json2)c.write_json(c.eth_coinbase(), contract_addr, json3)print c.read_json_from_address(contract_addr) #读取传入合约地址的所有json数据输出:[{u'c': u'x'}, {u'a': 3}, {u'b': 5}]
- python通过testrpc访问以太坊数据入门
- web3通过testrpc访问以太坊数据入门
- 以太坊开发--truffle和testrpc使用介绍
- 以太坊开发--阿里云ECS(centOS 6.8)安装Ethereum TestRPC
- Blockchain学习2_以太坊开发--truffle和testrpc使用介绍
- 以太坊开发--geth的使用入门
- 以太坊开发--geth的使用入门
- 【动态】以太坊上海协定—通过Cosmos网络实现以太坊扩容协议
- 以太坊上海协定—通过Cosmos网络实现以太坊扩容协议
- 微软公司确定通过以太坊首次推出区…
- 以太坊
- 以太坊连载(十):以太坊GO、JAVA、PYTHON、RUBY、JS客户端介绍
- 通过python多线程访问网页
- Python 通过代理访问网络
- python 通过happybase 访问hbase
- 区块链实践(二) 以太坊Geth入门操作
- 以太坊从入门到跑路(一)私有链搭建
- 开发者快速入门以太坊代币开发底层构架
- DataTables warning (table id = 'IDTableName'): Cannot reinitialise DataTable
- yii2.0高级框架配置时打开init.bat秒退的解决方法
- POJ 2918 Tudoku 【DFS】
- gitingnore忽略提交文件配置
- JSTL标签
- python通过testrpc访问以太坊数据入门
- 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
- c++输入函数小结
- 牛客网-华为在线编程-009-提取不重复的整数(字符串)
- Thread源码分析和小结
- 案例 | 巴别鸟为弘睿构建企业知识库
- 深入解析AIDL的实现:Messenger
- express 热部署,修改不重新启动
- SQL(高级查询)