大家好,這裡是鏈客區塊鏈技術問答社區。
鏈客,專為開發者而生,有問必答!
獨立交易驗證
在 [transactions] 中, 我們看到了錢包軟體如何通過收集UTXO創建交易,提供適當的解鎖腳本,然後構建分配給新所有者的新輸出。然後將產生的交易發送到比特幣網絡中的相鄰節點,以便它可以在整個比特幣網絡上傳播。
但是,在向鄰居轉發交易之前,接收交易的每個比特幣節點都將首先驗證交易。確保只有有效的交易通過網絡傳播,無效的交易會被遇到它們的第一個節點丟棄。
每個節點根據一個很長的標準檢查清單驗證每筆交易:
交易的語法和數據結構必須正確輸入和輸出列表都不為空所有交易的字節大小小於 MAX_BLOCK_SIZE.每個輸出值,和總的輸出值,都必須在允許的範圍區間(小於2100萬比特幣,大於 dust 閾值)任何輸入的hash不等於0,N不等於-1 (幣基交易不應該被傳播)nLocktime 等於 INT_MAX, 或者 nLocktime 和 nSequence 的值滿足 MedianTimePast 的要求每筆交易的字節大小大於或等於 100交易中包含的籤名操作(SIGOPS) 小於籤名操作限制解鎖腳本( scriptSig )只能向棧中壓入數值, 鎖定腳本 (scriptPubkey) 必須匹配 IsStandard 格式 (拒絕非標準的交易).交易池或主分支的一個區塊中必須存在這筆交易對於每個輸入,如果引用的輸出存在於池中的任意一筆其他交易中,則這筆交易被拒絕對於每個輸入,查找主分支和交易池以找到引用的輸出的交易。如果任何輸入的輸出交易丟失,這將成為一筆孤兒交易。如果匹配的交易沒在池中,添加它到孤兒交易池對於每個輸入,如果引用的交易是幣基輸出,它必須有至少 COINBASE_MATURITY (100) 次確認對於每個輸入,引用的輸出必須存在且未被花費使用引用的輸出交易來獲得輸入值,檢查每個輸入值,以及總和,在允許的範圍中(大於0,小於2100萬).如果輸入值的總和小於輸出值的總和,拒絕如果交易費太低( minRelayTxFee ),拒絕每個輸入的解鎖腳本必須與對應的輸出的鎖定腳本匹配這些條件的詳情可以在 Bitcoin Core 中的 AcceptToMemoryPool, CheckTransaction, 和 CheckInputs 中看到。注意,條件是隨時間改變的,以應對新的拒絕服務攻擊類型,或者放鬆規則以包含更多類型的交易。
通過在交易到達後,向外傳播前,獨立驗證,每個節點都簡歷了一個有效(但未確認)的交易池,稱為 transaction pool,memory pool或 mempool。