通过Geth搭建私有以太坊网络
前言
为了进一步了解以太坊区块链网络的工作方式和运行原理,笔者通过官方软件Geth搭建了私有以太坊网络fantasynetwork,最终实现了单机和多机节点间的相互连通:首先通过VMware Workstation创建基础Ubuntu实验平台,再安装Golang[1]、Geth[2]等依赖环境;其次使用puppeth工具生成私网的配置文件fantasynetwork.json并复制到三个节点目录下,三个节点均使用该配置文件初始化网络;最后使用static-nodes.json的方式将三个节点设为默认接入节点,实现节点间的连通,连通后各节点中的账户可以互相转账挖矿。
单机多节点私网[3]
本试验的项目结构为:
privateNet
├── accounts.txt
├── fantasynetwork.json
├── node1
│ ├── geth
│ ├── keystore
│ ├── node.sh
│ ├── password.txt
│ └── static-nodes.json
├── node2
│ ├── geth
│ ├── keystore
│ ├── node.sh
│ ├── password.txt
│ └── static-nodes.json
└── node3
├── geth
├── keystore
├── node.sh
├── password.txt
└── static-nodes.json
创建工作目录
- 创建私网工作目录
mkdir privateNet && cd privateNet - 创建三个节点数据目录
mkdir node1 node2 node3privateNet/
├── node1
├── node2
└── node3
创建默认用户
- Node1
test@ubuntu:~/privateNet$ geth --datadir node1/ account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Password:
Repeat password: Your new key was generated Public address of the key: 0x600d77B8ce36B829BFC8a1Cc5696Faf2218bDf75
Path of the secret key file: node1/keystore/UTC--2021-08-11T04-51-26.533482715Z--600d77b8ce36b829bfc8a1cc5696faf2218bdf75
- Node 2
test@ubuntu:~/privateNet$ geth --datadir node2/ account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Password:
Repeat password: Your new key was generated Public address of the key: 0x2F7fD5BD0026f7C2f0dB94b79D58AFE517BC56d2
Path of the secret key file: node2/keystore/UTC--2021-08-11T04-53-30.820914994Z--2f7fd5bd0026f7c2f0db94b79d58afe517bc56d2
- Node3
test@ubuntu:~/privateNet$ geth --datadir node3/ account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Password:
Repeat password: Your new key was generated Public address of the key: 0x6c1440E9c6Ca93C18B1e2A069D1D5a70e29C2363
Path of the secret key file: node3/keystore/UTC--2021-08-11T04-54-24.244487186Z--6c1440e9c6ca93c18b1e2a069d1d5a70e29c2363
在此创建账户的密码设置为
fantasy,操作完成后会在每个节点目录下的keystore目录中找到账户密钥文件/钱包地址。
保存账户凭证
- 将以上账户的公钥地址保存至文本文件
echo '0x600d77B8ce36B829BFC8a1Cc5696Faf2218bDf75' >> accounts.txt
echo '0x2F7fD5BD0026f7C2f0dB94b79D58AFE517BC56d2' >> accounts.txt
echo '0x6c1440E9c6Ca93C18B1e2A069D1D5a70e29C2363' >> accounts.txt
- 为了实验方便,将账户对应的密码文件保存至对应节点目录下
echo 'fantasy' > node1/password.txt
echo 'fantasy' > node2/password.txt
echo 'fantasy' > node3/password.txt
创建配置文件
- 设置网络名称
test@ubuntu:~/privateNet$ puppeth
Please specify a network name to administer (no spaces, hyphens or capital letters please)
> fantasynetwork
Sweet, you can set this via --network=fantasynetwork next time!
INFO [08-10|22:08:31.110] Administering Ethereum network name=fantasynetwork
WARN [08-10|22:08:31.110] No previous configurations found path=/home/test/.puppeth/fantasynetwork
- 选择程序功能
What would you like to do? (default = stats)
1. Show network stats
2. Configure new genesis
3. Track new remote server
4. Deploy network components
> 2
- 选择创建网络
What would you like to do? (default = create)
1. Create new genesis from scratch
2. Import already existing genesis
> 1
- 选择共识算法
Which consensus engine to use? (default = clique)
1. Ethash - proof-of-work
2. Clique - proof-of-authority
> 1
- 选择默认账号
Which accounts should be pre-funded? (advisable at least one)
> 0x600d77B8ce36B829BFC8a1Cc5696Faf2218bDf75
> 0x2F7fD5BD0026f7C2f0dB94b79D58AFE517BC56d2
> 0x6c1440E9c6Ca93C18B1e2A069D1D5a70e29C2363
> 0x
- 设置默认单位
Should the precompile-addresses (0x1 .. 0xff) be pre-funded with 1 wei? (advisable yes)
> yes
- 设置网络ID
Specify your chain/network ID if you want an explicit one (default = random)
> 7777
INFO [08-10|22:16:40.485] Configured new genesis block
- 导出配置文件
What would you like to do? (default = stats)
1. Show network stats
2. Manage existing genesis
3. Track new remote server
4. Deploy network components
> 2
1. Modify existing configurations
2. Export genesis configurations
3. Remove genesis configuration
> 2
Which folder to save the genesis specs into? (default = current)
Will create fantasynetwork.json, fantasynetwork-aleth.json, fantasynetwork-harmony.json, fantasynetwork-parity.json
>
INFO [08-10|22:18:48.283] Saved native genesis chain spec path=fantasynetwork.json
INFO [08-10|22:18:48.285] Saved genesis chain spec client=aleth path=fantasynetwork-aleth.json
INFO [08-10|22:18:48.286] Saved genesis chain spec client=parity path=fantasynetwork-parity.json
INFO [08-10|22:18:48.287] Saved genesis chain spec client=harmony path=fantasynetwork-harmony.json
- 退出工具
What would you like to do? (default = stats)
1. Show network stats
2. Manage existing genesis
3. Track new remote server
4. Deploy network components
> ^C
此时可在当前目录下看见生成的四个配置文件,在此只用到
fantasynetwork.json文件,其他文件可删去。
- 修改配置文件
为了更容易挖到矿,将配置文件中difficulty难度值调小(其它参数含义可参考《创世区块配置文件genesis.json的格式解读》[4]):

初始化三个节点
每个节点必须使用相同的配置文件进行初始化:
geth --datadir node1/ init fantasynetwork.json
geth --datadir node2/ init fantasynetwork.json
geth --datadir node3/ init fantasynetwork.json
运行三个节点
进入对应的节点目录下执行一下命令(其它参数含义可参考《以太坊客户端Geth命令用法-参数详解》[5]):
- Node1
geth --nousb --datadir=$pwd --syncmode 'full' --port 27271 --miner.gasprice 0 --miner.gastarget 470000000000 --http --http.addr 'localhost' --http.port 7271 --http.api admin,eth,miner,net,txpool,personal,web3 --mine --allow-insecure-unlock --unlock "0x600d77B8ce36B829BFC8a1Cc5696Faf2218bDf75" --password password.txt

得到节点一的enode:enode://0f870fa3f8085f5abf74ea7c2a12a0809a9daaece20e3b1c4c80fb6929ff652681068c6ffd47852a4544dc282a4a15f531b452e05c4f1cf6861d4fb3b728edeb@127.0.0.1:27271
- Node2
geth --nousb --datadir=$pwd --syncmode 'full' --port 27272 --miner.gasprice 0 --miner.gastarget 470000000000 --http --http.addr 'localhost' --http.port 7272 --http.api admin,eth,miner,net,txpool,personal,web3 --mine --allow-insecure-unlock --unlock "0x2F7fD5BD0026f7C2f0dB94b79D58AFE517BC56d2" --password password.txt
得到节点二的enode:
enode://45c2fc2bfdf0f48afe2083d82cc1cc642a96fcc2815755024a17b95b9fd1b3124f89e186c88a5013ced1c00bd10060a90e6b53e94fdbbfa6098b3088b3f78274@127.0.0.1:27272
- Node3
geth --nousb --datadir=$pwd --syncmode 'full' --port 27273 --miner.gasprice 0 --miner.gastarget 470000000000 --http --http.addr 'localhost' --http.port 7273 --http.api admin,eth,miner,net,txpool,personal,web3 --mine --allow-insecure-unlock --unlock "0x6c1440E9c6Ca93C18B1e2A069D1D5a70e29C2363" --password password.txt
得到节点三的enode:
enode://ae4b4e18afa6238753e14ca3e99c0858509fc76efee715dd1c8278bbb7eaa5614fdc8b77a82bf7baf128c14ef574cc6701514fbb97780d30c731f7bc82dfd932@127.0.0.1:27273
连通三个节点
Geth主要有三种方法连通其它节点:启动前配置static-nodes.json文件添加节点、启动时通过--bootnodes添加节点、启动后在控制台通过admin.addPeer命令添加节点。在此我们使用第一种方法。
- 在工作目录下创建
static-nodes.json:[
"enode://0f870fa3f8085f5abf74ea7c2a12a0809a9daaece20e3b1c4c80fb6929ff652681068c6ffd47852a4544dc282a4a15f531b452e05c4f1cf6861d4fb3b728edeb@127.0.0.1:27271",
"enode://45c2fc2bfdf0f48afe2083d82cc1cc642a96fcc2815755024a17b95b9fd1b3124f89e186c88a5013ced1c00bd10060a90e6b53e94fdbbfa6098b3088b3f78274@127.0.0.1:27272",
"enode://ae4b4e18afa6238753e14ca3e99c0858509fc76efee715dd1c8278bbb7eaa5614fdc8b77a82bf7baf128c14ef574cc6701514fbb97780d30c731f7bc82dfd932@127.0.0.1:27273"
]
- 将该文件复制到每个节点根目录下:
cp static-nodes.json node1/
cp static-nodes.json node2/
cp static-nodes.json node3/
- 为了简化启动,可以创建启动节点批处理文件
- node1/node.sh
nohup geth --nousb --datadir=$pwd --syncmode 'full' --port 27271 --miner.gasprice 0 --miner.gastarget 470000000000 --http --http.addr 'localhost' --http.port 7271 --http.api admin,eth,miner,net,txpool,personal,web3 --mine --allow-insecure-unlock --unlock "0x600d77B8ce36B829BFC8a1Cc5696Faf2218bDf75" --password password.txt &
echo "Geth started on node 1"
- node2/node.sh
nohup geth --nousb --datadir=$pwd --syncmode 'full' --port 27272 --miner.gasprice 0 --miner.gastarget 470000000000 --http --http.addr 'localhost' --http.port 7272 --http.api admin,eth,miner,net,txpool,personal,web3 --mine --allow-insecure-unlock --unlock "0x2F7fD5BD0026f7C2f0dB94b79D58AFE517BC56d2" --password password.txt &
echo "Geth started on node 2"
- node2/node.sh
nohup geth --nousb --datadir=$pwd --syncmode 'full' --port 27273 --miner.gasprice 0 --miner.gastarget 470000000000 --http --http.addr 'localhost' --http.port 7273 --http.api admin,eth,miner,net,txpool,personal,web3 --mine --allow-insecure-unlock --unlock "0x6c1440E9c6Ca93C18B1e2A069D1D5a70e29C2363" --password password.txt &
echo "Geth started on node 3"
- node1/node.sh
- 启动各节点
test@ubuntu:~/privateNet/node1$ sh node.sh
test@ubuntu:~/privateNet/node2$ sh node.sh
test@ubuntu:~/privateNet/node3$ sh node.sh
- 打开三个终端,使用
geth attach命令接入三个节点命令行test@ubuntu:~/privateNet/node1$ geth attach geth.ipc
test@ubuntu:~/privateNet/node2$ geth attach geth.ipc
test@ubuntu:~/privateNet/node3$ geth attach geth.ipc

- 查看已连接节点

此时各节点已连接完成,每个节点账户默认为10个以太币,各节点账户间可自由转账和挖矿,需要注意的是转账后必须经过挖矿操作才能被写入区块链。上方法启动后的程序将会运行在后台,关闭需通过ps ax | grep geth命令和kill <process id>命令。
多机多节点私网
准备
- 设置上节Ubuntu虚拟机网络模式为桥接,且IP设为静态IP
172.25.1.99 - Windows的IP设为静态
172.25.1.55
加入私网
- 在Windows下创建文件夹node4,并将fantasynetwork.json复制到其中
- 初始化节点4
C:\Users\Fantasy\Desktop\node4> geth --datadir . init fantasynetwork.json
- 新建账户
C:\Users\Fantasy\Desktop\node4>geth -datadir . console
> personal.newAccount("fantasy")
WARN [08-11|16:13:32.987] Please remember your password!
"0xbef61b5754ffaa843cc9199fb9a11aac468134f4"
> exit
- 启动节点4
geth --nousb --datadir=. --syncmode "full" --port 27271 --miner.gasprice 0 --miner.gastarget 470000000000 --http --http.addr 0.0.0.0 --http.port 7271 --http.api admin,eth,miner,net,txpool,personal,web3 --mine --allow-insecure-unlock console
- 添加节点1[6]
> net.peerCount
0
> admin.addPeer("enode://0f870fa3f8085f5abf74ea7c2a12a0809a9daaece20e3b1c4c80fb6929ff652681068c6ffd47852a4544dc282a4a15f531b452e05c4f1cf6861d4fb3b728edeb@172.25.1.99:27271")
true
> net.peerCount
1
此时各节点已连接完成,各节点账户间可自由转账和挖矿,需要注意的是转账后必须经过挖矿操作才能被写入区块链。
注意事项:
- 很多教程中说不同节点启动时不能使用相同的端口,那是因为其运行在同一个主机上,这里节点1和节点4运行在不同的端口上,故可以使用相同的端口。
- 添加节点无效常见原因/解决办法:
admin.addPeer后等一段时间才会生效admin.addPeer时使用的是NAT后公网地址,而公网防火墙通常拒绝异常接入admin.addPeer后开始挖矿增加同步速度- 简单的方法是使用上节中的
static-nodes.json方法
参考
yuanlulu. golang学习1:ubuntu下安装golang并简单测试. CSDN. [2021-02-21] ︎
shciily. Linux系统下安装Geth客户端. CSDN. [2020-08-29] ︎
Divyang Desai. Setup Your Private Ethereum Network With Geth. c-sharpcorner.com. [2020-08-04] ︎
soowin. 创世区块配置文件genesis.json的格式解读. CSDN. [2021-01-26] ︎
mb5fe559b5073e8. 以太坊客户端Geth命令用法-参数详解. CSDN. [2021-06-13] ︎
Someone. "admin.addPeer" is not working. Github. [2020-09-27] ︎
通过Geth搭建私有以太坊网络的更多相关文章
- 转:区块链开发(一)搭建基于以太坊go-ethereum的私有链环境
区块链开发(一)搭建基于以太坊go-ethereum的私有链环境 wo541075754 · 2016-11-07 13:00:03 · 3730 次点击 · 预计阅读时间 3 分钟 · 约1小时前 ...
- 科普贴 | 以太坊网络中的Gas Limit 和 Gas Price 是什么概念?
接触以太坊的同学都听过 Gas/ Gas Price/ Gas Limit,那么这些词汇究竟是什么意思? 还有,为什么有时候你的ETH转账会很慢?如何提高ETH转账速度? Ethereum平台 Vit ...
- geth搭建私有网络
geth --rpc --unlock "3ae88fe370c39384fc16da2c9e768cf5d2495b48,81063419f13cab5ac090cd8329d8fff9f ...
- 使用Mist部署Contract到Rinkeby以太坊网络
本文使用MyEthWallet新建一个账号,并导入到Mist中,然后部署Contract到Rinkeby网络使用MyEthWallet新建账号的好处是除了JSON文件之外,还能得到一张它生成的pdf( ...
- 区块链入门(2):搭建以太坊私有链(private network of ethereum),以及挖矿的操作..
在做一些测试工作的时候, 为了方便控制以及更快的进入真正的测试工作,可能需要搭建一个私有的以太坊网络. 而以太坊节点之间能够互相链接需要满足1)相同的协议版本2)相同的networkid,所以搭建私有 ...
- 以太坊 链私有链环境搭建(windows)
摸索以太坊区块链技术几个月了.最近打算逐步的把自己学到的东西和大家分享一下.在阅读本文之前,希望大家能对区块链的概念能有所了解.这样操作过程中的环节理解更深入.下面开始进入准备.因为本次是window ...
- Mac环境搭建以太坊私有链
原文地址: 石匠的blog 为了测试以太坊智能合约,最方便的是在本地搭建一个以太坊私有链.在mac上搭建环境主要需要以下步骤. geth安装 geth是go-ethereum的简写,是一个用go语言编 ...
- 区块链学习(四)truffle部署编译智能合约以太坊私有链
前面我们介绍了以太坊私有链的搭建以及多节点私有链网络,这次我们介绍如何使用truffle框架来部署编译智能合约到我们之前搭建的私有链网络中. 搭建环境及需使用的工具:ubuntu18.04 Truf ...
- 基于docker的以太坊集群的私有链开发环境
转载博文:https://www.jianshu.com/p/8af386ec5f9e https://www.jianshu.com/p/7994db7a2b89?from=singlemessag ...
随机推荐
- Java基础总结(二)
1.ArrayList和Vector的区别 这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的 ...
- 「游记」CSP-S 2021 爆零记
推荐访问本人自建博客 \(\text{cjwen.top}\) 初赛 之前参加过「难度介于 J 组(基础组)和 S 组(提高组)之间」的 [LGR-(-13) ]SCP 2021 第一轮(初赛)模拟, ...
- 1Python运行Appium测试的例子
电脑系统配置:Windows7的64位 1.Python sample(Python示例)下载 https://github.com/appium/sample-code/tree/master/sa ...
- Solution -「CF 1025G」Company Acquisitions
\(\mathcal{Description}\) Link. \(n\) 个公司,每个公司可能独立或者附属于另一个公司.初始时,每个公司附属于 \(a_i\)(\(a_i=-1\) 表示该公 ...
- Solution -「AGC 002F」「AT 2000」Leftmost Ball
\(\mathcal{Description}\) Link. 给你 \(n\) 种颜色的球,每个球有 \(k\) 个,把这 \(n\times k\) 个球排成一排,把每一种颜色的最左边出现 ...
- Node 模块规范鏖战:难以相容的 CJS 与 ESM
自 13.2.0 版本开始,Node.js 在保留了 CommonJS(CJS)语法的前提下,新增了对 ES Modules(ESM)语法的支持. 天下苦 CJS 久已,Node 逐渐拥抱新标准的规划 ...
- 图解python | for循环
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/56 本文地址:http://www.showmeai.tech/article-det ...
- 北大博士生提出CAE,下游任务泛化能力优于何恺明MAE
大家好,我是对白. 何恺明时隔两年发一作论文,提出了一种视觉自监督学习新范式-- 用掩蔽自编码器MAE,为视觉大模型开路. 这一次,北大博士生提出一个新方法CAE,在其下游任务中展现的泛化能力超过了M ...
- Linux mysql8.0.11安装
准备:检查是否已安装过mysql,若有便删除(linux系统自带的) rpm -qa | grep mariadb rpm -e nodeps mariadb-libs-5.5.56-2.el7.x8 ...
- 【基础知识】 CPU 详细整理(个人整理)
本文只是个人对cpu的理解,不建议浏览 建议浏览:https://zhuanlan.zhihu.com/p/397260483 提要 64位/32位操作系统,64/32指的是通用寄存器的位数. 定义 ...