当前位置:首页区块链py教程:如何使用Python转账

py教程:如何使用Python转账

这将是Python开发人员学习Web3基础知识的教程。Py,一个区块链以太坊)库。我们将在Python解释器中做很多这方面的工作。

注意:为了安全起见,我们将通过测试网络转账。所有这些相同的技术都可以用于以太坊家庭网络。

主要步骤如下:

1安装

2建立联系

3初始化

4创建帐户

5ENS帐户

6换乘

安装

我们将使用pip从命令行安装web3.py:

$pip3安装web3

对于同时安装了python2和python3的用户,应该检查PIP命令调用的版本。某些默认值为2.7:

$pip-Vpip 10.0.1来自/Library/Python/2.7/site packages/pip-10.0.1-py2.7.egg/pip;(Python 2.7)$pip3-Vpip 20.0.2来自usr/local/lib/python3.7/site packages/pip;(Python 3.7)

另外,如果您使用的是virtualenv,这里有一些关于为Web3设置干净环境的文档。是的。

安装连接

要与网络交互,必须托管节点或使用为您托管节点的服务。

因为这是一个基本教程,所以我们将使用一个服务。****的是Infra。您可以设置您自己的免费帐户(如这里所述)或使用下面的产品ID。获取项目ID和API端点非常重要,这将是区块链的API端点,分析仪表板将有所帮助。

py教程:如何使用Python转账

**并确保在地址前添加HTTPS://。

有了这些,你可以使用Python连接到区块链!

初始化

让我们启动Python解释器。这可能因Python安装的不同而有所不同,但通常可以通过运行通常放在Python文件之前的任何关键字来完成。对于安装了Python 2和Python 3的Mac iterm,它是:

$蟒蛇3
Python 3.8.2[Clang 6.0;(Clang-600.0.57)]有关darwinType quot;、quot;版权quot;、quot; Credits6035或quot;许可证quot;,以获取更多信息;

要检查所有设置是否正确,请运行Python解释器和以下命令:

gt;>>fromweb3导入;HTTPProvidergt;>importon

上面的命令从Web3导入一些主要方法。Py,我们将使用它连接到区块链和本地ON库。

下一个将使用HTTPS:/初始化的对象。在本教程的其余部分,它将是Web3的主要方式。Py与区块链一起工作。

>>>w3=Web3(Web3.HTTPProvider(quot;)https://rinkeby.infura.io/v3/8e4cd4b220fa42d3ac2ac966fd07faquot;)

注意:您需要在infra-API地址前面添加HTTPS://,否则会出错!

我们还需要添加一些中间件来帮助我们使用Infra和rinkeby testnet:

gt;>>从web3.中间件导入gETH_opoaémiddlewaregt;>w3.middleware洋葱。注射(获取poa中间件,层=0)

现在看看是否一切顺利,我们运行:

gt>>>w3.isConnected()

如果你是真的,恭喜你!您已连接到区块链!

1如果出现错误,可以检查以下内容:

2如果必须重新启动解释器,则必须重新导入库并重新初始化变量

3您是否正确**了infra API密钥?

4您是否安装了web3.py并导入了web3和httpprovider库?

5您是否添加了HTTPS://?在API密钥之前?

创建帐户

如果我们想在区块链上汇款,我们需要一个以太坊账户。以太坊账户是以太坊区块链上的主要身份单位-账户地址是如何识别用户在网络上的地址。账户系统的基础是基于公钥加密的分布式身份认证协议。本质上,区块链网络上的身份是由其公共地址对应方(由整个网络持有)通过单个私钥(由单个用户秘密持有)的数字签名进行验证。虽然它有很大的用户体验障碍,但它确实提供了一个快速的对等身份验证协议。

使用Web3。Py生成一个账户供以太坊网络使用非常简单。

注意:在接下来的几步中,我将打破一些性规则:

1) 我将生成一个熵不足的私钥(随机性)

2) 我将在网上公布我的私钥。

我不会在本教程之外使用这个键,它只是为了教育目的。您应该始终使用正确的私钥管理,例如gETH或metamask,而不要公开共享您的私钥。

gt;>>我的账户=w3。ETH.account.create.创建(39;没有人期望西班牙宗教裁判所!#39;)gt;>我的账户。地址#39;0x5B580EB23FCA4F0936127335A92F72905286738#39;>>我的账户。uUKeyHexBytes(39;0x265434629C3D2E6525D6225ADCB2813D3AC32C6E07C8C39B5CC1EFBCA18B3#39;)

上面的命令使用输入字符串生成my_uaccount对象,该对象包含一个私钥(my_uaccount.u private_ykey)及其关联的以太坊地址(my)u Account.u address),但是,由于密钥已公开发布,因此有人可以生成并使用相同的私钥。

因此,它通常被称为对客户端的私钥(如get)和(MASH)的管理。为这些区块链项目提供非常安全的交互方式。

Ens帐户

以太坊地址是一个长的十六进制数。它们几乎不可能输入或记住,所以以太坊社区创建了以太坊名称系统(ENS)。它具有与域名系统相同的优点,域名系统用人类可读的名称(Google)代替web服务器号(216.58.194.46)。大多数ENS名称使用。ETH域而不是。COM域。

例如,我有一个地址为0x4d3dd8471a289e820aa9e2dc5f437c1b2e22f598的ETHereum帐户,但我使用了一个更易于阅读的ENS名称库根.埃思映射到这个地址。如果您在支持ENS的应用程序或项目中键入这些(例如,Web3)。啊!),将替换为以太坊十六进制地址。不幸的是,我们不能在本教程中使用它,因为。ETH域名只能在主网上使用,但可能会在下一个教程中使用!

转账账户

在**一节中,我们将从刚刚创建的帐户中向另一个以太坊帐户发送一些钱。全部来自Python解释器!

加密货币美元的价格极不稳定。这让公司犹豫不决——你为什么要接受一种价格不确定的货币?

然而,在以太坊生态系统中建立了一个新的解决方案。以太坊被称为“世界计算机”,因为它是一个分布式系统,允许开发者上传和执行他们自己的代码。以这种方式上传到以太坊的代码称为智能合约。上传到网络后,它将成为一个独立的实体,拥有自己的地址、内存存储和网络访问权限。智能合约催生了丰富的以太坊开发者社区,该社区既有创意,又能应对区块链固有的价格波动等挑战。

以太坊创造了稳定的价值来源,一群开发人员编写了名为Dai的代码并将其上传到以太坊。这是一个数字代币,总价值约1美元。持有代币后,我们可以与其他用户以与美元相同的汇率兑换。我们现在就去做!

合同实例化

第一步是通过以太坊上传代码与开发者进行交互。我们需要知道上传的代码公开了哪些方法。py原生机知道如何与核心以太坊软件连接,但它需要与第三方代码交互的指导。我们通过为Web3提供一个应用程序二进制接口(ABI)来提供这个指导。是的。与应用程序编程接口(API)类似,ABI允许我们的机器知道可用的函数以及这些函数所需的参数。ABI在区块链上不可用,由GitHub或ETHerscan等网站上的开发者提供。

下面是我们要使用的testnet Dai ABI,单击并**整个代码片段:

注:此代码很长,请特别注意完整副本!

39岁的时候,[{quot;internalTypequot;:quot;Constantal6035:真,quot;inputsquot;:[][],quot;namequot;:quot;namequot;,quot;outputsquot;:[{quot;internalTypequot;:quot; Stringquot;:quot; Stringquot;,quot;命名quot;:quot; quot; quot;,quot;typequot;:quot; Stringquot;}quot;]quot;Payaable6035:虚假,A603035状态的状态的可变性性性亚6035:quot;:quot;viewquot;通过quot;、quot;通过quot;、quot;通过quot;:quot;function6035},{quot;constantquot;:false,quot;输入quot;的输入Squot;:[{quot; InternalTypequot;:quot;地址quot;,quot;名称quot;:quot;名称quot;:quot; Spenderquot;,quot;typequot;:quot;:quot;:quot;:quot;:quot;:quot;UIT256quot;,quot;名称quot;:quot;:quot;:quot;:quot;价值quot;;quot;quot;:quot;:quot; UIT256A656quot;}}]]quot;命名quot;:quot;:quot;批准6035,quot;输出Squot;:[{A6{A6A6quot; quot;-输出SA603035内部类quot;:quot;工具quot;,quot;名称quot;:quot;quot;,quot;typequot;:quot;quot;:quot;boolquot;}]],quot;Payable6035:假,quot;Statem变变性性yquot;:quot;非paymable6035,quot;typequot;:quot;Statem变变性yquot;:quot;:quot;StateM变能6035},{quot;Constantal6035:真,quot;inputsquot;:[[]quot;名称quot;:quot; TotalSupp6035,quot;输出Squot;:[[[{quot; InternalTypequot;:quot;:quot;:quot;:quot;:quot;年quot;名称quot;:quot;quot;,quot;quot;quot;:quot;UInt25quot;}]、quot;Payable6035:假,quot;状态可变性亚6035:quot;viewquot;,quot;typequot;:quot;viewquot;,quot;typequot;:quot;quot;:quot;Function6035功能6035},{quot;Constantal6035:false,quot;inputsquot;:[{{quot; InternalTypequot;:quot;-quot;地址quot;,quot;命名quot;命名quot;:quot;从quot;出发的quot;、quot;:quot;:quot;:quot;地址quot;},{quot;-5:quot;地址quot;,quot;名称quot;:quot;:quot; Toquot;,quot;typequot;:quot;:quot;地址quot;地址quot;},{quot; InternalTypequot;:quot;uint2556quot;,quot;名名称quot;:quot; valuequot;,quot;typequot;:quot;:quot;uint25uint25quot;}}]],quot;名称quot;:quot;从quot;转移到quot;,quot;输出Squot;:[{{quot; InternalTypequot;:quot;:quot;:quot;:quot;:quot;:quot;:quot;:quot; quot; quot;,quot;typequot;:quot;boolquot;}],quot;Payable6035:错误,quot;状态可变性yquot;:quot;Nopaymable6035,quot;typequot;:quot;Functional6035},{quot;Constantal6035:true,quot;inputsquot;:[][],quot;名称quot;名称quot;:quot; DecimalSquot;,quot;输出Squot;:quot;输出Squot;:[[[{quot;内在Typequot;:quot;uint8quot;,quot;名称quot;:quot;quot; quot;,quot;名称quot;:quot;quot;,quot;类quot;:quot;:quot;:quot;:quot;:quot;:quot;:quot;]quot;[:假,quot;状态可变性quot;:quot;视图quot;,quot;typequot;:quot;Function6035},{quot;Constantal6035:假,quot;inputsquot;:错误,quot;inputsquot;:[{quot;内在Typequot;:quot;:quot;地址quot;地址quot;,quot;名称quot;:quot;名称quot;:quot;名除能者quot;、quot;类quot;:quot;:quot;:quot; uint2556quot;,quot;名称quot;:quot;添加的附加价值quot;,quot;typequot;:quot;添加的价值quot;,quot;quot;:quot;:quot;:quot;UIT256quot;:quot;:A6}],quot;名称quot;:quot;增加Allowancequot;,quot;输出quot;的输出Squot;:[{quot; InternalTypequot;:quot;internalTypequot;:quot;quot;,quot;namequot;:quot;quot;,quot;typequot;:quot;quot;:quot;Poolquot;[]]quot;Payabl6035:假,quot;StateM变性yquot;:quot;非Paymable6035,quot;typequot;:quot;Function6035},{quot;Constantal6035:假,quot;inputsquot;:[{quot; InternalTypeA603035:quot;:quot;内在Typequot;:quot;:quot;地址quot;地址A6quot;名称quot;:quot;至6035,quot;internalTypequot;:quot;addressquot;},{quot; InternalTypequot;:quot;quot;uint2556quot;,quot;namequot;:quot;valuequot;,quot;typequot;:quot;typequot;:quot;typequot;:quot;typequot;:
557Maintquot;,quot;输出输出Squot;:[{quot; InternalTypequot;:quot;quot;:quot;boolquot;,quot;名称quot;:quot;quot; quot;,quot; Typequot;:quot;:quot; quot;:quot;:quot;:quot;:quot;}],quot;Payable6035:错误,quot;StateMutatabilityquot;:quot;Nonpayable6035,quot;typequot;:quot;:quot;Functional6035},{quot;Constantal6035:true,quot;inputsquot;:[{{quot; InternalTypequot;:quot;addressquot;,quot;名称quot;:quot;:quot;Owner6035,quot;typequot;:quot;addressquot;}}]、quot;名称quot;名称quot;:quot;:quot;Balaneofquot;,quot;输出Squot;:[[{quot; InternalTypequot;:quot;:035 InternalTypequot;:quot;:quot; quot;uint256quot;,quot;名称quot;:quot;quot;,quot;typequot;:quot;UInt2556quot;}],quot;Payabl6035:假,quot;状态可变性亚6035:quot;:quot;viewquot;,quot;typequot;:quot;Statem变变位性Yquot;:quot;:quot;StateM变变性yquot;:quot;Constantal6035:真,quot;inputsquot;:[[]quot;名称quot;:quot;symbolquot;,quot;输出Squot;:[{quot; InternalTypequot;:quot;:quot;:quot; Stringquot; Stringquot;:quot; Strangquot; quot;名称quot;:quot;quot;,quot;Payable6035:false,quot;quot;:quot;stringquot;},quot;Payable6035:假,quot;状态可变性亚6035:quot;viewquot;,quot;typequot;:quot;quot;Function6035},{quot;Constantal6035:假,quot;inputsquot;:[{{{quot;internalTypequot;:quot;addressquot;,quot;命名quot;:quot;:quot;spenderquot;,quot;typequot;:quot;addressquot;:quot;addressquot;},{quot; InternalTypequot; InternalTypequot; quot;-A603:quot;uint256quot;,quot;名称quot;:quot;减法值quot;,quot;类quot;:quot;:quot;UInt2556quot;}}]、quot;名称quot;:quot;减少了allowance6035,quot;输出输出Squot;:[{quot; InternalTypequot;:quot;internalTypequot;:quot;boolquot;,quot;名称quot;:quot;quot; quot;、quot; Typequot;:quot;quot; Poolquot;}}]、quot;Payable6035:假,A603035 StateMutabiliabilityquot;:quot;非payablequot;:quot;非payquot;非盈利6035 035quot;:quot;功能6035},{{{quot;internalTypequot;:quot;internalTypequot;:quot;addressquot;:quot;addressquot;,quot;namequot;:quot;To6035,quot;namequot;:quot;:quot;To6035,quot;typequot;:quot;quot;quot;:quot;UInt2556quot;,quot;名称quot;:quot;价值quot;,quot;typequot;,quot;typequot;:quot;:quot;:quot;:quot;:quot;:quot;:quot;:quot;:quot;:quot;:quot;转让quot;,quot;,quot;转让quot;,A6输出Squot;:[{quot;内部类quot;:quot;boolquot;,quot;quot;名称quot;:quot;quot;,quot;typequot;:quot;quot;:quot;boolquot;}]、quot;Payabl6035:假,quot;Statem变变性性yquot;:quot;非paymable6035,quot;typequot;:quot;Statem可变性yquot;:quot;Function6035},{quot;Constant6035:真,quot;inputsquot;:[{quot; InternalTypequot;:quot;internalTypequot;:quot; Addressquot;,quot; namquot; namquot;:quot;:quot; Ownerquot;,quot;:quot;:A603035},{{quot;internalTypequot;:quot;地址quot;,quot;名称quot;:quot;spenderquot;,quot;typequot;:quot;spenderquot;,quot;typequot;:quot;addressquot;}]],quot;名称quot;:quot;:quot;Allowance6035,quot;输出Squot;:[{{quot;internalTypequot;:quot;:quot;:quot;:quot;quot;,quot;类quot;类quot;:quot;:quot;:quot;:quot;:quot;:quot;:quot;:quot;:quot;:quot;:quot;:quot;:A6状态可变性quot;:quot;视图quot;,quot;quot;quot;:quot;Function6035},{quot;inputsquot;:[[],quot;Payable6035:假:假,quot;状态可变性Yquot;:quot;非Payable6035,quot;typequot;:quot; Constructorquot;},{quot;匿名quot;匿名quot;:假,quot;inputsquot;:[{{quot;IndexedeDquot;:真,quot;internalTypequot;:quot;内部Typequot;:quot;地址quot;地址quot;,quot;命名quot;:quot;:quot;来自quot;的quot;:quot;来自quot;,quot; quot;quot;类:quot;地址quot;},{{{quot;indexedquot;:真,quot;internalTypequot;:quot;addressquot;,quot;名称quot;:quot;addressquot;,quot;名称quot;:quot;名称quot;:quot;addressquot;:quot;addressquot;:quot;addressquot;},{A603035IndexeDquot;:虚假,quot;internalTypequot;:quot;内在Typequot;:quot;;quot;名称quot;:quot;价值quot;,quot;typequot;:quot;:quot;:quot;:quot;:quot;:quot;:quot;转让quot;,quot;:quot;:quot;:类quot;:quot;事件quot;},{{quot;匿名quot;:false,quot;inputsquot;:[{{quot;IndexedAD6035:true,quot;internalTypequot;:quot;addressquot;,quot;名称quot;名称quot;:quot;OwnerA66035,quot;typequot;:quot;addressquot;:quot;addressquot;}},{quot;IndexedA66035:真,quot;内在Typequot;:quot;地址quot;地址quot;,quot;名称quot;名称quot;:quot;:quot;:quot;:quot;:quot;:quot;:quot;:quot;:quot;:quot;:quot;:},{quot;indexedquot;:错误,quot;内部类quot;:quot;uint256quot;,quot;名称quot;:quot;值quot;,quot;类quot;:quot;uint256quot;}],quot;名称quot;:quot;批准quot;,quot;typequot;:quot;eventquot;}]39;

我们需要使用ON进行解析:

gt>>>abi=on.loads(abi)

我们还需要告诉Web3。Py在以太坊网络上找到代码的位置。我们使用以下代码:

gt;>>地址=39;0xc3dbf84Abb494ce5199D5d4D815b10EC29529ff839;

然后,我们使用ABI和address实例化智能合约对象。这将允许我们访问代码公开的函数:

>>>戴=w3。ETH.合同(地址=地址,abi=abi)

为了测试我们是否正确地实例化了契约,我们将调用一个函数,该函数告诉我们契约拥有多少Dai:

gt;>>;dai.功能.总供给().call()1010000000000101001376883458034812485564519

(运行此程序时,余额可能会有所不同)

达成交易

为了检查我们在西班牙的账户(我的账户)转账Dai,我们将使用Dai智能合约的转账功能,如下所示:

A602A602

我们可以看到,我们需要向契约传递两个参数:to,这将是十六进制以太坊地址和值uint256。对于有经验的开发人员来说,使用256位无符号整数(uint256)可能是一个挑战。网站3。Py提供了一种将值从整数转换为此智能合约所需格式tohex的方法。我们发送10个Dai,由于我们发送的不到16个,我们只需要在它前面加一个0x。对于“地址”,请输入要发送给Dai的地址。

因此,我们目前的交易如下:

交易=dai.功能.传输(收件人地址,0x10)

这些参数对于Dai契约很有用(这里我们不会出错),但是我们需要更多的参数来让事务在以太坊网络上运行。这些值是chainid、gas和nonce。

.buildTransaction({#39;链ID#39;:4,#39;天然气#39;:70000,#39;nonce#39;:w3。ETH.getTransactionCount(我的账户地址)

Chainid帮助Web3。Py知道将事务发送到哪个网络。不同的网络有不同的怪癖(正如我们第一次为rinkeby安装中间件时所看到的),这有助于web3.py正确地捆绑事务。Rinkeby的网络ID为4,这是网络ID的完整列表。

天然气是你在网络上付给矿工的一小笔钱,用来支付交易费用。

Nonce是特定于每个以太坊帐户的全局变量。它的工作方式与分类帐底部的数字相同:它允许不同账户的付款正确排序。在每个事务被发送后,它将递增一。网站3。Py可以找到地址当前的随机数:W3ETH.getTransactionCount(以太坊地址)

我们将使用Web3。Py法。Buildtransaction将这三个变量合并到我们的事务中。我还想加上一个朋友的以太坊地址,给他发10代:

>>>交易=dai.功能.传输(39;0xafC2F2bBD4173311BE60A7f5d4103b098D2703e8#39;,0x10).buildTransaction({#39;链ID#39;:4,#39;gas#39;:70000,39;nonce#39;:w3。ETH.getTransactionCount(39;0x5b580eB23Fca4f0936127335a92f722905286738#39;)})

签署并发送交易

现在我们有了事务,我们需要用私钥对它进行签名。这就是以太坊的对等协议如何知道要汇哪个帐户。若要签名,我们将使用我的帐户进行交易。私钥被放入以下功能:

gt;>>已签名的txn=w3。ETH.account.signTransaction公司(事务处理,#39;0x265434629c3d2e652550d6225adcb2813d3ac32c6e07c8c39b5cc1efbca18b3#39;)

对于签名的事务,我们现在需要做的是通过InfraAPI端点将其发送到网络。我们使用以下命令通过W3对象执行此操作:

gt;>>txnuHash=w3。ETH.sendRawTransaction(签名txn.rawTransaction公司)

如果你成功了,恭喜你!你刚刚用Python汇款!

要找到您的事务,可以打印TxN_uHash并将字符串值带给rinkeby的einscan。这是我的杂碎(你会与众不同的!):

gt;>>txn_xn哈希
十六进制字节(39;0xc5f98cbe6f1eaef16916b148e6c4ae926b11ab9dde750e188362745da39d560e#39;)

如您所见,使用Web3。Py为您的应用程序提供了多种可能性。

温馨提示:

文章标题:py教程:如何使用Python转账

文章链接:https://www.btchangqing.cn/98634.html

更新时间:2020年09月05日

本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。

区块链

太阳硬币:一个以波场定义为中心的社会实验

2020-9-5 20:50:35

区块链

王氏区块链日记1028:5000渔场

2020-9-5 21:06:07

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索