默克尔化抽象语法树(MerklizedAbstractSyntaxTrees,MAST)是一项为比特币提议的升级,可以实现更小的交易体积、更好的隐私性,以及更大的智能合约。在本文中,我们会解释MAST的基本原理,讲解其潜在好处,并总结目前一些包含这项技术的提案。
中本聪给了比特币一个有趣的特性,是他没有写在比特币白皮书里的。除了可以通过公钥来接收比特币、用私钥数字签名来花费比特币,用户还可以编写程序(叫做script,脚本),当成动态的公钥和签名来用。
当你指定一个脚本后这在每一种比特币钱包里都是基本操作由比特币网络强制执行的比特币协议就不会让任何人花费这个脚本所控制的比特币,除非脚本返回True。这让你可以指定资金的花费条件,称为encumbrances(财产条件),比如要求花费的交易一定要得到你的私钥签名。
更加复杂的财产条件也是有可能实现的,比如下面这个例子,我们会用它贯穿整篇文章:Alice希望能够随时花费她的比特币,但如果她连续三个月没有花费自己的比特币(可能因为身故或者丧失行为能力),她希望自己的兄弟姐妹Bob和Charlie拥有自己的比特币,在任何两人能达成一致的地方使用这些财产。
下面这个条件脚本就实现了上文所说的目标,它不仅纳入了Alice的公钥(需要验证一个来自她私钥的签名),但也加入了以下条件性逻辑:一个超时条件,以及Bob和Charlie的公钥。
在当前的比特币协议中,上述所有的数据都必须添加到区块链中,在Alice的比特币花费的时候,也包括在特定的花费行为中完全无关的脚本部分,也要曝光。就比如在Alice花费自己的比特币时Bob和Charlie的公钥也要曝光。
未使用的条件数据增大了交易的体积,也使用户在必要之外曝光了更多的隐私,同时,也使体积而非验证代价成为智能合约大小的主要限制因素。MAST旨在改善这些情况,办法就是移除在区块链上直接包含未使用的脚本部分的需要。
MAST1背后的观念来自于两种久已存在的概念,抽象语义树和默克尔树。抽象语义树(AST)是一种通过将一个程序分割成独立的小块来描述程序的方法,这样会让程序变得更容易分析和优化。为了生成一个AST,你需要把所有的方程与其前提用箭头连接起来,直至所有的前提都被找出。下图即是上文示例脚本的AST。
另一方面,默克尔树则可用来验证某个元素是否是属于某个集合,且无需知晓整个集合的全貌。举个例子,比特币的简易支付验证钱包(SPVwallet)就使用默克尔树来验证某笔交易是否存在于某个区块中,这样无需下载完整的区块,可以节省带宽。
要生成一棵默克尔树,先要把每个元素都各自哈希一次,生成各自唯一的标识符;然后这些标识符配对之后再次哈希,生成这一对标识符的标识符;如此不断重复,直至只剩下一个标识符,称为默克尔根,它就是一个短小精悍、但是标记了整个集合的标识符了。
在验证某个元素属不属于某个集合时,拥有整个集合的人可以向你提供从那个元素到默克尔根路径上的所有标识符。这样就能证明,这个元素确实在这个集合内。
简而言之,AST背后的技术让你可以把一个程序分成多个小块,而默克尔树让我们可以验证这些小块确实是一个完整程序的一部分,且不必暴露整个程序。这就是MAST的基本原理,可以让花费者用一个默克尔证明来替换在单次交易中没有用到的条件减少交易体积、提高隐私性,并支持更大的合约。
我们以上文的财产条件为例,为我们希望的两种可能场景分割为两个子脚本:
基于这两个独立的子脚本,创建一棵默克尔树:
这棵默克尔树的树根最终标识了Alice的完整财产条件,而且只有32字节的体积。此后,Alice可以使用一个替代性的条件脚本,声明:一笔花费交易,只有提供其中一个子脚本连接到默克尔根的证据、并且子程序返回True的时候,才是有效的。
子脚本的默克尔证据,形象地画出来会像下图这样,就看用的是哪个子脚本了:
我们先来看看MAST如何能让复杂财产条件的用户创建更小的交易。这是MAST给我们带来的第一个好处。
在上文的例子中,我们使用了一个具备两个子脚本的财产条:要么Alice自己花自己的钱,要么Bob和Charlie在等待三个月之后一起花她的钱。我们来设想一个无限延伸的版本:其第三个子脚本指明,三个月零一天后,Dan和Edith可以花费此中的资金;第四个子脚本指明,三个月零二天后,Fred和George可以使用这笔资金;等等等等。
这个思维实验可以使我们得到下面的这张图,它显示了,子脚本的数量与需要加入区块的条件数据量,在有和没有MAST时候的关系。
下面是一个对数图,意思是一样的:
以上就是什么是比特币默克尔化抽象语法树?的全部内容,望能这篇什么是比特币默克尔化抽象语法树?可以帮助您解决问题,能够解决大家的实际问题是非常好学习网一直努力的方向和目标。