Python智能合约开发指南(以太坊+web3py)
在以太坊上获得⼀个基本的智能合约是⼀个很简单的事,只需google查询“ERC20教程”,你会发现有关如何做到这⼀点的⼤量信息。以编程⽅式与合约交互完全是另⼀回事,如果你是⼀个Python程序员,那么教程就很少。所以写这个Python中的以太坊智能合约开发指南。
按我的统计对我们来说幸运的是,2017年Web3.py的第4版发布,这意味着现在⽐以往更容易运⾏python脚本并观察区块链上发⽣的神奇事情。像幽灵般的。
Piper Merriam,Jason Carver以及其他所有在Web3.py上努⼒⼯作以使我们其他⼈⽣活更轻松的⼈⼤声呼喊,在Sempo,我们正在使⽤以太坊来使灾难般的响应更加透明,⽽且它是只有Web3.py才能真正实现。
设置
⾸先我们进⾏设置,确保我们安装了相关的python库。
Python库⽆处不在,但它们的⽤途是什么?
有很多与以太坊相关的python库,但是当⼈们谈论以太坊时,有两个会出现很多:Web3.py和Pyethereum。乍⼀看,你应该使⽤哪⼀个并不明显。
Pyethereum
以太坊虚拟机(EVM)的Python实现。反过来,EVM是以太坊协议的⼀部分,它实际运⾏智能合约中的代码并确定其输出。因此,如果你想在Python中运⾏以太坊节点,那么Pyethereum是⼀个很好的起点。
即使你⾮常⾼兴在不运⾏⾃⼰的节点的情况下运⾏智能合约,Pyethereum仍然是⼀个很好的库,它包含许多功能,可以执⾏有⽤的功能,例如从私钥计算⽤户的地址等等。
Web3.py
⽤于实际与以太坊区块链交互的库。我们谈论的事情包括在账户之间转移以太⽹,发布智能合约以及触发附加现有智能合约的功能。它受到流⾏的JavaScript库Web3.js的启发,它将成为我们在本教程中使⽤的主库。
好的,少说多做!
起初我尝试使⽤Python3.5版本,但在运⾏时我遇到了问题,显然是由Python的类型提⽰造成的。基于Python3.6创建虚拟环境解决了这个问题,所以我建议你做同样的事情。
继续并pip-install (确保你获得版本4)。
除⾮你喜欢花钱,否则你需要在以太坊测试⽹上使⽤钱包,例如Ropsten和其他⼤量以太玩法。⼀个简单的⽅法是下载Chrome的扩展,并从那⾥创建⼀个新帐户。
image
确保你还选择左侧的'Ropsten Test Net'。
即使你的现有钱包中包含真正的以太币,我也强烈建议你为开发⽬的创建⼀个新的钱包。我们将使⽤私钥做⼀些相对⽆法预测的事,所以如果它们不⼩⼼变成公共主⽹络的话就不会有问题(公私钥?)
为新创建的钱包获取测试Ether⾮常简单:只需访问并点击“请求来⾃faucet的1个 以太”。对于我们将要做的事情,这应该是充⾜的。
最后,因为我们将在没有托管我们⾃⼰的节点的情况下使⽤Ropsten TestNet,我们需要⼀个可以连接Blockchain的供应商。适⽤于此,所以去那⾥创建⼀个免费帐户。记下Ropsten TestNet的提供者URL(看起来像)。
部署智能合约
使⽤Python来部署智能合约⽽不运⾏⾃⼰的节点是⾮常困难的,所以我们将在这⼀步上做点⼉⼿脚。对于许多智能合约⽤例,你只需要执⾏⼀次。
xml要用什么编辑正如我之前提到的,有关如何部署ERC20合约的百万条指南,因此我们将部署⼀些不同的(并且更⽅便地更短)。
问:谁喜欢在互联⽹上分享他们的意见?
⼤家都喜欢?
好答案。以下我称之为“Soap Box”肥皂盒的智能合约允许任何⼈向区块链⼴播他们想要的任何意见,在永恒的剩余时间(给予或接受)可以看到它。
但是有⼀个问题:只有⽀付了必要的0.02以太⽹费⽤的地址才能播出他们的意见。听起来不太公平,但就这样。
异步通信根据请求和回答的信号的撤销是否互锁分为,以太坊的在线代码编辑器⾮常出⾊,因此在那⾥创建⼀个新⽂件并粘贴以下代码。它是⽤Solidity(Smart 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 (in Wei)
//如果发送的值⼤于0.02 ether(在Wei中)
// 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];
}
oracle中instr函数用法// Read-only function that returns the current opinion
//返回当前意见的只读函数
function getCurrentOpinion() public view returns(string) {
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中创建。如果没有,只需刷新浏览器即可。
image
然后单击“create”创建。Metamask应该弹出⼀个弹出窗⼝,要求你确认交易。如果没有,只需打开Metamask扩展并在那⾥执⾏:
image
你将在Remix控制台底部收到⼀条消息,告知你合约的创建正在等待处理。单击链接以在Etherscan上查看其状态。如果刷新并且“To”收件⼈字段填充了合约地址,则合约已成功部署。
⼀旦你记下了合约地址,我们就该开始通过Web3.py与合约进⾏交互了。
jdk工具概述在我看来,有四种(半)⽅式可以与以太坊智能合约进⾏互动。最后两个(⼀半)经常混在⼀起,但差异很重要。我们已经看到了第⼀个:在区块链上部署智能合约。现在我们将介绍其余的python:
向合约发送以太:真正⾃我解释,将以太币从钱包发送到智能合约的地址。希望换取有⽤的东西。
调⽤函数:执⾏智能合约的只读功能以获取某些信息(例如地址的余额)。
与功能进⾏交易:执⾏智能合约的功能,该功能可以更改区块链的状态。
查看事件:查看由于先前的功能交易⽽发布到区块链的信息。
将以太币发送给合约
⼀些(但不是全部)智能合约包括“payable”应付功能。如果你将Ether发送到合约的地址,则会触发这些功能。⼀个典型的⽤例就是ICO:将以太送到合约中,然后返回给你的是。
⾸先,我们将从导⼊开始,创建⼀个新的web3对象,通过Infura.io连接到Ropsten TestNet。
import time
from web3 import Web3, HTTPProvider
contract_address = [YOUR CONTRACT ADDRESS]
wallet_private_key = [YOUR TEST WALLET PRIVATE KEY]
wallet_address = [YOUR WALLET ADDRESS]
w3 = Web3(HTTPProvider([YOUR INFURA URL]))
你可以在Metamask中的帐户名称旁边的菜单中到你的钱包私钥。因为我们使⽤的Web3.py的某些功能尚未经过完全审核以确保安全性,所以我们需要调⽤able_unaudited_features()来确认我们知道可能会发⽣问题的情况。我告诉过你我们⽤私钥做了⼀些危险的事情!
现在我们将编写⼀个函数,将以太币从我们的钱包发送到合约:
def send_ether_to_contract(amount_in_ether):
amount_in_wei = w3.toWei(amount_in_ether,'ether');
数据库索引超出范围怎么解决nonce = TransactionCount(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 = TransactionReceipt(txn_hash)
print(txn_receipt)
python在线编辑器python3time.sleep(10)
if txn_receipt is None:
return {'status': 'failed', 'error': 'timeout'}
return {'status': 'added', 'txn_receipt': txn_receipt}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论