使用Foundry部署合约至Moonbeam¶
概览¶
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项目,您需要通过以下步骤创建一个:
-
如果您尚未安装,您需要先安装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
-
创建项目,这将创建一个文件夹,其中包含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
编译完成后,将创建两个文件夹:out
和cache
。您合约的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包括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”:
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部署和交互合约!
Created: August 18, 2022