花費來自更改地址的未經確認的輸出
考慮一個自定義程序,它偶爾需要向我欠錢的使用者發送比特幣。
假設我在地址 ADDR_A 有 100 個未使用的 BTC。
UserX 要求向 ADDR_X 支付 1 BTC。我兌現了請求,從 ADDR_A 花費了我的 100 BTC,將 1 BTC 定向到 ADDR_X,將 99 定向到 ADDR_CHANGE_A。(在這個人為的例子中,讓我們忽略交易費用的影響。)原始交易是通過像 Insight 這樣的公共比特幣 API 送出的。
五秒後,UserY 要求向 ADDR_Y 支付 1 BTC。我想使用 ADDR_CHANGE_A 作為輸入來促進交易。
問題:鑑於針對 ADDR_CHANGE_A 的原始更改輸出尚未確認,我可以使用我新創建的 ADDR_CHANGE_A 地址作為輸入嗎?該網站上的其他材料表明該交易應該有效,但我想了解它為什麼有效。假設公共比特幣 API 接收到我使用 ADDR_CHANGE_A 作為輸入的交易,但不知道 ADDR_CHANGE_A 被用作僅在幾秒鐘前發生的先前交易中的輸出,它不會阻止我嘗試從 ADDR_CHANGE_A 消費?
您在技術上能夠做到這一點,但強烈不建議這樣做。只要相關節點知道父交易,交易就可以花費另一交易的輸出,但是這是非常脆弱的。
比特幣交易通過 TXID 回溯引用,TXID 是前一個被花費的加密雜湊。由於被稱為交易延展性的特性,目前該 TXID 在通過網路廣播時可能會自發更改,因為某些節點執行自定義程式碼,這些程式碼會以特定方式改變交易。如果您建構了一長串未經確認的交易並且早期發生了變異,那麼所有後續交易都可能突然出現花費不再存在並且實際上無效的輸出。很難生產出可以處理這種情況的安全軟體,因為有很多邊緣情況需要處理。
如果您需要在短時間內向多方付款,許多大型供應商會提前拆分他們的輸出,以避免需要花費未經確認的零錢。當他們收到 100 BTC 的輸出時,他們可能會將其分成四個 25 BTC 的塊來支付自己的費用,這將允許他們在需要時向四個人支付費用,而無需嘗試花費未經確認的零錢。這裡需要一些微妙的平衡,如果你的錢包裡有太多的輸出,費用會急劇增加,軟體會變慢。