Python开发人员对于以太坊和区块链库的技术练习。
警告:下面的教程包含这些元素:显式加密、点对点金融服务以及可能的违规行为。这些例子仅仅是为了说明Python区块链的强大功能和便捷性。
嗨,Pythoners,你们好!
我真的很喜欢Python社区。像很多人一样,Python是我的第一种编程语言。Python hackathon和它的meet-up非常棒。而且此外,我喜欢Monty Python(https://pythonspamclub.com/monty-python-and-programming-language/)!
我正在将热爱的东西与目前的工作结合在一起:向开发人员展示区块链编程的强大功能,以及这些技能是多么容易掌握。
这是一个向Python开发人员介绍Web3.py(一个区块链/以太坊库)的基础知识的教程。我们将在Python解释器中做很多事情。(在下一节中,我们将给出一个合适的目录。但现在,让我们放轻松!)
注意:出于安全原因,我们将通过测试网络进行汇款。所有这些技术都可以在主要的以太坊网络上使用。
目录
·安装
·建立连接
·初始化
·创建一个帐户
·ENS帐户
·汇款
安装
我们将使用pip,用命令行安装web3.py:
对于同时安装了Python 2和3的用户,您应该检查一下使用哪个版本的pip命令。某些默认的是2.7:
另外,如果您使用的是virtualenv,这里还有一些为Web3.py设置环境的文档(https://web3py.readthedocs.io/en/stable/troubleshooting.html#setup-environment)。
很好!我们已经开始了。
建立我们的连接
区块链系统是分散的网络,由运营专门的P2P软件或“节点”的人员组成。它类似于torrent网络:为了与网络交互,您必须托管一个节点,或使用相关的托管服务。
由于这是基础教程,因此我们将使用托管服务。最受欢迎的是Infura。您可以设置自己的免费帐户(说明见https://blog.infura.io/getting-started-with-infura-28e41844cc89/),也可以使用下面的产品ID。获取项目ID和API端点至关重要——这将是我们通往区块链的API端点,并且用于分析的仪表盘也很有帮助。
复制这里的Endpoint,并确保在地址前添加https://。
一旦有了它,您就可以用Python连接区块链了!
初始化
让我们启动Python解释器。具体操作取决于您安装的Python,输入你通常运行Python脚本时在脚本名称前面的部分就可以了。对于我的Mac iTerm来说,它同时安装了Python 2和3,是下面这样的:
为了检查我们的所有设置是否正确,请运行python解释器和以下命令:
上面的命令导入了一些web3.py中的主要方法,我们要用这些方法连接区块链,它还导入了内置的json。
接下来,我们将创建一个对象(w3),我们将使用Infura API端点(以https://开头)对其进行初始化。在本教程接下来的部分中,它将成为web3.py与区块链协作的主要方式。
注意:您需要在Infura API地址前面添加HTTPS://,否则会出现错误!
我们还需要添加一些中间件来帮助我们使用Infura和Rinkeby测试网:
现在,为了查看一切是否顺利,我们运行:
如果您得到True的结果,恭喜!您已连接到区块链!
如果您得 False的结果,可以检查以下事项:
1.如果您需要重新启动解释器,那么必须重新导入库,并且重新初始化变量
2.您是否正确复制了Infura API密钥?
3.您是否安装了web3.py?是否安装并导入了Web3和HTTPProvider?
4.您是否已在API密钥前面加上https://?
创建一个帐户
如果我们想在区块链上汇款,我们需要一个以太坊账户。以太坊账户是以太坊区块链上的主要身份单位——账户的地址用于网络对用户的识别。帐户系统的基础是基于公钥加密的分散身份协议。本质上来说,区块链网络上的身份是通过公共地址对应方(由网络持有)对单个私钥(由用户秘密持有)的数字签名进行身份验证来确认的。尽管它带来了一定的用户体验障碍,但它确实提供了一种快速的、点对点的身份验证协议。
用web3.py生成一个可以在以太坊网络上使用的账户非常容易。
注意:在接下来的几个步骤中,我将违反一些加密和安全方面的规则。(1)我将生成一个熵不足的私钥(随机地),并且(2)我将在线公开私钥。在本教程之外,我不会使用此私钥——它只是出于教学的目的。您应该始终使用正确的私钥管理,例如Geth或MetaMask,并且永远不要共享您的私钥。
上面的命令使用输入的字符串生成了my_account对象,该对象包含一个私钥(my_account._private_key)和相关的以太坊地址(my_account._address)。但是,由于我已经公开该私钥,因此其他人可以生成和使用相同的私钥。(幸运的是,本教程仅在用于测试的区块链网络上使用它。)
因此,用户通常将私钥的创建和管理委托给名为客户端(如Geth)或钱包(如MetaMask)的软件。这些软件提供了一种非常安全的方式来生成和处理用于区块链交互的私钥。
ENS帐户
以太坊的地址是十六进制数字。这让人几乎不可能手动输入或记住,因此以太坊社区创建了Ethereum Name System (ENS)。它也具有域名系统的优势,该域名系统将网站服务器编号(216.58.194.46)替换为易于理解的名称(google.com)。大多数ENS名称都使用.eth域,而不是.com域。
例如,我有一个Ethererum帐户(0x4d3dd8471a289E820Aa9E2Dc5f437C1b2E22F598)。但是我用ENS将更易读的名称(coogan.eth)映射到该地址。如果您在支持ENS的应用或项目中输入这些内容(例如web3.py),它将代替以太坊的十六进制地址。不幸的是,由于.eth域名只能在主网上使用,因此我们无法在本教程中使用它,但也许下一教程中会有!
汇款
在最后一部分中,我们将从刚创建的账户向一些以太坊账户汇款。它们全部用python解释器进行!
人们对汇款的合理反应是:“难道互联网上的钱不是在波动中呈现不断下降的趋势吗?” 是的,加密货币的美元价格波动很大。这引起了企业的犹豫——为什么您会接受价格不确定的货币?
但是,以太坊生态系统建立了一个奇特的解决方法。以太坊被称为“世界计算机”,因为它是一个分布式系统,允许开发人员上传并执行自己的代码。用这种方式上传到以太坊的代码称为智能合约。它被上传到网络后,将成为一个独立的实体,具有自己的地址,内存和网络访问权限。智能合约使得以太坊开发者社区丰富了起来,该社区既富有创意又不懈地应对挑战,例如区块链固有的价格波动。
为了给以太坊创造稳定的价值来源,一群开发人员编写了名为Dai的代码并将其上传到以太坊。这是一个数字令牌,价值始终约为1美元(实现这种稳定性技术的操作细节很有趣,但是超出了本教程的范围——如果您想了解更多有关它原理的知识,可以在https://docs.ethhub.io/built-on-ethereum/open-finance/stablecoins/dai/找到更多信息)。持有Dai代币后,我们可以与其他用户以美元汇率兑换它。我们现在就这样做!
注意:要使帐户(不同于本教程中的账户)获得Dai,您可以通过这个合约地址(https://rinkeby.etherscan.io/address/0xc3dbf84abb494ce5199d5d4d815b10ec29529ff8#code),Metamask和您自己的帐户在测试网上创建自己的帐户。请按照此处教程(https://tokenmint.io/blog/how-to-mint-new-tokens-using-etherscan.html)中的步骤进行操作。
合约实例化
首先,为了与开发人员上传到以太坊的代码进行交互,我们需要知道上传的代码提供了哪些方法。Web3.py知道如何与核心的以太坊软件进行对接,但是需要被指导如何与第三方代码交互。我们通过为Web3.py提供应用程序二进制接口(ABI)来提供这个指导。与应用程序编程接口(API)相似,ABI让我们的计算机知道哪些功能可用以及实现这些功能需要的参数。ABI在区块链上不可用,由开发人员在Github或Etherscan网站上提供。
下面是我们将使用的测试网的Dai ABI,请复制整个代码块:
注意:此代码真的很长,请仔细地将其完全复制!
我们需要使用json解析它:
我们还需要告诉web3.py如何在太坊网络找到此代码。我们使用以下代码进行操作:
然后,我们使用ABI和这个地址将智能合约对象实例化。这将使我们能够访问代码提供的功能:
为了测试我们是否已经正确地将合约实例化,我们将调用一个函数,该函数告诉我们该合约持有多少Dai:
(运行该帐户时,余额可能有所不同)
创建交易
为了从我们的西班牙帐户(my_account)转移Dai ,我们将使用Dai智能合约中的transfer功能,如下所示:
我们可以看到,我们需要将两个参数传递给合约:to,这是一个十六进制的以太坊address和 value,为uint256格式。即使是经验丰富的开发人员,处理256位(uint256)的无符整型数也可能是一个挑战。这证明了非常规编程必须在智能合约的水平上完成,这经常让我很失望。Web3.py有一种方法可以将整数值转换为智能合约所需的格式,这个方法是toHex。让我们发送10个Dai,由于我们要发送的数量少于16个,因此我们只需将0x放在前面。对于address,请输入您要发送Dai给别人的地址。
我们的当前交易如下所示:
这些参数对于Dai合约很有用(我们不会在这出现错误),但是我们需要更多的参数,使得交易在以太坊网络上进行。这些参数是chainId,gas和nonce。
·ChainId可以让web3.py知道将交易发送到哪个网络。不同的网络有不同的偏好(就像我们一开始为Rinkeby安装middleware时所看到的那样),这有助于web3.py正确绑定交易。Rinkeby的网络ID为 4,这是网络ID的完整列表(https://besu.hyperledger.org/en/stable/Concepts/NetworkID-And-ChainID/)。。
·Gas是您向网络矿工支付的用于交易费用的小笔款项。许多人对此感到惊讶,但是它的金额很小(例如,我们的交易将花费0.00007000ETH,名为Gwei的特定面额划定了它的标准(https://ethereum-homestead.readthedocs.io/en/latest/ether.html))。Gas以分散的方式帮助网络安全运行。
·Nonce是每个以太坊账户专用的全局变量。它的作用与支票底部的数字相同:它允许对来自不同帐户的付款正确排序。发送每笔交易后,它就加一。Web3.py有一种查找当前nonce地址的方法: w3.eth.getTransactionCount(ETHEREUM_ADDRESS)。
我们将使用web3.py的buildTransaction方法将这三个变量合并到我们的交易中。我还要添加我朋友的以太坊地址,并给他发送10个Dai:
签名和发送交易
现在我们有了transaction,我们需要使用私钥对其进行签名。这样,以太坊的点对点协议就会知道是哪个账户想要汇款。为了完成签名,我们将transaction对象和my_account._private_key对象放入以下函数中:
注意:您绝对不能在网上发布真实的私钥!我们这样做仅出于教学目的。再次注意:在此帐户耗尽测试的内容(或用于测试的Dai)之前,以上命令对Rinkeby网络都是有效的。
交易签名后,我们现在要做的就是通过Infura API端点将其发送到网络。我们使用以下命令对w3对象进行操作:
如果成功的话,恭喜!您刚刚用Python汇款了!
要查找您的交易,您可以输入txn_hash,并将字符串值交给Rinkeby的Etherscan。这是我拥有的哈希(您自己的可能有所不同):
您可以在以太坊测试网上看到它(https://rinkeby.etherscan.io/tx/0xc5f98cbe6f1eaef16916b148e6c4ae926b11ab9dde750e188362745da39d560e)。
如您所见,使用web3.py可以为您的应用程序创造各种可能。在下一个教程中,我希望使用正确的文件和目录来做更多的事情。现在,我只想向您展示区块链可以提供的一些令人难以置信的功能。希望您发现有趣的东西!这个社区希望与新朋友互动,请和他们交流。
英文原文:https://consensys.net/blog/blockchain-development/how-to-send-money-using-python-a-web3-py-tutorial/ 译者:桃夭