Bitcoin-Core

當選擇其中之一時,如何在並發塊中設置塊索引中的有效性標誌?

  • June 20, 2022

我試圖了解塊有效性標誌,以及發生分支時會發生什麼。我在比特幣核心原始碼中發現了一個區塊狀態標誌:

enum BlockStatus : uint32_t {

   BLOCK_VALID_UNKNOWN      =    0,
   BLOCK_VALID_RESERVED     =    1,
   BLOCK_VALID_TREE         =    2,
   BLOCK_VALID_TRANSACTIONS =    3,
   BLOCK_VALID_CHAIN        =    4,
   BLOCK_VALID_SCRIPTS      =    5,

   BLOCK_VALID_MASK         =   BLOCK_VALID_RESERVED | BLOCK_VALID_TREE | BLOCK_VALID_TRANSACTIONS |
                                BLOCK_VALID_CHAIN | BLOCK_VALID_SCRIPTS,

   BLOCK_HAVE_DATA          =    8, //!< full block available in blk*.dat
   BLOCK_HAVE_UNDO          =   16, //!< undo data available in rev*.dat
   BLOCK_HAVE_MASK          =   BLOCK_HAVE_DATA | BLOCK_HAVE_UNDO,

   BLOCK_FAILED_VALID       =   32, //!< stage after last reached validness failed
   BLOCK_FAILED_CHILD       =   64, //!< descends from failed block
   BLOCK_FAILED_MASK        =   BLOCK_FAILED_VALID | BLOCK_FAILED_CHILD,

   BLOCK_OPT_WITNESS        =   128, //!< block data in blk*.dat was received with a witness-enforcing client
   BLOCK_ASSUMED_VALID      =   256,
};

假設該塊到達,節點成功驗證它。我想在這種情況下,塊狀態設置為 5 (BLOCK_VALID_SCRIPTS)。然後將其儲存在塊索引數據庫中。現在另一個兩個有效塊的序列從與上面的塊相同的高度開始到達。我假設工作節點會將此序列視為活動分支,並且將放棄前一個塊。廢棄塊的索引條目會發生什麼?它會保留在數據庫中嗎?然後如何設置這些標誌或其他欄位以將此塊標記為已放棄?對於遍歷索引數據庫時要遵循哪個分支的問題,是否有任何簡單的答案,或者我是否需要訪問每個分支到最後一個葉子並每次選擇最長的序列?

廢棄塊的索引條目會發生什麼?

沒有什麼。塊索引包含有關可用塊和分支及其有效性的資訊。它不包含有關節點目前實際認為哪個鏈處於活動狀態的任何資訊。該資訊位於鏈狀態數據庫(也包含 UTXO 集)中。

它會保留在數據庫中嗎?

是的。這是一個有效的塊。

然後如何設置這些標誌或其他欄位以將此塊標記為已放棄?

沒有什麼變化。

對於遍歷索引數據庫時要遵循哪個分支的問題,是否有任何簡單的答案,或者我是否需要訪問每個分支到最後一個葉子並每次選擇最長的序列?

這是一種可能。另一種方法是查看鏈狀態數據庫。

引用自:https://bitcoin.stackexchange.com/questions/114155