對 Simplicity 的 CheckSigHashAll 的直覺
所以,我下載了 Simplicity 並使用
cabal new-repl Simplicity
. 然後我使用:set -XTypeApplications
.考慮這些呼叫:
> (pkwCheckSigHashAll @CommitmentRoot @() lib (Schnorr.PubKey True (read "0")) (Schnorr.Sig (read "0") (read "1"))) CommitmentRoot {commitmentRoot = Hash256 {hash256 = "\CAN\r\201\231\SO0:1\183\130a\DC3m4u!\193\247e\EOT\194nO\US\208\150\&2\182\ACK\203\151>"}} > (pkwCheckSigHashAll @CommitmentRoot @() lib (Schnorr.PubKey True (read "1")) (Schnorr.Sig (read "0") (read "1"))) CommitmentRoot {commitmentRoot = Hash256 {hash256 = "\215\222oj\251&\134\SOZ\202@N\161(\185j2\DELt\156\147\136Nz\183\179\EOTH\166\FS\141F"}} > (pkwCheckSigHashAll @CommitmentRoot @() lib (Schnorr.PubKey True (read "1")) (Schnorr.Sig (read "0") (read "0"))) CommitmentRoot {commitmentRoot = Hash256 {hash256 = "\215\222oj\251&\134\SOZ\202@N\161(\185j2\DELt\156\147\136Nz\183\179\EOTH\166\FS\141F"}}
如果我理解正確,承諾根會進入交易輸出。由於簽名不應該發揮作用,因此 Haskell 的輸出是有意義的,因為我更改了 sig 並且它不會影響承諾根。上面的例子似乎與這種直覺一致。我的直覺和範常式式碼都正確嗎?
現在,我可以呼叫相同的方法
WitnessRoot
:> (pkwCheckSigHashAll @WitnessRoot @() lib (Schnorr.PubKey True (read "0")) (Schnorr.Sig (read "0") (read "0"))) WitnessRoot {witnessRoot = Hash256 {hash256 = "\185\FS\176\179\b{Xc2\216\n\240\186\205v\208\164NW\\\DLE\193:\ETB\bMO\211\152*I%"}} > (pkwCheckSigHashAll @WitnessRoot @() lib (Schnorr.PubKey True (read "1")) (Schnorr.Sig (read "0") (read "0"))) WitnessRoot {witnessRoot = Hash256 {hash256 = "\240h\NUL\188z4\ACK\200\ETX\151\DC1&Y\253\t\152\176P\146\186\137\NAKm!\STX\DC3\182\148\193\246\172O"}} > (pkwCheckSigHashAll @WitnessRoot @() lib (Schnorr.PubKey True (read "0")) (Schnorr.Sig (read "0") (read "1"))) WitnessRoot {witnessRoot = Hash256 {hash256 = "\205\DEL\132Q\245\166!\196\178\248\136\194aO\243+\145T\200E\129I#\253F\134\173i\243K\154J"}}
同樣,如果我理解正確,見證根會進入支出交易輸入。如果我更改簽名或公鑰,這似乎會影響見證根,這與我的直覺相符。Simplicity 使用不允許公鑰恢復的 BIP-Schnorr。再說一遍,我的直覺和上面的程式碼一致嗎?
我假設這些雜湊值包含模擬事務元數據,如 nLocktime,嵌入在 中
lib
,對嗎?現在,假設我想用 Simplicity 做一個 2-of-2 MAST-based multisig,那會是什麼樣子?必須有一種方法來組合對 CheckSigHashAll 的兩個不同呼叫。支出交易肯定需要通過腳本提供 MAST 路徑,我如何將其傳遞給 Simplicity?與
oooh
?
您對承諾根的理解是正確的。利用 Haskell 的惰性,
undefined
在計算承諾根時可以隨意放入簽名中。目前,協議中沒有使用見證根。關於如何在更複雜的協議中使用它有一些想法,但這些想法尚未實現。但是,無論如何,見證根在測試和開發中都有一些用途。
Simplicity 本身並不使用 BIP-Schnorr。相反
checkSigHashAll
,它是實現 BIP-Schnorr 舊草案的 Simplicity 表達式。如果你想要一個支持密鑰恢復的簽名方案,你可以在 Simplicity 中實現這樣的方案。承諾和見證根都不包含任何交易數據,模擬或其他。相反,
checkSigHashAll
Simplicity 表達式包含在 Simplicity 執行期間返回事務的鎖定時間和版本的原語要製作一個簡單的 2-of-2 多重簽名,您可以按照以下方式編寫一些內容
pkwCheckSigHashAll <pubkeyA> <sigA> &&& pkwCheckSigHashAll <pubkeyB> <sigB> >>> unit
由於兩個分支都在 2-of-2 多重簽名中使用,因此沒有 MAST 分支。
要製作 1-of-2 多重簽名,您有一些選擇。一種方法是
witness <value of type (Bit, Sig)> >>> cond (scribe <pubkeyA> &&& iden) (scribe <pubkeyB> &&& iden) >>> checkSigHashAll
然而,即使在修剪之後(將
case
insidecond
變成assert
),該程序看起來很像 1-of-2 多重簽名。另一種實現可能是
witness <value of type Bit> &&& unit >>> cond (pkwCheckSigHashAll <pubkeyA> <sigA>) (pkwCheckSigHashAll <pubkeyB> <sigB>)
在這種情況下,修剪後它看起來像一個 1-sig 或其他東西。修剪將上述表達式轉換為類似
witness <0> &&& unit >>> assertl (drop (pkwCheckSigHashAll <pubkeyB> <sigB>)) (commitmentRoot (drop (pkwCheckSigHashAll <pubkeyA> <sigA>)))
其中僅顯示未採用分支的承諾根。
請注意,截至撰寫本文時,修剪尚未實施,修剪後的表達式也未由實施強制執行。不過,您仍然可以手動修剪表達式。