區塊鏈是一個鏈式存儲結構,區塊就是鏈式存儲結構中的數據元素,區塊鏈由區塊相互連接形成單向鏈式結構,其中第一個區塊被稱為創始區塊。
那作為區塊鏈的數據元素,區塊的構成又是怎樣的呢?
其實,每個區塊的大小被規定不能超過1M,它的結構分為兩部分,區塊頭和區塊體。
區塊頭共80字節,分為6個部分:version,prevBlockHash,merkleRoot,time difficultyTarget,nonce。
version:大小為4字節,記錄了區塊頭的版本號,用於跟蹤軟件/協議的更新;
prevBlockHash:大小為32字節 ,記錄了該區塊的上一個區塊的Hash地址;
merkleRoot:大小為32字節,記錄了該區塊中交易的merkle樹根的哈希值;
time:大小為 4字節,記錄了該區塊的創建時間戳;
difficultyTarget:大小為4字節,記錄了該區塊鏈工作量證明難度目標;
nonce:大小為4字節,記錄了用於證明工作量的計算參數。
區塊體的內容是該區塊的交易信息,包括交易數量和交易數據。區塊體共分為三部分:
numTransactionsBytes,numTransactions,transactions。
numTransactionsBytes:大小為1字節,記錄了交易數量占用的字節數;
numTransactions:大小為0-8個字節,記錄了區塊內的交易數量;
transactions:大小不確定,記錄了區塊內存的多個交易數據。
在區塊體部分中,numTransactions(記錄區塊內交易數量)是存儲交易信息的重要字段,將numTransactions(記錄區塊內交易數量)部分使用壓縮存儲方式,這樣可以大量的節約存儲空間。numTransactionsBytes字段的存在是為了指出numTransactions在區塊體中存在的部位,為讀取交易數量而做准備,因此,應最先讀取numTransactionsBytes字段值,並根據該字段值的不同做出如下規定:
如果numTransactionsBytes字段值小於253,則交易數量為numTransactionsBytes字段值作為;
如果numTransactionsBytes字段值等於253,則交易數量為numTransactionsBytes字段值之后的兩個字節;
如果numTransactionsBytes字段值等於254,則交易數量為numTransactionsBytes字段值之后的4個字節;
否則,交易數量為numTransactionsBytes字段值之后的8個字節。
作者:f珞珈山神