溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Bytom創(chuàng)世區(qū)塊怎么獲取

發(fā)布時間:2021-12-20 17:45:09 來源:億速云 閱讀:126 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要講解了“Bytom創(chuàng)世區(qū)塊怎么獲取”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Bytom創(chuàng)世區(qū)塊怎么獲取”吧!

創(chuàng)世區(qū)塊介紹

區(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: 目標值,挖礦時計算的hash之后要小于等于的目標值則新塊構(gòu)建成功

  • difficulty: 難度值,礦工找到下一個有效區(qū)塊的難度。該參數(shù)并不存儲在區(qū)塊鏈上,是由bits計算得出

  • hash: 當前區(qū)塊hash

  • height: 當前區(qū)塊高度

  • nonce: 隨機數(shù),挖礦時反復(fù)使用不同的nonce來生成不同哈希值

  • previous_block_hash: 當前區(qū)塊的父區(qū)塊hash值

  • size: 當前區(qū)塊的字節(jié)數(shù)

  • timestamp: 出塊時間

  • transaction_merkle_root: 創(chuàng)世區(qū)塊的merkle樹根節(jié)點

  • transactions: 當前塊中的utxo交易

由于創(chuàng)世區(qū)塊是第一個塊,創(chuàng)世區(qū)塊的父區(qū)塊,也就是previous_block_hash參數(shù),默認情況下為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()
	}
	// ...
}

當我們第一次啟動比原鏈節(jié)點時,store.GetStoreStatus會從db中獲取存儲狀態(tài),獲取存儲狀態(tài)的過程是從LevelDB中查詢key為blockStore的數(shù)據(jù),如果查詢出錯則認為是第一次運行比原鏈節(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ū)塊中的交易,默認就一筆交易

  • 設(shè)置塊中的交易狀態(tài)為false

  • 將創(chuàng)世區(qū)塊設(shè)置為merkle樹的根節(jié)點

  • 實例化Block塊并返回

genesisTx函數(shù)生成創(chuàng)世區(qū)塊中的交易,默認就一筆交易,一筆交易中包含input輸入和output輸出。

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

output輸出: 輸出中我們看到consensus.InitialBlockSubsidy創(chuàng)世區(qū)塊的獎勵??偣?40700041250000000/1e8 = 1407000412。也就是14億個BTM幣。

計算即權(quán)力

引用比原鏈創(chuàng)始人長鋏的話:

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

感謝各位的閱讀,以上就是“Bytom創(chuàng)世區(qū)塊怎么獲取”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Bytom創(chuàng)世區(qū)塊怎么獲取這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI