Bitcoin source code 1 Block Chain - killelder/cryptocurrency GitHub Wiki

本篇會綜合網路上的比特幣源代碼筆記來做自己的筆記
加入我自己的學習過程

由於程式碼相當龐大, 也不知道從何開始讀起
所以可以從比特幣實現的幾個功能下手
bitcoin developer-reference左側的分類下
可以看出幾個組成比特幣的基本要素

  1. Block Chain
  2. Transactions
  3. Wallets
  4. P2P Network
  5. Bitcoin Core APIs

Block Chain

Block Chain又包含了Block Headers, Block Versions, Merkle Trees, Target nBits, Serialized Blocks
這裡可以參考SnakeCoin 用50行python代碼創建一個簡單的區塊鏈

Block Headers

Block headers = version (4 Bytes) +
previous block header hash (32 Bytes) +
merkle root hash (32 Bytes) +
time (4 Bytes) +
Target nBits(4 Bytes)

version : 是block validation rules要遵循哪一個版本
previous block header hash : 前一個block的SHA256 merkle root hash : 包含所有交易的hash(包含當下這個區塊的), 可以確保整個交易沒有被更動
time : 這個區塊的時間必須大於前11個區塊的中位數時間, 但不大於兩小時
Target nBits: 讓比特幣可以調整難度用的

Block Version

目前比特幣改過四次version, 這邊就不一一介紹
每次改版就會做一次soft fork, 會呼叫 IsSuperMajority 這個function
但以後可能會使用一個叫做version bits的東西(目前還不清楚這是甚麼)

Merkle Trees

merkle root包含所有的交易TXID, TXID的擺放必須遵守下面的規則

  1. 第一個coinbase 交易必須由礦工創造, 永遠放在第一位
  2. 同一個TXID在同一個區塊可以拿賺到的錢(output)來花(input), 所以在同一區塊的output必須在input之前

如果這筆交易只有挖礦者, 那麼這筆交易就拿礦工的TXID當成merkle root hash
如果有兩筆交易, 那麼就拿兩筆交易按照上面說的順序把TXID合成64 Bytes, 做SHA256變成merkle root hash
如果有三筆交易以上, 那麼按照順序, 然後兩兩hash, 再把hash起來的值兩兩hash, 變成一個merkle tree
最後的值就是merkle root hash

Target nBits

意思就是當比特幣調整nonce算出來的hash前面要有幾個0,
但Bitcoin儲存target使用的是浮點數,
這段我還不太懂怎麼換算

Serialized Blocks

根據現在的共識規則, block必須要< 1MB,
包含了
block header (80 Bytes) + txn_count + txns
block header : 就是上面介紹的
txn_count : 有幾組交易
txns : 每筆交易的紀錄
block height小於6930000的塊(塊的序號), 可以獲得挖礦獎勵
一開始是50BTC, 每210000塊會減少一半

下一篇 Bitcoin source code 2 Transactions

參考:
bitcoin developer-reference
Youtube Lecture
Bitcoins the hard way
比特幣源碼解析
比特幣源碼學習筆記(一)做參考