区块链研究实验室 | 如何使用Python部署智能合约



在本文中,我们将使用Python部署智能合约。


我喜欢Python,它具备着开发人员出色的经验。能够写作print(“hi”)而又不会过于冗长System.out.println(“hi”)。许多人(包括金融科技界人士)都认同这一观点。我曾与许多对冲基金都使用Python作为主要语言。


Python它有很多不错的功能,并且可以使用Python进行部署。刚开始使用Solidity,我使用了Remix,这是一个功能强大的Web IDE,让您可视化智能合约。但是在单个IDE之外可以实现很多工作效率。这是我开始学习Truffle和HardHat的时候,它们是用于部署智能合约的Node.js框架。


这些是到目前为止我所见过的主要框架,这一切都很棒,但是我们不喜欢Javascript,我们喜欢Python。所以我很高兴找到Python和web3.py ,一个用于部署智能合约的Python框架和一个用于处理区块链的开源回购协议。


为什么选择Python?


Python被很多数据科学家,学者和金融科技机构所使用是有原因的。它是一种多用途的语言,让开发人员轻松获得,使用时更容易上手。顶级defi项目意识到这一点后,后续诸如yearn.finance之类的项目使用python来部署其所有生产代码。Yearn.finance由一群非常有才华的金融科技工程师经营,他们转向了区块链,他们运用着熟悉和喜爱的Python工具。

什么是Brownie?



Brownie是由Ben Hauser创建的开源Python智能合约框架,又名“非绝对人类”的一件艺术品。这是yearn.finance使用此框架来部署和维护合同的工具。您可以使用简单的命令启动项目,然后立即可以使用代码。



使用Python部署您的第一个智能合约

1.安装Brownie



Brownie具有“baking”功能,可让您使用一些基线代码启动存储库,因为大多数项目都需要很多相同的部分,就像create-eth-app.要开始使用一样,我们只需要以安装其他Python软件包的相同方式来安装Brownie 。
pip install eth-brownie


我们还需要安装ganache-cli一个用于部署本地区块链的软件包。需要为此安装npm和nodejs。
npm install -g ganache-cli


我们将使用chainlink-mix来开始使用,因为许多顶级defi项目都使用Chainlink来获取其资产数据。
brownie bake chainlink-mixcd chainlink


快速ls命令将向我们展示项目的布局


build :这是项目跟踪已部署的智能合约和已编译合约的地方

contracts:合同的源代码,通常以solidity或vyper

interfaces:处理已部署合同所需的接口布局。每次与合同的交互都需要一个ABI和一个地址。接口是获取合同的ABI的好方法

scripts :我们创建的脚本可自动执行合同工作

tests :测试

brownie-config.yaml:这是我们拥有布朗尼所有信息的地方,以了解如何使用我们的智能合约。我们想部署到什么区块链?我们是否需要设置任何特殊参数?所有这些都在配置文件中设置。



您可以忽略requirements.txt,README.md,LICENSE,和.gitignore,因为您在练习时会了解它们的用途。

2.设置环境变量



如果您熟悉区块链开发,那么您就会知道本地区块链,testnet区块链和mainnet区块链之间的区别。我们将部署到测试网,以便我们可以与真实的实时区块链进行交互。


您需要一个 WEB3_INFURA_PROJECT_ID 可以通过创建Infura帐户来检索的。这就是我们用来连接到我们的测试网络的东西。



您还需要获取一个metamask或其他Web3以太坊钱包,并用一些ETH进行资助。对于此演示,我们要使用Kovan测试网络。


如果您从未使用过Metamask,您可以跳过有关LINK资金的部分,我们只需要testnet ETH。我们也不会使用Ropsten,而是使用Kovan。如果您已经有了钱包,可以抢些Kovan Ether。



有了Metamask钱包,就可以将私钥导出到PRIVATE_KEY环境变量。


如果您感到困惑,无须担心,这只是一个测试钱包,请随时PRIVATE_KEY用您的私钥替换代码,然后单击WEB3_INFURA_PROJECT_ID。

3.部署您的智能合约



在我们的scripts文件夹中,我们有一个名为deploy_price_consumer_v3.py的脚本,该脚本将部署我们的智能合约,该合约读取以美元为单位的以太坊价格。



brownie run是我们可以用来运行脚本的命令。如果仅运行brownie,则可以看到所有命令的列表。
brownie run scripts/price_feed_scripts/deploy_price_consumer_v3.py --network kovan


network kovan允许我们设置要使用的网络。我们正在kovan为此示例使用testnet。您将需要Kovan ETH来做到这一点!您将获得很大的输出,但最终会得到类似以下结果:
Running 'scripts/price_feed_scripts/deploy_price_consumer_v3.py::main'...Transaction sent: 0x23d1dfa3937e0cfbab58f8d5ecabe2bfffc28bbe2349527dabe9289e747bac56Gas price: 20.0 gwei Gas limit: 145600 Nonce: 1339PriceFeed.constructor confirmed - Block: 22721813 Gas used: 132364 (90.91%)PriceFeed deployed at: 0x6B2305935DbC77662811ff817cF3Aa54fc585816


如果此方法正常运行,我们可以转到kovan etherscan并找到我们部署的合同。上面的链接显示了此示例中部署的合同。

4.阅读您的智能合约



现在我们已经部署了智能合约,我们可以从刚刚部署的合约中读取以太坊的价格。我们将使用另一个具有的脚本:
brownie run scripts/price_feed_scripts/read_price_feed.py --network kovan


我们将得到类似以下的输出:
Brownie v1.12.2 - Python development framework for EthereumChainlinkProject is the active project.Running 'scripts/price_feed_scripts/read_price_feed.py::main'...Reading data from 0x6B2305935DbC77662811ff817cF3Aa54fc58581662322000000


其中62322000000是ETH当前的美元价格!Solidity无法解读小数,因此我们知道此示例有8个小数,因此价格为$623.22。


您刚刚使用Python和Brownie部署了您的第一个智能合约!

5.使用web3.py



Brownie使用一种称为的工具web3.py来使您的生活更轻松,可以直接在没有框架的情况下使用合同。Web3.py是一个原始程序包,我们可以使用它来更直接地处理合同。


为此,我们只需要上面的Kovan infura项目ID。
请记住,要与任何智能合约进行交互,您需要做两件事:


合同ABI
合同地址


Brownie会在后台处理很多此类工作,但我们也可以手动进行。这是通过web3.py从链上合同中读取的内容。


首先,我们需要安装web3.py。
pip install web3

然后,我们可以在文件中运行以下内容:
web3 = Web3(Web3.HTTPProvider('https://kovan.infura.io/v3/<infura_project_id>')) abi = '[{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"getRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]' addr = '0x9326BFA02ADD2366b30bacB125260Af641031331' contract = web3.eth.contract(address=addr, abi=abi) latestData = contract.functions.latestRoundData().call() print(latestData)


运行上述操作将在我们的控制台中获取以美元为单位的ETH的最新价格。

作者:链三丰,来源:区块链研究实验室

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

留言与评论(共有 0 条评论)
   
验证码:
微信号已复制,请打开微信添加咨询详情!