hg888皇冠手机登录

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

三月 27th, 2019  |  www.hg888.com

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

预备条件

为以太坊安装Python XC90PC客户端,输入:

jitsejan@jjvps:~$ pip install ethereum-rpc-client

输入:

jitsejan@jjvps:~$ geth --networkid 23 --nodiscover --maxpeers 0 --port 30333 --rpc

输入:

!geth account list

输出:

Account #0: {8cf9deda0712f2291fb16739f8759e4a0a575854} keystore:///home/jitsejan/.ethereum/keystore/UTC--2017-05-01T14-58-43.532247863Z--8cf9deda0712f2291fb16739f8759e4a0a575854

输入:

from eth_rpc_client import Clientclient = Client(host="127.0.0.1", port="8545")

输入:

import pdirpdir

输出:

abstract class: __subclasshook__attribute access: __delattr__, __dir__, __getattribute__, __setattr__class customization: __init_subclass__object customization: __format__, __hash__, __init__, __new__, __repr__, __sizeof__, __str__other: _coinbase_cache, _coinbase_cache_til, _nonce, async_timeout, host, is_async, port, request_queue, request_thread, results, sessionpickle: __reduce__, __reduce_ex__rich comparison: __eq__, __ge__, __gt__, __le__, __lt__, __ne__special attribute: __class__, __dict__, __doc__, __module__, __weakref__descriptor: default_from_address: @property with getter, Cache the coinbase address so that we don't make two requests for everyfunction: _make_request: call: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_call construct_json_request: get_accounts: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_accounts get_balance: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getbalance get_block_by_hash: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getblockbyhash get_block_by_number: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getblockbynumber get_block_number: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_blocknumber<F37> get_code: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getcode get_coinbase: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_coinbase get_filter_changes: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getfilterchanges get_filter_logs: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getfilterlogs get_gas_price: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_gasprice get_logs: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getlogs get_max_gas: get_nonce: get_transaction_by_hash: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_gettransactionbyhash get_transaction_receipt: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_gettransactionreceipt make_request: new_block_filter: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_newblockfilter new_filter: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_newfilter new_pending_transaction_filter: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_newpendingtransactionfilter process_requests: Loop that runs in a thread to process requests synchronously. send_transaction: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sendtransaction uninstall_filter: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_uninstallfilter wait_for_block: wait_for_transaction: 

输入:

address = client.get_coinbase()address

输出:

0x8cf9deda0712f2291fb16739f8759e4a0a575854

输入:

client.get_balance

输出:

135000419895999999940

输入:

address_vps_one = "0xc257beaea430afb3a09640ce7f020c906331f805"address_vps_two = "0xe86ee31b7d32b743907fa7438c422a1803717deb"client.get_balance(address_vps_one)client.get_balance(address_vps_two)

输出:

699916006000000000083000420044000000060

编写制定代码

代码10分简单,你只必要创设一个不停转变地址的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,因而你可以变更的地点类型受到限制。借使输入的对象不是十六进制,它将最为循环,因为它永远不会转移包括非十六进制字符的地点。

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为以太坊和比特币生成虚拟地址

事件events

自小编将事件称为与智能合约交互的“百分之五十”格局,因为从技术上讲,它们是由交易产生的。
事件是智能合约以不难阅读的方式在区块链上记下事物的办法,它们大多只是一组可以利用一定交易的收据查找的值。大家在智能合约的最顶层概念了叁个:

event OpinionBroadcast(address _soapboxer, string _opinion);

接下来,当大家利用broadcastOpinion函数时,大家利用它向区块链发出音信。

将交易增进到块后,你能够运用交易哈希查询区块链以寻找OpinionBroadcast事件时有爆发的特定值。那是大家在函数broadcast_an_opinion中的最终一点python代码。你会注意到我们供给事件产生的音信存款和储蓄在’args’属性中。

以此事件非常理解。实际上,任何人都足以轻松利用Etherscan或近似工具来查阅智能合约发出的保有事件的日记。

图片 1image

Etherscan会自动检查和测试“Transfer”转移事件并列出全部事件。Nifty

假诺您早就实现那或多或少,你就有权发布意见。继续用你挑选的眼光运营broadcast_an_opinion

假如一切顺遂进行,你应有不慢就会吸收已处理的收据,以及已放入区块链的OpinionBroadcast事件的打印输出。

Nice。

那是共同体的python代码:

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()contract = w3.eth.contract(address = contract_address, abi = contract_abi.abi)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}def check_whether_address_is_approved: return contract.functions.isApproved.call()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}if __name__ == "__main__": send_ether_to_contract is_approved = check_whether_address_is_approved(wallet_address) print(is_approved) broadcast_an_opinion('Despite the Constant Negative Press')

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中应用以太坊奥迪Q3PC客户端

安装包

率先,大家须要安装一些足以执行计算的软件包,以便从私钥生成有效的共用地址。要转变比特币地址,须求转到终端并输入下面发号施令安装比特币:

pip install bitcoin

要生成以太坊地址,你供给通过输入上面发号施令来设置以太坊:

pip install ethereum

设置

先是大家进行安装,确定保证我们设置了连带的python库。

Python库无处不在,但它们的用途是怎么着?

有成都百货上千与以太坊休戚相关的python库,然则当人们议论以太坊时,有八个会油不过生众多:Web3.py和Pyethereum。乍一看,你应有利用哪2个并不显明。

以太坊虚拟机的Python达成。反过来,EVM是以太坊合计的一有的,它事实上运作智能合约中的代码并规定其出口。由此,假若你想在Python中运作以太坊节点,那么Pyethereum是一个很好的起点。

就算你相当的热情洋溢在不运转本人的节点的意况下运作智能合约,Pyethereum仍旧是3个很好的库,它含有众多功用,可以推行有用的效果,例如从私钥总括用户的地址等等。

用以实际与以太坊区块链交互的库。我们商量的作业包含在账户之间转换以太网,公布智能合约以及触发附加现有智能合约的功效。它受到流行的JavaScript库Web3.js的诱导,它将变成大家在本教程中选取的主库。

开局我尝试利用Python3.5版本,但在运维时本人遇见了难点,显著是由Python的门类提醒造成的。基于Python3.6开立虚拟环境消除了这么些题材,所以笔者提出您做相同的工作。

继续并pip-install web3 。

唯有你喜欢花钱,不然你须求在以太坊测试网上使用钱包,例如Ropsten和别的多量以太玩法。八个简短的法门是下载Chrome的Metamask扩大,并从那边创造三个新帐户。

图片 2image

保险您还挑拣左侧的’Ropsten Test Net’。

就算你的依存钱包中蕴藏真正的以太币,小编也强烈提议你为支付目标创造2个新的腰包。大家将采取私钥做一些相对无法预测的事,所以一旦它们十分的大心变成公共主网络的话就不会不经常

为新创造的钱包获得测试Ether非凡不难:只需访问faucet.metamask.io并点击“请求来自faucet的3个以太”。对于大家将要做的事体,那应该是取之不尽的。

最后,因为我们将在未曾托管我们和好的节点的景况下选择Ropsten TestNet,大家须求二个足以连接Blockchain的供应商。Infura.io适用于此,所以去那边创设二个免费帐户。记下Ropsten
TestNet的提供者UENCOREL(看起来像

本学科详细讲解怎样利用Python开发以太坊应用,课程内容即涉及以太坊中的主题概念,例如账户管理、状态与交易、智能合约开发与相互、过滤器和事件等,同时也详细表达如何使用Python与以太坊举办互动,是Python工程师学习以太坊应用开发的不二选项

交易

让我们从主机发送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'}

后日,大家将编写制定3个万分简单的python脚本来生成虚荣地址,这几个地址是以某些短语或字母系列早先的加密货币地址。该进度涉及生成私钥并检讨对象短语的地址,直到找到如意的地点。

配备智能合约

利用Python来配置智能合约而不运行本人的节点是那个勤奋的,所以大家将在这一步上做简双手脚。对于众多智能合约用例,你只供给进行叁遍。

正如小编事先涉嫌的,有关如何布置E奥迪Q7C20合同的百万条指南,因而大家将计划一些比不上的。

问:什么人喜欢在网络上享受他们的见解?

大家都爱不释手?

好答案。以下作者叫作“Soap
Box”肥皂盒的智能合约允许任哪个人向区块链广播他们想要的此外看法,在定位的剩余时间能够见见它。

然而有三个难点:唯有付出了须要的0.02以太网费用的地方才能热映他们的意见。听起来不太公平,但就好像此。

Remix,以太坊的在线代码编辑器格外精良,由此在那里创制三个新文件并粘贴以下代码。它是用Solidity(斯马特Contracts的编制程序语言)编写的。假使代码没有太多意义并不主要,大家将在稍后详细介绍相关部分,但最终那是一个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中创建。假若没有,只需刷新浏览器即可。

图片 3image

下一场单击“create”创立。Metamask应该弹出七个弹出窗口,供给您肯定交易。如若没有,只需打开Metamask扩充并在那边执行:

图片 4image

您将在Remix控制台尾部收到一条消息,告知您合约的创始正在等待处理。单击链接以在Etherscan上查看其情形。如若刷新并且“To”收件人字段填充了合约地址,则合约已成功布置。

万一您记下了合约地址,大家就该起来通过Web3.py与合同实行交互了。

在笔者眼里,有三种艺术得以与以太坊智能合约举行互相。最终七个常常混在共同,但差异很要紧。大家曾经看到了第三个:在区块链上配置智能合约。今后大家将介绍任何的python:

  • 向合约发送以太:真正自笔者演说,将以太币从钱包发送到智能合约的地点。希望换取有用的事物。
  • 调用函数:执行智能合约的只读功用以得到有个别新闻。
  • 与成效实行贸易:执行智能合约的效应,该意义能够更改区块链的处境。
  • 翻开事件:查看由于从前的法力交易而公布到区块链的音讯。

一对智能合约包含“payable”应付作用。借使你将Ether发送到合同的地址,则会触发那么些意义。四个金榜题名的用例就是ICO:将以太送到合同中,然后再次来到给您的是代币。

第2,大家将从导入起头,创设三个新的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方法。

在矿工决定将其富含在3个区块中以前,我们的交易实际不会形成。一般而言,你为各样单位支付的耗费Gas(记住大家的重油价格参数)决定了一个节点控制将你的贸易包括在二个区块中的速度。

图片 5image

此时间延迟意味着交易是异步的。当大家调用sendRawTransaction时,大家会应声赢得贸易的绝无仅有哈希值。你能够每一天使用此哈希来查询你的贸易是或不是已包罗在块中。我们精通,当且仅当大家能够赢得贸易收据时才将交易增进到区块链中(因为具备好的购买都包罗收据吗?)。这就是为什么我们创制循环来定期检查大家是还是不是有收据:

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

值得注意的是,交易能够增进到区块链中,但依旧因各个原由此输球,例如没有丰盛的gas。

那正是将以太符号发送给合约的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中的更加多消息。

标签:, , , , , , , ,

Your Comments

近期评论

    功能


    网站地图xml地图