
这篇文章重点介绍了Algorand智能合约架构的链下组件,由Jing Chen, Maurice Herlihy, Victor Luchangco, Silvio Micali, and Liuba Shrira开发。
智能合约使区块链可编程。像自动售货机一样,智能合约建立了明确定义的资产转移程序。例如,Alice想购买Bob发行的代币,所以她将硬币发送到Bob的智能合约。合约的代码计算硬币,检查Alice是否在合同的合格投资者数据库中,然后将正确数量的代币转移到Alice的账户。交换是透明的:Alice可以检查合约的代码,代码在没有Bob参与的情况下运行。
这篇文章描述了Algorand的智能合约架构,以及为什么它在很大程度上偏离了以前的方法。特别是,Algorand的智能合约架构包括几种工具,Algorand的用户需要解决几种问题。
我们的双层架构
首先,对于日常需求,Algorand提供了L1智能合约,这是一条用于常见日常交易的安全快速路径。(我们稍后会回顾一下这样的智能合约。其次,Algorand为需要更多定制的智能合约的“长尾理论”提供(L2)链下合约。这些是我们在本博客中介绍的智能合约。
与以太坊智能合约的比较
以太坊区块链是第一个展示智能合约力量的区块链,因此以太坊智能合约是分析后继技术的自然起点。它们的利弊在区块链社区中得到了广泛的讨论,这些讨论引发了智能合约语言的各种新设计。在这里,我们重点讨论对算法区块链特别重要的两个问题。
1. 简单的问题往往需要复杂而脆弱的解决方案。
假设Alice和Bob同意,如果Alice向Bob发送100个“美元币”,那么Bob将把100个“Bob硬币”转移给Alice。Alice想确保,如果她转移硬币,她会得到代币,Bob想要类似的保证。这种交易,其中由相互怀疑的各方控制的转移要么两者都发生,要么两者都不会发生,称为原子交换。使用以太坊的智能合约对原子交换进行编程需要一个散列的时间锁合约(或类似的东西) - 一个微妙的,定时的,多阶段的协议,任何编程错误都可能是灾难性的。相比之下,正如在之前的一篇文章中所讨论的,Algorand L1智能合约为原子交换和相关问题提供了一种简单而安全的解决方案。
2.每个人都必须等待其他人
在法国奶酪店,客户不允许自己进行选择。相反,所有的奶酪都放在柜台后面,由店主售卖给客户。客户在柜台前排队。排在生产线顶端的客户正在寻找来自特定地区的山羊奶酪。店主解释说,他有三种这样的奶酪,一种是温和的,一种是适中的,一种是辛辣的,但适中的奶酪有点咸。在明智地讨论了这些奶酪的相对优点之后,客户做出了选择。店主将奶酪切片并称重,用纸和线包裹,然后计算价格。顾客付钱,拿走她的包裹,然后离开,对她的购买感到满意。
与传统的法国奶酪店一样,每个智能以太坊智能合约的执行都阻碍了整个区块链的进展。更糟糕的是,每个矿工都必须重新执行每个合约调用,每个新矿工都必须重新执行曾经发生的每个合约调用。以太坊传统的“奶酪店”架构存在可扩展性风险,严重限制了新区块的生产速度。
我们将看到,Algorand的链下合同结构更像是一个现代超市。在这里,顾客可以自己选择,而无需询问店主。一旦客户决定了要买什么,她就会在收银台上排队付款。一个优柔寡断的购物者在不同种类的山羊奶酪之间犹豫不决时,不会耽误其他购物者,也不会自己限制顾客的服务速度。
注意:算法链下合约不应与闪电网络等L2支付网络混淆。支付网络是专业化的:它们的存在只是为了将付款从一方发送到另一方。相比之下,阿尔戈兰德链下合同是灵活的通用计划。
Algorand的Layer-1 (链上)智能合约
算法L1智能合约直接在区块链本身执行许多常见,简单的交易。例如,算法L1智能合约使前面提到的原子交换交易变得微不足道。L1合约提供原子传输,这是一种内置机制,可确保相互可疑方授权的多个交易作为单个原子单元执行:要么全部成功,要么不成功。在我们的示例中,Alice创建了一个原子传输,其中包含她对Bob的付款和Bob对她的付款。她签署她的付款,Bob签署他的,然后包含两笔付款的双重签名原子转账被发送到区块链。
再举一个例子,假设Alice想发行自己的代币,每个代币代表她餐厅未来利润的一部分。以太坊的智能合约为其自己的以太币提供了内置支持,但希望创建自己的类似货币的代币的客户只能使用自己的设备。尽管以太坊中用户定义令牌的标准和约定已经发展很好了,但编写此类代码仍然存在风险,并且可能会对以太坊中用户定义的令牌进行攻击。
相比之下,Algorand智能合约架构为用户定义的算法标准资产提供了内置支持,与Algorand的原生算法货币处于同一水平。Algorand区块链提供内置保护,防止无意中创建或丢弃令牌,并直接支持选择性冻结,抓取,铸造和刻录令牌。
如之前的一篇文章所述,Algorand L1合同还为常见类型的“售后”交易、证券化贷款、众筹、认可交易、多重签名钱包和其他简单的重复易类型提供了直接支持。
L1智能合约是用TEAL编写的,TEAL是一种类似组件的堆栈机器语言。TEAL为程序员提供了实现前面提到的各种常见交易的表达能力。即将于2020年夏季准备的TEAL扩展将允许程序将状态存储在L1中,并检查帐户余额和其他区块链状态以获得更具表现力的功能。TEAL还将为链下合同提供增强的安全保障。事实上,它为下面描述的链下合约提供了一个强大的基础。
Algorand的 (Layer-2)链下合约
虽然许多简单的区块链交易适用于L1快速路径,但也有一个需要更专业工具的应用程序的“长尾理论”。例如:
- 合同可能太大。例如,管理私人股票配售的合同可能需要查阅允许参与的认证投资者数据库,以及不允许参与的黑名单投资者数据库。这些数据库可能太大而无法保留在链上,或者太敏感而无法公开。
- 合同的计算要求可能太高。例如,管理提供高度隐私的令牌的合同可能需要计算密集型库,如 ZK-STARK、ZK-SNARK 等。同样,处理有价值资产的复杂合约可以自由使用检查其数据结构完整性的断言。如此长的计算可能会阻碍其他客户端的进度,从而减慢每个人的阻止速率。
- 合同可能过于复杂。TEAL是一个功能强大且安全的工具,用于对简单的L1交易进行编程,但更复杂的应用程序需要更高级的语言。良好的软件工程实践通常需要将应用程序拆分为多个合同,有时由不同的方提供。任何复杂到需要模块化结构的应用程序最好由更高级的语言来管理。
链上与链下合约
回想一下,在Algorand区块链中,新区块是由共识委员会根据Algorand的加密自选算法安全随机选择的。当用户调用链下合约时,该调用不会由共识委员会直接执行。相反,调用由一个并行委员会(称为合同执行委员会)执行和验证。该委员会的每个验证者都执行合约调用并生成一系列效果:由合约调用生成的区块链交易序列。然后,合同执行委员会生成一个签名证书,用于认可。然后将简单的效果列表以及签名证书和其他验证条件提交给共识委员会。为了提高效率,可以批量执行多个合约调用,因此它们都可以使用单个证书进行背书。共识委员会验证器从不执行用户定义的合约代码,就像在链上合约架构中一样。相反,共识委员会验证者只需在应用交易效果之前检查证书和验证条件。
需要链上合同的区块链就像银行要求所有金融交易都通过银行本票进行。在花钱之前,客户必须与所有其他客户一起在只有一名出纳员的银行办公室排队等候,以托管支票的金额。相比之下,使用链下合约的区块链就像使用常规支票账户:客户自己写支票而不在银行排队,当支票结算时,资金会稍后转移。

图1:使用L1智能合约的正常算法执行

图2:使用以太坊式链上合约执行

图 3:使用Algorand链下合约执行
执行链下合约
图1显示了正常的 Algorand 执行,其中每5秒选择一个5000个交易块。(一个区块中的5000笔交易可能确实包括Algorand的Layer-1智能合约,而不会减慢区块生产的速度。图2显示了向每个区块添加10秒合约调用的效果:显然,如果每个合约调用需要额外的10秒,则不可能维持5秒的区块时间。图3显示了在链下执行合约调用的好处:合约调用可以与常规交易并行执行,而不会危及区块链的吞吐量。
合同执行委员会由Algorand的安全,随机,自我选择算法选择,就像主要的共识委员会一样。由于合同执行与区块共识不同,是确定性的,因此合同执行委员会可以用更少的验证者(大约150个验证者而不是数千个)实现相同的安全级别。
链下合约代码以高级语言编写,并由虚拟机 (VM) 执行。链下合约有自己的长期状态,称为合约存储。为了保护隐私,合约存储本身不会出现在区块链上。但是,为了安全起见,每个合约调用都会发布对最新合约存储的承诺。链下合约可以读取账户余额和其他链上信息,并且可以发布修改区块链状态的交易,例如付款。与传统的以太坊式合约不同,这些“效应交易”不是直接执行的。相反,调用的效果由合同执行委员会验证者的法定人数进行验证。调用的效果交易被打包到L1 “全有或全无”的交易批处理中,保证一起成功或失败。合约执行委员会还跟踪每个调用的依赖关系。例如,将100个代币从Alice转移到Bob的合约调用依赖于Alice的代币余额至少为100。委员会生成一个依赖关系列表,供共识委员会在执行效果之前进行检查。(这些检查是快速、简单的标量比较。每个原子交易及其证书和依赖项都像任何其他交易序列一样提交给共识委员会,该委员会检查原子交易的证书和依赖项,并将该原子交易包含在未来的块中。
什么可能出错?好吧,链下合约调用是“投机性的”,因为链上状态(例如账户余额)可能会在合约调用被验证与该调用的效果到达区块链之间的间隔内发生变化。即便如此,正确性也是有保证的。链下合约实现跟踪合约调用依赖关系,确保依赖关系被违反的调用的效果永远不会包含在区块链上。
进展如何?如果合约调用反复通过合约执行委员会验证,但由于反复违反链上的依赖关系而从未进入链上,该怎么办?回到支票类比,定期支票比银行本票更快,更方便,但即使签署时帐户中有足够的钱,支票仍然可能反弹。然而,尽管支票有时会反弹,但它们比银行本票更广泛地使用,因为大多数支票写员不会透支他们的账户。同样,链下合约有时可能会失败,但我们希望它们在大多数情况下都能成功,因为它们的依赖关系大多在用户的控制之下,用户不会违反自己的依赖关系。
我们对Algorand链下合同感到兴奋,因为用户可以编写可能很大,计算要求高以及特殊和/或复杂的合同,而不会堵塞其他人的区块链。与大多数智能合约架构与区块链架构紧密交织的区块链不同,Algorand的智能合约架构将链下合约执行与区块链共识委员会隔离开来。Algorand的智能合约架构是灵活的,将来可能会启用多个合同执行委员会,每个委员会都有不同的服务水平保证,每个委员会都有自己的合同语言和虚拟机。验证计算要求高隐私令牌的合同执行委员会,可能与验证高度监管的数据密集型金融应用程序的合同执行委员会不同。无论专业智能合约需要什么,Algorand智能合约架构都可以支持匹配的语言和VM。
原文链接:https://www.algorand.com/resources/blog/algorand-smart-contract-architecture
---煤油灯科技victorlamp.com翻译整理---