通过命令行在Python中测量试验以太坊RPC客商端

本学科详细疏解怎样选用Python开拓以太坊应用,课程内容即涉及以太坊中的宗旨概念,比方账户管理、状态与贸易、智能合约开辟与互为、过滤器和事件等,同不时间也详细表明什么接收Python与以太坊实行互动,是Python程序员学习以太坊应用开荒的不二选项

实施二个开挖步骤

进行矿工以验证交易。

输入:

prev_balance_sen = client.get_balance(sending_address)prev_balance_rec = client.get_balance(receiving_address)

result = !geth --exec "miner.start();admin.sleepBlocks;miner.stop();" attachif result[0] != 'true': print('Fail: %s' % result[0])else: print("Mining finished!")

出口挖矿实现:

Mining finished!

输入:

print("Received %d"% (client.get_balance(receiving_address)-prev_balance_rec))

输出收到金额:

Received 12000000000

首先检查余额的出入,输入:

print("Difference of the sender %d"% (client.get_balance(sending_address)-prev_balance_sen))

输出:

Difference of the sender 4999999988000000000

对于采矿来说,矿工将获取采矿奖金。

输入:

mining_bonus = 5000000000000000000

要得到以太网发送的数目,大家须求减去采矿奖金。

输入:

print("Amount difference: %d" % int(client.get_balance(sending_address)-prev_balance_sen - mining_bonus))

出口金额差异:

Amount difference: -12000000000

======================================================================

分享部分以太坊、EOS、比特币等区块链相关的交互式在线编制程序实战教程:

  • python以太坊,首倘使指向python技术员使用web3.py举行区块链以太坊开拓的详解。
  • java以太坊支出教程,重假若对准java和android程序猿实行区块链以太坊付出的web3j详解。
  • php以太坊,重假诺介绍使用php实行智能合约开垦交互,实行账号创制、交易、转账、代币开荒甚至过滤器和贸易等内容。
  • 以太坊入门教程,重要介绍智能合约与dapp应用开拓,切合入门。
  • 以太坊支付进级教程,重假如介绍使用node.js、mongodb、区块链、ipfs完毕去大旨化电商DApp实战,符合进级。
  • C#以太坊,重要教师怎样使用C#支付基于.Net的以太坊应用,满含账户管理、状态与贸易、智能合约开荒与互动、过滤器和交易等。
  • EOS教程,本课程帮衬您火速入门EOS区块链去中央化应用的支出,内容包罗EOS工具链、账户与卡包、发行代币、智能合约开采与铺排、使用代码与智能合约交互等基本知识点,最终归咎应用各知识点达成多少个便签DApp的支付。
  • java比特币开采教程,本课程面向初读书人,内容即含有比特币的中央概念,举例区块链存储、去中央化共鸣机制、密钥与剧本、交易与UTXO等,同期也详细疏解怎样在Java代码中集成比特币补助功用,譬如制造地址、管理卡包、构造裸交易等,是Java程序猿博闻强记的比特币开拓学习课程。
  • php比特币开荒教程,本学科面向初学者,内容即含有比特币的宗旨概念,比如区块链存款和储蓄、边缘化共鸣机制、密钥与剧本、交易与UTXO等,同有时间也详细讲授怎样在Php代码中集成比特币扶植功用,比如创制地址、处理卡包、构造裸交易等,是Php程序猿博览群书的比特币开垦学习课程。
  • tendermint区块链开荒详解,本学科符合希望利用tendermint实行区块链开采的技术员,课程内容即包蕴tendermint应用开垦模型中的大旨概念,举个例子ABCI接口、默克尔(Merkel)树、多版本状态库等,也包括代币发行等丰盛的实际操作代码,是go语言程序猿急速入门区块链开采的一级选项。

汇智网原创翻译,转发请注解出处。这里是原版的书文在Python中动用以太坊RPC顾客端

编纂代码

代码特别轻易,你只须要成立一个相接变化地址的while循环,并依靠你的指标短语实行反省。那是比特币地址的代码:

from bitcoin import *target = input('Input Target Phrase\n>')priv = random_key()addr = pubtoaddr(privtopubwhile not addr.lower().startswith('1{}'.format: priv = random_key() addr = pubtoaddr(privtopubprint('Address: {}\nPrivate Key: {}'.format(addr, priv))

以太坊有个别分歧,因为它从未松手的即兴密钥生成器,所以您不得不导入os来变化随机数并运用SHA3来哈希它们以生成私钥。

别的,请留意,以太坊地点是十九进制的,只利用了字符a-f和0-9,由此你能够转变的地点类型受到节制。假诺输入的靶子不是十二进制,它将Infiniti循环,因为它世代不会转移包括非十八进制字符的地点。

from ethereum import utilsimport ostarget = input('Input Target Phrase\n>')priv = utils.sha3(os.urandomaddr = utils.checksum_encode(utils.privtoaddrwhile not addr.lower().startswith('0x{}'.format: priv = utils.sha3(os.urandom addr = utils.checksum_encode(utils.privtoaddrprint('Address: {}\nPrivate Key: {}'.format(addr, priv.hex

自家希望你对那个有点野趣!别的,请留心目的短语中的种种附加字符都会以指数方式加码浮动难度,由此请勿过长。

======================================================================

享用部分以太坊、EOS、比特币等区块链相关的交互式在线编制程序实战教程:

python以太坊,首倘使针对python程序猿使用web3.py进行区块链以太坊付出的详解。

  • java以太坊开采教程,首若是本着java和android程序猿进行区块链以太坊支出的web3j详解。
  • php以太坊,首假若介绍使用php举行智能合约开垦交互,实行账号成立、交易、转账、代币开垦以致过滤器和贸易等剧情。
  • 以太坊入门教程,首要介绍智能合约与dapp应用开垦,相符入门。
  • 以太坊付出进级教程,首要是介绍使用node.js、mongodb、区块链、ipfs达成去宗旨化电商DApp实战,切合进级。
  • C#以太坊,重要疏解怎么样使用C#开采基于.Net的以太坊应用,包蕴账户管理、状态与贸易、智能合约开拓与相互、过滤器和贸易等。
  • EOS教程,本课程扶助你迅速入门EOS区块链去中央化应用的费用,内容满含EOS工具链、账户与钱包、发行代币、智能合约开辟与布局、使用代码与智能合约交互等为主知识点,最后汇总接收各知识点完结三个便签DApp的花费。
  • java比特币开采教程,本课程面向初读书人,内容即含有比特币的主导概念,比如区块链存款和储蓄、去中央化共鸣机制、密钥与剧本、交易与UTXO等,同不经常候也详细讲明怎样在Java代码中集成比特币帮助效能,举例成立地址、管理钱包、构造裸交易等,是Java程序员超群轶类的比特币开垦学习课程。
  • php比特币开采教程,本课程面向初读书人,内容即含有比特币的中坚概念,比方区块链存储、去大旨化共鸣机制、密钥与剧本、交易与UTXO等,同有时候也详细疏解怎么样在Php代码中集成比特币协理效用,比如成立地址、处理钱包、构造裸交易等,是Php技术员博学睿智的比特币开荒学习课程。

汇智网原创翻译,转发请标记出处。这里是原来的小说怎么着用Python为以太坊和比特币生成设想地址

调用一个函数

大家正好向我们的智能合约发送了部分以太币,因而大家想检查大家的钱包地址是还是不是已被准予分享意见是有意义的。为此,大家在智能合约中定义了以下功效:

function isApproved(address _soapboxer) public view returns (bool approved) { return approvedSoapboxer[_soapboxer]; }

与python比较,那么些函数附带了众多附加的事物,比如证明类型。就算如此,那几个函数只需求一个地点(_soapboxer参数),在有效的哈希表/python
dict中追寻相应的许可布尔值并重返该值。

您调用的时候一个智能合约函数,以太坊节点将总计结果,并将其归来给你。这里的事务变得多少复杂:调用是只读的,那意味它们不会对区块链进行任何退换。要是上述函数包罗后生可畏行代码来记录数字时间,则检查地址是还是不是已获准:

approvedCheckedCount[_soapboxer] = approvedCheckedCount[_soapboxer] + 1

接下来,当调用该函数时,该节点将计算approvedCheckedCount的新值,但如果回到结果就撇下它。

作为只读的置换,函数调用不会开支你运转任何以太,由此你能够欢快地检讨帐户是或不是已被准许而不必要顾虑花费。

让我们跳回到大家的python文件的最上端并充分一些越多的装置代码。

import contract_abicontract = w3.eth.contract(address = contract_address, abi = contract_abi.abi)

您必要创造另一个名字为contract_abi的python文件。那将包蕴三个大的JSON消息字符串,Python必要与我们在智能合约中定义的函数举行互相,称为应用程序二进制接口。你能够在Remix中找到智能合约的ABI的JSON字符串:

  • 单击编写翻译“Compile”选项卡。
  • 单击详细新闻“Details”——应展现包罗一大波信息的方式。
  • 向下滚动到ABI部分,然后单击复制到剪贴板“Copy to clipboard”Logo。

将复制的字符串粘贴到contract_abi.py文件中,该文件应如下所示:

abi = """[ { A BIG LIST OF ABI INFO SPREAD ACROSS MULTIPLE DICTS }]""

咱俩增多到主python文件的另生龙活虎行今精灵用此ABI
JSON字符串并应用它来设置合约对象。假诺你浏览合约,你会注意到它包涵叁个函数属性,此中积存我们在智能合约中创立的四个函数。

前不久大家将创造三个python函数,该函数调用Smart Contract智能合约的isApproved函数来检查钦命的地址是或不是被准予分享意见。

def check_whether_address_is_approved: return contract.functions.isApproved.call()

那超短暂。

您未来能够运用它来检查你的卡包地址是或不是已获批准。假设你前边运营了send_ether_to_contract函数并发送了丰硕数量的以太,那么愿意您能回来true

python利用web3.py开拓以太坊应用dapp的实战教程:

交易

让大家从主机发送11个以太网到VPS,1 GWEI=0.000000001 Ether。

输入:

amount = 12 # Ethersending_address = addressreceiving_address = address_vps_one

输入:

from getpass import getpass pw = getpass(prompt='Enter the password for the sender: ')

输入:

command = r'geth --exec "personal.unlockAccount(\"%s\", \"%s\");" attach ' % (sending_address, pw)result = !$commandif result[0] != 'true': print('Fail: %s' % result[0])else: print('Account is unlocked!')

输出:

Account is unlocked!

tx_hash = client.send_transaction(to=receiving_address, _from=sending_address, value=amount * 10**9)

client.get_transaction_by_hash

输出:

{'blockHash': '0x0000000000000000000000000000000000000000000000000000000000000000', 'blockNumber': None, 'from': '0x8cf9deda0712f2291fb16739f8759e4a0a575854', 'gas': '0x15f90', 'gasPrice': '0x4a817c800', 'hash': '0x3d1a193ccfccc4e9ab2a411044069deeec2feef31a594bbf73726b463e8e90b4', 'input': '0x', 'nonce': '0xb', 'r': '0xe8698846a461938e800698fcc34570e0c4e9a3425f0bc441bf3e0716dab7b3e0', 's': '0x4fcd9bda8a1e98a7b0e8d953dec0cc733238c383d97393aa15c43963551f8daf', 'to': '0xc257beaea430afb3a09640ce7f020c906331f805', 'transactionIndex': '0x0', 'v': '0x42', 'value': '0x2cb417800'}

几方今,大家将编辑三个非常轻易的python脚本来生成虚荣地址,那一个地点是以某些短语或字母种类早先的加密钱币地址。该进程涉及生成私钥并检讨对象短语的地点,直到找到满足之处。

安顿智能合约

选取Python来布署智能合约而不运维本身的节点是非常不便的,所以大家就要这里一步上做轻便臂脚。对于许多智能合约用例,你只须要奉行二次。

正如我前边提到的,有关如何布署ERC20协议的百万条指南,由此大家将配备一些不及的。

问:什么人喜欢在互联网络享用他们的眼光?

大家都赏识?

好答案。以下笔者称之为“Soap
Box”肥皂盒的智能合约允许任什么人向区块链广播他们想要的其他意见,在一直的剩余时间能够看出它。

而是有二个标题:独有付出了必备的0.02以太网开销的地点能力热播他们的见解。听上去不太公平,但就这么。

Remix,以太坊的在线代码编辑器非常卓绝,由此在此创造多少个新文件并粘贴以下代码。它是用Solidity(SmartContracts的编制程序语言)编写的。如若代码未有太多意义并不根本,我们就要稍后详细介绍有关部分,但结尾那是一个Python教程。

pragma solidity ^0.4.0;contract SoapBox {// Our 'dict' of addresses that are approved to share opinions //我们批准分享意见的地址的“字典” mapping (address => bool) approvedSoapboxer; string opinion; // Our event to announce an opinion on the blockchain //我们的事件发布对区块链的意见 event OpinionBroadcast(address _soapboxer, string _opinion);// This is a constructor function, so its name has to match the contract //这是一个构造函数,所以它的名字必须与合约相匹配 function SoapBox() public { } // Because this function is 'payable' it will be called when ether is sent to the contract address. //因为这个函数是“支付”,所以当以太网被发送到合约地址时将被调用。 function() public payable{ // msg is a special variable that contains information about the transaction // msg是一个特殊变量,包含有关交易的信息 if (msg.value > 20000000000000000) { //if the value sent greater than 0.02 ether  //如果发送的值大于0.02 ether // then add the sender's address to approvedSoapboxer //然后将发件人的地址添加到approvedSoapboxer approvedSoapboxer[msg.sender] = true; } } // Our read-only function that checks whether the specified address is approved to post opinions. //我们的只读函数,用于检查指定地址是否被批准发布意见。 function isApproved(address _soapboxer) public view returns (bool approved) { return approvedSoapboxer[_soapboxer]; } // Read-only function that returns the current opinion //返回当前意见的只读函数 function getCurrentOpinion() public view returns { return opinion; }//Our function that modifies the state on the blockchain //我们的函数修改了区块链上的状态 function broadcastOpinion(string _opinion) public returns (bool success) { // Looking up the address of the sender will return false if the sender isn't approved //如果发件人未获批准,查找发件人的地址将返回false if (approvedSoapboxer[msg.sender]) { opinion = _opinion; emit OpinionBroadcast(msg.sender, opinion); return true; } else { return false; } }}

以下是Metamask变得分外有效的地点:假如您点击重新混音窗口右上角的“run”运转标签并在“Environment”景况下拉列表中筛选“Injected
Web3”注入的Web3,则“Account”帐户下拉列表中应填充你的帐户地址早在MetaMask中创制。若无,只需刷新浏览器就可以。

图片 1image

下一场单击“create”创立。Metamask应该弹出一个弹出窗口,须要你认可交易。若无,只需展开Metamask增添并在此边奉行:

图片 2image

你就要Remix调节台底部收到一条新闻,告知您合约的创设正在等候管理。单击链接以在Etherscan上查看其情景。即使刷新何况“To”收件人字段填充了合同地址,则合约已成功布署。

风姿浪漫旦你记下了公约地址,我们就该起来通过Web3.py与合同举办互相了。

在小编看来,有各种艺术可以与以太坊智能合约实行互动。最终五个平日混在联合,但差距很要紧。我们曾经见到了第三个:在区块链上配置智能合约。今后我们将介绍其余的python:

  • 向合约发送以太:真正自己演讲,将以太币从卡包发送到智能合约之处。希望换取有用的事物。
  • 调用函数:试行智能合约的只读成效以获得某个消息。
  • 与功用进行交易:实行智能合约的效应,该意义能够改进区块链的景色。
  • 翻开事件:查看由于原先的机能交易而发布到区块链的音信。

生机勃勃对智能合约富含“payable”应付功用。即使您将Ether发送到合同的地址,则会接触那些职能。叁个卓绝的用例正是ICO:将以太送到左券中,然后重回给你的是代币。

先是,大家将从导入开首,创立八个新的web3指标,通过Infura.io连接到Ropsten
TestNet。

import timefrom web3 import Web3, HTTPProvidercontract_address = [YOUR CONTRACT ADDRESS]wallet_private_key = [YOUR TEST WALLET PRIVATE KEY]wallet_address = [YOUR WALLET ADDRESS]w3 = Web3(HTTPProvider([YOUR INFURA URL]))w3.eth.enable_unaudited_features()

您能够在Metamask中的帐户名称旁边的菜单中找到你的卡包私钥。因为我们接受的Web3.py的有些功效还没通过完全审查以有限支撑安全性,所以大家必要调用w3.eth.enable_unaudited_features()来确认大家清楚也许会发生难点的图景。作者告诉过你大家用私钥做了有的高危的作业!

到现在大家将编写制定一个函数,将以太币从大家的钥匙包发送到合约:

def send_ether_to_contract(amount_in_ether): amount_in_wei = w3.toWei(amount_in_ether,'ether'); nonce = w3.eth.getTransactionCount(wallet_address) txn_dict = { 'to': contract_address, 'value': amount_in_wei, 'gas': 2000000, 'gasPrice': w3.toWei('40', 'gwei'), 'nonce': nonce, 'chainId': 3 } signed_txn = w3.eth.account.signTransaction(txn_dict, wallet_private_key) txn_hash = w3.eth.sendRawTransaction(signed_txn.rawTransaction) txn_receipt = None count = 0 while txn_receipt is None and (count < 30): txn_receipt = w3.eth.getTransactionReceipt print(txn_receipt) time.sleep if txn_receipt is None: return {'status': 'failed', 'error': 'timeout'} return {'status': 'added', 'txn_receipt': txn_receipt}

首先让我们回想一下交易字典txn_dict:它包括了概念大家发送给智能合约的交易所需的超越四分之一音信。

  • to:大家将以太送到哪儿(在这里种情景下是智能合约)。
  • Vaule:大家送多少钱单位wei。
  • gas:瓦斯是衡量在以太坊上施行交易的乘除专门的学问量度。在这里种状态下,大家钦命了我们愿意执行此交易的自然气量的上限。
  • gasPrice:大家愿意为每单位瓦斯支付多少钱。
  • Nonce:那是贰个地点nonce并不是更普及的办事评释。它只是发送地址所做的先前交易次数的计数,用于幸免再次费用。
  • Chain ID:每一种以太坊互联网都有投机的链ID:主网的ID为1,而Ropsten为3。你能够在那地找到更加长的列表。

关于瓦斯限定的飞速表达:有黄金年代对意义能够令你推外交关系破裂易将接受多少瓦斯。然而,笔者发觉选用范围的精品方式是总结出你愿意支付多少钱,然后再让交易退步,然后再去做。

借使大家定义了贸易的重大片段,我们就能够动用大家钱袋的私钥对其进行签名。然后它就能够发送到网络了,大家将使用sendRawTransaction方法。

在矿工决定将其富含在多少个区块中在此以前,大家的交易实际不会实现。平时来说,你为各样单位支付的费用Gas(记住我们的石脑原油的价格格参数)决定了二个节点调整将你的贸易包罗在一个区块中的速度。

图片 3image

那个时候间延缓意味着交易是异步的。当我们调用sendRawTransaction时,大家会立时获得贸易的当世无双哈希值。你能够任何时候使用此哈希来查询你的交易是不是已满含在块中。大家知道,当且仅当我们能够赢得贸易小票时才将交易拉长到区块链中(因为具备好的选购都包蕴收据吗?)。这就是干吗大家创造循环来准时检查大家是还是不是有小票:

 txn_receipt = None count = 0 while txn_receipt is None and (count < 30): txn_receipt = w3.eth.getTransactionReceipt print(txn_receipt) time.sleep

值得注意的是,交易能够加上到区块链中,但照旧因各个缘由而未果,例如未有丰盛的瓦斯。

这便是将以太符号发送给合约的Python代码。让大家快速回想一下大家在Solidity中写的敷衍函数:

function() public payable{ if (msg.value >= 20000000000000000) { approvedSoapboxer[msg.sender] = true; } }

Msg是智能合约中的一个独具一格变量,当中蕴含关于发送到智能合约的贸易的信息。在此种气象下,我们采用msg.value,它交给了贸易中发送的Ether数量(在Wei实际不是raw
Ether中)。同样,msg.sender提交了开展交易的钱包的地址:假设已经发送了足足的以太币,我们会将其增多到已批准帐户的字典中。

继承运营send_ether_to_contract函数。希望您能接过回执。你还足以通过在Etherscan的Ropsten
Network部分查找你的卡包地址来检查交易是不是做到。大家将要下风流洒脱节中得到Python中的越多消息。

python以太坊

输入:

安装包

先是,大家需求设置一些方可举办计算的软件包,以便从私钥生成有效的集体地址。要扭转比特币地址,要求转到终端并输入下边施命发号安装比特币:

pip install bitcoin

要生成以太坊地址,你要求经过输入上面三令五申来设置以太坊:

pip install ethereum

与函数交易

大家正在与智能合约举行最后的根本互动:广播意见。再叁次,大家来探视大家的Solidity
Code:

function broadcastOpinion(string _opinion) public returns (bool success) { if (approvedSoapboxer[msg.sender]) { opinion = _opinion; emit OpinionBroadcast(msg.sender, opinion); return true; } else { return false; } }

此间未有何样新东西:大家使用传入的_opinion参数并行使它来安装全局变量意见。(假如你愿意,能够由此getter函数查询实习生)。有一条线有一点不一样:

emit OpinionBroadcast(msg.sender, opinion)

我们一点也不慢就能够介绍。

当你通过交易与智能合约的机能扩充交互时,功效对智能合约状态所做的其他更动都会在区块链上表露。为了换取这种特权,你必须向矿工支付部分的以太量。Python时间:

def broadcast_an_opinion: nonce = w3.eth.getTransactionCount(wallet_address) txn_dict = contract.functions.broadcastOpinion.buildTransaction({ 'chainId': 3, 'gas': 140000, 'gasPrice': w3.toWei('40', 'gwei'), 'nonce': nonce, }) signed_txn = w3.eth.account.signTransaction(txn_dict, private_key=wallet_private_key) result = w3.eth.sendRawTransaction(signed_txn.rawTransaction) tx_receipt = w3.eth.getTransactionReceipt count = 0 while tx_receipt is None and (count < 30): time.sleep tx_receipt = w3.eth.getTransactionReceipt print(tx_receipt) if tx_receipt is None: return {'status': 'failed', 'error': 'timeout'} processed_receipt = contract.events.OpinionBroadcast().processReceipt(tx_receipt) print(processed_receipt) output = "Address {} broadcasted the opinion: {}"\ .format(processed_receipt[0].args._soapboxer, processed_receipt[0].args._opinion) print return {'status': 'added', 'processed_receipt': processed_receipt}

那件事实上与将Ether发送到智能合约时采取的经过相似。大家将创制并签订一个贸易,然后将其发送到互联网。再一遍,交易是异步的,那意味着不管函数应诉知在Solidity代码中回到什么,你实际获得的东西总是交易的哈希。

出于交易自身并从未回去任何有效的新闻,我们要求别的东西。这致使大家运用末段情势与智能合约实行互动。

相关文章