使用 Python 在 ETH 上部署 Brownie FundMe 智能合约

本文介绍的是 Brownie FundMe 智能合约,并分享了如何使用 Web3 模块和 Python 将其部署到以太坊网络上。

Web3.0 产品的主要价值主张之一是中央银行使用加密货币和区块链进行支付去中心化。这个价值是可以想象的,因为你可以使用自己开发的加密支付网关发送或接收资金。此外,传统的银行系统不太可能直接记录所有交易。事实上,这在企业资产和财务运营方面意味着很多。

在本文中,我将分享 Brownie FundMe 智能合约,并介绍如何将其部署到以太坊网络上。

使用 Python 和 Web3 在以太坊上部署 Brownie FundMe 智能合约的要素

Python3、布朗尼、Solidity、ChainLink

目录

添加 Brownie FundMe 智能合约 .sol

首先,我们创建一个智能合约,可以在新的 Brownie 项目下处理资金发送或接收和添加。我们之前已经开发过一个智能合约。如果您有兴趣,请留言“Brownie FundMe智能合约脚本”订阅Easy2Digital简讯,我们会尽快给您发送。

联系我们

使用 .yaml 与第三方存储库连接

如果您只是将外部第 3 方存储库源和数据源添加到智能合约中,则 Brownie 无法读取它们。以下是为连接外部源而添加的组件,如下所示:

1.创建一个brownie-config.YAML并添加依赖项——组织和版本

首先,我们需要在根目录下添加一个配置YAML文件。也就是说,该文件告诉 Brownies 有一些内部或外部源需要连接。在我们的例子中,我们使用 Chainlink。

请务必检查布朗尼智能合约的最新编号,这里是0.5.1。这是因为它告诉布朗尼我们正在连接到哪个版本。欲了解更多详细信息,只需在 Google 中搜索即可弹出。因此,这是 YAML 文件中使用依赖项的代码示例,如下所示:

Dependencies:

smartcontractkit/chainlink-brownie-contracts@0.5.1

2. Compiler, solc, remapping

设置目标后,我们需要告诉 Brownie 我们想要将哪个模块与外部源映射。正如您在我们完成的 Brownie FundMe .sol 中看到的,我们在模块导入部分使用 @chainlink

import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

下面是使用ompiler, solc and remappings与外部源进行映射的代码

compiler:

solc:

remappings:

- '@chainlink=smartcontractkit/chainlink-brownie-contracts@0.5.1'

请务必检查外部源的版本是否与您在智能合约中使用的版本匹配或在其范围内。例如,我们正在导入V8版本的界面,solidity版本范围应涵盖V8,如下所示:

pragma solidity >=0.6.0 <0.9.0;

3.布朗尼编译

一旦完成前面提到的事情,我们可以输入brownie compil,它表明该项目已编译。然后,您可以看到在contracts文件夹下添加了一个新的JSON文件。

使用独立的 Python 脚本创建 get_account 函数

在前面关于 Infura 和 Metamask 的章节中,我们在 Python 部署脚本中创建了一个 get_account 函数。此函数用于获取您想要与智能合约交互的特定加密货币帐户。除了通用的 Python 函数导入方法之外,Brownie 还提供了一个脚本文件夹,供任何人添加所需的任何脚本。这些脚本也可以相互连接。

以下是get_account函数脚本的代码,与连接 Ganache CLI 的代码相同。

from brownie import network, config, accounts

def get_account():

if network.show_active() == "development":

return accounts[0]

else:

return accounts.add(config["wallets"]["from_key"])

创建脚本并将其保存在脚本文件夹下后,我们可以在部署脚本中导入该函数,如下所示:

如上面代码中突出显示的,如果您对如何创建和添加wallets, from_key, and .env有任何疑问,请查看之前的文章,如下所示。它们用于在安全模式下连接您的真实钱包。

https://www.easy2digital.com/web3/brownie-web3-develop-ethereum-smart-contracts-interacting-with-cryptocurrency-network-using-brownie-and-python/#4

或者您可以阅读本文末尾并订阅 Easy2Digital 时事通讯以获取完整脚本。

最后但并非最不重要的一点是,请务必添加一个名为如下的 Python 脚本。它告诉 Python 它可以相互导入模块。

__init__.py

在 Etherscan 上验证您的智能合约

如果我们想检查我们的FundMe智能合约验证在以太坊网络上是否有效(注意**。请务必部署与我们的脚本相同的设置,需要执行以下几个步骤:

第 1 步:创建 Etherscan 帐户并获取 API Key

前往 etherscan.io 并注册一个免费帐户。每个帐户有 5 个免费的 API 密钥。注册后,请提前复制,稍后即可使用。

步骤 2:使用 .env 中的 ETHERSCAN_TOKEN 添加 API 密钥

除了设置您的私钥外,我们还将 Etherscan 密钥放入 .env 中。因此,将如下代码添加到.env file

export ETHERSCAN_TOKEN = your etherscan api key

步骤3:运行Brownie脚本并在验证发生后在Etherscan上检查验证情况

最后,请再次在终端中运行该脚本,一旦您的智能合约成功上传到 Etherscan 网络,您将看到通过并已验证。

在FundMe智能合约的构造函数中添加参数

发送或接收资金必然显示实时货币汇率以及资助者和发送者的地址。因此,在为此功能部署函数之前,我们需要在构造函数中设置价格反馈参数,即address_priceFeed 。 FundMe 智能合约中更新后的构造函数代码示例如下:

constructor(address _priceFeed) public {

priceFeed = AggregatorV3Interface(_priceFeed);

owner = msg.sender;

}

部署模拟

如果我们只在goerli区块链网络上,那么我们只需使用关联地址即可。但是为什么我们喜欢设置一个或多个网络,包括测试网络和真实网络呢?在这种情况下,我们需要部署模拟。

步骤 1:将包含 ETH 的网络数据集添加到目标货币价格源中

为了获取不同的网络数据集,我们需要将网络数据集放入.yaml中。这是代码:

networks:

goerli:

eth_usd_price_feed: '0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e'

verify: True

Chainlink 提供实时汇率数据源,因此请前往 data.chain.link 并复制,并将区块链网络的 ETH 与目标货币价格费用密钥粘贴到 .yaml

第 2 步:更新deploy.py ,动态获取网络价格源

if network.show_active() != "development":

price_feed_address = config["networks"][network.show_active(

)]["eth_usd_price_feed"]

第 3 步:部署模拟

首先,我们需要添加一个测试文件夹,并在测试文件夹下添加一个模拟 .sol 合约。对于这个模拟智能合约,请留下 web3 教程 4 订阅 Easy2Digital 时事通讯,我们会尽快发送给您。

然后,再次编译后,在 YAML 文件中,我们将再添加一个名为development的网络,并且验证应该为False,因为它是本地测试喂价数据。

development:

verify: False

另外,除了导入FundMe之外,我们还需要导入MockV3Aggregator,并在else部分编写代码,这就是一种开发模式。

from brownie import FundMe, MockV3Aggregator, network, config

else:

deploy_mocks()

price_feed_address = MockV3Aggregator[-1].address

这里我们在get_account脚本中创建一个函数deploy_mock(),如果是开发模式则使用Mock合约,如下:

DECIMALS = 8

STARTING_PRICE = 2000000000000000

def deploy_mocks():

print(f"The active network is {network.show_active()}")

print("Deploying Mocks......")

if len(MockV3Aggregator) <= 0:

mock_aggregator = MockV3Aggregator.deploy(

DECIMALS, STARTING_PRICE, {

"from": get_account()}

添加新网络

除了 Brownie 提供的现有网络之外,我们还可以添加所需的新网络,例如用于测试目的。

以下是在终端中添加 ganache-local 网络的示例:

brownie networks add Ethereum ganache-local host=http://address chainid=yours

默认情况下,Brownie 使用开发模式网络。由于现在又添加了一个本地网络,我们需要更新变量以证明执行的合理性

LOCAL_BLOCKCHAIN_ENVIRONMENTS = ["development", "ganache-local"]

资金和取款

在脚本文件夹下,我们创建一个资金和取款脚本。其功能如下:

基金:

def 基金():
Fund_me = FundMe[-1]
帐户 = get_account()
入场费=fund_me.getEntranceFee()
打印(入场费)
print(f“当前入场费为{entrance_fee}”)
打印(“资金”)
fund_me.fund({“from”:账户,“value”:entry_fee})
提取:
def 撤回():
Fund_me = FundMe[-1]
帐户 = get_account()
fund_me.withdraw({“from”: 账户})
结果:

Brownie FundMe 智能合约的完整 Python 脚本

如果您对使用 Python 和 Web3 在以太坊上部署的 Brownie FundMe 智能合约感兴趣,请添加消息“Web3.0教程4”来订阅我们的新闻通讯。我们会立即将脚本发送到您的邮箱。

我希望您喜欢阅读使用 Python 和 Web3 在以太坊上部署的 Brownie FundMe 智能合约。如果您这样做了,请通过执行下列操作之一来支持我们,因为这总是对我们的频道有所帮助。