Simplicity

修剪 Simplicity 案例表達式

  • March 15, 2020

我試圖從一個分支的 Simplicity 程序中花費,但我不想在未使用的分支中提供簽名,所以我試圖手動修剪程序。我已經驗證我可以將commitmentRoot簽名設置為undefined.

為了進行有效的支出,我認為我需要建構一個CommitmentRoot與完整程序具有相同的修剪程序。所以我把程序歸結為一個 case 表達式:

u :: CommitmentRoot () ()
u = unit

full :: CommitmentRoot (Bit, ()) ()
full = cond u unit

pruned :: CommitmentRoot (Bit, ()) ()
pruned = assertr (commitmentRoot u) unit

但是CommitmentRoots 沒有相同的雜湊值:

*Main> (encode.fromShort.hash256.commitmentRoot) pruned
"7b4082aaae5e289f29855ede047b2b6598805b153324aa3a5fd4fec5b1a86053"
*Main> (encode.fromShort.hash256.commitmentRoot) full
"dded2b0938bb9f58f20324ab1f699e7006ffd8e9251b3ddd0f551de1d66fe119"

是什麼賦予了?我對我需要匹配的理解是否CommitmentRoot不正確?如果不正確,如何正確修剪 case 表達式?

此外,Simplicity 技術報告的“4.3.2.1 修剪未使用的案例分支”部分聲稱“我們可以有效地將案例表達式中的任何未使用分支替換為其承諾 Merkle 根。” 但如果我這樣做,我將無法使用runKleisli. 那麼這應該如何工作呢?

的定義cond

cond thn els = match (drop els) (drop thn)

full在你對收益率的定義中擴展它

full = match (drop unit) (drop u)

正確的修剪版本應該是

pruned = assertl (drop unit) (commitmentRoot (drop u))

具有匹配的承諾根:

let full = cond unit unit in (flip Numeric.showHex "".integerHash256.commitmentRoot) (full :: CommitmentRoot (Bit, ()) ())
"dded2b0938bb9f58f20324ab1f699e7006ffd8e9251b3ddd0f551de1d66fe119"

let pruned = assertl (Simplicity.Term.Core.drop unit) (commitmentRoot (Simplicity.Term.Core.drop unit :: CommitmentRoot ((),()) ())) in (flip Numeric.showHex "".integerHash256.commitmentRoot) (pruned :: CommitmentRoot (Bit, ()) ())
"dded2b0938bb9f58f20324ab1f699e7006ffd8e9251b3ddd0f551de1d66fe119"

將開發更好的庫對修剪表達式的支持。

引用自:https://bitcoin.stackexchange.com/questions/93751