Zcash 開發者研議修復方案:每次網路升級都會使已簽名的錢包交易失效
重點速覽
- •Zcash 的 NU7 升級在區塊 3,543,405 啟用,交易格式並未改動,但每個錢包仍須發布新版本或新韌體,使用者才能再次花費。
- •開發者 ValarDragon 提議將移除共識分支 ID 更新列為 NU8 升級的七項目標之一,希望終結每次啟用都弄壞錢包的模式。
- •每個 Zcash 簽名都承諾由 ZIP 200 為分叉重放保護而引入的共識分支 ID,因此一旦升級啟用,以舊 ID 簽名的交易立即失效。
- •Konclave 金庫開發者 Daniel Gorgonha 說明,受限於約 50 分鐘預設到期時限的門檻簽名流程,若升級恰好在收集期間發生即整筆作廢,因此他要求實作所提議的選擇退出機制。
- •Electric Coin Company 工程師指出重放保護是交易所的硬性要求,而 nuttycom 提議的 ZIP 248 選擇退出變體,將以部分重放保護及可能縮小的匿名集,換取能跨越升級存活的交易。

隱私導向加密貨幣 Zcash 的貢獻者之間,目前流傳著一項提案,主張移除在每次網路升級(NU)時使待簽名交易失效的機制。起因是最近一次升級啟用後,各錢包在發布新版軟體或韌體之前無法恢復花費功能。
新的抱怨,伴隨新的實例
在11 月 9 日的一篇論壇貼文中,開發者 ValarDragon 將移除共識分支 ID 更新列為下一次升級 NU8 的七項目標之一,並表明目的是終結「每次 NU 都弄壞錢包」的模式。
這項抱怨背後有一個新近的實例。NU7 上週在區塊 3,543,405 啟用,並未觸及交易格式,但正如論壇成員 strahncryptography 在同一討論串中指出的,每個錢包仍然需要新的發布版本或新韌體,才能再次花費。使用離線隔離手機或不受支援裝置的使用者則無法動彈。
到了隔天早上,討論串已出現三種立場:移除該機制、保留它但允許使用者選擇退出,或承認真正的問題是錢包過時,而非簽名到期。接著一位金庫(vault)開發者說明了為何這個選擇並非纸上談兵。
究竟是什麼失效了
每個 Zcash 簽名都承諾(commit)一個共識分支 ID,亦即當前規則集的標籤。ZIP 200——規範協定規則的 Zcash 改進提案(ZIP)之一——引入了這項機制,確保為某一條鏈簽名的交易無法在共享相同歷史的分叉上被重放。當升級啟用時,ID 隨之改變,任何以舊 ID 簽名的內容立即失效。
NU7 部署 ZIP 就這次剛發生的升級明確說明了這一點:第 5 版與第 6 版交易保留了原有結構,但交易在啟用前後仍然無效,因為其簽名綁定了分支 ID。文件還指出,已儲存與離線簽名的交易同樣需要經過與線上交易相同的啟用檢查。
這就是為何錢包必須為一次絲毫未改變交易建構方式的升級發布更新。不知道新 ID 的錢包,等於是為一條已不存在的鏈簽名。
來不及完成簽名的金庫
在 Deega Labs 建構 Konclave t-of-n 金庫的 Daniel Gorgonha,隨後在討論串中描述了實際的代價。Konclave 先建構交易、之後收集門檻簽名,因此每位必要簽名者都必須在交易的到期時限內行動,約為 50 分鐘。若升級恰好落在這個時限中間,整個流程即告作廢。
這 50 分鐘來自 ZIP 203,在區塊時間歷經三次變更後,預設到期時間一直維持在這個長度上下。自 NU7 起,這意味著以 25 秒的目標出塊間隔計算的 120 個區塊。這是錢包的預設值,可依節點設定調整,而將該欄位設為零即可建構完全沒有到期時間的交易。
因此計時問題其實已有解法,至少在錢包有公開該設定的情況下是如此。但升級分界則不然。金庫可以給成員一週時間簽名,卻仍會在分支 ID 切換的瞬間失去該筆交易。Gorgonha 所要求的,正是 nuttycom 剛剛提出的選擇退出機制,讓群組得以在自擔風險的前提下,花費數小時或數天收集簽名。
三條出路,各有一個代價
**移除分支 ID 承諾。**這是 ValarDragon 的原始提案。Electric Coin Company(ECC)工程師 str4d 回應指出,ZIP 200 撰寫當時,重放保護是交易所及其他生態系參與者的硬性要求,因此任何移除方案都需要替代機制,理想上還應涵蓋純粹為擾亂主鏈而建立的敵意分叉。
**保留為預設,允許使用者退出。**同樣任職於 ECC 的 nuttycom 提議在 ZIP 248 下加入同時省略分支 ID 與到期高度的簽名變體。選擇使用的使用者將放棄部分重放保護,換取能夠跨越升級存活下来的交易。他表示現有演算法對絕大多數交易而言運作良好,將繼續作為安全的預設選項。str4d 也早已指出,一旦 ZIP 248 啟用,定義這類變體並不困難。
**質疑這是否真的解決了錢包的問題。**strahncryptography 認為這些變體解決的是交易壽命,而非過時問題:若分支 ID 未被寫死在程式中,使用者就必須自行提供正確的 ID,這又把同樣的負擔推回錢包軟體。他寫道,針對友善分叉的重放保護有其價值,收益應當審慎衡量。
討論串並未化解分歧。它所做到的,是把問題收斂為:是否值得為有需要的使用者建構一個選擇加入(opt-in)的變體,以及這些使用者將付出什麼代價。
選擇退出的代價
重放風險以這次剛發生的升級來理解最為直觀。僅針對 NU7,ZIP 259 豁免了舊節點軟體在啟用前必須自我棄用的一貫要求,這意味著從未升級的營運者可以繼續留在線上,並持續跟隨 NU7 之前的分支。簽名未綁定特定分支的交易,正是可能被兩條鏈同時接受的那一類。
風險敞口在於授權的範圍,而非其背後的金鑰。被重放的交易是在簽名者從未打算使用的另一條鏈上花費相同的輸入;它並不能讓任何人偽造新的交易。
從簽名中移除到期高度還有第二個效應:一筆已授權的付款,只要其輸入仍未被花費,就可能一直處於未確認狀態。這是金庫所想要的功能,卻也是一般使用者可能未能察覺的風險。
nuttycom 也指出匿名集可能因此縮小。在屏蔽(shielded)系統中,隱私取決於每筆交易看起來都與其他交易相同;以罕見變體簽名的交易,可供藏身的群體就更小。該貼文並未量化這個效應,且目前也尚未有任何變體被具體定義。
更長壽的簽名,並不會更新老舊裝置
這一切所依賴的可擴充交易格式 ZIP 248 仍處於草案階段。str4d 表示其設計已穩定超過半年,而他在過去一週都在根據此後部署的共識變更更新內容。它尚未被指派給任何升級,選擇退出的變體也還不存在其中。
即便變體問世,硬體錢包或離線簽名器仍需要能理解新格式的軟體。ZIP 248 禁止錢包建構或簽署其無法解析的元件。相容性的好處確實存在,但它必須透過錢包版本更新才能落實——而這正是 strahncryptography 所指屢屢出問題的環節。
此外,這一切也無法幫助已淘汰格式的交易。ZIP 259 指出,NU7 對第 4 版交易的禁令同樣涵蓋透明(transparent)與 Sapling 花費,以及 Sprout;重新簽名無法挽救它們,唯一的解法是在受支援的版本中重建該筆付款。Coindoo 上週報導了更棘手的情況——完全沒有替代格式的 Sprout 幣。
Konclave 也有自己尚未完成的部分。其關於非同步簽名的開放議題,試圖將隨時間逐步收集的核准,與金庫現行的互動式門檻儀式分開。能夠跨越升級存活的交易移除了一項障礙;但讓成員在各自上線時參與簽名的工作流程,仍待撰寫與審查。
實務建議
如果你管理一個群組錢包:
- 啟用是區塊高度,不是日期;每次升級的部署 ZIP 都會提前公布。
- 不要開啟可能跨越該高度的簽名輪次。
- 啟用前準備好的任何內容,啟用後都必須重建,即使尚無人簽名也一樣。
如果你在老舊裝置上持有幣:
- 嘗試花費之前,先確認其韌體或應用程式是否已支援 NU7。
- 來自受支援資金池的卡住支出是錢包問題,並非資金遺失。
- 11 月 6 日之前儲存的第 4 版交易無法透過重新簽名恢復有效。
Coindoo 先前對錢包端付款改進的探討涵蓋了交易建構與確認之間的落差。這次討論串則在其間加入了第三個階段:在使用者與裝置趕上進度的同時,讓授權保持有效。
接下來的發展
1 月下旬是 ValarDragon 的目標,而非既定時程。str4d 在同一討論串中質疑,兩個半月的時間對清單上的 Tachyon 資金池而言是否足夠,而分支 ID 這一項是七項目標中受到最強烈反對的。NU8 最終會附帶選擇退出機制、重放保護的替代方案,或兩者皆無,將由 ZIP 程序決定,而非在論壇上定案。