比特幣 SIGHASH_ANYPREVOUT 是什麼?一篇文搞懂 APO 的核心概念與風險
你有沒有想過,同時管理好幾個閃電頻道或比特幣金庫時,最麻煩的是什麼?答案不是金額,而是「每一次都要重新簽名」。如果我告訴你,有一種方法可以讓同一張簽名在不同的 UTXO 上重複使用,你會怎麼看?這不是什麼魔法,而是 BIP-118 提案的核心——SIGHASH_ANYPREVOUT。
從 SIGHASH_NOINPUT 到 APO:比特幣簽名的進化史
說到 SIGHASH_ANYPREVOUT,不能不提它的前身。這個概念最早出現在 2015 年閃電網路白皮書裡,由 Joseph Poon 和 Thaddeus Dryja 提出,當時叫做 SIGHASH_NOINPUT。2016 年,Poon 在 bitcoin-dev 郵件列表正式提案,後來演變成現在的 BIP-118。
簡單來說,APO 不是什麼新的Opcode,而是賦予 SIGHASH 標誌一個全新的值。它被設計成透過軟分叉升級部署到比特幣上,而且目前只支援 Taproot 地址的花費。
比特幣簽名到底是怎麼運作的?
在進入 APO 之前,先快速搞懂現有的 SIGHASH 模式:
- SIGHASH_ALL:簽名覆蓋所有輸入、所有輸出,還有被花費的那個 UTXO(術語叫 outpoint)。這是最嚴格的繫結。
- SIGHASH_NONE:只簽名輸入,輸出隨便你改。
- SIGHASH_SINGLE:簽所有輸入,但只簽跟輸入同編號的那個輸出。
- ANYONECANPAY:修飾符,讓你只簽名單一一個輸入,別的不用管。
重點來了:這些現有模式統統都要求簽名「承諾」outpoint,也就是那個「交易 ID + 輸出索引」的組合。少了這個,等於簽名跟特定 UTXO 脫鉤了——這在以前被認為是安全隱患,但現在成了新功能的基礎。
SIGHASH_ANYPREVOUT 兩種版本:差在哪裡?
BIP-118 定義了兩種變體,差異在於「省略了多少上一筆輸出的資訊」:
SIGHASH_ANYPREVOUT(簡稱 APO)
這種模式下,簽名確實跳過了 outpoint,但仍然 commitment 到以下幾項:
- 前一筆輸出的金額(amount)
- 前一筆輸出的指令碼公鑰(scriptPubKey)
- 輸入的 nSequence
也就是說,簽名不能用在金額不同或指令碼不同的 UTXO 上,安全性相對高一點。
SIGHASH_ANYPREVOUTANYSCRIPT
這個更猛——連 amount 和 scriptPubKey 都省略了。簽名根本不管上一筆輸出長什麼樣,幾乎任何 UTXO 都能用同一張簽名花掉。
當然,這種極度彈性的設計,適合的場景就比較限縮了。
實際應用:為什麼這東西這麼重要?
好,理論講完了,來點實際的。
假設你用 APO | SIGHASH_ALL 預先簽了一筆交易,要產生 0.5 BTC 的輸出。後來你的地址收到了另一筆 0.5 BTC——即使私鑰已經無法使用(假設你用了多簽設定),這筆舊簽名依然有效,可以花掉新收到的 UTXO。
這就是「重繫結」(rebinding)的力量。對閃電網路來說,這意味著同一個預簽名交易可以跨多個狀態更新使用,不用每次都驚動主鏈。對 Vault 設計來說,意味著你可以設定更靈活的資金釋放條件。
風險提示:簽名 replay 不是開玩笑的
APO 最大的問題在於 replay attack。因為簽名不 commitment 到具體哪個 UTXO,理論上同一張簽名可以被用來花掉不同的 UTXO——只要滿足剩餘的 commitment 條件。
具體哪些情況需要注意?
- 當你用 APO | SINGLE,而且輸出金額可以被重新排列時
- 當區塊鏈上存在另一個指令碼公鑰和金額都相同的 UTXO(對 APO 而言)
- 當同一個公鑰出現在多個相容指令碼中(對 ANYPREVOUTANYSCRIPT 而言)
- 當礦工能夠影響交易排序和包含順序來利用這些條件時
不過說實話,這些攻擊場景都需要「刻意為之」或「開發者沒做好功課」才會發生。正常使用的協議設計會把這些 replay 風險考量進去。
有趣的安全應用:Recovered-Key 構造
研究人員還發現一個酷東西:移除 outpoint commitment 之後,可以做到「從固定簽名推匯出公鑰,但對應的私鑰誰都不知道」。這讓 UTXO 的 key path 變成「證明無法花費」,強制所有花費都必須走 script path。
這意味著什麼?你不需要再用臨時鑰匙來讓 key path 失效了。這是 Jacob Swambo 等人在 2020 年論文裡提出的理論構造,雖然還沒被寫進 BIP-118,但值得關注。
APO 能做到遞迴合約嗎?不行
最後澄清一下:APO 雖然厲害,但它不是萬能的。它放寬了簽名與 UTXO 的繫結,讓預簽名交易更容易重用,但並不支援遞迴合約或交易內省(introspection)。要實現那些功能,需要搭配其他工具——比如 OP_CTV 或者其他 Opcode。
下一篇文章,我們會開始聊「輔助工具 Opcode」:OP_CHECKSIGFROMSTACK、OP_CAT 這些。它們本身不是合約功能,但可以擴充套件比特幣指令碼的表現力,為未來的設計開啟大門。
FAQ 常見問題
SIGHASH_ANYPREVOUT 和 SIGHASH_NOINPUT 有什麼差別?
SIGHASH_NOINPUT 是早期的概念名稱,後來正式發展成 BIP-118 的 SIGHASH_ANYPREVOUT。APO 在此基礎上增加了更多安全限制,比如只支援 Taproot 地址。
APO 對普通比特幣使用者有什麼影響?
直接影響比較少,因為 APO 主要被應用在閃電網路、Vault 這些二層協議上。但如果你使用這些二層產品,可能會發現頻道重建更快、費用更低。
為什麼 BIP-118 只支援 Taproot?
因為軟分叉的升級性考量。Taproot 提供了更靈活的指令碼結構,讓 APO 的部署更安全、更容易向後相容。
如果你對比特幣指令碼的進化有興趣,或者想了解這些技術如何實際落地成產品,歡迎持續追蹤我們的系列報導。
🔍 相關標籤
#比特幣 #SIGHASH_ANYPREVOUT #BIP-118 #閃電網路 #比特幣指令碼 #比特幣擴容 #區塊鏈技術 #Taproot

