主页 > token.im官网 > 启动以太坊私有链¶

启动以太坊私有链¶

token.im官网 2023-10-12 05:13:12

启动以太坊私有链

以太坊网络分为主网和测试网。 这两个网络都是公共链,可供全球所有开发者和用户使用。

我们今天的学习蓝图是以太坊的私有网络,也就是私有链。

私链和公链不互通,通过网络相互隔离。 在我们教程的私有链中,只有一台我们的计算机在运行。

以太坊的源代码和软件都是开源的,任何人都可以复制一份源代码,运行自己的以太坊私链。 下面是访问不同网络所需下载数据量的比较。

我们将以搭建私有网络、亲自创建以太坊私有链的形式进行后续教学。

设置工作目录

我们设置一个新的工作目录并创建一个新的 Genesis 启动配置文件。

1
2
3
4

mkdir ether-test
cd ether-test
touch gensis.json
mkdir db

至此,我们的genesis目录已经生成,目录结构如下。

ether-test/
├── db
└── gensis.json
1 directory, 1 file

编辑创世配置

如果读者还记得解释,与比特币不同,以太坊创建时已经分配了大约 70% 的 ETH,然后进入挖矿过程,大家竞相挖矿并分配剩余的币。 我们的私链也可以通过创世的方式分配一些以太币用于测试,或者从零开始一点一点地挖以太币。

Genesis 配置在以太坊私有链首次启动时使用。 创世区块是最特殊的区块。 它没有前一个块,因为它是第一个块。 让我们在下面配置创世块 gensis.json 文件。

// gensis.json
{
  "config": {
      "chainId": 987,
      "homesteadBlock": 0,
      "eip155Block": 0,
      "eip158Block": 0
  },
  "difficulty": "0x400",
  "gasLimit": "0x8000000",
  "alloc": {}
}

以上是一个最小可行的创世块配置,包括区块链配置、挖矿难度设置、单个区块包含的最大gas上限、空的创世币分配区alloc(即没有预分配的以太币)。 当然,还可以扩展一些其他的参数,比如时间戳,前一个块的哈希值,这些都是可选的。 gensis.json 的完整版本如下所示。

{
  "config": {
      "chainId": 987,
      "homesteadBlock": 0,
      "eip155Block": 0,
      "eip158Block": 0
  },
  "difficulty": "0x400",
  "gasLimit": "0xffffffff",
  // 可选填的参数
  "coinbase": "0x0000000000000000000000000000000000000000",
  "extraData": "0x00",
  "nonce": "0x0000000000000001",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp": "0x00",
  "alloc": {
    "430e986e0cca10a174baad96871ec9cb308c6d05": {"balance": "111111"}
  }
}

各字段解释如下:

必需的

链号

自定义私有链的网络ID。 不同的网络 ID 不能相互通信。 以太坊公链 ID 为 1,我们将其设置为 987,以防止与网络中的其他私有链发生冲突。

家园座

是否是HomeStead版块,设置为0表示是。

eip155块

EIP155 是一个以太坊分叉提案。 它的存在是为了与之前的以太坊经典 ETC 链分叉。 我们私链不需要,设置为0。

eip158区块

EIP158 是一个以太坊分叉提案。 它是为了解决之前因以太坊账户为空而导致的低效协议漏洞而分叉的。 我们私链不需要,设置为0。

困难

设置当前区块的难度。 如果难度太高,挖矿会很慢。 我们设置一个较小的值。

气体限制

单个区块的最大耗气量上限用于限制交易的数量和可以打包到一个区块中的信息总和。 我们可以在学习中将它设置为最大。

选修的

币库

打包这个区块的矿工的奖励地址,因为是创世区块,可以设置为0地址。

额外数据

矿工在开采区块时所做的笔记。

随机数

矿工在打包该区块时用于挖矿的Ethash输入参数nonce。

混合哈希

与nonce一起用于挖矿,创世区没有之前的区块,可以留空。

父哈希

前一个区块头的哈希值,创世块没有前一个区块,设置为0。

时间戳

打包区块的时间戳,符合Unix Timestamp标准,设置为0。

分配

创建时分配给每个账户的以太币数量,如果你不想分配,忽略它。

下面将使用简化版的gensis.json作为创世私链的基础。

初始化创世配置

我们已经准备好了创世配置,接下来就是初始化链的配置,形成区块链的起点。 初始化之后,我们有了第一个区块,接下来我们可以使用第一个区块来创建第二个区块已经被挖出来了。

进入ether-test目录,进行初始化。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12

cd ether-test
geth --datadir "./db" init gensis.json
>
INFO [09-16|15:04:53.320] Maximum peer count
INFO [09-16|15:04:53.326] Allocated cache and file handles
INFO [09-16|15:04:53.329] Writing custom genesis block
INFO [09-16|15:04:53.329] Persisted trie from memory database
INFO [09-16|15:04:53.329] Successfully wrote genesis state
INFO [09-16|15:04:53.329] Allocated cache and file handles
INFO [09-16|15:04:53.331] Writing custom genesis block
INFO [09-16|15:04:53.331] Persisted trie from memory database
INFO [09-16|15:04:53.331] Successfully wrote genesis state

此时我们看到控制台输出了“Successfully written genesis state”,说明我们的初始化已经成功。 让我们借此机会了解一下本地目录发生了怎样的变化:

ether-test/
├── db
│   ├── geth
│   │   ├── chaindata
│   │   │   ├── 000001.log
│   │   │   ├── CURRENT
│   │   │   ├── LOCK
│   │   │   ├── LOG
│   │   │   └── MANIFEST-000000
│   │   └── lightchaindata
│   │       ├── 000001.log
│   │       ├── CURRENT
│   │       ├── LOCK
│   │       ├── LOG
│   │       └── MANIFEST-000000
│   └── keystore
└── gensis.json
5 directories, 11 files

在db目录数据库中,程序自动新建一个geth目录。 该目录存放了区块链运行过程中产生的所有区块链数据、日志、世界状态以太坊重启挖矿pow,随着区块链的增长,会占用更多的存储硬盘空间。 它里面的两个子目录存放着具体的区块链数据。 db目录下还有一个keystore目录。 每个账户的私钥的加密文件都存放在这个目录下,对应我们所学的。 只有在签名时,用户才会解锁keystore来执行签名操作。

启动 Geth 节点

一切就绪,科学怪人的巨人即将苏醒。 在我们当前的环境中,我们需要启动一个Geth节点来接入私有链网络(实际上它是这个私有链网络的唯一节点),负责创建第一个区块以太坊重启挖矿pow,在世界区块之后进行开采。 这个节点也是我们与以太坊私链通信的节点服务器。 让我们启动这样一个节点。

1
2
3
4
5
6
7

cd ether-test
geth --datadir ./db/ --rpc --rpcaddr=127.0.0.1 --rpcport 8545 --rpccorsdomain "*" \
   --rpcapi "eth,net,web3,personal,admin,shh,txpool,debug,miner" \
   --nodiscover --maxpeers 30 --networkid 198989 --port 30303 \
   --mine --minerthreads 1 \
   --etherbase "0x7df9a875a174b3bc565e6424a0050ebc1b2d1d82" \
   console

geth启动时的命令行参数解释如下表:

范围

解释

–rpc

开启JSON-RPC服务进行调用/调试访问。

–rpcaddr

本地侦听器 JSON-RPC 地址。

–rpc端口

在本地监听 JSON-RPC 的端口。

–prccorsdomain

本地监听JSON-RPC允许的域名访问。

–rpcapi

允许提供的RPC服务模块,示例中选择了几个模块加载。

–nodiscover

关闭节点的自动发现,防止他人意外访问私链。 您可以选择关闭此选项以防止其他人加入网络。

–maxpeers

允许的最大节点链接数。

–networkid

指定以太坊网络 ID。

-港口

监听以太坊节点间P2P消息的TCP/UDP端口,默认为30303。

- 矿

节点启动挖矿功能,参与挖矿。

–矿工线程

挖矿多线程配置,示例配置为1线程。

–etherbase

如果开启了挖矿功能,挖矿奖励的接收地址,我们在例子中只填了一个。

安慰

(可选)启动后进入命令行模式,直接输入命令进行交互操作。

回车,启动成功! 这时候控制台会输出一组日志信息,有如下欢迎信息:

INFO [09-16|15:33:26.872] Maximum peer count                       ETH=30 LES=0 total=30
INFO [09-16|15:33:26.879] Starting peer-to-peer node               instance=Geth/v1.8.14-stable/darwin-amd64/go1.10.3
INFO [09-16|15:33:26.879] Allocated cache and file handles         database=/ether-test/db/geth/chaindata cache=768 handles=1024
INFO [09-16|15:33:26.889] Initialised chain configuration          config="{ChainID: 987 Homestead: 0 DAO:  DAOSupport: false EIP150:  EIP155: 0 EIP158: 0 Byzantium:  Constantinople:  Engine: unknown}"
INFO [09-16|15:33:26.889] Disk storage enabled for ethash caches   dir=/ether-test/db/geth/ethash count=3
INFO [09-16|15:33:26.889] Disk storage enabled for ethash DAGs     dir=/.ethash                   count=2
INFO [09-16|15:33:26.889] Initialising Ethereum protocol           versions="[63 62]" network=198989
INFO [09-16|15:33:26.890] Loaded most recent local header          number=0 hash=4e048d…366eb4 td=1024
INFO [09-16|15:33:26.890] Loaded most recent local full block      number=0 hash=4e048d…366eb4 td=1024
INFO [09-16|15:33:26.890] Loaded most recent local fast block      number=0 hash=4e048d…366eb4 td=1024
INFO [09-16|15:33:26.890] Regenerated local transaction journal    transactions=0 accounts=0
INFO [09-16|15:33:26.890] Starting P2P networking
...

笔记

Geth 在启动时使用多个计算机端口,确保它们可用。

在慢速硬盘(非SSD)或者虚拟机环境下,挖出一个block需要很长时间,大约需要5-10分钟。 在配备SSD硬盘的新Macbook上,几乎可以瞬间挖矿。 创建一个块。 当一个方块被挖出时,会有一个小锤子标记,控制台输出如下:

INFO [09-16|15:34:03.651] Successfully sealed new block            number=1 hash=589650…007f89 elapsed=8.569s
INFO [09-16|15:34:03.651]  mined potential block                  number=1 hash=589650…007f89
INFO [09-16|15:34:03.652] Commit new mining work                   number=2 uncles=0 txs=0 gas=0 fees=0 elapsed=125.154µs
INFO [09-16|15:34:03.838] Successfully sealed new block            number=2 hash=fb5f62…81e023 elapsed=186.718ms
INFO [09-16|15:34:03.839]  mined potential block                  number=2 hash=fb5f62…81e023
INFO [09-16|15:34:03.839] Commit new mining work                   number=3 uncles=0 txs=0 gas=0 fees=0 elapsed=142.96µs
INFO [09-16|15:34:04.092] Successfully sealed new block            number=3 hash=4fb51d…5c5e1c elapsed=252.862ms
INFO [09-16|15:34:04.092]  mined potential block                  number=3 hash=4fb51d…5c5e1c

我们可以看到一个接一个输出number=1,number=2这样的输出,说明我们已经成功挖到了第1,2,3...块,而该块的uncles=0,说明没有叔块generated ,回顾一下我们之前了解到的,当网络中只有我们一个挖矿节点时,没有竞争者会生成相同高度的区块,所以很明显不会产生孤立块,也不会产生叔块。

至此,控制台持续输出挖矿相关信息。 您的私有链一直稳定运行。 由于我们在启动时在etherbase参数中随机设置了一个矿工奖励地址,所有挖出的区块奖励都发送到该地址,而我们却不持有该地址,无异于浪费。 现在,让我们和Geth通信,让它暂停挖矿一段时间,等我们创建新账户后,再恢复挖矿。

我们重新打开控制台窗口并连接到正在运行的 Geth 以停止挖矿。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13

cd ether-test
geth --datadir ./db attach ipc:./db/geth.ipc
>
Welcome to the Geth JavaScript console!
instance: Geth/v1.8.14-stable/darwin-amd64/go1.10.3
coinbase: 0x7df9a875a174b3bc565e6424a0050ebc1b2d1d82
at block: 90 (Sun, 16 Sep 2018 15:56:37 CST)
 datadir: /ether-test/db
 modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
> miner.stop()
true

我们使用 miner.stop() 命令停止挖矿。 这时我们可以看到之前启动的Geth节点的控制台输出已经停止,没有新的区块被挖出。 需要重启挖矿,执行miner.start()即可。

至此我们回顾。 我们启动了一条以太坊私有链,在启动的时候我们选择了一些参数。

–rpcapi "eth,net,web3,personal,admin,shh,txpool,debug,miner"

这些参数指定在 Geth 客户端上加载哪些功能模块。 这些模块有的是挖矿模块,有的是账户模块。 可以根据用户喜好选择性启用,并适当增加或减少当前节点的能力。 具体模块说明见下表。

模块

解释

个人的

账户相关操作——创建新账户、锁定账户、发送签名交易等。

行政

节点管理相关——节点数据存储、网络状态、API开放状态等。

交易池

交易池相关——交易池等待状态,查看交易详情等。

调试

开发调试相关——跟踪区块状态,分析区块细节,检测CPU状态等。

矿工

挖矿相关——更改奖励接收地址、开启/关闭挖矿功能、设置gas费等。

网络3

包含了上述模块的总入口,还包含了单位转换函数。

伦理

提供操作区块链的相关方法。

提供分布式网络P2P Whisper通信协议的相关方法

Vitalik Buterin (2016),“简单的重放攻击保护”,可在:

Vitalik Buterin(2016 年),“状态清算”,可在:

作者注:更多参考资料请见