Skip to content

使用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:

  1. 如果您已全网安装Truffle,您可以执行:

    mkdir moonbeam-truffle-box && cd moonbeam-truffle-box
    truffle unbox moonbeam-foundation/moonbeam-truffle-box
    

    Unbox Moonbeam Truffle box

    否则,您可以直接复制以下代码库:

    git clone https://github.com/moonbeam-foundation/moonbeam-truffle-box
    cd moonbeam-truffle-box
    
  2. 使用本地系统中的文件,您可以通过运行以下命令安装所有依赖项:

    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开发节点,您需要:

  1. 下载对应的Docker镜像:

    truffle run moonbeam install
    

    Docker image download

  2. 下载后,您可以运行以下命令开始生成本地节点:

    truffle run moonbeam start
    

    您将看到节点启动的提示消息,紧随其后的是两个有效终端。

    Moonbeam local node started

当您使用完Moonbeam开发节点后,您可以运行以下命令行停止运行Moonbeam开发节点并将Docker镜像移除:

truffle run moonbeam stop && \
truffle run moonbeam remove

Moonbeam local node stoped and image removed

您可以选择暂停和取消暂停您的Moonbeam开发节点:

truffle run moonbeam pause
truffle run moonbeam unpause

您可以在下图中看到这些命令的输出:

Install Moonbeam Truffle box

注意事项

如果您熟悉Docker,您可以跳过插件命令,直接与Docker映像交互。

Truffle配置文件

Truffle配置文件已经包含了开始操作和部署合约至本地Moonbeam开发节点所需要的内容。打开truffle-config.js文件并查看以下详情:

  1. 来自Truffle的HDWalletProvider安装包已经被导入并作为分层确定性钱包使用

  2. privateKeyDev变量对应您的开发节点的私钥,该账户持有一定资金用于开发使用。您的开发节点拥有10个预充值帐户

  3. networks下面,您将看到dev网络配置,这将配置使用本地开发节点正在运行的端口以及开发帐户的私钥。对于部署合约至本地开发节点,两者缺一不可

  4. compilers下面,列出的solc编译器版本应设置为支持您希望部署的任何合约的版本。本示例所设置的支持版本为0.7.0及以上

  5. 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的迁移功能。您可以执行以下步骤编译和部署您的合约:

  1. 编译合约:

    truffle compile
    

    如果成功,您将看到如下所示的输出:

    Truffle compile success message

  2. 部署已编译的合约:

    truffle migrate --network moonbeam
    
    truffle migrate --network moonriver
    
    truffle migrate --network moonbase
    
    truffle migrate --network dev
    

    如果成功,您将看到部署成功的信息,包括已部署合约的地址:

    Successful contract deployment actions

使用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/。终端输出应类似于如下内容:

Forking terminal screen

要验证您是否已经分叉好网络,您可以查询最新区块号:

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