如何使用Python部署智能合约

区块链研究实验室 阅读 646 2021-4-6 14:19
分享至
微信扫一扫,打开网页后点击屏幕右上角分享按钮

如何使用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工具。

如何使用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命令将向我们展示项目的布局:

如何使用Python部署智能合约

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/')) 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的最新价格。

btcfans公众号

微信扫描关注公众号,及时掌握新动向

来源链接
免责声明:
2.本文版权归属原作所有,仅代表作者本人观点,不代表比特范的观点或立场
2.本文版权归属原作所有,仅代表作者本人观点,不代表比特范的观点或立场
标签: 智能合约 Python
上一篇:如何在DApp中加载区块链 下一篇:如何使用Go实现区块链

相关资讯