Skip to content

使用Foundry部署合约至Moonbeam

Foundry Create Project

概览

Foundry是一个用Rust语言编写的以太坊部署环境,能够帮助开发者管理依赖项、编译项目、运行测试、部署合约以及从命令行与区块链交互。Foundry可以直接与Moonbeam的以太坊API交互,所以可以直接用于将智能合约部署至Moonbeam。

Foundry由三个工具组成:

  • Forge - 编译、测试和部署合约
  • Cast - 用于与合约交互的命令行界面
  • Anvil - 用于开发目的的本地测试节点,可分叉预先存在的网络

本教程将涵盖如何使用Foundry在Moonbase Alpha TestNet上编译、部署和调试以太坊智能合约。此教程同样适用于Moonbeam、Moonriver和Moonbeam开发节点。

查看先决条件

开始之前,您将需要准备以下内容:

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

创建Foundry项目

如果您尚未拥有Foundry项目,您需要通过以下步骤创建一个:

  1. 如果您尚未安装,您需要先安装Foundry。如果您在Linux或MacOS系统操作,您可以运行以下命令:

    curl -L https://foundry.paradigm.xyz | bash
    foundryup
    

    如果在Windows系统操作,您必须安装Rust,然后从源代码构建Foundry:

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs/ | sh
    cargo install --git https://github.com/foundry-rs/foundry foundry-cli anvil --bins --locked
    
  2. 创建项目,这将创建一个文件夹,其中包含3个文件夹:

    forge init foundry
    

创建默认项目后,您将看到以下三个文件夹:

  • lib - 项目所有的依赖项以git子模块的形式
  • src - 用于存放智能合约(以及功能)
  • test - 用于存放项目的Forge测试,这些测试是用Solidity编写的

除了这三个文件夹,还将创建一个git项目以及一个预先编写的.gitignore文件,其中相关文件类型和文件夹被忽略。

源代码文件夹

src文件夹可能已经包含Contract.sol(一个最小的Solidity合约),您可以自行删除此合约。相反,您需要部署一个ERC-20合约。在合约目录中,您可以创建一个MyToken.sol文件:

cd src
touch MyToken.sol

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

pragma solidity ^0.8.0;

// Import OpenZeppelin Contract
import "openzeppelin-contracts/contracts/token/ERC20/ERC20.sol";

// This ERC-20 contract mints the specified amount of tokens to the contract creator
contract MyToken is ERC20 {
  constructor(uint256 initialSupply) ERC20("MyToken", "MYTOK") {
    _mint(msg.sender, initialSupply);
  }
}

在尝试编译合约之前,您需要安装OpenZeppelin合约作为依赖项。您可能需要先将以前的更改提交到git。默认情况下,Foundry使用git子模块而非npm程序包,因此没有使用传统的npm导入路径和命令。相反,使用OpenZeppelin Github repo的名称。

forge install OpenZeppelin/openzeppelin-contracts

编译Solidity

安装完所有的依赖项后,您可以开始编译合约:

forge build

Foundry Contract Compile

编译完成后,将创建两个文件夹:outcache。您合约的ABI和字节码将包含在out文件夹中。这两个文件夹已被默认Foundry项目初始化中包含的.gitignore忽略。

部署合约

使用Forge部署合约需要一个命令,但您将需要包含一个RPC端点、一个拥有资金的私钥和构造函数参数。MyToken.sol要求在其构造函数中提供Token初始供应量,因此以下每个命令将包含100作为构造函数。您可以为正确的网络使用命令部署MyToken.sol合约。

forge create --rpc-url RPC-API-ENDPOINT-HERE \
--constructor-args 100 \
--private-key YOUR_PRIVATE_KEY \
src/MyToken.sol:MyToken 
forge create --rpc-url RPC-API-ENDPOINT-HERE \
--constructor-args 100 \
--private-key YOUR_PRIVATE_KEY \
src/MyToken.sol:MyToken 
forge create --rpc-url https://rpc.api.moonbase.moonbeam.network \
--constructor-args 100 \
--private-key YOUR_PRIVATE_KEY \
src/MyToken.sol:MyToken 
forge create --rpc-url http://127.0.0.1:9944 \
--constructor-args 100 \
--private-key YOUR_PRIVATE_KEY \
src/MyToken.sol:MyToken 

几分钟后,合约完成部署,您将在终端看到地址。

Foundry Contract Deploy

恭喜您,您的合约已上线!保存地址,用于后续合约实例交互。

与合约交互

Foundry包括cast,一个用于执行以太坊RPC调用的CLI。

尝试使用cast检索Token名称,其中YOUR_CONTRACT_ADDRESS是您在上一部分部署合约的地址:

cast call YOUR_CONTRACT_ADDRESS "name()" --rpc-url RPC-API-ENDPOINT-HERE
cast call YOUR_CONTRACT_ADDRESS "name()" --rpc-url RPC-API-ENDPOINT-HERE
cast call YOUR_CONTRACT_ADDRESS "name()" --rpc-url https://rpc.api.moonbase.moonbeam.network
cast call YOUR_CONTRACT_ADDRESS "name()" --rpc-url http://127.0.0.1:9944

您需要获取此数据的hex格式:

0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000074d79546f6b656e00000000000000000000000000000000000000000000000000

此数据非可读,但您可以使用cast将其转换成您想要的格式。在这种情况下,数据是文本,因此您可以将其转换为ascii字符以查看“My Token”:

Foundry Contract View

cast --to-ascii 0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000074d79546f6b656e00000000000000000000000000000000000000000000000000

您也可以使用cast来改变数据。通过将其发送到0地址来尝试销毁Token。

cast send --private-key YOUR_PRIVATE_KEY \
--rpc-url RPC-API-ENDPOINT-HERE \
--chain 1284 \
YOUR_CONTRACT_ADDRESS \
"transfer(address,uint256)" 0x0000000000000000000000000000000000000001 1
cast send --private-key YOUR_PRIVATE_KEY \
--rpc-url RPC-API-ENDPOINT-HERE \
--chain 1285 \
YOUR_CONTRACT_ADDRESS \
"transfer(address,uint256)" 0x0000000000000000000000000000000000000001 1
cast send --private-key YOUR_PRIVATE_KEY \
--rpc-url https://rpc.api.moonbase.moonbeam.network \
--chain 1287 \
YOUR_CONTRACT_ADDRESS \
"transfer(address,uint256)" 0x0000000000000000000000000000000000000001 1
cast send --private-key YOUR_PRIVATE_KEY \
--rpc-url http://127.0.0.1:9944 \
--chain 1281 \
YOUR_CONTRACT_ADDRESS \
"transfer(address,uint256)" 0x0000000000000000000000000000000000000001 1

交易将由您的Moonbase账户签署并传播到网络。输出应如下所示:

Foundry Contract Interaction

恭喜您!您已成功使用Foundry部署和交互合约!

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

Last update: October 11, 2022
Created: August 18, 2022