手把手教你搭建以太坊私有链:从零开始的实验指南**
以太坊作为全球领先的智能合约平台,其公有链虽然功能强大,但在某些场景下(如企业内部应用、数据隐私要求高的项目、开发测试等),搭建一条私有链或联盟链更为合适,私有链允许参与者对交易数据进行完全控制,无需担心公有链上的网络拥堵和高昂Gas费用,本文将详细介绍如何通过Geth(Go-Ethereum)客户端,从零开始搭建一条简单的以太坊私有链,并进行基本的交互实验。
# 安装Go (以Ubuntu为例,具体版本请参考Go官网) sudo apt update sudo apt install golang-go
# 下载并解压Geth (示例版本v1.10.25,请替换为最新稳定版) wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.10.25-4167d45b.tar.gz tar -xzf geth-linux-amd64-1.10.25-4167d45b.tar.gz sudo cp geth-linux-amd64-1.10.25-4167d45b/geth /usr/local/bin/ geth version # 验证安装
# 安装solc (通过npm,需先安装Node.js) sudo apt install nodejs npm npm install -g solc
私有链的第一个区块——创世区块需要我们手动定义,创建一个名为custom.json的文件,内容如下:

{
"config": {
"chainId": 15, // 私有链ID,避免与公有链冲突 (1-14为公有链保留)
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc": {
// 预分配一些以太坊给指定地址,可选
"0x1234567890123456789012345678901234567890": {
"balance": "100000000000000000000" // 100 ETH
}
},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x4000", // 初始难度,私有链可以设置低一些方便挖矿
"extraData": "",
"gasLimit": "0xffffffff",
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
说明:
chainId:私有链的唯一标识符,非常重要。alloc:预分配地址和余额,方便初始测试。difficulty:挖矿难度,私有链可以设置较低值,以便快速出块。使用Geth的init命令,根据创世区块文件初始化私有链数据目录。
cd my_private_chain # 使用创世区块文件初始化 geth --datadir "./data" init ../custom.json
执行成功后,会在./data目录下生成geth、keystore、chaindata等文件夹,用于存储链数据、账户信息和区块数据。
初始化完成后,启动私有链节点。

geth --datadir "./data" --nodiscover --rpc --rpcaddr "0.0.0.0" --rpcport "8545" --rpcapi "db,eth,net,web3,personal" --mine --minerthreads 1 --console
参数说明:
--datadir "./data":指定数据目录。--nodiscover:禁止节点自动发现其他节点,适用于私有链。--rpc:启用HTTP-RPC服务。--rpcaddr "0.0.0.0":RPC服务监听地址,0.0.0.0表示监听所有网络接口。--rpcport "8545":RPC服务端口,默认8545。--rpcapi "db,eth,net,web3,personal":允许通过RPC调用的API列表。--mine:开启挖矿。--minerthreads 1:挖矿线程数,根据CPU核心数调整。--console:启动后自动进入JavaScript控制台,方便交互。启动后,节点会开始尝试挖矿,由于我们设置了较低的难度,出块会很快,如果没有预分配地址或预分配地址没有解锁,节点会使用默认的coinbase地址挖矿。
当看到miner.start()返回的哈希值,并且区块高度开始增长时,表示节点运行正常,我们可以在Geth控制台进行以下操作:
查看账户信息:

// 查看当前账户列表 personal.listAccounts // 应该能看到预分配的地址(如果解锁了)和默认的coinbase地址 // 查看当前使用的账户(默认为coinbase) eth.coinbase
创建新账户:
// 创建一个新账户,并设置密码(注意:控制台输入密码不会显示)
personal.newAccount("your_password")
// 记住返回的新账户地址 解锁账户:
// 解锁账户,以便进行交易(如转账、部署合约)
personal.unlockAccount(eth.coinbase, "your_coinbase_password")
// 解锁预分配的账户(如果需要)
// personal.unlockAccount("0x1234567890123456789012345678901234567890", "alloc_password") 转账 (发送ETH):
// 从coinbase账户向新创建的账户转账1 ETH
// 参数:发送方,接收方,金额(单位:wei),单位
eth.sendTransaction({from: eth.coinbase, to: "0x新创建的账户地址", value: web3.toWei(1, "ether")})
// 查看交易状态,返回交易哈希
// 交易被打包后,接收方余额会增加 查看余额:
// 查看指定地址的余额(单位:wei)
web3.eth.getBalance("0x1234567890123456789012345678901234567890")
// 转换为ether显示
web3.fromWei(web3.eth.getBalance("0x1234567890123456789012345678901234567890"), "ether") 停止/开始挖矿:
// 停止挖矿 miner.stop() // 开始挖矿 miner.start(1) // 1为线程数
SimpleStorage.sol: