搭建私有链

文章目录

  • [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,用于唯一标识该私有链网络,区别于其他以太坊网络(如主网或测试网),防止网络冲突。
  • homesteadBlockeip150Block 等:都设为 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 唯一标识私有链网络,避免与其他以太坊网络(主网、测试网等)混淆,用于区分不同的区块链网络。
homesteadBlockeip150Block 定义对应的以太坊硬分叉升级相关的起始区块高度,用于控制网络协议在私有链中的迭代逻辑,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
    └── keystore

    7 directories, 42 files

  • geth/chaindata中存放的是区块数据,keystore中存放的是账户数据

4. 启动私有节点

5. Geth的JavaScript控制台操作

相关推荐
howard20053 天前
初试以太坊Geth客户端
以太坊·geth客户端
天涯学馆1 个月前
以太坊基础知识结构详解
web3·以太坊
Daniel_1872 个月前
区块链技术与应用-PKU 学习笔记
区块链·以太坊·比特币
花花花13 个月前
如何使用智能合约铸造 NFT —— 以 NftMarket 合约为例
去中心化·区块链·智能合约·以太坊·nft·sepolia
bighu3 个月前
区块链应用与以太坊的交互
以太坊·l2
bighu3 个月前
以太坊Rollup方案之 arbitrum(1)
区块链·以太坊·arbitrum·l2
Mindfulness code3 个月前
以太坊开发环境
区块链·以太坊
代码与野兽4 个月前
既有比特币,为什么还要有以太坊?聊聊以太坊
web3·区块链·以太坊
Z3r4y5 个月前
【区块链】浅谈面向小白的关于BlockChain那些事
区块链·智能合约·it·以太坊·比特币