中文網站上關於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,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"ethash": {}
},
"nonce": "0x0",
"timestamp": "0x5ddf8f3e",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x47b760",
"difficulty": "0x00002",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {
"0x1e82968C4624880FD1E8e818421841E6DB8D1Fa4" : {"balance" : "30000000000000000000"}
},
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
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