在以太坊上获得一个基本的智能合约是一个很简单的事,只需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 web3 (确保你获得版本4)。
除非你喜欢花钱,否则你需要在以太坊测试网上使用钱包,例如Ropsten和其他大量以太玩法。一个简单的方法是下载Chrome的Metamask扩展,并从那里创建一个新帐户。
确保你还选择左侧的’Ropsten Test Net’。
即使你的现有钱包中包含真正的以太币,我也强烈建议你为开发目的创建一个新的钱包。我们将使用私钥做一些相对无法预测的事,所以如果它们不小心变成公共主网络的话就不会有问题(公私钥?)
为新创建的钱包获取测试Ether非常简单:只需访问faucet.metamask.io并点击“请求来自faucet的1个 以太”。对于我们将要做的事情,这应该是充足的。
最后,因为我们将在没有托管我们自己的节点的情况下使用Ropsten TestNet
,我们需要一个可以连接Blockchain的供应商。Infura.io适用于此,所以去那里创建一个免费帐户。记下Ropsten TestNet的提供者URL(看起来像https://ropsten.infura.io/FE2Gfedcm3tfed3)。
部署智能合约
使用Python来部署智能合约而不运行自己的节点是非常困难的,所以我们将在这一步上做点儿手脚。对于许多智能合约用例,你只需要执行一次。
正如我之前提到的,有关如何部署ERC20合约的百万条指南,因此我们将部署一些不同的(并且更方便地更短)。
问:谁喜欢在互联网上分享他们的意见?
大家都喜欢?
好答案。以下我称之为“Soap Box”肥皂盒的智能合约允许任何人向区块链广播他们想要的任何意见,在永恒的剩余时间(给予或接受)可以看到它。
但是有一个问题:只有支付了必要的0.02以太网费用的地址才能播出他们的意见。听起来不太公平,但就这样。
Remix,以太坊的在线代码编辑器非常出色,因此在那里创建一个新文件并粘贴以下代码。它是用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 re