
SIGHASH_ANYPREVOUT(APO,BIP-118)是比特幣Taproot升級後引入的新型簽名哈希類型。其核心創新在於簽名時無需綁定具體輸入UTXO,僅對輸出進行簽名,從而實現更靈活的支出邏輯。該機制是閃電網絡Eltoo改造的技術基石,可大幅降低狀態存儲需求,助力通道工廠與輕量級瞭望塔構建,顯著提升比特幣二層擴展性能。
APO允許比特幣簽名授權任何兼容的UTXO,而非固定的輸出點。它允許為Lightning、Vault和Layer-2協議提供可重新綁定的預簽名交易,而無需新的密鑰管理開銷。
這是Cointelegraph Research關於比特幣契約的技術文章系列的第三部分。點擊這裡閱讀上一篇文章。
SIGHASH_ANYPREVOUT,正如 BIP 118 中所述,基於 Joseph Poon 和 Thaddeus Dryja 在 2015 年 Lightning Network 論文中提到的早期SIGHASH_NOINPUT概念,後來由 Joseph Poon 於 2016 年 2 月在比特幣開發郵件列表上正式提出。
SIGHASH_ANYPREVOUT不是新的操作碼,而是SIGHASH標志的一個提議新值,設計用於作為比特幣的軟分叉升級。SIGHASH 標志附加在簽名後,決定交易的哪些部分已簽署,並由 CHECKSIG 操作碼檢查。所選的旗幟由簽署者選擇,而非由scriptPubKey強制執行。由於軟分叉中升級的技術細節,SIGHASH_ANYPREVOUT提案僅適用於來自主根地址的支出。
如圖1所示,已經存在多種標準SIGHASH模式。如果標志設置為SIGHASH_ALL,簽名必須覆蓋所有輸入、所有輸出以及具體的輸出點,從而加密綁定授權到該精確的UTXO。outpoint 是交易 ID 和輸出索引的組合,共同唯一標識交易正在消耗的 UTXO。而 SIGHASH_NONE 則隻需對輸入進行符號,輸出則不受約束。SIGHASH_SINGLE變體對所有輸入進行簽名,但僅對與被簽名輸入索引相同的輸出簽名。ANYONECANPAY 修飾符通過允許單個輸入獨立簽名,增加瞭更多靈活性。關鍵是,這些現有模式都不允許簽名省略對出點的承諾。正是這個限制被SIGHASH_ANYPREVOUT移除瞭。

BIP-118定義瞭兩種ANYPREVOUT變體,它們在摘要中省略的前一輸出比例不同,如圖2總結。在SIGHASH_ANYPREVOUT下,輸出點被排除在摘要之外,但簽名仍然承諾到之前輸出的數量和scriptPubKey,以及輸入的nSequence。在 SIGHASH_ANYPREVOUTANYSCRIPT 下,金額和 scriptPubKey 也被排除,這意味著簽名完全不綁定在已花費輸出的鎖定腳本上。所有其他承諾都遵循標準的Taproot簽名消息結構,並依賴於所選的基標志,如SIGHASH_ALL或SIGHASH_SINGLE。

由於摘要中省略瞭該輸出點,同一簽名可以授權使用任何滿足剩餘提交字段的兼容UTXO。例如,一筆以 ANYPREVOUT | 預先簽名的交易如果同一地址後來收到另一個0.5 BTC的UTXO,即使用於創建原始簽名的私鑰已不可用,ALL可以重復使用以產生0.5 BTC的輸出。但如果新的UTXO持有超過0.5 BTC,礦工將損失多餘部分,除非原始簽名包含變更輸出。這種重新綁定特性使ANYPREVOUT在第二層協議中非常有用,因為同一預簽名事務必須適用於多個可能的鏈上UTXO,而無需為每個協議重新簽名。
對於類似契約的應用,ANYPREVOUT 變體保留對前一輸出 scriptPubKey 的承諾,通常是最相關的。它們允許簽名在兼容的UTXO間重復使用,同時確保資金綁定在同一鎖定腳本下。ANYPREVOUTANYSCRIPT 完全去除瞭這種綁定,因此不太適合契約式應用。
與OP_CTV類似,SIGHASH_ANYPREVOUT改進瞭預簽名事務已可實現的邏輯,但本身並不支持遞歸契約或事務內省。相反,它放松瞭簽名與特定UTXO之間的綁定,允許簽名在多個兼容的UTXO間重復使用。
一些研究還指出,移除輸出點承諾使得恢復密鑰構造成為可能——即公鑰可以從固定簽名和消息對中推導出來,使得對應的私鑰對任何人都可證明未知,使UTXO的密鑰路徑可證明不可使用,強制任何花費通過腳本路徑。這將避免臨時密鑰的需求,而臨時密鑰在依賴腳本路徑強制執行的構造中是使密鑰路徑不可使用的關鍵。這一觀察出現在Jacob Swambo等人(2020年)的《比特幣契約:三種控制未來的方式》中,盡管它仍是理論構造,而非BIP-118中提出的設計。
SIGHASH_ANYPREVOUT簽名的主要風險是簽名回放。由於這些簽名不承諾特定出點,隻要新的 UTXO 滿足剩餘的已提交字段,同一簽名可用於使用與原意不同的 UTXO。這種風險在特定配置中更為明顯:當 ANYPREVOUT |使用單一(SINGLE)並可重新排列輸出量;當存在一個獨立的 UTXO,且具有相同的 scriptPubKey 和金額時,如 ANYPREVOUT;當同一公鑰以兼容的文字出現時,如ANYPREVOUTANYSCRIPT;或者礦工可以影響交易排序和包含性,利用這些條件。然而,這些場景要麼是故意濫用,要麼是用戶或開發者在協議設計時未能考慮重放條件。
在我們的下一篇文章中,我們將開始討論作為輔助工具的操作碼。這些工具擴展瞭比特幣腳本或數據處理的表達力,但除非與其他操作碼結合,否則不實現契約功能。在下一類中,我們將討論OP_CHECKSIGFROMSTACK和 OP_CAT。
以上就是比特幣(BTC)契約第三部分:SIGHASH_ANYPREVOUT的詳細內容,更多關於BTC契約三:ANYPREVOUT的資料請關註腳本之傢其它相關文章!
原创文章,作者:fanbi,如若转载,请注明出处:https://www.fanbi.net/archives/5218