科普:比特幣新區塊產生的過程
這是博主挖礦科普專輯的第二篇內容,承接上一篇“比特幣交易的過程”在
在
在“比特幣交易的過程”一文中,我們已經知道比特幣的交易信息是如何構造的,但是這些信息又是如何進入比特幣新區塊的呢?
接下來博主將通過比特幣新區塊產生的過程來具體說明比特幣區塊是如何記錄並確認交易信息的。
交易池
交易池,英文名稱:mempool,又叫內存池,是用來存儲待確認交易的地方,每個比特幣挖礦節點均有自己獨立的交易池,因交易池體積,最低交易費比例(本文所指交易費比例,均為單位體積交易包含的手續費,單位是Sat/B,即每B字節交易的手續費為x聰比特幣,下同)限制等不同,各節點的交易池也不相同。礦工(礦池)在構造預備區塊時,需要從交易池中選擇要打包的交易。由於交易池經常被調用,它的數據被存放在節點服務器的RAM中,這就意味著交易池的體積不會太大。
挖礦節點,在比特幣網絡中,參與記錄和驗證比特幣交易和區塊的是一個個保存比特幣數據的節點。其中有一部分節點,不僅參與記錄和驗證的工作,還參與比特幣新區塊的創建工作,他們構造新區塊,並通過PoW工作量證明競爭記賬權,進而獲得創建新區塊的權限,這部分節點是挖礦節點。早期的挖礦節點有礦工,也有礦池,但當前由於比特幣挖礦難度太高,單個礦工很難贏取記賬權,創建新區塊。目前主要的比特幣挖礦節點,是各家礦池,如F2Pool,Poolin,BTC.com,Antpool,Slushpool等。
UTXO庫,比特幣節點通過掃描節點所有交易信息,構建的UTXO集群。它包含所有未被消耗的UTXO。每當新區塊產生後,UTXO庫會將新區塊中消耗掉的UTXO從自己的列表中刪除,將新產生的UTXO加入到自己的列表中。
二級標題二級標題
待確認的交易會先進入交易池中
當我們要發起一筆比特幣交易時,交易發起方構造好交易信息,此時的交易信息是待確認的交易,它包含交易輸入信息(未使用的UTXO和正確私鑰簽名)和交易輸出信息圖片描述
圖片描述
圖1 待確認交易進入交易池
需要驗證的交易信息包括:
交易是否包含有效的輸入和輸出錢包地址;
交易體積是否小於區塊的最大體積(比特幣區塊的最大體積目前是1M);
輸入的UTXO是否合法(對照節點的UTXO庫,輸入UTXO未被使用過);
交易輸入總額和輸出總額是否合理(輸入總額≥輸出總額);
判斷交易的輸入是否有來自Coinbase的獎勵,該獎勵對應的幣需至少有100個區塊確認才能可以使用;
二級標題
二級標題
挖礦節點從交易池中選擇交易,構造預備區塊
其中,
圖片描述
其中,
其中,“魔數”是一個值為0xD9B4BEF9的常數;“區塊體積”是本區塊所有數據的總體積;“區塊頭”是可以看作是整個區塊的縮略信息,挖礦用到的區塊信息就是區塊頭;“交易計數器”用來記錄區塊中交易的數量;“交易數據”是區塊所包含的所有交易信息,包括Coinbase獎勵部分,一般來說,這部分數據佔了整個區塊絕大部分空間。
在比特幣區塊中,區塊頭是最為關鍵的一個信息。它包含整個區塊的所有特徵信息:
區塊版本號。創建區塊的比特幣節點的版本信息,用於追踪比特幣協議的升級和更新情況;
前一個區塊的哈希值圖片描述
MerkleRoot哈希圖片描述
圖3 交易數據的Merkle樹結構
由於哈希算法的敏感性,整個交易的Merkle樹中任何一個交易數據有微小的改動,都會產生聯動效果,導致Merkle樹的根哈希值出現巨大變化。因此交易數據的Merkle樹根哈希值(MerkleRoot Hash)可以看作是整個交易的指紋,用來指代區塊中的交易數據。
時間戳。創建預備區塊的時間。
隨機數隨機數
隨機數。又叫Nonce。我們可以發現,區塊頭信息中,區塊版本號,前一個區塊的哈希值,MerkleRoot哈希值,時間戳,以及當前目標哈希,都是已知信息,相對固定,不便隨意更改。因此,如果要調整預備區塊的哈希值,就需要引入一個可變的數據——隨機數。修改隨機數,就可以調整預備區塊的哈希值。
參考資料:
參考資料:
參考資料:
比特幣源碼分析
比特幣區塊頭結構分析:
比特幣目標哈希值
比特幣區塊結構
精通比特幣


