4. 使用Ganache作为本地测试链
任务说明
在智能合约开发中,频繁部署到公开测试网既慢又耗费测试币。本案例目标是在本地启动一个 Ganache 区块链节点,将其作为 Truffle 或 Hardhat 项目的测试链,完成合约编译、迁移部署与交互验证,形成一套不依赖外网的合约测试闭环。
实现方案
采用 Ganache CLI(命令行版本)作为本地测试链,配合 Truffle 框架完成合约部署与调用。Ganache 启动后自动生成 10 个带 100 ETH 测试余额的账户,监听 7545 端口。通过 Truffle 的配置文件将网络指向本地节点,使用迁移脚本部署合约,最后通过 Truffle Console 调用合约方法验证链上状态变更。
代码实现
首先安装依赖并初始化项目结构:
# 全局安装 Ganache CLI 与 Truffle
npm install -g ganache-cli truffle
# 创建项目目录并初始化 Truffle 空项目
mkdir ganache-demo && cd ganache-demo
truffle init
编写一个简单的计数器合约,用于验证链上交互:
// contracts/Counter.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Counter {
uint256 private _count;
event Incremented(uint256 newValue);
function increment() external {
_count += 1;
emit Incremented(_count);
}
function getCount() external view returns (uint256) {
return _count;
}
}
配置 Truffle 连接本地 Ganache 节点(编辑 truffle-config.js):
// truffle-config.js
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 7545,
network_id: "*" // 匹配任何网络 ID
}
},
compilers: {
solc: {
version: "0.8.0"
}
}
};
编写迁移脚本:
// migrations/2_deploy_counter.js
const Counter = artifacts.require("Counter");
module.exports = function (deployer) {
deployer.deploy(Counter);
};
运行与验证
按以下步骤执行,即可完成本地测试链的完整闭环:
# 终端 1:启动 Ganache 本地链
ganache-cli --port 7545
# 终端 2:编译合约
truffle compile
# 部署到本地链
truffle migrate --network development
# 进入 Truffle 控制台交互验证
truffle console --network development
在 Truffle 控制台中执行以下命令验证合约功能:
truffle(development)> const counter = await Counter.deployed()
truffle(development)> await counter.getCount()
// 预期输出:BN { negative: 0, words: [0, <1 empty slot>], length: 1, red: null } —— 表示初始值为 0
truffle(development)> await counter.increment()
truffle(development)> await counter.getCount()
// 预期输出:BN { negative: 0, words: [1, <1 empty slot>], length: 1, red: null } —— 表示值变为 1
验证判定标准:
- Ganache 终端输出 10 个账户地址及助记词,监听 7545 端口无报错;
truffle migrate显示部署成功,包含合约地址与交易哈希;- 控制台调用
getCount()返回 0,调用increment()后再次调用返回 1,证明状态已写入本地链; - Ganache 终端同步显示交易日志,包含区块号与 gas 消耗。
关键说明
本案例中 Ganache 的 network_id 使用通配符 *,可自动匹配任意链 ID,便于本地开发。若需固定 ID,可在启动时添加 --networkId 5777 参数并在配置中指定。合约部署后,Ganache 终端会显示每个交易的区块确认信息,这是验证交易上链的直接证据。若迁移失败,优先检查 Ganache 是否仍在运行、端口是否被占用,以及 Solidity 编译器版本是否与合约 pragma 声明一致。