国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Derek解讀Bytom源碼-創世區塊

王軍 / 2557人閱讀

摘要:作者簡介地址地址本章介紹解讀源碼分析創世區塊作者使用操作系統,其他平臺也大同小異創世區塊介紹區塊鏈里的第一個區塊創被稱為創世區塊。在比原鏈中創世區塊被硬編碼到中,每一個比原節點都始于同一個創世區塊,這能確保創世區塊不會被改變。

作者: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創世區塊的獎勵??偣?40700041250000000/1e8 = 1407000412。也就是14億個BTM幣。

計算即權力

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24256.html

相關文章

  • Derek解讀Bytom源碼-孤塊管理

    摘要:此時節點將放入到孤塊管理緩存池中,等待彼此的父塊。判斷當前塊是否存在于區塊鏈上或是否存在孤塊緩存池中,如果存在則返回。比如當前區塊高度為,則在孤塊緩存池中查詢是否有區塊高度為的區塊。 作者:Derek 簡介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 本章介紹bytom...

    Donne 評論0 收藏0
  • Derek解讀Bytom源碼-持久化存儲LevelDB

    摘要:函數總共操作有兩步從緩存中查詢值,如果查到則返回如果為從緩存中查詢到則回調回調函數。回調函數會將從磁盤上獲得到塊信息存儲到緩存中并返回該塊的信息。回調函數實際上調取的是下的,它會從磁盤中獲取信息并返回。 作者:Derek 簡介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc......

    Eminjannn 評論0 收藏0
  • Derek解讀Bytom源碼分析-持久化存儲LevelDB

    摘要:函數總共操作有兩步從緩存中查詢值,如果查到則返回如果為從緩存中查詢到則回調回調函數。回調函數會將從磁盤上獲得到塊信息存儲到緩存中并返回該塊的信息。回調函數實際上調取的是下的,它會從磁盤中獲取信息并返回。 簡介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 本章介紹Dere...

    GitChat 評論0 收藏0
  • Derek解讀Bytom源碼-Api Server接口服務

    摘要:首先讀取請求內容,解析請求,接著匹配相應的路由項,隨后調用路由項的回調函數來處理。每一個路由項由請求方法和回調函數組成將監聽地址作為參數,最終執行開始服務于外部請求創建對象首先,實例化對象。我們可以看到一條項由和對應的回調函數組成。 作者:Derek 簡介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com...

    GitCafe 評論0 收藏0
  • Derek解讀Bytom源碼-P2P網絡 地址簿

    摘要:作者簡介地址地址本章介紹代碼網絡中地址簿作者使用操作系統,其他平臺也大同小異介紹用于存儲網絡中保留最近的對端節點地址在下,默認的地址簿路徑存儲在地址簿格式地址類型在中存儲的地址有兩種標識新地址,不可靠地址未成功連接過。 作者:Derek 簡介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomB...

    Kahn 評論0 收藏0

發表評論

0條評論

王軍

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<