CSFS 的有趣用法(其一)

作者:Jeremy Rubin

來源:https://rubin.io/bitcoin/2025/03/05/csfs-fun/

在這個系列博客中,我會記錄一些我注意到的 CSFS 的有趣用法。

目標是記錄一些其他人可能還不知道的東西。

它們是我發明的嗎?可能是,也可能不是。歡迎指出前人已經作出的成果!

不可替換且不可複用的地址

創建一個 Taproot 輸出並使用 “NUMS 點” 作為內部公鑰(使用 NUMS 密鑰路徑以及只設一個腳本樹葉子(tapleaf),意味著你總是知道所有的花費選擇),並使用這樣一個腳本樹葉子(tapleaf):要麼滿足 <PK> CHECKSIG(檢查簽名)腳本,要麼提供一個證據,證明有這個公鑰對任何兩個不同的數據生成了超過 1 個簽名;然後,在兩者中選其一:

  • 使用 CTV ,它可以發送到 OP_RETUREN;
  • 不使用 CTV,它變成任何人都可以花費的。

這意味著,只要你觀察到了從這個地址發出的一筆交易的簽名,你就知道,發送者不會發送另一筆簽名,除非願意上自己的資金被燒掉。

更多樂趣:

這種 “模稜兩可保險” 也可以用在不同輸出、不同地址中,以保護帶有新的擔保品的地址,甚至可以是 回溯性的

函數查找表預編譯

假設我們希望給比特幣添加一種操作碼,它可以求值 f(x)

設 x = musig(巨大的聯盟,帶有一次性的啟動儀式)設 CSFS(key, sig, data) = ...

請回憶密鑰串聯技巧中文譯本)……通過密鑰串聯來創建一個帶有下列邏輯的腳本:

CSFS(X, sig_x, sig_arg)CSFS(Tweaked(X, arg), sig_arg, arg)CSFS(Tweaked(X, arg), sig_f, f(arg)))sig_f != sig_arg

現在,(在簽名人委員會內)對 arg 的所有值運行 f(arg)

這樣一來,你就得到了一張查找表(lookup table),可以用在任何腳本的任意體積的樹結構中,開銷是常量:3 個簽名和 2 個公鑰,也就是 256 字節,比使用 taproot 預先生成的樹結構在許多情況下都便宜。

這種技術還可以修改成與多個參數一起工作,只要結果是可以預先計算出來的。這就排除了比如 OP_CAT 這樣的 “大輸出空間” 函數,但查找表中可以有規則,比如默克爾樹。

至於其用途,在(比如說)一棵默克爾樹無論如何都要用一個密鑰來簽名的時候,使用上述技巧在信任上是等價的。例如,可以這樣構造出一棵存儲了用戶餘額的樹,任何用戶都能從簽名集合中 “查找” 自己的餘額。

對於 “標準庫” 的典型用法,大的聯盟可以用於一次性的受信任啟動儀式(one-time-trusted-setup)。

SIGHASH 標籤檢測

當前,比特幣的腳本無法約束一個公鑰使用哪個 sighash 標籤。CSFS 則可以在 Taproot 輸出中帶來一個有侷限的版本。以下是實現方法:

使用 CSFS,你可以從一個簽名中獲得交易的摘要並將它存入堆棧。

沒有 OP_CAT,其用法是有限的 ……

但是,我們有以下公式:

^ SigMsg() 的輸出長度是多少?SigMsg() 的總長度可以使用這個公式計算出來: 174 - is_anyonecanpay * 49 - is_none * 32 + has_annex * 32

(譯者注:這裡的 is_anyonecanpayis_nonehas_annex 都是布爾值,表示簽名是否使用了這些 sighash 標籤。)

也就是,最多隻有 206 字節(就是在設置了 has_annex 的時候)。

注意:這個數字最終還要加上 1 字節的 sighash epoch ,以及 64 字節的 taggedhash 的值。

這意味著,使用 CSFS,你可以通過使用 OP_SIZE 來約束一個簽名使用特定的 sighash 標籤。

  • is_anyonecanpay=0, is_none=0, has_annex=0,大小是 174+65
  • is_anyonecanpay=0, is_none=0, has_annex=1,大小是 206+65
  • is_anyonecanpay=0, is_none=1, has_annex=0,大小是 142+65
  • is_anyonecanpay=0, is_none=1, has_annex=1,大小是 174+65
  • is_anyonecanpay=1, is_none=0, has_annex=0,大小是 125+65
  • is_anyonecanpay=1, is_none=0, has_annex=1,大小是 157+65
  • is_anyonecanpay=1, is_none=1, has_annex=0,大小是 93+65
  • is_anyonecanpay=1, is_none=1, has_annex=1,大小是 125+65

也就是說,你可以用 CSFS 來區分使用 anyonecanpaynoneannex 的標籤組合,除了 is_nonehas_annex 都設置或者都沒設置的情形(因為體積相同,所以無法區分)。

唉,再換句話說,你可能只能對以下組合動腦筋了:

  • is_anyonecanpay=0, is_none=1, has_annex=0,大小是 142+65
  • is_anyonecanpay=1, is_none=1, has_annex=0,大小是 93+65

至於以下組合,則只能沒那麼感興趣,但依然可以感興趣,因為 annex 還不是標準交易:

  • is_anyonecanpay=0, is_none=0, has_annex=1,大小是 206+65
  • is_anyonecanpay=1, is_none=0, has_annex=1,大小是 157+65

注:給定這些組合,依然可以設置其它標籤!

來源
免責聲明:以上內容僅為作者觀點,不代表Followin的任何立場,不構成與Followin相關的任何投資建議。
喜歡
收藏
評論