1. 程式人生 > >比特幣bitcoin原始碼解析之資料結構

比特幣bitcoin原始碼解析之資料結構

1. CTxOut

An output of a transaction. It contains the public key that the next input must be able to sign with to claim it.CTxOut類圖
欄位屬性說明
nValue交易輸出對應的金額
scriptPubKey交易對應的公鑰

2. COutPoint

對應交易的第幾個輸出COutPoint類圖
欄位屬性說明
hash交易對應的hash
n交易對應的第幾個輸出

3. CTxIn

An input of a transaction. It contains the location of the previous transaction's output that it claims and a signature that matches the output's public key.
CTxIn類圖
欄位屬性說明
prevout前一個交易對應的輸出(叫一個交易對應的hash值和對應的第幾個輸出)
scriptSig輸入指令碼對應的簽名
nSequence主要是用於判斷相同輸入的交易哪一個更新,值越大越新

4. CTransaction

The basic transaction that is broadcasted on the network and contained in blocks. A transaction can contain multiple inputs and outputs.CTransaction類圖
欄位屬性說明
nVersion交易的版本號,用於升級
vin交易對應的輸入列表
vout交易對應的輸出列表
nLockTime交易對應的鎖定時間,目前沒有使用(在最初版本的比特幣中)

5. CMerkleTx

A transaction with a merkle branch linking it to the block chainCMerkleTx類圖
欄位屬性說明
hashBlock交易所在block對應的hash值,因為block中有對應整個交易的默克爾樹,這樣才能根據分支來校驗當前交易是否在block中
vMerkleBranch當前交易對應的默克爾分支
nIndex當前交易在對應的block對應的輸入vtx列表中的索引,CMerkleTx就是根據索引來計算這個交易對應的默克爾樹分支的
fMerkleVerified標記默克爾交易是否已經校驗,如果沒有校驗則進行校驗,校驗之後將這個值設為true

6. CWalletTx

A transaction with a bunch of additional info that only the owner cares about. It includes any unrecorded transactions needed to link it back to the block chain.CWalletTx類圖
欄位屬性說明
vtxPrev當前交易A對應的輸入對應的交易B,如果B所在block到最長鏈末尾的長度小於3,則將次交易放入
fTimeReceivedIsTxTime接收時間是否是交易時間標記
nTimeReceived交易被這個節點接收的時間

7. CBlock

Nodes collect new transactions into a block, hash them into a hash tree, and scan through nonce values to make the block's hash satisfy proof-of-work requirements. When they solve the proof-of-work, they broadcast the block to everyone and the block is added to the block chain. The first transaction in the block is a special one that creates a new coin owned by the creator of the block. Blocks are appended to blk0001.dat files on disk. Their location on disk is indexed by CBlockIndex objects in memory.CBlock類圖
欄位屬性說明
nVersion塊的版本,主要為了後續的升級使用
hashPrevBlock前一個塊對應的hash
hashMerkleRoot默克爾對應的根
nTime區塊建立時間:這個值取max(前11個區塊對應建立時間中位數,當前時間)
nBits記錄本區塊難度
nNonce工作量證明獲得隨機數,這個隨機數正好滿足當前挖礦對應的難度
vtx塊中交易列表
vMerkleTree整個交易對應的默克爾樹列表

8. CBlockIndex

The block chain is a tree shaped structure starting with the genesis block at the root, with each block potentially having multiple candidates to be the next block. pprev and pnext link a path through the main/longest chain. A blockindex may have multiple pprev pointing back to it, but pnext will only point forward to the longest branch, or will be null if the block is not part of the longest chain. 如果塊索引對應的pNext不為空,則這個塊索引一定對應的是主鏈CBlockIndex類圖
欄位屬性說明
phashBlock對應塊hash值指標
pprev指向前一個blockIndex
pnext指向當前區塊索引的下一個,只有當前區塊索引在主鏈上的時候,這個值才是非空
nFile塊所在檔案的資訊,而且塊檔案的命名一般是blk${nFile}.dat
nBlockPos塊在檔案中的偏移
nHeight塊索引在最長鏈的深度,即是中間隔了多少個block,即是從創世區塊到當前區塊中間隔了多少個區塊
nVersion塊的版本,主要為了後續的升級使用
hashMerkleRoot默克爾對應的根
nTime區塊建立時間:這個值取max(前11個區塊對應建立時間中位數,當前時間)
nBits記錄本區塊難度
nNonce工作量證明獲得隨機數,這個隨機數正好滿足當前挖礦對應的難度

9. CDiskTxPos

交易在檔案中對應的索引位置CDiskTxPos類圖
欄位屬性說明
nFile塊所在檔案的資訊,而且塊檔案的命名一般是blk${nFile}.dat
nBlockPos塊在檔案中的偏移
nTxPos交易在對應塊中的偏移

10. CTxIndex

A txdb record that contains the disk location of a transaction and the locations of transactions that spend its outputs. vSpent is really only used as a flag, but having the location is very helpful for debugging. 交易索引---每一個交易對應一個索引CTxIndex類圖
欄位屬性說明
pos交易對應的在硬碟中檔案的位置
vSpent標記交易的輸出是否已經被消費了,根據下標來標記對應交易指定位置的輸出是否已經被消費了

11. CDataStream

Double ended buffer combining vector and stream-like interfaces. >> and << read and write unformatted data using the above serialization templates. Fills with data in linear time; some stringstream implementations take N^2 time.CDataStream類圖
欄位屬性說明
vch流中存放的資料
nReadPos流中讀取的位置
nType型別
nVersion版本

12. CAddress

地址資訊CAddress類圖
欄位屬性說明
nServices服務標識
pchReserved保留內容:{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff }
ipIp地址
port
nTime時間
nLastFailed對應這個地址最近連線失敗時間

13. CNode

節點定義CNode類圖
CInv類圖
欄位屬性說明
nServices服務標識
hSocket對應本地和這個節點連線的套接字
vSend傳送快取區
vRecv接收緩衝區
nPushPos指定傳送區已經發送的位置
addr對應這個節點的地址資訊
nVersion節點對應的版本,如果節點版本為0,則訊息傳送不出去
fClient標記是否是客戶端,如果是客戶端則需要區塊的頭部進行校驗就可以了,不需要儲存整個區塊的內容
fNetworkNode設定對應的節點為網路節點
fDisconnect節點斷開連線的標記
nRefCount引用計數器
nReleaseTime節點釋放的時間
vAddrToSendflood 洪泛:訊息需要傳送對應的地址,對需要傳送的地址進行已知地址的集合過濾之後再發送
setAddrKnown已知地址的集合
setInventoryKnown基於轉播的庫存:已知庫存的集合
vInventoryToSend庫存準備傳送的集合,對庫存準備傳送的集合根據已知庫存的集合進行過濾之後在傳送

二. 原始碼地址