Simplicity
修剪 Simplicity 案例表達式
我試圖從一個分支的 Simplicity 程序中花費,但我不想在未使用的分支中提供簽名,所以我試圖手動修剪程序。我已經驗證我可以將
commitmentRoot
簽名設置為undefined
.為了進行有效的支出,我認為我需要建構一個
CommitmentRoot
與完整程序具有相同的修剪程序。所以我把程序歸結為一個 case 表達式:u :: CommitmentRoot () () u = unit full :: CommitmentRoot (Bit, ()) () full = cond u unit pruned :: CommitmentRoot (Bit, ()) () pruned = assertr (commitmentRoot u) unit
但是
CommitmentRoot
s 沒有相同的雜湊值:*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"
將開發更好的庫對修剪表達式的支持。