WTF Solidity 工具篇 3:使用 Ganache 搭建本地以太坊测试网络并 Fork 主网
WTF Solidity 工具篇 3使用 Ganache 搭建本地以太坊测试网络并 Fork 主网【免费下载链接】WTF-SolidityWTF Solidity 极简入门教程供小白们使用。Now supports English! 官网: https://wtf.academy项目地址: https://gitcode.com/GitHub_Trending/wt/WTF-Solidity本指南基于 WTF-Solidity 仓库的 工具篇 3Ganache 整理并扩展面向 Solidity 入门开发者你将学会安装与启动 Ganache、通过命令行与 GUI 两种方式 Fork 主网、推进区块时间以及用 Remix、Web3.js、ethers.js 连接本地网络完成合约部署与调试从而在没有测试网水龙头Faucet的情况下也能获得充足的测试 ETH 和主网级合约上下文。Ganache 是什么Ganache是一个面向开发场景的以太坊区块链网络EVM 节点模拟器用于让以太坊应用的开发更快、更容易、更安全。它实现了所有流行的 RPC 功能与特性如事件、日志并且可以确定性地运行让开发调试变得轻而易举。简单理解Ganache 是一个以太坊区块链模拟器在开发过程中模拟生产环境方便开发者获取合约调用的上下文账户、余额、区块、Gas 等信息无需等待真实网络的区块同步。⚠️重要警告请不要将 Ganache 作为生产环境中的区块链网络使用。如果需要生产级节点请使用 geth、openethereum 等节点应用。Ganache 同时提供GUI 版本与命令行CLI版本GUI 适合新手快速配置使用CLI 适合脚本化、自动化与 CI 场景。项目设施Ganache 由 Truffle Suite 团队维护官方资源如下官网https://trufflesuite.com/ganache/文档https://trufflesuite.com/docs/ganache/GitHub 仓库UI 版本https://github.com/trufflesuite/ganache-uiCLI 版本https://github.com/trufflesuite/ganache旧版 CLI已弃用https://github.com/trufflesuite/ganache-cliGanache 7 命令行 / npm 使用文档https://trufflesuite.com/blog/introducing-ganache-7/⚠️注意官网中展示的 GitHub 仓库是UI 版本CLI 版本发布在 npm 上包含ganache与ganache-cli两个包名其中ganache-cli已被弃用新项目应使用ganache。在 WTF-Solidity 仓库中工具篇 7Foundry 提到的本地节点anvil与 Hardhat、Truffle 中的 Ganache 定位相同都是一个本地以太坊节点同样具备各种 Fork 功能——这说明本地节点 Fork 主网是当前主流 Solidity 开发工具链的通用能力模型。为什么要使用 GanacheGanache 的主要功能包括开箱即用快速启动一个 EVM 区块链网络可配置 miner矿工、出块时间block time便捷 Fork分叉fork已经存在的区块链网络无需等待区块同步console.log调试在 Solidity 开发过程中通过console.log方便地打印调试信息快进时间Fast-forward time模拟智能合约在未来时间点的状态模拟任意账户无需私钥即可在模拟环境中使用任意用户的 Token 进行测试。为什么需要本地 Fork有时你想测试合约或进行合约开发却需要去测试网领取 ETH而测试网水龙头faucet可能恰好没有 ETH 可领。这时你可以选择在本地Fork 一个网络原理是 Fork 一份主网运行在本地即运行在本地的 Chain想要多少 ETH 都可以直接生成不再受水龙头限制。Fork 主网还有一个好处你可以直接 Mock 主网上当前的所有环境例如 DEX 交易所中代币的余额。只要你知道合约地址就可以直接在本地进行测试和交换等操作而不会影响主网资金。命令行安装推荐使用 npm 全局安装 Ganachenpm install ganache --global你也可以在不使用--global的情况下将 Ganache 安装到项目目录并通过编写package.json中的scripts配置来启动。在 Ganache 7 之后你可以在 Node.js 的 JavaScript 脚本中引入并直接使用 Ganache。它将会提供一个 EIP-1193Ethereum Provider JavaScript API provider一个 JSON-RPC 服务端Web3.js 与 ethers.js 可用的 provider。同时你也可以在浏览器环境中使用它。启动 Ganache安装完成后直接运行ganache默认情况下Ganache CLI 会在127.0.0.1:8545上启动一个 RPC 服务并自动生成 10 个带 100 ETH 余额的测试账户具体账户数量与余额可通过--wallet.totalAccounts、--wallet.defaultBalance等参数调整。帮助 / 说明ganache --help通过帮助信息你可以了解 Ganache 的主要功能和配置参数主要包括Chain设置网络的版本、ID、时间、合约大小限制、hardfork 版本规则Database设置是否将链保存到数据库用于持久化Logging设置 EVM opcodes、RPC 请求与响应的日志输出Miner设置矿工相关参数包括出块时间、默认 gas price、交易 gas limit、难度、instamine即时挖矿、gas 价格上涨Wallet设置钱包的默认余额、是否解锁钱包Fork分叉网络的设置包括目标网络的 RPC URL、区块高度、userAgent、缓存策略并支持提供用户名/密码当目标 RPC 存在 Basic Authentication 时Server设置本地 Chain 的监听地址与端口。Fork 主网启动以下命令会自动生成 10 个 ETH 账号每个账号带有 100 ETH 的数量ganache -f https://eth-mainnet.alchemyapi.io/v2/YOUR_API_KEY其中YOUR_API_KEY需要替换为你自己的 Alchemy API Key。你也可以 Fork 其他以太坊兼容的区块链网络例如 BSC、Polygon、Astar 等只需寻找并使用他们对应的 RPC 节点地址即可。 如果你还没有 RPC 节点可以参考 工具篇 2Infura 申请 Infura 的主网 RPC 链接或使用 工具篇 4Alchemy 申请 Alchemy 的 API Key。Fork 主网固定账号启动如果你希望 Fork 主网后使用指定的私钥账号可以使用--wallet.accounts参数ganache -f https://eth-mainnet.alchemyapi.io/v2/YOUR_API_KEY --wallet.accountsACCOUNT_PRIATE_KEY,AMOUNT_WEI --wallet.accountsACCOUNT_PRIATE_KEY,1000000000000000000000参数说明wallet.accounts的主要参数为私钥和需要生成的ETH 数量⚠️ 注意余额单位为wei案例中的1000000000000000000000换算之后是1000 ETH该参数可以重复指定多次每次对应一个账号。推进时间Fast Forward time需要操纵时间的原因或场景一些合约锁住了用户的 Token设计了释放周期/时间逐步释放这些被锁住的 Token或者在未来某个特定时间允许用户进行某些操作。Ganache 允许我们通过 RPC 调用方法evm_increaseTime和evm_setTime来推进区块链上的时间。evm_increaseTime增加指定时间量大多数情况下我们无法等到这个时间可以使用evm_increaseTime将区块链当前时间戳增加指定的时间量以秒为单位以十六进制格式传入。该方法将返回以秒为单位调整的总时间。curl -H Content-Type: application/json --data {jsonrpc: 2.0, id: 1, method: evm_increaseTime, params: [0x15180] } http://localhost:8545上面的示例中0x15180是十六进制的86400秒即将链上时间向前推进 1 天。evm_setTime设置指定时间戳此外你可以使用evm_setTime将链上时间设置为特定的时间戳。它接受具有毫秒精度的 JavaScript 时间戳并返回给定时间戳和当前时间之间的秒数。 实用案例Liquity 项目的合约测试中就实现了ForwardTime功能在测试中推进区块时间以验证锁仓释放逻辑原文档引用了其testHelpers.js中的实现。在 WTF-Solidity 的 43_TokenVesting代币归属与 44_TokenLocker代币锁仓等教程中你也会遇到类似的时间锁 分步释放合约这正是 Ganache 时间推进能力的典型用武之地。通过 GUI 使用 Ganache如果不想敲命令行Ganache 官方提供了图形界面客户端适合新手快速熟悉 Ganache 的工作方式注意GUI 默认端口为7545与 CLI 默认的8545不同。下载地址https://trufflesuite.com/ganache/客户端界面启动后进入 Ganache GUI 主界面顶部导航包含ACCOUNTS账户、BLOCKS区块、TRANSACTIONS交易、CONTRACTS合约、EVENTS事件、LOGS日志等标签页状态信息区会显示当前区块高度、Gas 价格、Gas 限制、Hardfork 版本、网络 ID、RPC 服务器地址默认HTTP://127.0.0.1:7545以及挖矿状态AUTOMINING。初始化新建工作空间点击QUICKSTART即可快速启动一个默认工作空间快速启动默认的网络端口是7545如果你用 Remix 连接的时候需要修改端口。启动完成之后第一行可以看到你现在的网络rpc server默认地址和端口是127.0.0.1:7545如果你在 Remix 中使用默认的需要把端口改为7545。Remix 链接默认 Ganache在 Remix 部署页面选择环境为Ganache Provider具体端口需要和 Ganache 的端口一致端口改为和本地 Ganache 默认一样的7545后即可在 Remix 中部署合约到本地网络。测试部署一个合约部署完成后可以在 Ganache 的区块BLOCKS/交易TRANSACTIONS标签页看到区块里的交易信息其中会显示部署的合约地址。自定义配置有时候你可能需要自定义配置比如修改网络端口或者需要 Fork 主网。你可以在初始化空间的时候配置选择NEW WORKSPACE新建工作空间设置端口和网络 ID在Server配置区可以将默认端口7545改成8545看你的习惯同时可以设置网络 IDFork 主网在Chain配置区找到CHAIN FORKING链分叉选项打开开关后在ENTER CUSTOM URL中输入你的 ETH 主网 RPC 地址即可例如 Alchemy 或 Infura 提供的地址这里的地址填入你 Alchemy 的主网地址即可。没有的话申请一个 Alchemy 的 API Key或者参考 工具篇 2Infura 申请一个 Infura 的 RPC 链接。在CHAIN FORKING下面的ENTER CUSTOM URL里面填入你的 ETH mainnet 地址即可还可以指定BLOCK NUMBER区块号从特定高度分叉。设置固定账号和余额在Accounts Keys配置区可以自定义测试账号的私钥与余额便于在 Fork 主网后使用指定账户进行测试最后点击SAVE WORKSPACE即可启动你的自定义工作空间。web3.js / ethers.js 链接 GanacheGanache 命令行生成的本地 RPC 地址为127.0.0.1:8545UI 的默认地址是7545和命令行有区别所以上面做了端口变更像 Remix 默认使用的就是7545端口。在 JavaScript 项目中可以这样连接本地 Ganache// web3js const web3 new Web3(Web3.givenProvider || http://127.0.0.1:8545); // ethersjs const provider new ethers.providers.JsonRpcProvider(http://127.0.0.1:8545);拿到web3或provider之后就可以像连接真实网络一样进行转账、合约部署与调用、事件监听等操作。Ganache 提供的 EIP-1193 Provider 与 JSON-RPC 服务端保证了与 Web3.js、ethers.js 的完全兼容。Remix 链接本地 Ganache在 Remix 中把环境链接修改为Ganache即可这样你就可以把合约部署在你本地的 ETH 网络环境上了测试部署合约部署时Remix 会将合约部署到本地运行的 Ganache 上命令行/节点日志会输出部署的相应细节可以看到部署成功之后可以方便地在 Remix 中调用合约的各种方法部署合约查询 v 神余额这个合约写了一个可以查询 ETH 余额的方法。因为我们 Fork 了主网所以查询一下 v 神在我们本地测试网络的余额应该和主网的余额是一样的// contracts/GLDToken.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract XBXToken { function getETHBalance(address _address) view external returns(uint256) { return address(_address).balance; } }v 神主网钱包地址0xab5801a7d398351b8be11c439e05c5b3259aec9b可以在 Etherscan 上查看。将该合约部署到 Fork 主网的本地 Ganache 后通过 Remix 调用getETHBalance传入 v 神地址本地 Fork 的网络查询 v 神余额与主网上的余额一致说明Fork 主网测试成功。与 Foundry / Hardhat 工具链的配合在 WTF-Solidity 仓库的 工具篇 7Foundry 中anvil被明确描述为跟 hardhat 还有 truffle 中的 ganache 都是一样的是一个本地的 eth 节点同样拥有各种 fork 的功能。二者在功能上高度对应能力Ganache CLIFoundry anvil本地 EVM 节点✅ 默认端口 8545✅ 默认端口 8545Fork 主网ganache -f RPC_URLanvil --fork-url$RPC --fork-block-numberBLOCK时间操纵evm_increaseTime/evm_setTimeanvil_setNextBlockTimestamp等指定区块高度 ForkFork 配置中的 BLOCK NUMBER--fork-block-number两者的 RPC 均为 JSON-RPC 标准接口因此curl、Web3.js、ethers.js 以及 Remix 的连接方式完全通用。在仓库根目录的 foundry.toml 中可以看到项目统一使用 Foundrysolc 0.8.34跑全仓库合约测试而 Ganache 更适合交互式开发、Remix 联调与主网状态 Mock 场景。总结至此我们已经完整地安装并启动了 Ganache 本地测试网络通过命令行与 GUI 两种方式配置了端口、网络 ID 与固定账号成功 Fork 了一个主网查询 v 神余额与主网一致验证成功学会了用evm_increaseTime/evm_setTime推进区块时间打通了 Remix、Web3.js、ethers.js 与本地 Ganache 的连接。这样就为下一步合约开发搭建好了必要的本地环境——开发、调试、Mock 主网状态一站式完成且完全不需要等待测试网水龙头。【免费下载链接】WTF-SolidityWTF Solidity 极简入门教程供小白们使用。Now supports English! 官网: https://wtf.academy项目地址: https://gitcode.com/GitHub_Trending/wt/WTF-Solidity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考