Skip to content

使用Brownie在Moonbeam上进行部署

概览

Brownie是一个以太坊开发环境,用于协助Python开发者管理和自动化构建智能合约以及DApp所需的重复性任务。Brownie能够直接与Moonbeam的以太坊API交互,因此其可以用于在Moonbeam上部署智能合约。

本教程将会包含如何在Moonbase Alpha测试网使用Brownie与以太坊式智能合约进行编译、部署和交互。此教程也同样适用于Moonbeam、Moonriver以及Moonbeam开发节点。

查看先决条件

首先,您需要准备以下先决条件:

  • 安装MetaMask并连接至Moonbase Alpha
  • 具有拥有一定数量资金的账户。 您可以每24小时一次从Moonbase Alpha水龙头上获取DEV代币以在Moonbase Alpha上进行测试
  • 要在Moonbeam或Moonriver网络上测试本指南中的示例,您可以从受支持的网络端点提供商之一获取您自己的端点和API密钥

创建Brownie项目

您将会需要安装Brownie并创建一个Brownie项目(如果您尚未创建)。您可以选择创建一个空白的项目或是使用Brownie mix(基础的项目模板)创建项目。本教程将以创建一个空白的项目为例,您可以通过跟随以下步骤进行操作:

  1. 为您的项目创建目录

    mkdir brownie && cd brownie
    
  2. 如果您尚未安装pipx,执行以下命令进行安装

    python3 -m pip install --user pipx
    python3 -m pipx ensurepath
    
  3. 使用pipx安装Brownie。如果您尚未安装pipx ,您可以跟随上个步骤进行安装

    pipx install eth-brownie
    

    注意事项

    pipx用于运行本地安装在您的项目中的可执行文件。Brownie将会被安装在一个虚拟环境中并可在命令行直接使用。

  4. 创建项目

    brownie init
    

    brownie init Brownie v1.19.1 - Python development framework for Ethereum
    SUCCESS: A new Brownie project has been initialized at /home/moonbeam/brownie
    ls build contracts interfaces reports scripts tests

您的Brownie项目应包含以下空白目录:

  • build —— 用于例如来自编译的合约代码的项目数据
  • contracts —— 用于储存智能合约文件
  • interfaces —— 用于项目所需的智能合约接口
  • reports —— 用于在Brownie GUI使用的JSON报告文件
  • scripts —— 为Python脚本用于部署合约或是其他自动化事务存在的地方
  • tests —— 用于储存测试项目的Python脚本。Brownie将使用pytest框架进行单位测试

另外一个不被包含但需要注意且同样重要的文件为brownie-config.yaml配置文件。此配置文件为可选项,在自定义特定设置,如默认网络、编译器版本和设置时将会派上用场。

网络配置

要部署至Moonbeam网络,您需要添加并配置网络。Brownie中的网络配置需通过命令行添加。Brownie可以被用于开发和生产环境。

从版本1.19.3开始,Brownie开箱即可支持Moonbeam、Moonriver和Moonbase Alpha。要查看支持的网络的完整列表,您可以运行以下命令:

brownie networks list
brownie networks list
Moonbeam ├─Mainnet: moonbeam-main └─Moonbase Alpha: moonbeam-test Moonriver └─Mainnet: moonriver-main

如果您希望将合约部署到Moonbeam开发节点,则需要添加网络配置。在后台,Brownie使用Ganache开发环境。但是,由于Moonbeam开发节点将充当您自己的个人开发环境,因此不需要Ganache。因此,您可以将开发节点配置为“live”网络。

要添加Moonbeam开发节点配置,您可以运行以下命令:

brownie networks add Moonbeam moonbeam-dev host=http://127.0.0.1:9944 name=Development chainid=1281

如果您成功添加了网络,您将会在终端看到关于网络细节的成功信息。

要部署Moonbeam网络或是在特定网络上进行测试,您可以通过以下命令扩展至指定的网络:

--network moonbeam-main
--network moonriver-main
--network moonbeam-test
--network moonbeam-dev

如果您希望设置默认网络,您可以通过添加以下代码段至brownie-config.yaml配置文件进行操作:

networks:
    default: moonbeam-main
networks:
    default: moonriver-main
networks:
    default: moonbeam-test
networks:
    default: moonbeam-dev

注意事项

请注意brownie-config.yaml并不会由系统自动创建,您需要自行创建此目录文件。

账户配置

在您部署合约之前,您需要配置您的账户,其同样为通过命令行进行操作。您可以运行以下命令添加新的账户:

brownie accounts new {INSERT_ACCOUNT_NAME}

请确认您将{INSERT_ACCOUNT_NAME}替换成您想要设置的账户名称。在本教程中,alice将会是账户名称。

系统将跳出弹窗提示您输入私钥和加密账户密码。如果账户被成功配置,您将会在终端中看到您的账户地址。

brownie accounts new alice Brownie v1.19.1 - Python development framework for Ethereum
Enter the private key you wish to add: 0x5b92d6e98884f76de468fa3f6278f880748bebc13595d45af5bdc4da702133 Enter the password to encrypt this account with: SUCCESS: A new account 'Oxf24FF3a9CF04c71Dbc94D06566f7A27B94566cac' has been generated with the id 'alice'

合约文件

接着您可以在contracts目录中创建合约。在本教程中,您将部署的智能合约为Box,用于存储后续读取的数据。您可以运行以下命令创建一个Box.sol合约:

cd contracts && touch Box.sol

打开文件并添加以下合约内容:

// contracts/Box.sol
pragma solidity ^0.8.1;

contract Box {
    uint256 private value;

    // Emitted when the stored value changes
    event ValueChanged(uint256 newValue);

    // Stores a new value in the contract
    function store(uint256 newValue) public {
        value = newValue;
        emit ValueChanged(newValue);
    }

    // Reads the last stored value
    function retrieve() public view returns (uint256) {
        return value;
    }
}

编译Solidity

要编译合约您可以运行以下命令:

brownie compile
brownie compile Brownie v1.19.1 - Python development framework for Ethereum
New compatible solc version available: 0.8.4 Compiling contracts... Solc version: 0.8.4 Optimizer: Enabled Runs: 200 EVM Version: Istanbul Generating build data... - Box Project has been compiled. Build artifacts saved at /home/moonbeam/brownie/build/contracts

注意事项

首次编译合约时需要安装solc二进制文件,因此可能需要较长的时间。

在成功编译后,您将会在build/contracts目录中找到您的文件。此文件包含智能合约的字节码和元数据,皆为.json文件。此外,build目录应当处于.gitignore文件之中,如果并非如此,请您将其移入。

如果您希望设置指定的编译器版本,您可以在brownie-config.yaml文件中操作。请注意,如果您尚未创建此文件,您需要创建一个。接着,您可以指定编译器(如下所示):

compiler:
  evm_version: london
  solc:
    version: 0.8.13
    optimizer:
      enabled: true
      runs: 200

当Brownie接收到更改的消息时,您的合约才会重新编译。您可以运行以下命令强制执行新的编译:

brownie compile --all

部署合约

要部署Box.sol智能合约,您将需要撰写一个简单的部署脚本。您可以在scripts目录中创建一个新文件并将其命名为deploy.py

cd scripts && touch deploy.py

接着,您将需要撰写您的部署脚本。您可以跟随以下步骤开始进行操作:

  1. brownie导入Box合约和accounts模块

  2. 使用accounts.load()加载您的账户,这将解密您的文件并根据提供的账户名称获取账户信息

  3. 使用实例中存在的deploy函数指定from账户和gas_limit以将其实例化

# scripts/deploy.py
from brownie import Box, accounts

def main():
    account = accounts.load("alice")
    return Box.deploy({"from": account, "gas_limit": "200000"})

您可以使用run命令并指定网络来部署Box.sol合约:

brownie run scripts/deploy.py --network moonbeam-main
brownie run scripts/deploy.py --network moonriver-main
brownie run scripts/deploy.py --network moonbeam-test
brownie run scripts/deploy.py --network moonbeam-dev

在数秒后,合约将会被部署且在终端中可见。

brownie run scripts/deploy.py --network moonbeam-testnet Brownie v1.19.1 - Python development framework for Ethereum
BrownieProject is the active project.
Running 'scripts/deploy.py: :main Enter password for "alice": Transaction sent: Oxf091d0415d1a4614ccd76a5f5f985fdf6abbd68d7481647fb3144dfecffb333 Gas price: 1.0 gwei Gas limit: 200000 Nonce: 15298 Box.constructor confirmed Block: 1901367 Gas used: 103095 (51.55%) Box deployed at: OxccA4aDdD51Af1E76beZaBE5FD04A82EB6063C65

恭喜您,您的合约已上线!您可以储存地址,您将会在下个步骤中使用该地址并与之交互。

与合约交互

您可以使用Brownie控制台与合约交互以进行快速调试和测试,也可以编写脚本进行交互。

使用Brownie控制台

要与您新部署的合约交互,您可以在Brownie控制台中运行以下命令:

brownie console --network moonbeam-main
brownie console --network moonriver-main
brownie console --network moonbeam-test
brownie console --network moonbeam-dev

随后,合约实例将会自动在终端中可见且可访问。它将会被打包在ContractContainer中,并允许您部署新的合约实例。要访问部署的合约,您可以使用Box[0]。您可以跟随以下步骤,调用store函数并将数值设置为5

  1. 为合约创建一个变量

    box = Box[0]
    
  2. 使用您的账户调用store函数并将数值设置为5

    box.store(5, {'from': accounts.load('alice'), 'gas_limit': '50000'})
    
  3. 输入您账户的密码

此交易将会由您的账户签署并传送至网络。现在,您可以通过以下步骤获取数据:

  1. 调用retrieve函数

    box.retrieve({'from': accounts.load('alice')})
    
  2. 输入密码

您将会看见5或是任何您先前储存的数据。

brownie console --network moonbeam-testnet Brownie v1.19.1 - Python development framework for Ethereum
BrownieProject is the active project. Brownie environment is ready. box = Box[0]
box. store(5, {'from': accounts. load('alice"), 'gas-limit: "50000"). Enter password for "alice": Transaction sent: 0x2418038735934917861dfa77068fe6dadd0b3c7e4362d6f73c1712aaf6a89a Gas price: 1.0 gwei Box.store confirmed Gas limit: 50000 Nonce: 15299 Box.store confirmed Block: 1901372 Gas used: 44593 (89.19%)
Transaction '0×24180387359349178b1dfa770e68fe6dadd0b3c7e4362d6f73c1712aaf6a89a' box.retrieve ({'from': accounts. load('alice")}) Enter password for "alice": 5

恭喜您!您已经成功通过Brownie部署合约并与之交互!

使用脚本

您还可以编写一个脚本来与您新部署的合约进行交互。首先,您可以在scripts目录中创建一个新文件:

cd scripts && touch store-and-retrieve.py

接下来,您需要编写存储和查询数值的脚本。请执行以下步骤:

  1. brownie导入Box合约和accounts模块
  2. 使用accounts.load()加载您的帐户,它会解密密钥库文件并返回给定帐户名称的帐户信息
  3. Box合约创建一个变量
  4. 使用storeretrieve函数存储一个值,然后检索它并打印到控制台
# scripts/store-and-retrieve.py
from brownie import Box, accounts

def main():
    account = accounts.load("alice")
    box = Box[0]
    store = box.store(5, {"from": accounts.load("alice"), "gas_limit": "50000"})
    retrieve = box.retrieve({"from": accounts.load("alice")})

要运行脚本,您可以使用以下命令:

brownie run scripts/store-and-retrieve.py --network moonbeam-main
brownie run scripts/store-and-retrieve.py --network moonriver-main
brownie run scripts/store-and-retrieve.py --network moonbeam-test
brownie run scripts/store-and-retrieve.py --network moonbeam-dev

您需要输入Alice的密码才能发送交易以更新存储值。交易完成后,您应该会在控制台上看到交易哈希和“5”。

恭喜,您已成功部署并使用Brownie与合约交互!

本网站的所有信息由第三方提供,仅供参考之用。Moonbeam文档网站(https://docs.moonbeam.network/)上列出和描述的任何项目与Moonbeam立场无关。Moonbeam Foundation不保证网站信息的准确性、完整性或真实性。如使用或依赖本网站信息,需自行承担相关风险,Moonbeam Foundation不承担任何责任和义务。这些材料的所有陈述和/或意见由提供方个人或实体负责,与Moonbeam Foundation立场无关,概不构成任何投资建议。对于任何特定事项或情况,应寻求专业权威人士的建议。此处的信息可能会包含或链接至第三方提供的信息与/或第三方服务(包括任何第三方网站等)。这类链接网站不受Moonbeam Foundation控制。Moonbeam Foundation对此类链接网站的内容(包括此类链接网站上包含的任何信息或资料)概不负责也不认可。这些链接内容仅为方便访客而提供,Moonbeam Foundation对因您使用此信息或任何第三方网站或服务提供的信息而产生的所有责任概不负责。
Last update: January 23, 2024
| Created: April 29, 2022