Derek解讀Bytom源碼-創世區塊

來源:互聯網
上載者:User

作者:Derek

簡介

Github地址:https://github.com/Bytom/bytom

Gitee地址:https://gitee.com/BytomBlockc...

本章介紹Derek解讀-Bytom源碼分析-創世區塊

作者使用MacOS作業系統,其他平台也大同小異

Golang Version: 1.8

創世區塊介紹

區塊鏈裡的第一個區塊創被稱為創世區塊。它是區塊鏈裡面所有區塊的共同祖先。

在比原鏈中創世區塊被寫入程式碼到bytomd中,每一個比原節點都始於同一個創世區塊,這能確保創世區塊不會被改變。每個節點都把創世區塊作為區塊鏈的首區塊,從而構建了一個安全的、可信的區塊鏈。

擷取創世區塊

./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的區塊資訊。我們可以看到以上輸出結果。

  • bits: 目標值,挖礦時計算的hash之後要小於等於的目標值則新塊構建成功
  • difficulty: 難度值,礦工找到下一個有效區塊的難度。該參數並不儲存在區塊鏈上,是由bits計算得出
  • hash: 當前區塊hash
  • height: 當前區塊高度
  • nonce: 隨機數,挖礦時反覆使用不同的nonce來產生不同雜湊值
  • previous_block_hash: 當前區塊的父區塊hash值
  • size: 當前區塊的位元組數
  • timestamp: 出塊時間
  • transaction_merkle_root: 創世區塊的merkle樹根節點
  • transactions: 當前塊中的utxo交易

由於創世區塊是第一個塊,創世區塊的父區塊,也就是previous_block_hash參數,預設情況下為0000000000000000000000000000000000000000000000000000000000000000

時間戳記timestamp為1524549600,時間為2018-04-24 14:00:00也就是比原鏈上主網的時間。

源碼分析

擷取區塊鏈狀態

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()    }    // ...}

當我們第一次啟動比原鏈節點時,store.GetStoreStatus會從db中擷取儲存狀態,擷取儲存狀態的過程是從LevelDB中查詢key為blockStore的資料,如果查詢出錯則認為是第一次運行比原鏈節點,那麼就需要初始化比原主鏈。

初始化主鏈

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()擷取創世區塊
  • 設定創世區塊中所有交易狀態
  • 儲存創世區塊到LevelDB
  • state.NewUtxoViewpoint()用於臨時小部分utxo狀態儲存集合
  • 執行個體化BlockNode,BlockNode用於選擇最佳鏈作為主鏈
  • 儲存最新主鏈狀態

被硬式編碼創世區塊

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主要有如下操作:

  • 產生創世區塊中的交易,預設就一筆交易
  • 設定塊中的交易狀態為false
  • 將創世區塊設定為merkle樹的根節點
  • 執行個體化Block塊並返回

genesisTx函數產生創世區塊中的交易,預設就一筆交易,一筆交易中包含input輸入和output輸出。

input輸入:
輸入中有一句話"Information is power. -- Jan/11/2013. Computing is power. -- Apr/24/2018."這是為了紀念Aaron Swartz的精神

output輸出:
輸出中我們看到consensus.InitialBlockSubsidy創世區塊的獎勵。總共140700041250000000/1e8 = 1407000412。也就是14億個BTM幣。

計算即權力

引用比原鏈創始人長鋏的話:

4月24號,我們主網上線,資訊即權力,2013年Jaruary11;計算即權力,2018年April24。這句話是為了紀念Aaron Swartz的精神,資訊即權力可以視為互連網宣言,致力於資訊自由傳播,讓公民隱私得到保護。計算即權力,致力於讓資產自由的交易,自由的流動,讓公民的財富得到保護,我覺得這是非常好的紀念。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.