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
命令行中输入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}]



参考链接:http://blog.csdn.net/wo541075754/article/details/53125593


阅读全文
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 刚生的小狗没奶怎么办 家兔在笼子里下崽怎么办 小兔子不吃东西 精神不好怎么办 兔子要生宝宝了怎么办 宝宝让兔子咬了怎么办 兔子的右耳坏了怎么办 被小兔子咬了怎么办 打老鼠被老鼠咬了了怎么办 制作棒棒糖时木棍翘起怎么办 兔子被打后怕我怎么办 兔子后腿摔断了怎么办 兔子腿骨头断了怎么办 减肥老是控制不住吃怎么办 不爱吃主食爱吃零食怎么办 猫咪奶涨的很硬怎么办 斩魂技能乱加的怎么办 狗狗不吃东西还拉稀怎么办 狗狗拉稀不吃饭怎么办 狗狗几天不吃东西怎么办 狗狗不吃不喝怎么办 拖鞋洗了有臭味怎么办 拖鞋湿水了很臭怎么办 棉被上渗了酸奶怎么办 酸奶弄在衣服上怎么办 孩子把褥子尿湿怎么办 小孩尿过的褥子怎么办 包包放着发霉了怎么办 被套盖久了发黄怎么办 小白鞋里面发霉怎么办 棉被淋了一点雨怎么办 苹果手机被拉进电话群怎么办 墙上的插座烧了怎么办 富士康早退4分钟怎么办 我老婆起泡疹腿剌痛睡不着了怎么办 oppo耳机孔坏了怎么办 魅族耳机口坏了怎么办 控制线的报验资料怎么办 人失踪报警派出所不管怎么办 铁板的货架久了怎么办 干镀锌让环保查了怎么办 水管软管生锈了拧不动怎么办