Merklized 抽象語法樹 MAST(又名 Merklized 替代腳本樹)是一種使用 Merkle 樹壓縮位元幣智能合約的技術,我們在位元幣 SV 上實施了 MAST,與所有其他實作不同,我們利用原始位元幣協議,沒有任何共識更改,
問題
通常有不止一種方法可以解鎖鎖定在位元幣智能合約中的硬幣,在 sCrypt 中,每種方式都被建模為一個公有函式,代表一種條件的解鎖分支,例如,在 TimedCommit 合約中,可以通過 Alice 的原像和她的簽名,或者通過 Alice 和 Bob 的簽名來解鎖合約,
contract TimedCommit {
bytes aliceHash;
PubKey alice;
PubKey bob;
public function open(bytes aliceNonce, Sig aliceSig) {
require(sha256(aliceNonce) == this.aliceHash);
require(checkSig(aliceSig, this.alice));
}
public function forfeit(Sig aliceSig, Sig bobSig) {
require(checkSig(aliceSig, this.alice));
require(checkSig(bobSig, this.bob));
}
}
隨著合約變得越來越復雜,一個合約中可能有數十個甚至數百個公有函式/分支,最終只呼叫其中一個,但所有這些都必須包含在區塊鏈中,即使他們根本沒有被執行,這會增加鏈上的足跡并增加交易費用,
contract ContractOfManyBranches {
public function branchA() { }
public function branchB() { }
public function branchC() { }
public function branchC() { }
// ... more branches
}
MAST
抽象語法樹 MAST 可以從區塊鏈中洗掉未執行的分支,未壓縮的合約(原始合約)被拆分為單獨的分支并組織成 Merkle 樹,其中每個分支的腳本都是一片葉子,壓縮后的合約并不存盤所有分支,只存盤了所有分支的 merkle root,用于驗證某個特定分支是否屬于原始合約,
以下是 MAST 帶來了巨大的好處,尤其是當分支數 n 很大時:
可擴展性: 部署的合約大小按 log(n)1 縮小,因為只需要選定的分支及其默克爾路徑,而不是所有分支,在下面的例子中,當分支 Tc 被呼叫時,只需要黃色的默克爾路徑,
隱私性: 未使用的分支不會在鏈上發布,在下面的示例中,僅顯示 Tc,隱藏所有其他分支,

實作
我們已經在位元幣中實作了 MAST,當一個分支被執行時,它本身和它的默克爾路徑被用來解鎖,在壓縮合約中,我們首先使用其默克爾根驗證分支是否來自原始合約,接下來,使用 P2SH 技術,將當前支出交易中的新鎖定腳本設定為該分支的腳本,該腳本將在后續交易中被解鎖,合約代碼如下:
contract MAST {
static const int DEPTH = 4;
Sha256 merkleRoot;
public function main(bytes branchScript, MerklePath merklePath, SigHashPreimage txPreimage) {
require(Tx.checkPreimage(txPreimage));
// validate branchScript is from the merkle tree
require(calMerkleRoot(branchScript, merklePath) == this.merkleRoot);
// "P2SH": use branch script as the new locking script, while maintaining value
bytes output = Util.buildOutput(branchScript, Util.value(txPreimage));
require(hash256(output) == Util.hashOutputs(txPreimage));
}
static function calMerkleRoot(bytes leaf, MerklePath merklePath) : Sha256 {
Sha256 root = sha256(leaf);
loop (DEPTH) : i {
Sibling s = merklePath[i];
root = s.left ? sha256(s.hash + root) : sha256(root + s.hash);
}
return root;
}
}
腳注
[1] 假設所有分支的大小相似,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/291557.html
標籤:區塊鏈
