摘要:作者簡介地址地址本章介紹解讀源碼分析創(chuàng)世區(qū)塊作者使用操作系統(tǒng),其他平臺也大同小異創(chuàng)世區(qū)塊介紹區(qū)塊鏈里的第一個區(qū)塊創(chuàng)被稱為創(chuàng)世區(qū)塊。在比原鏈中創(chuàng)世區(qū)塊被硬編碼到中,每一個比原節(jié)點都始于同一個創(chuàng)世區(qū)塊,這能確保創(chuàng)世區(qū)塊不會被改變。
作者:Derek
簡介Github地址:https://github.com/Bytom/bytom
Gitee地址:https://gitee.com/BytomBlockc...
本章介紹Derek解讀-Bytom源碼分析-創(chuàng)世區(qū)塊
作者使用MacOS操作系統(tǒng),其他平臺也大同小異創(chuàng)世區(qū)塊介紹Golang Version: 1.8
區(qū)塊鏈里的第一個區(qū)塊創(chuàng)被稱為創(chuàng)世區(qū)塊。它是區(qū)塊鏈里面所有區(qū)塊的共同祖先。
在比原鏈中創(chuàng)世區(qū)塊被硬編碼到bytomd中,每一個比原節(jié)點都始于同一個創(chuàng)世區(qū)塊,這能確保創(chuàng)世區(qū)塊不會被改變。每個節(jié)點都把創(chuàng)世區(qū)塊作為區(qū)塊鏈的首區(qū)塊,從而構(gòu)建了一個安全的、可信的區(qū)塊鏈。
獲取創(chuàng)世區(qū)塊./bytomcli get-block 0 { "bits": 2161727821137910500, "difficulty": "15154807", "hash": "a75483474799ea1aa6bb910a1a5025b4372bf20bef20f246a2c2dc5e12e8a053", "height": 0, "nonce": 9253507043297, "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", "size": 546, "timestamp": 1524549600, "transaction_merkle_root": "58e45ceb675a0b3d7ad3ab9d4288048789de8194e9766b26d8f42fdb624d4390", "transaction_status_hash": "c9c377e5192668bc0a367e4a4764f11e7c725ecced1d7b6a492974fab1b6d5bc", "transactions": [ { "id": "158d7d7c6a8d2464725d508fafca76f0838d998eacaacb42ccc58cfb0c155352", "inputs": [ { "amount": 0, "arbitrary": "496e666f726d6174696f6e20697320706f7765722e202d2d204a616e2f31312f323031332e20436f6d707574696e6720697320706f7765722e202d2d204170722f32342f323031382e", "asset_definition": {}, "asset_id": "0000000000000000000000000000000000000000000000000000000000000000", "type": "coinbase" } ], "outputs": [ { "address": "bm1q3jwsv0lhfmndnlag3kp6avpcq6pkd3xy8e5r88", "amount": 140700041250000000, "asset_definition": {}, "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "control_program": "00148c9d063ff74ee6d9ffa88d83aeb038068366c4c4", "id": "e3325bf07c4385af4b60ad6ecc682ee0773f9b96e1cfbbae9f0f12b86b5f1093", "position": 0, "type": "control" } ], "size": 151, "status_fail": false, "time_range": 0, "version": 1 } ], "version": 1 }
使用bytomcli客戶端查詢高度為0的區(qū)塊信息。我們可以看到以上輸出結(jié)果。
bits: 目標(biāo)值,挖礦時計算的hash之后要小于等于的目標(biāo)值則新塊構(gòu)建成功
difficulty: 難度值,礦工找到下一個有效區(qū)塊的難度。該參數(shù)并不存儲在區(qū)塊鏈上,是由bits計算得出
hash: 當(dāng)前區(qū)塊hash
height: 當(dāng)前區(qū)塊高度
nonce: 隨機數(shù),挖礦時反復(fù)使用不同的nonce來生成不同哈希值
previous_block_hash: 當(dāng)前區(qū)塊的父區(qū)塊hash值
size: 當(dāng)前區(qū)塊的字節(jié)數(shù)
timestamp: 出塊時間
transaction_merkle_root: 創(chuàng)世區(qū)塊的merkle樹根節(jié)點
transactions: 當(dāng)前塊中的utxo交易
由于創(chuàng)世區(qū)塊是第一個塊,創(chuàng)世區(qū)塊的父區(qū)塊,也就是previous_block_hash參數(shù),默認(rèn)情況下為0000000000000000000000000000000000000000000000000000000000000000
時間戳timestamp為1524549600,時間為2018-04-24 14:00:00也就是比原鏈上主網(wǎng)的時間。
源碼分析 獲取區(qū)塊鏈狀態(tài)protocol/protocol.go
func NewChain(store Store, txPool *TxPool) (*Chain, error) { // ... storeStatus := store.GetStoreStatus() if storeStatus == nil { if err := c.initChainStatus(); err != nil { return nil, err } storeStatus = store.GetStoreStatus() } // ... }
當(dāng)我們第一次啟動比原鏈節(jié)點時,store.GetStoreStatus會從db中獲取存儲狀態(tài),獲取存儲狀態(tài)的過程是從LevelDB中查詢key為blockStore的數(shù)據(jù),如果查詢出錯則認(rèn)為是第一次運行比原鏈節(jié)點,那么就需要初始化比原主鏈。
初始化主鏈protocol/protocol.go
func (c *Chain) initChainStatus() error { genesisBlock := config.GenesisBlock() txStatus := bc.NewTransactionStatus() for i := range genesisBlock.Transactions { txStatus.SetStatus(i, false) } if err := c.store.SaveBlock(genesisBlock, txStatus); err != nil { return err } utxoView := state.NewUtxoViewpoint() bcBlock := types.MapBlock(genesisBlock) if err := utxoView.ApplyBlock(bcBlock, txStatus); err != nil { return err } node, err := state.NewBlockNode(&genesisBlock.BlockHeader, nil) if err != nil { return err } return c.store.SaveChainStatus(node, utxoView) }
初始化主鏈有幾步操作:
config.GenesisBlock()獲取創(chuàng)世區(qū)塊
設(shè)置創(chuàng)世區(qū)塊中所有交易狀態(tài)
存儲創(chuàng)世區(qū)塊到LevelDB
state.NewUtxoViewpoint()用于臨時小部分utxo狀態(tài)存儲集合
實例化BlockNode,BlockNode用于選擇最佳鏈作為主鏈
保存最新主鏈狀態(tài)
被硬編碼的創(chuàng)世區(qū)塊config/genesis.go
func genesisTx() *types.Tx { contract, err := hex.DecodeString("00148c9d063ff74ee6d9ffa88d83aeb038068366c4c4") if err != nil { log.Panicf("fail on decode genesis tx output control program") } txData := types.TxData{ Version: 1, Inputs: []*types.TxInput{ types.NewCoinbaseInput([]byte("Information is power. -- Jan/11/2013. Computing is power. -- Apr/24/2018.")), }, Outputs: []*types.TxOutput{ types.NewTxOutput(*consensus.BTMAssetID, consensus.InitialBlockSubsidy, contract), }, } return types.NewTx(txData) } func mainNetGenesisBlock() *types.Block { tx := genesisTx() txStatus := bc.NewTransactionStatus() txStatus.SetStatus(0, false) txStatusHash, err := bc.TxStatusMerkleRoot(txStatus.VerifyStatus) if err != nil { log.Panicf("fail on calc genesis tx status merkle root") } merkleRoot, err := bc.TxMerkleRoot([]*bc.Tx{tx.Tx}) if err != nil { log.Panicf("fail on calc genesis tx merkel root") } block := &types.Block{ BlockHeader: types.BlockHeader{ Version: 1, Height: 0, Nonce: 9253507043297, Timestamp: 1524549600, Bits: 2161727821137910632, BlockCommitment: types.BlockCommitment{ TransactionsMerkleRoot: merkleRoot, TransactionStatusHash: txStatusHash, }, }, Transactions: []*types.Tx{tx}, } return block }
mainNetGenesisBlock主要有如下操作:
生成創(chuàng)世區(qū)塊中的交易,默認(rèn)就一筆交易
設(shè)置塊中的交易狀態(tài)為false
將創(chuàng)世區(qū)塊設(shè)置為merkle樹的根節(jié)點
實例化Block塊并返回
genesisTx函數(shù)生成創(chuàng)世區(qū)塊中的交易,默認(rèn)就一筆交易,一筆交易中包含input輸入和output輸出。
input輸入:
輸入中有一句話"Information is power. -- Jan/11/2013. Computing is power. -- Apr/24/2018."這是為了紀(jì)念A(yù)aron Swartz的精神
output輸出:
輸出中我們看到consensus.InitialBlockSubsidy創(chuàng)世區(qū)塊的獎勵。總共140700041250000000/1e8 = 1407000412。也就是14億個BTM幣。
引用比原鏈創(chuàng)始人長鋏的話:
4月24號,我們主網(wǎng)上線,信息即權(quán)力,2013年Jaruary11;計算即權(quán)力,2018年April24。這句話是為了紀(jì)念A(yù)aron Swartz的精神,信息即權(quán)力可以視為互聯(lián)網(wǎng)宣言,致力于信息自由傳播,讓公民隱私得到保護。計算即權(quán)力,致力于讓資產(chǎn)自由的交易,自由的流動,讓公民的財富得到保護,我覺得這是非常好的紀(jì)念。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/24256.html
摘要:此時節(jié)點將放入到孤塊管理緩存池中,等待彼此的父塊。判斷當(dāng)前塊是否存在于區(qū)塊鏈上或是否存在孤塊緩存池中,如果存在則返回。比如當(dāng)前區(qū)塊高度為,則在孤塊緩存池中查詢是否有區(qū)塊高度為的區(qū)塊。 作者:Derek 簡介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 本章介紹bytom...
摘要:函數(shù)總共操作有兩步從緩存中查詢值,如果查到則返回如果為從緩存中查詢到則回調(diào)回調(diào)函數(shù)?;卣{(diào)函數(shù)會將從磁盤上獲得到塊信息存儲到緩存中并返回該塊的信息?;卣{(diào)函數(shù)實際上調(diào)取的是下的,它會從磁盤中獲取信息并返回。 作者:Derek 簡介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc......
摘要:函數(shù)總共操作有兩步從緩存中查詢值,如果查到則返回如果為從緩存中查詢到則回調(diào)回調(diào)函數(shù)?;卣{(diào)函數(shù)會將從磁盤上獲得到塊信息存儲到緩存中并返回該塊的信息?;卣{(diào)函數(shù)實際上調(diào)取的是下的,它會從磁盤中獲取信息并返回。 簡介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 本章介紹Dere...
摘要:首先讀取請求內(nèi)容,解析請求,接著匹配相應(yīng)的路由項,隨后調(diào)用路由項的回調(diào)函數(shù)來處理。每一個路由項由請求方法和回調(diào)函數(shù)組成將監(jiān)聽地址作為參數(shù),最終執(zhí)行開始服務(wù)于外部請求創(chuàng)建對象首先,實例化對象。我們可以看到一條項由和對應(yīng)的回調(diào)函數(shù)組成。 作者:Derek 簡介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com...
摘要:作者簡介地址地址本章介紹代碼網(wǎng)絡(luò)中地址簿作者使用操作系統(tǒng),其他平臺也大同小異介紹用于存儲網(wǎng)絡(luò)中保留最近的對端節(jié)點地址在下,默認(rèn)的地址簿路徑存儲在地址簿格式地址類型在中存儲的地址有兩種標(biāo)識新地址,不可靠地址未成功連接過。 作者:Derek 簡介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomB...
閱讀 2498·2021-08-11 11:16
閱讀 2938·2019-08-30 15:55
閱讀 3337·2019-08-30 12:53
閱讀 1578·2019-08-29 13:28
閱讀 3271·2019-08-28 18:17
閱讀 944·2019-08-26 12:19
閱讀 2475·2019-08-23 18:27
閱讀 712·2019-08-23 18:17