Blockchain
比特幣如何知道一個賬戶是否有足夠的比特幣來允許交易?
讓我們考慮這個簡化的區塊鏈:
BLOCK 108 address ddd111 received 2 BTC by mining block 108 BLOCK 109 address abc123 received 2 BTC by mining block 109 BLOCK 110 address xyz999 created with 0 BTC address fff555 created with 0 BTC address abc123 => xyz999 1 BTC address abc123 => fff555 1 BTC BLOCK 111 address ddd111 => xyz999 1 BTC BLOCK 112 address xyz999 => bbb888 5 BTC
比特幣核心如何知道最後一筆交易有問題?它怎麼知道因為餘額不足而
xyz999
無法發送 5 BTC ?bbb888``xyz999
比特幣不跟踪地址的餘額。您可以取得平衡,但這是針對人類的,並不是協議真正起作用的方式。比特幣節點跟踪的是未使用的交易輸出列表。
這是你的場景改寫了一下。
第 108 塊
地址 ddd111 在交易 A:0 中通過探勘區塊 108 收到 2 BTC(我的意思是交易 A 有一個輸出(索引 0),即 2 BTC 到地址 ddd111)
Transaction A: Inputs: coinbase Outputs: A:0 - ddd111 2.0 BTC
第 109 塊
地址 abc123 在交易 B 中通過探勘區塊 109 收到 2 BTC
Transaction B Inputs: coinbase Outputs: B:0 - abc123 2.0 BTC
第 110 塊
網路對沒有資金的地址一無所知,這不會發生
address xyz999 created with 0 BTC address fff555 created with 0 BTC
地址 abc123 花費 B:0,發送 1 BTC 給 xyz999 (C:1) 剩餘的給自己 (1 BTC) (C:0) 交易 C
Transaction C Inputs: B:0 (signed by abc123) Outputs: C:0 - abc123 1.0 BTC C:1 - xyz999 1.0 BTC
地址 abc123 花費 C:0,發送 1 BTC 到 fff555 交易 D
Transaction D Inputs: C:0 (signed by abc123) Outputs: D:0 - fff555 1.0 BTC
第 111 塊
地址 ddd111 花費交易 A 發送 xyz999 1 BTC 和 1 BTC 回自己 - 交易 E
Transaction E Inputs: A:0 (signed by ddd111) Outputs: E:0 - xyz999 1.0 BTC E:1 - ddd111 1.0 BTC
第 112 塊
地址 xyz999 花費交易 E:0 和 C:1 發送 bbb888 2 BTC - 交易 F
Transaction F Inputs: E:0 (signed by xyz999) C:1 (signed by xyz999) Outputs: F:0 - bbb888 2.0 BTC
(xyz999 無法形成發送 5 BTC 的有效交易,因為沒有 5 BTC 的未花費輸出可供它使用)
注意:一個交易可以有多個可以獨立花費的輸出。
現在我們在塊 112 之後有了這個列表:
Unspent after block 112 D:0 F:0 E:1
每個節點的工作是通過將已使用的輸出標記為已使用並跟踪新的未使用輸出來導入塊。這就是同步區塊鏈需要時間的部分原因,不僅需要下載塊,還需要驗證它們並且需要更新本地數據庫。
注意:如果你執行一個修剪的節點,它只會保留未使用的輸出。如果您不修剪,它將保留所有塊和未使用的輸出。