目錄
一、區塊結構
數據區塊是區塊鏈的基本元素。比特幣系統的每個數據區塊主要由區塊頭(Block Header)和區塊體(Block Body)兩部分組成,其中區塊頭記錄當前區塊的元數據,而區塊體則存儲封裝到該區塊的實際交易數據。
數據項 | 數據說明 | 大小 |
Block Size | 區塊大小 | 4字節 |
Block Header | 區塊頭 | 80字節 |
Transaction Counter | 交易數量 | 1~9字節 |
Transactions | 交易列表 | 可變 |
下圖是:比特幣系統的區塊結構圖
二、區塊頭
比特幣系統區塊頭的數據項及說明:
數據項 | 說明 | 更新時間 | 大小 |
Version | 版本號,表示本區塊遵守的驗證規則 | 版本升級時 | 4字節 |
Pre-block | 引用區塊鏈中夫區塊的哈希值 | 創建一個新區塊時 | 32字節 |
Bits | 壓縮格式的當前目標哈希值 | 當挖礦難度調整時 | 4字節 |
Nonce | 32位數字(從0開始) | 共識過程中實時更新 | 4字節 |
Kerkle-root | 基於一個區塊中所有交易的哈希值 | 交易列表發生變化時 | 32字節 |
Timestamp | 該區塊產生的近似時間,精確到秒的Unix時間戳 | 構建區塊時 | 4字節 |
三、區塊體
數據項 | 數據描述 | 大小 |
Version No | 版本號,目前爲1,表示這筆交易參照的規則 | 4字節 |
In-counter | 輸入數量,正整數VI=VarInt | 1~9字節 |
list of inputs | 輸入列表,每區塊的第一個交易稱爲“Coinbase”交易 | <in-counter>許多輸入 |
Out-counter | 輸出數量,正整數VI=VarInt | 1~9字節 |
list of outputs | 輸出列表,每區塊第一個交易的輸出是給礦工的獎勵 | <out-counter>許多輸出 |
lock_time |
鎖定時間,如果非0並且序號小於0XFFFFFFFF,則是指塊序號; 如果交易已經終止,則是指時間戳 |
交易主要可以分成三部分:元數據、一系列的輸入和一系列的輸出。除了第一筆Coinbase交易是礦工的挖礦收入之外,其他每一筆交易都有一個或多個輸入,以及一個或多個輸出。Coinbase交易沒有輸入,只有輸出。
(1)元數據
主要存儲一些內部處理的信息,包含版本號、這筆交易的規模,輸入的數量、輸出的數量、交易鎖定時間,以及作爲該交易獨一無二的ID的哈希值。其他區塊可以通過哈希指針指向這個ID。
(2)交易輸入
每筆交易的所有輸入排成一個序列,每個輸入的格式相同,當交易被序列化以便在網絡上傳播時,輸入將被編碼爲字節流。
數據項 | 描述 | 大小 |
Previous Transaction hash | 指向交易包含的未花費的UTXO的哈希指針 | 32字節 |
Previous Txout-index | 未花費的UTXO的索引號,第一個是0 | 4bytes |
Txin-script length | 解鎖腳本長度 | 1~9字節(可變整數) |
Txin-script/scriptSig | 一個達到UTXO鎖定腳本中的條件的腳本 | 變長 |
sequence_no | 目前未被使用的交易替換功能,通常設成0xFFFFFFFF | 4字節 |
(3)交易輸出
每個輸出的內容分成兩部分,一部分是特定數量的比特幣,以“聰”爲單位(最小的比特幣單位),另一部分是鎖定腳本,即提出支付輸出所必須滿足的條件以“鎖住”這筆總額。
數據項 | 描述 | 大小 |
Value | 用“聰”表示的比特幣值 | 8字節 |
Txout-script length | 鎖定腳本長度 | 1~9字節(可變整數) |
Txout-script/scriptPubKey | 定義了支付輸出所需條件的腳本 | 變長 |
四、交易類型
(1)生產交易
每個區塊的第一筆交易都是生產新幣的交易。該交易沒有輸入地址,僅有一個輸出地址,其作用是將系統新生成的加密貨幣獎勵給創造當前區塊的礦工。
(2)通用地址交易
這是區塊鏈系統中最常見的交易,由N個輸入和M個輸出構成,其中N>0,M>0。根據N和M的不同取值,可以進一步細分爲一對一轉賬交易、一對多分散交易、多對一聚合交易和多對多轉賬交易。
(3)合成地址交易
合成地址交易是一類特殊交易,其接收地址不是通常意義的地址,而是一個以3開頭的合成地址。合成地址一般是M of N的多重簽名地址,其中1<=N<=3、1<=M<=N,通常選擇N=3。合成地址的交易構造、簽名和發送過程與普通交易類似,但其地址創建過程需要三對公鑰和私鑰,其中公鑰用於創建地址、私鑰用於簽名。