创世区块配置文件genesis.json的格式解读

创世区块配置文件genesis.json的格式解读

中文网站上关于genesis 的解析大多数都来自于这个Gist:Ethereum private network configuration guide. (github.com),但实际上genesis 中的配置项还有一些其他内容。

首先,genesis.json 是Geth 工具用来创建创世区块以及区块链的配置文件,genesis.json 并不是创世区块本身。

查阅Geth 文档,在Using Geth/ Connecting To The Network 中,举例了一个genesis.json 如下:

{
  "alloc": {
    "dbdbdb2cbd23b783741e8d7fcf51e459b497e4a6": { 
        "balance": "1606938044258990275541962092341162602522202993782792835301376"
    },
    "e6716f9544a56c530d868e4bfbacb172315bdead": {
        "balance": "1606938044258990275541962092341162602522202993782792835301376"
    },
    ...
  },
  "nonce": "0x000000000000002a",
  "difficulty": "0x020000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x0000000000000000000000000000000000000000",
  "timestamp": "0x00",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "0x",
  "gasLimit": "0x2fefd8"
}

我们先来关注该示例中列举出来的keys:

alloc 代表初始资产配置,在该区块链产生时,就预先赋予这些账户一定数额的WEI(不是ETH)

nonce 预定一个随机数,这是一个与PoW 机制有关的值

difficulty 定义了每次挖矿时,最终确定nonce 的难度

mixhash 一个与PoW 机制有关的值

coinbase 每挖出一个区块,都会获得奖励。该值指定默认情况下把奖励给到哪个账户。实际上,我们每次挖矿开始之前,都会自己指定miner.setEtherbase(UserAddress),一般都会把奖励给自己

timestamp 时间戳,规定创世区块开始的时间

parentHash 在区块链中,区块是相连的,parentHash 指定了本区块的上一个区块Hash。对于创世区块来说,parentHash 为0

extraData ???

gasLimit 规定该区块链中,gas 的上限

更多的genesis.json 文件中会包含config 参数,例如:

{
  "config": {
    "chainId": 666,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,
    "constantinopleBlock": 0,
    "petersburgBlock": 0,
    "clique": {
      "period": 15,
      "epoch": 30000
    }
  },
  "gasLimit": "8000000",
  "difficulty": "1",
  "extraData": "0x00000000000000000000000000000000000000000000000000000000000000008D5090Cbf4AC61BD8da523eDC8C52335a2136BDF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  "alloc": {
    "8D5090Cbf4AC61BD8da523eDC8C52335a2136BDF": {
      "balance": "0x1000000000000000000"
    }
  }
}

chainID 该链的ID。在用geth 启动区块链时,还需要指定一个network 参数。只有当network、chainID、创世区块配置都相同时,才是同一条链。

homesteadBlock等 相关协议机制的升级区块所在的高度,签名算法是homestead ->eip155 -> eip158,所以从homesteadBlock 之前区块都通过homestead 相关算法机制来验证,homesteadBlock 到eip155Block 之间的用eip155 算法来验证,依次类推。有关这些Block 的内容,可以参阅go-ethereum 源码中的config.go

clique 一种PoA(Proof-of-Authority)的共识方法,与之相对的是Ethash,一种PoW 共识方法。有关Clique 共识方法的详细内容,可参阅EIP-225。如果要使用Clique,则extraData 字段必须按规定设置

extraData 在Clique 机制下,新区块只能被签名人(singers)挖掘,区块链生长过程中,可以通过投票来选举或者免除签名人。在区块链开始运行时,需要定义一个初始singer。

官方文档给出的示例为:To create the initial extradata for your network, collect the signer addresses and encode extradata as the concatenation of 32 zero bytes, all signer addresses, and 65 further zero bytes.

建议

要使用Geth启动一个私有的用于实验的以太坊区块链,可以参考https://geth.ethereum.org/docs/interface/private-network 按步骤进行配置。

其他参考资料:

第二份genesis.json文件来自:float's blog

关于homesteadBlock的解释:https://www.liankexing.com/question/622

posted @ 2021-01-26 00:19  soowin  阅读(4500)  评论(0编辑  收藏  举报