:2026-02-11 17:27 点击:9
以太坊作为目前最智能的平台和区块链操作系统之一,其强大的去中心化应用(DApps)开发能力吸引了全球开发者,对于许多 JavaScript 开发者而言,利用熟悉的语言与以太坊生态系统交互是进入区块链领域的自然选择,而搭建以太坊私链,则是在无需担心成本和安全风险的前提下,进行开发、测试和实验的理想选择,本文将详细介绍如何使用 JavaScript 及相关工具来搭建和交互以太坊私链。
web3.js、ethers.js 等,极大地简化了与以太坊节点交互的复杂性。在 JavaScript 生态中,搭建以太坊私链最常用的工具是 Geth(Go-Ethereum)配合 Node.js 以及相关的 JavaScript 库。
--dev 模式或通过自定义创世块的方式。ethers.js 以其更现代的 API 设计和对 EIP-1193 标准的良好支持而越来越受欢迎。ethers.js 为例)scoop 等包管理器。brew install geth。apt-get install geth (Ubuntu/Debian) 或从源码编译。
PATH 中,以便在命令行中直接调用 geth 命令。最简单的方式是使用 Geth 的 --dev 模式,它会自动创建一个包含预挖区块和测试账户的私有开发网络。
打开终端,运行以下命令:
geth --dev --http --http.addr "0.0.0.0" --http.port "8545" --http.api "eth,net,web3,personal"
命令参数说明:
--dev:启动开发模式,创建一个全新的私有链,包含一个预分配了 10000 ETH 的测试账户,并自动挖矿。--http:启用 HTTP-RPC 服务,允许通过 HTTP API 访问节点。--addr "0.0.0.0":监听所有网络接口,方便本地或其他机器访问。--http.port "8545":指定 HTTP-RPC 服务的端口号,默认是 8545。--http.api "eth,net,web3,personal":暴露指定的 API 接口。启动后,Geth 会开始同步区块(在 --dev 模式下会很快),并自动开始挖矿,你会看到类似 Mining started 的输出。
ethers.js) 与私链交互初始化项目并安装 ethers.js:
在新的项目目录下,运行:
npm init -y npm install ethers
编写交互脚本:
创建一个 interact.js 文件,编写以下代码:
const { ethers } = require("ethers");
// 1. 连接到私链的 HTTP-RPC 端点
const provider = new ethers.providers.JsonRpcProvider("http://localhost:8545");
// 2. 获取链信息(可选)
console.log("Connected to network:", (await provider.getNetwork()).name);
console.log("Chain ID:", (await provider.getNetwork()).chainId);
console.log("Latest block number:", await provider.getBlockNumber());
// 3. 获取 dev 模式下默认的测试账户
// 在 --dev 模式下,Geth 会创建一个默认账户,其私钥是固定的
// 注意:在实际项目中,不要硬编码私钥!这里仅用于演示 dev 模式
const devPrivateKey = "0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d"; // geth --dev 默认账户私钥
const wallet = new ethers.Wallet(devPrivateKey, provider);
console.log("\nDefault account address:", wallet.address);
console.log("Default account balance:", ethers.utils.formatEther(await wallet.getBalance()));
// 4. 发送一笔交易(从一个账户转账到另一个新账户)
// 创建一个新账户作为接收方
const receiverWallet = ethers.Wallet.createRandom();
console.log("\nReceiver address:", receiverWallet.address);
console.log("Receiver initial balance:", ethers.utils.formatEther(await provider.getBalance(receiverWallet.address)));
// 构建并发送交易
const tx = await wallet.sendTransaction({
to: receiverWallet.address,
value: ethers.utils.parseEther("0.1"), // 转账 0.1 ETH
gasLimit: 21000, // 转 ETH 的标准 gas 限制
gasPrice: await provider.getGasPrice() // 获取当前建议的 gas 价格
});
console.log("\nTransaction hash:", tx.hash);
console.log("Waiting for transaction to be mined...");
// 等待交易被打包
await tx.wait();
console.log("Transaction mined!");
// 检查转账后的余额
console.log("Sender balance after tx:", ethers.utils.formatEther(await wallet.getBalance()));
console.log("Receiver balance after tx:", ethers.utils.formatEther(await provider.getBalance(receiverWallet.address)));
运行脚本:
在终端中运行:
node interact.js
你应该能看到脚本成功连接到私链,获取账户信息,并执行了转账交易,最终打印出交易前后的余额变化,Geth 终端中也会显示新的区块被挖出。
对于更复杂的测试场景,可能需要自定义创世块或搭建多节点私链。
自定义创世块:
genesis.json 文件,定义创世区块的配置,如链 ID、初始账户列表、共识算法(如 clique 用于 PoA)、难度等。geth --datadir "./mychain" init genesis.json 命令用该创世文件初始化数据目录。geth --datadir "./mychain" --networkid 12345 --http --http.addr "0.0.0.0" --http.port "8545" 启动节点,--networkid 用于区分不同的网络。多节点私链:
geth.config 或启动命令中通过 --bootnodes 指定其他节点的 enode 地址,使它们能够互相发现和连接。本文由用户投稿上传,若侵权请提供版权资料并联系删除!