Bitcoin source code 1 Block Chain - killelder/cryptocurrency GitHub Wiki
本篇會綜合網路上的比特幣源代碼筆記來做自己的筆記
加入我自己的學習過程
由於程式碼相當龐大, 也不知道從何開始讀起
所以可以從比特幣實現的幾個功能下手
在bitcoin developer-reference左側的分類下
可以看出幾個組成比特幣的基本要素
- Block Chain
- Transactions
- Wallets
- P2P Network
- 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的擺放必須遵守下面的規則
- 第一個coinbase 交易必須由礦工創造, 永遠放在第一位
- 同一個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
比特幣源碼解析
比特幣源碼學習筆記(一)做參考