以太坊私链搭建——genesis.json字段解读
Posted llsForest
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以太坊私链搭建——genesis.json字段解读相关的知识,希望对你有一定的参考价值。
genesis.json文件用于配置生成以太坊私链网络的创世区块,当我们需要去创建一个创世区块时,我们可以通过修改genesis.json文件内的初始参数将这些数据写入创世区块。下面是以太坊官方文档给出的一个例子:
"config":
"chainId": 15,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"ethash":
,
"difficulty": "1",
"gasLimit": "8000000",
"alloc":
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": "balance": "300000" ,
"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": "balance": "400000"
字段解读
config
config是决定私链设置的核心配置。
chainId:链ID,用于标识当前这条链,主要用于重放保护。
homesteadBlock:以太坊“家园”版本启用的区块高度,homesteadBlock被设置为0则意味着我们将直接使用以太坊的“家园”版本,在以太坊主网中此设置为0.
eip150Block:第150号以太坊改进提案(EIP150)启用的区块高度,该提案主要用于解决因denial-of-service问题导致gas价格提高的问题主网中其启用高度为2463000。
eip155Block:EIP155提案启用的区块高度,该提案主要是为了预防重放攻击。
eip158Block:EIP158提案启用的区块高度,该提案的提出主要是为了改变以太坊客户端处理空账户的方式。在EIP158提案中以太坊客户端会将空账户视为不存在的对象,这能有效节省区块链上的存储空间。
byzantiumBlock:拜占庭硬分叉启用的区块高度,最大的改动是将出块奖励从5ETH减少到了3ETH,主网中该分叉的启用区块高度为4370000。
constantinopleBlock:君士坦丁堡硬分叉启用的区块高度,该分叉的目的是提高以太坊的运行效率,并移除/推迟难度炸弹,同时将出块奖励从拜占庭硬分叉后的3ETH减少为2ETH。主网中君士坦丁堡硬分叉的启用区块高度为7280000。
petersburgBlock:圣彼得堡硬分叉启用的区块高度,该硬分叉是为解决君士坦丁堡硬分叉中的安全漏洞问题,将EIP1283提案移除。主网中圣彼得堡和君士坦丁堡分叉同时激活,区块高度为7280000。
ethash:标识当前私链使用的共识算法为ethash。
mixhash
一个256为的哈希散列,结合nonce一同证明已在此区块上执行了足够量的计算(POW)。nonce和mixhash的组合必须满足黄皮书4.3.4中描述的数学条件,即区块头有效性(44)。它允许验证该区块是否被加密挖掘。
nonce
一个用于标记发送方发送的交易数量的值,是一个64位哈希值,与mixhash值一起证明已在区块上进行了足够量的计算。
difficulty
出块难度,对应发现该区块的nonce期间所应用的难度级别,难度越高,矿工发现有效区块所需的计算就越多。该值主要用于控制出块时间,使得出块效率保持在目标范围之内。
alloc
预定义的钱包列表,可以通过该字段预先在指定钱包地址内预存一定数量得原生代币。这是以太坊预售期间所执行得特定功能。
coinbase
一个160位地址,用于标识出块奖励的收益地址。
timestamp
时间戳,相当于Unix中的time()函数的输出。引入时间戳的机制能够在时间方面实现出块的稳态,时间戳还允许验证出块顺序。(黄皮书,4.3.4.(43))。
parentHash
整个父块头的Keccak256位哈希(包括父块头的nonce和mixhash),若区块是创世区块,则该值为0。
extraData
一个可以自由设置的选项,最大32个byte。该字段用于将数据保存在区块链上
gasLimit
每个区块的gas消耗限制。每个区块所消耗的gas不能超过这个值。
参考资料
https://github.com/ethereum/go-ethereum/tree/feeccdf4ec1084b38dac112ff4f86809efd7c0e5/params
Ethereum private network configuration guide. · GitHub
第一个为以太坊相关源码,第二个为genesis.json文件解析。
以太坊搭建私链
- 新建一个私链目录
- 在目录中新建genesis.json, 里面存储创世配置
- 通过genesis.json生成创世块:geth --datadir data init genesis.json
- 启动节点:geth --datadir data console
- 节点启动之后会在data目录下生成geth和keystore目录
- geth:存储区块链数据等
- keystore:存储私钥文件
5.创世区块配置文件参数详解
- ChainId:独立的区块链网络ID,再连接到其他节点时可以用到公网ID是1。不同ID的网络节点无法连接。
- homesteadBlock:值为0表示当前正在使用的homestead版本。
- alloc:预置账号以及账号的以太币数量,私链用不上。
- coinbase:矿工账号,可以随便填,因为以太坊中会默认把账号列表中的第一个账号当成挖矿账号
- difficulty:挖矿难度,可以动态的进行调节。
- extaData:附加信息,随便填。
- gasLimit:gas上限。
- nonce:随机数,随便填。
- mixHash:与nonce结合用于配合挖矿。
- parentHash:前区块hash。
- timestamp:创世区块时间戳。
以下是全部配置文件示例:
"config":
"chainId": <arbitrary positive integer>,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"londonBlock": 0
,
"alloc": ,
"coinbase": "0x0000000000000000000000000000000000000000","difficulty": "0x20000",
"extraData": "",
"gasLimit": "0x2fefd8",
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
6. geth启动参数详解
- datadir:区块链数据库存放位置
- rpc:启动RPC通信,可以进行智能合约部署和调试
- rpcaddr:指定HTTP_RPC监听地址,默认localhost
- rpcport:指定HTTP_RPC监听端口,默认8545
- rpccorsdomain:*
- rpcapi:允许连接的RPC客户端
- nodiscover:关闭自动连接
- maxpeers:允许的最大连接数,默认25个
- networkid:设置当前区块链中网络ID,为了区分不同的网络
- port:30303
- mine:开户挖矿,默认CPU挖矿
- minerthreads:挖矿的CPU线程数,默认为4
- etherbase:矿工账号
- console:启动命令行
以上是关于以太坊私链搭建——genesis.json字段解读的主要内容,如果未能解决你的问题,请参考以下文章