创建一个目录用于存放私有链数据
手把手教你搭建以太坊私有链:从零开始的实验指南**
以太坊作为全球领先的智能合约平台,其公有链虽然功能强大,但在某些场景下(如企业内部应用、数据隐私要求高的项目、开发测试等),搭建一条私有链或联盟链更为合适,私有链允许参与者对交易数据进行完全控制,无需担心公有链上的网络拥堵和高昂Gas费用,本文将详细介绍如何通过Geth(Go-Ethereum)客户端,从零开始搭建一条简单的以太坊私有链,并进行基本的交互实验。
实验目的
- 理解以太坊私有链的基本概念与搭建原理。
- 掌握使用Geth客户端初始化、启动私有链的方法。
- 学会在私有链上创建账户、查看账户信息、转账及部署简单智能合约。
- 体验私有链的运行机制与特点。
实验环境准备
- 操作系统:Linux (Ubuntu 18.04/20.04)、macOS 或 Windows (本文以Linux为例)。
- Go语言环境:Geth是Go语言编写的,需要安装Go (建议1.16及以上版本)。
# 安装Go (以Ubuntu为例,具体版本请参考Go官网) sudo apt update sudo apt install golang-go
- Geth客户端:可以从以太坊官方GitHub下载编译好的二进制文件或自行编译。
# 下载并解压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 # 验证安装
- 文本编辑器:如VS Code, Vim等,用于编写智能合约。
- Solidity编译器 (solc):用于编译智能合约。
# 安装solc (通过npm,需先安装Node.js) sudo apt install nodejs npm npm install -g solc
实验步骤
设计创世区块 (Genesis Block)
私有链的第一个区块——创世区块需要我们手动定义,创建一个名为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地址挖矿。
私有链交互 (通过Geth控制台)
当看到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:
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。




