使用Truffle部署至Moonbeam¶
概览¶
本教程将向您展示通过以太坊上常用的智能合约开发工具Truffle将基于Solidity智能合约部署至Moonbeam节点的操作过程。鉴于Moonbeam兼容以太坊的特性,Truffle可与Moonbeam节点一起直接使用。
为简化使用Truffle的步骤,您可以使用Moonbeam Truffle box。这将提供一个模板设置以加快在Moonbeam上的部署流程。Moonbeam Truffle box自带Moonbeam Truffle plugin,使您可以快速开始使用Moonbeam开发节点。
本教程将向您展示如何在本地运行的开发节点上使用Moonbeam Truffle box和Moonbeam Truffle plugin部署合约并之其交互。这教程也同样适用于Moonbeam、Moonriver和Moonbase Alpha测试网。
查看先决条件¶
本教程将使用Moonbeam Truffle box和Moonbeam Truffle plugin,所以您无需创建一个新账户,也无需为账户充值。Moonbeam开发节点拥有10个预充值帐户。然而,如果您想要使用Moonbeam、Moonriver或Moonbase Alpha,您将需要一个拥有资金的账户。 您可以每24小时一次从Moonbase Alpha水龙头上获取DEV代币以在Moonbase Alpha上进行测试。
要在Moonbeam或Moonriver网络上测试本指南中的示例,您可以从受支持的网络端点提供商之一获取您自己的端点和API密钥。
使用Moonbeam Truffle plugin之前,您需要准备已经安装的Docker。
在以下示例中,您无需全网安装Truffle,因其已作为依赖项包含在Moonbeam Truffle box中。但是,如果您希望使用truffle
命令直接替代运行中的npx truffle
或./node_modules/.bin/truffle
,您可以通过运行以下命令进行全网安装:
npm install -g truffle
使用Moonbeam Truffle Box创建项目¶
您可以遵循以下步骤以开始使用Moonbeam Truffle box:
-
如果您已全网安装Truffle,您可以执行:
mkdir moonbeam-truffle-box && cd moonbeam-truffle-box truffle unbox moonbeam-foundation/moonbeam-truffle-box
否则,您可以直接复制以下代码库:
git clone https://github.com/moonbeam-foundation/moonbeam-truffle-box cd moonbeam-truffle-box
-
使用本地系统中的文件,您可以通过运行以下命令安装所有依赖项:
npm install
如果您查看moonbeam-truffle-box
目录内部,您将发现以下需要注意的目录和文件:
contracts
—— 一个目录,用于存储您创建的任何Solidity合约,包括以下Moonbeam Truffle box中的合约:Migrations.sol
—— 使用Truffle迁移功能所需的合约MyToken.sol
—— 示例合约
migrations
—— 包含帮助您部署合约至网络的JavaScript文件。这带有以下脚本:1_initial_migration.js
—— 部署Migrations.sol
合约的脚本。由于此合约需要先部署才能使用迁移,因此合约以1
开头,您可以从那里创建具有递增编号前缀的新的迁移2_deploy_contracts.js
—— 部署示例合约MyToken.sol
的脚本
truffle-config.js
—— 项目的配置文件,您可以在其中定义项目可以部署的网络以及编译合约时所使用的编译器等
使用Moonbeam Truffle Plugin运行节点¶
现在,您已经创建了一个简单的Truffle项目,接下来您可以启动本地Moonbeam开发节点部署合约。Moonbeam Truffle plugin提供了一种在后台使用Docker快速开始开发节点的方法。
要在您的本地环境启动Moonbeam开发节点,您需要:
-
下载对应的Docker镜像:
truffle run moonbeam install
-
下载后,您可以运行以下命令开始生成本地节点:
truffle run moonbeam start
您将看到节点启动的提示消息,紧随其后的是两个有效终端。
当您使用完Moonbeam开发节点后,您可以运行以下命令行停止运行Moonbeam开发节点并将Docker镜像移除:
truffle run moonbeam stop && \
truffle run moonbeam remove
您可以选择暂停和取消暂停您的Moonbeam开发节点:
truffle run moonbeam pause
truffle run moonbeam unpause
您可以在下图中看到这些命令的输出:
注意事项
如果您熟悉Docker,您可以跳过插件命令,直接与Docker映像交互。
Truffle配置文件¶
Truffle配置文件已经包含了开始操作和部署合约至本地Moonbeam开发节点所需要的内容。打开truffle-config.js
文件并查看以下详情:
-
来自Truffle的
HDWalletProvider
安装包已经被导入并作为分层确定性钱包使用 -
privateKeyDev
变量对应您的开发节点的私钥,该账户持有一定资金用于开发使用。您的开发节点拥有10个预充值帐户 -
在
networks
下面,您将看到dev
网络配置,这将配置使用本地开发节点正在运行的端口以及开发帐户的私钥。对于部署合约至本地开发节点,两者缺一不可 -
在
compilers
下面,列出的solc编译器版本应设置为支持您希望部署的任何合约的版本。本示例所设置的支持版本为0.7.0
及以上 -
在
plugins
下面,您将看到够快速启动本地Moonbeam开发节点的moonbeam-truffle-plugin
以及为您自动执行合约验证步骤的truffle-plugin-verify
插件。想要获取如何使用插件的更多信息,请查看使用Etherscan Plugins验证智能合约
// 1. Import HDWalletProvider
const HDWalletProvider = require('@truffle/hdwallet-provider');
// 2. Moonbeam development node private key
const privateKeyDev =
'99B3C12287537E38C90A9219D4CB074A89A16E9CDB20BF85728EBD97C343E342';
module.exports = {
networks: {
// 3. Configure networks
dev: {
provider: () => {
...
return new HDWalletProvider(privateKeyDev, 'http://127.0.0.1:9944')
},
network_id: 1281, // 0x501 in hex,
},
},
// 4. Configure compiler & version
compilers: {
solc: {
version: '^0.7.0',
},
},
// 5. Plugin configuration
plugins: ['moonbeam-truffle-plugin', 'truffle-plugin-verify'],
};
注意事项
出于本教程目的,一些配置文件已从上述示例中移除。
如果您要使用Moonbeam、Moonriver或Moonbase Alpha,您将需要为对应网络更新配置文件。 要为Moonbeam或Moonriver网络配置您的项目,您可以从受支持的网络端点提供商之一获取您自己的端点和API密钥。 您也需要为网络上拥有资金的账户更新私钥:
moonbeam: {
provider: () => {
...
return new HDWalletProvider(
'PRIVATE-KEY-HERE', // Insert your private key here
'INSERT_RPC_API_ENDPOINT' // Insert your RPC URL here
)
},
network_id: 1284 // (hex: 0x504),
},
moonriver: {
provider: () => {
...
return new HDWalletProvider(
'PRIVATE-KEY-HERE', // Insert your private key here
'INSERT_RPC_API_ENDPOINT' // Insert your RPC URL here
)
},
network_id: 1285 // (hex: 0x505),
},
moonbase: {
provider: () => {
...
return new HDWalletProvider(
'PRIVATE-KEY-HERE', // Insert your private key here
'https://rpc.api.moonbase.moonbeam.network' // Insert your RPC URL here
)
},
network_id: 1287 // (hex: 0x507),
},
合约文件¶
在contracts
目录下,您将看到一个名为MyToken
的ERC-20 Token合约,这将为合约所有者铸造一定数量的Token:
pragma solidity ^0.7.5;
// Import OpenZeppelin Contract
import "@openzeppelin/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);
}
}
这是一个基于OpenZepplin ERC-20合约模板的的简易版ERC-20合约。该合约创建以MyToken
为符号和标准的 18 位小数的MyToken
。此外,还将为合约创建者设置初始Token供应量。
迁移脚本¶
Truffle使用一种称为迁移(Migrations)的概念。迁移是JavaScript文件,帮助您将合约部署至网络。
如果您在migrations
目录中查看迁移脚本,您将看到其中有两个文件。如前所述,需要先部署1_initial_migration.js
脚本并且需要启用Truffle的迁移功能。如果您查看在migrations/2_deploy_contracts.js
下的迁移脚本,这其中包含以下内容:
var MyToken = artifacts.require('MyToken');
module.exports = function (deployer) {
deployer.deploy(MyToken, '8000000000000000000000000');
};
此脚本导入编译合约时创建的MyToken
合约工件。然后使用它来部署具有任何初始构造函数值的合约。
在本示例中,8000000000000000000000000
是合约初始Token供应量,即800万小数点后18位。
使用Truffle部署合约至Moonbeam¶
在部署之前必须先对合约进行编译。友情提示,您将使用migrations/1_initial_migration.js
脚本先部署Migrations.sol
合约。这将为您启用Truffle的迁移功能。您可以执行以下步骤编译和部署您的合约:
-
编译合约:
truffle compile
如果成功,您将看到如下所示的输出:
-
部署已编译的合约:
truffle migrate --network moonbeam
truffle migrate --network moonriver
truffle migrate --network moonbase
truffle migrate --network dev
如果成功,您将看到部署成功的信息,包括已部署合约的地址:
使用Ganache进行分叉¶
Ganache是Truffle开发工具套件的一部分,是您用于本地开发和测试的个人区块链。您可以使用Ganache分叉Moonbeam,这将在本地模拟实时网络,使您能够在本地测试环境中与已经部署在Moonbeam上的合约交互。
使用Ganache分叉时需要注意一些限制。由于Ganache是基于EVM实现,因此您无法与任何Moonbeam的预编译合约及其功能交互。预编译是Substrate实现的一部分,因此无法在模拟的EVM环境中复制。从而,您无法与在Moonbeam上的跨链资产和基于Substrate的功能(如质押和治理)进行交互。
在Truffle项目中,您可以通过运行以下命令安装Ganache CLI:
npm install ganache
然后,您可以添加脚本以在package.json
文件中运行Ganache分叉:
...
"scripts": {
"ganache": "ganache --fork.url INSERT_RPC_API_ENDPOINT"
},
...
...
"scripts": {
"ganache": "ganache --fork.url INSERT_RPC_API_ENDPOINT"
},
...
...
"scripts": {
"ganache": "ganache --fork.url https://rpc.api.moonbase.moonbeam.network"
},
...
当您启动分叉的实例时,您将拥有10个预注资1,000个测试Token的开发账户。分叉实例位于http://127.0.0.1:8545/
。终端输出应类似于如下内容:
要验证您是否已经分叉好网络,您可以查询最新区块号:
curl --data '{"method":"eth_blockNumber","params":[],"id":1,"jsonrpc":"2.0"}' -H "Content-Type: application/json" -X POST localhost:8545
如果您已经将result
从16进制转换成十进制,您应该在分叉网络时获得了最新区块号。您可以使用区块浏览器交叉查询区块号。
在这里,您可以部署新的合约到您的Moonbeam分叉实例,或者通过创建已部署合约的本地实例与已部署合约交互。
要与已部署合约交互,您可以使用Ethers.js或Web3.js在scripts
目录中创建新脚本。首先,您将需要安装你选择的JavaScript库:
npm install ethers
npm install web3
然后,您可以创建一个新脚本来访问网络上的实时合约:
const ethers = require('ethers');
async function main() {
const provider = new ethers.JsonRpcProvider('http://127.0.0.1:8545/');
const contract = new ethers.Contract(
'INSERT_CONTRACT_ADDRESS', 'INSERT_CONTRACT_ABI', provider
);
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
const Web3 = require('web3');
async function main() {
const web3 = new Web3('http://127.0.0.1:8545/');
const contract = new web3.eth.Contract('INSERT_CONTRACT_ADDRESS', 'INSERT_CONTRACT_ABI');
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
要运行脚本,您可以使用以下命令:
truffle exec INSERT_PATH_TO_FILE
| Created: March 21, 2022