文章目录
- [1. 准备工作](#1. 准备工作)
- [2. 创建创世区块配置文件](#2. 创建创世区块配置文件)
-
- [2.1 创建数据目录](#2.1 创建数据目录)
- [2.2 创建创世区块配置文件](#2.2 创建创世区块配置文件)
-
- [1. "config"部分](#1. “config”部分)
- [2. "alloc"部分](#2. “alloc”部分)
- [3. "coinbase"](#3. “coinbase”)
- [4. "difficulty"](#4. “difficulty”)
- [5. "extraData"](#5. “extraData”)
- [6. "gasLimit"](#6. “gasLimit”)
- [7. "nonce"](#7. “nonce”)
- [8. "mixhash"](#8. “mixhash”)
- [9. "parentHash"](#9. “parentHash”)
- [10. "timestamp"](#10. “timestamp”)
- [3. 初始化:将创世区块信息写入区块链](#3. 初始化:将创世区块信息写入区块链)
- [4. 启动私有节点](#4. 启动私有节点)
- [5. Geth的JavaScript控制台操作](#5. Geth的JavaScript控制台操作)
1. 准备工作
- 准备工作指安装Geth客户端
- 查看Geth版本,执行命令:
geth version
2. 创建创世区块配置文件
2.1 创建数据目录
- 执行命令:
sudo mkdir -p /private_chain/nodedata
2.2 创建创世区块配置文件
-
进入
private_chain
目录
-
执行命令:
sudo vim genesis.json
json
{
"config": {
"chainId": 12345,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0
},
"alloc": {},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x20000",
"extraData": "",
"gasLimit": "0xffffffff",
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
1. "config"部分
这是定义区块链网络配置相关参数的对象。
chainId
:值为12345
,用于唯一标识该私有链网络,区别于其他以太坊网络(如主网或测试网),防止网络冲突。homesteadBlock
、eip150Block
等:都设为0
,表示对应的以太坊硬分叉升级相关的起始区块高度设定在此私有链初始就是生效状态,用于控制网络协议的迭代逻辑。
2. "alloc"部分
这是一个空对象 {}
,通常用于预分配以太坊账户的初始余额。格式为以账户地址为键,对应账户初始余额等配置为值。此处为空则意味着初始没有预分配资金的账户,后续需自行创建并获取资金。
3. "coinbase"
其值 0x0000000000000000000000000000000000000000
设定了挖矿奖励的接收地址,也就是挖到新区块后,奖励的以太币等会发送到该地址。
4. "difficulty"
"0x20000"
这个值定义了挖矿的难度系数。难度决定了矿工找到符合要求的新区块哈希的难易程度,较低难度意味着相对更容易挖到矿,可根据私有链的实际需求和运行环境等进行调整。
5. "extraData"
为空字符串 ""
,这里可以存放一些额外的自定义数据,比如节点相关的描述信息等,若无需添加额外信息则为空。
6. "gasLimit"
"0xffffffff"
用于限定每个区块中可消耗的最大 "gas" 量。"gas" 用于衡量在以太坊网络上执行交易或智能合约等操作的计算资源开销,该参数控制了单个区块能容纳的计算资源总量。
7. "nonce"
"0x0000000000000042"
是一个随机数,主要用于挖矿等操作中确保区块哈希的唯一性等,与挖矿过程中的计算相关。
8. "mixhash"
全零的值 0x0000000000000000000000000000000000000000000000000000000000000000
,在挖矿验证等环节参与计算,与区块哈希等相关,帮助保证区块链的安全性和一致性。
9. "parentHash"
同样全零 0x0000000000000000000000000000000000000000000000000000000000000000
,代表该私有链创世区块的父区块哈希(创世区块无父区块,所以是全零),用于构建区块链的链式结构基础。
10. "timestamp"
"0x00"
表示创世区块的时间戳,通常初始设为 0
,后续区块的时间戳会依次递增,以此来体现区块产生的时间顺序等信息。
总体来说,这份 genesis.json
文件为以太坊私有链定义好了初始状态的各项关键参数,后续可基于它使用相关命令(如 geth init
命令)去初始化并启动私有链。
初始化参数 | 作用 |
---|---|
chainId |
唯一标识私有链网络,避免与其他以太坊网络(主网、测试网等)混淆,用于区分不同的区块链网络。 |
homesteadBlock 、eip150Block 等 |
定义对应的以太坊硬分叉升级相关的起始区块高度,用于控制网络协议在私有链中的迭代逻辑,0表示初始就生效。 |
alloc |
用于预先分配以太坊账户的初始余额。空对象表示初始没有预分配资金的账户,后续需要自行创建账户获取资金。 |
coinbase |
指定挖矿奖励的接收地址,挖到新区块后,奖励的以太币会发送到该地址。 |
difficulty |
定义挖矿的难度系数,决定矿工找到符合要求的新区块哈希的难易程度,可根据私有链实际需求和运行环境调整。 |
extraData |
可存放一些额外的自定义数据,如节点相关描述信息等。为空字符串时表示无额外信息添加。 |
gasLimit |
限定每个区块中可消耗的最大"gas"量。"gas"用于衡量在以太坊网络上执行交易或智能合约等操作的计算资源开销,控制单个区块能容纳的计算资源总量。 |
nonce |
用于挖矿等操作中确保区块哈希的唯一性,与挖矿过程中的计算相关。 |
mixhash |
在挖矿验证等环节参与计算,与区块哈希等相关,帮助保证区块链的安全性和一致性。 |
parentHash |
代表私有链创世区块的父区块哈希(创世区块无父区块,所以初始为全零),用于构建区块链的链式结构基础。 |
timestamp |
表示创世区块的时间戳,初始设为0,后续区块的时间戳依次递增,用于体现区块产生的时间顺序。 |
3. 初始化:将创世区块信息写入区块链
-
准备号创世区块配置文件后,需要初始化区块链,将上面的创世区块信息写入区块链。
-
准备好目录存放区块链数据
-
执行命令:
sudo chmod -R 777 /private_chain
,将/private_chain
目录及其内部的所有子目录和文件的权限都设置为所有人(所有者、所属组和其他用户)都具有读、写和执行权限。
-
执行命令:
cd /private_chain
-
执行命令:
sudo geth --datadir nodedata init genesis.json
-
第一次执行,报一个错误,第二次执行就OK,看到
Successfully wrote genesis state
,表明初始化成功。 -
查看私有链目录结构,执行命令:
sudo tree /private_chain
/private_chain
├── genesis.json
└── nodedata
├── geth
│ ├── chaindata
│ │ ├── 000004.sst
│ │ ├── 000008.log
│ │ ├── ancient
│ │ │ ├── chain
│ │ │ │ ├── bodies.0000.cdat
│ │ │ │ ├── bodies.cidx
│ │ │ │ ├── bodies.meta
│ │ │ │ ├── diffs.0000.rdat
│ │ │ │ ├── diffs.meta
│ │ │ │ ├── diffs.ridx
│ │ │ │ ├── FLOCK
│ │ │ │ ├── hashes.0000.rdat
│ │ │ │ ├── hashes.meta
│ │ │ │ ├── hashes.ridx
│ │ │ │ ├── headers.0000.cdat
│ │ │ │ ├── headers.cidx
│ │ │ │ ├── headers.meta
│ │ │ │ ├── receipts.0000.cdat
│ │ │ │ ├── receipts.cidx
│ │ │ │ └── receipts.meta
│ │ │ └── state
│ │ │ ├── account.data.0000.cdat
│ │ │ ├── account.data.cidx
│ │ │ ├── account.data.meta
│ │ │ ├── account.index.0000.cdat
│ │ │ ├── account.index.cidx
│ │ │ ├── account.index.meta
│ │ │ ├── FLOCK
│ │ │ ├── history.meta.0000.rdat
│ │ │ ├── history.meta.meta
│ │ │ ├── history.meta.ridx
│ │ │ ├── storage.data.0000.cdat
│ │ │ ├── storage.data.cidx
│ │ │ ├── storage.data.meta
│ │ │ ├── storage.index.0000.cdat
│ │ │ ├── storage.index.cidx
│ │ │ └── storage.index.meta
│ │ ├── CURRENT
│ │ ├── LOCK
│ │ ├── MANIFEST-000006
│ │ ├── MANIFEST-000009
│ │ └── OPTIONS-000010
│ ├── LOCK
│ └── nodekey
└── keystore7 directories, 42 files
-
geth/chaindata
中存放的是区块数据,keystore
中存放的是账户数据