最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何使用?Merklized?抽象語法樹壓縮智能合約

 更新時間:2023年12月04日 16:30:06   作者:sCrypt?Web3應用開發(fā)  
Merklized?抽象語法樹?MAST(又名?Merklized?替代腳本樹)是一種使用?Merkle?樹壓縮比特幣智能合約的技術,這篇文章主要介紹了使用?Merklized?抽象語法樹壓縮智能合約,需要的朋友可以參考下

Merklized 抽象語法樹 MAST(又名 Merklized 替代腳本樹)是一種使用 Merkle 樹壓縮比特幣智能合約的技術。我們在比特幣 SV 上實施了 MAST。與所有其他實現(xiàn)不同,我們利用原始比特幣協(xié)議,沒有任何共識更改。

問題

通常有不止一種方法可以解鎖鎖定在比特幣智能合約中的硬幣。在 sCrypt 中,每種方式都被建模為一個公有函數(shù),代表一種條件的解鎖分支。例如,在 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));
  }
}

隨著合約變得越來越復雜,一個合約中可能有數(shù)十個甚至數(shù)百個公有函數(shù)/分支。最終只調用其中一個,但所有這些都必須包含在區(qū)塊鏈中,即使他們根本沒有被執(zhí)行。這會增加鏈上的足跡并增加交易費用。

contract ContractOfManyBranches {
    public function branchA() { }
    public function branchB() { }
    public function branchC() { }
    public function branchC() { }
    // ... more branches
}

MAST

抽象語法樹 MAST 可以從區(qū)塊鏈中刪除未執(zhí)行的分支。未壓縮的合約(原始合約)被拆分為單獨的分支并組織成 Merkle 樹,其中每個分支的腳本都是一片葉子。壓縮后的合約并不存儲所有分支,只存儲了所有分支的 merkle root,用于驗證某個特定分支是否屬于原始合約。

以下是 MAST 帶來了巨大的好處,尤其是當分支數(shù) n 很大時:

可擴展性: 部署的合約大小按 log(n)¹ 縮小,因為只需要選定的分支及其默克爾路徑,而不是所有分支。在下面的例子中,當分支 Tc 被調用時,只需要黃色的默克爾路徑。

隱私性: 未使用的分支不會在鏈上發(fā)布。在下面的示例中,僅顯示 Tc,隱藏所有其他分支。

在這里插入圖片描述

默克爾樹和默克爾路徑

實現(xiàn)

我們已經(jīng)在比特幣中實現(xiàn)了 MAST。當一個分支被執(zhí)行時,它本身和它的默克爾路徑被用來解鎖。在壓縮合約中,我們首先使用其默克爾根驗證分支是否來自原始合約。接下來,使用 P2SH 技術,將當前支出交易中的新鎖定腳本設置為該分支的腳本,該腳本將在后續(xù)交易中被解鎖。合約代碼如下:

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] 假設所有分支的大小相似。

到此這篇關于如何使用 Merklized 抽象語法樹壓縮智能合約的文章就介紹到這了,更多相關Merklized 抽象語法樹內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

竹山县| 马鞍山市| 永定县| 邯郸市| 金平| 江达县| 日喀则市| 涞源县| 惠安县| 塔河县| 松阳县| 乌恰县| 会东县| 达尔| 连州市| 登封市| 本溪市| 安图县| 娄底市| 油尖旺区| 阿勒泰市| 肇州县| 合山市| 贵德县| 大港区| 宁安市| 元江| 柯坪县| 阿瓦提县| 永靖县| 寿光市| 阳西县| 临沭县| 南康市| 饶河县| 保定市| 四会市| 临沧市| 新泰市| 锡林浩特市| 曲水县|