Linux服务器

推荐列表 站点导航

当前位置:首页 > 服务器技术 > Linux服务器 >

python通过estrpc访问以太坊数据入门

来源:网络整理  作者:wy  发布时间:2020-12-24 11:40
搭建基于python的以太坊客户端和testrpc的开发环境 系统:Ubuntu 16.04 1.安装nodejs testrpc的安装需要使用nodejs中的npm命令。...

搭建基于python的以太坊客户端和testrpc的开发环境

系统:Ubuntu 16.04

 

1.安装nodejs

testrpc的安装需要使用nodejs中的npm命令。所以要先安装nodejs。

下载:

nodejs官网:

从官网上找到对应的版本下载。笔者编写本文时最新的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/node  

ln –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,显示如下

python通过estrpc访问以太坊数据入门

证明安装成功。

 

3.安装基于python的以太坊客户端

sudo apt install python-pip  

sudo pipinstall ethereum  

sudo pip install ethjsonrpc  

sudo 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接口调用出现错误,查看源文件中此方法的定义:

python通过estrpc访问以太坊数据入门

发现在该方法返回时将结果从16进制转换成十进制,而得到的结果本来就是十进制的,所以报错。我们只需将方法的最后一行去掉hex_to_dec函数,变为return self._call('eth_getBlockTransactionCountByNumber', [block])就可正常调用。

python通过estrpc访问以太坊数据入门

 

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 = '606060405261020f806100136000396000f30060606040526000357c01000XX'  

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}]

相关热词:

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://v30.fanwenzhu.com/server/fwq/8512.shtml

相关文章
Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

python通过estrpc访问以太坊数据入门

2020-12-24 编辑:wy

搭建基于python的以太坊客户端和testrpc的开发环境

系统:Ubuntu 16.04

 

1.安装nodejs

testrpc的安装需要使用nodejs中的npm命令。所以要先安装nodejs。

下载:

nodejs官网:

从官网上找到对应的版本下载。笔者编写本文时最新的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/node  

ln –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,显示如下

python通过estrpc访问以太坊数据入门

证明安装成功。

 

3.安装基于python的以太坊客户端

sudo apt install python-pip  

sudo pipinstall ethereum  

sudo pip install ethjsonrpc  

sudo 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接口调用出现错误,查看源文件中此方法的定义:

python通过estrpc访问以太坊数据入门

发现在该方法返回时将结果从16进制转换成十进制,而得到的结果本来就是十进制的,所以报错。我们只需将方法的最后一行去掉hex_to_dec函数,变为return self._call('eth_getBlockTransactionCountByNumber', [block])就可正常调用。

python通过estrpc访问以太坊数据入门

 

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 = '606060405261020f806100136000396000f30060606040526000357c01000XX'  

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}]

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://v30.fanwenzhu.com/server/fwq/8512.shtml

相关文章

风云图片

推荐阅读

返回Linux服务器频道首页