Algorand的第1层(链上)智能合约
Algorand Layer-1智能合约直接在区块链本身中执行许多常见的简单交易。例如,Algorand Layer-1智能合约使前面提到的原子交换交易变得轻而易举。
第1层合约提供了原子转移,这是一种内置机制,可确保由可疑双方授权的多个事务作为单个原子单位执行:要么全部成功,要么全部成功。在我们的示例中,爱丽丝创建了一个原子转移,其中既包含她对鲍勃的付款,也包括鲍勃对她的付款。她签署了付款,Bob签署了付款,然后将包含两次付款的双重签名的原子转移发送到区块链。
再举一个例子,假设爱丽丝想发行她自己的代币,其中每个代币代表她餐厅未来利润中的份额。以太坊的智能合约为其自身的以太币提供内置支持,但希望创建自己的类似币种的代币的客户则留在自己的设备上。尽管以太坊中用户定义代币的标准和约定已经发展,但是编写此类代码仍然存在风险,并且在以太坊中成功攻击用户定义代币的历史悠久而丰富多彩。
相比之下,Algorand智能合约体系结构为用户定义的Algorand标准资产提供了内置支持,与Algorand的本机Algo货币处于同一级别。Algorand区块链提供内置保护,以防止意外创建或丢弃令牌,并直接支持可选地冻结,收回,铸造和记录代币。
如先前文章所述,Algorand Layer-1合约还为常见的“售后”交易,证券化贷款,众筹,仅授权交易,多签名钱包以及其他简单的重复交易提供直接支持类型。
第1层智能合约用TEAL(一种类似于程序集的堆栈机器语言)编写。TEAL为程序员提供了实现前面提到的各种常见事务的表达能力。即将在2020年夏季完成的TEAL的“有状态”扩展,将允许程序将状态存储在第1层中,并检查帐户余额和其他区块链状态是否具有更强大的表达能力。TEAL还将为链下合约提供增强的安全保证。实际上,它为下述链下合约提供了强大的基础。
Algorand(第2层)的链下合约
尽管许多简单的区块链交易都适合第1层快速路径,但应用程序的“长尾巴”也需要更专业的工具。例如:
合约可能太大。例如,管理私人股票配售的合约可能需要咨询被允许参加的经认证投资者的数据库,或者与未经许可的列入黑名单的投资者的数据库进行查询。这些数据库可能太大而无法保存,或者太敏感而无法公开。
合约可能在计算上要求太高。例如,管理提供高度隐私的代币的合约可能需要计算密集型库,例如ZK-STARK,ZK-SNARK等。同样,处理有价值资产的复杂合约可以自由使用断言来检查其数据结构的完整性。如此长的计算可能会阻碍其他客户端的进度,从而降低每个客户端的块生成率。
合约可能太复杂了。TEAL是用于对简单的第1层交易进行编程的功能强大且安全的工具,但更复杂的应用程序需要使用高级语言。良好的软件工程实践通常需要将应用程序分成多个合约,有时由不同的各方提供。任何复杂到足以需要模块化结构的应用程序,最好由高级语言来管理。
链上合约与链外合约
回想一下,在Algorand区块链中,新区块是由共识委员会选择的,该共识委员会由Algorand的密码自选算法安全地随机选择。当用户调用链下合约时,协商会议不会直接由共识委员会执行。而是由一个称为合约执行委员会的并行委员会执行和验证请求。
该委员会的每个验证人都执行合约调用并产生一系列效果:合约调用生成的区块链交易序列。然后,合约执行委员会出示已签署的证书认可通话的效果。简单的效果清单,连同签名的证书和其他验证条件,然后提交给共识委员会。为了提高效率,可以批量执行多个合约调用,因此都可以使用单个证书进行批注。共识委员会验证者从不执行用户定义的合约代码,就像在链上合约体系结构中那样。取而代之的是,共识委员会验证者仅需在应用交易的影响之前检查证书和验证条件即可。
需要链上合约的区块链就像银行一样,要求所有金融交易都必须由出纳支票进行。在花钱之前,客户必须与所有其他客户一起在只有一名出纳员的银行办公室排队等候,以保管支票的金额。相比之下,使用链下合约的区块链就像使用常规支票帐户:客户无需在银行排队就可以写自己的支票,而当支票清算时,资金便会转移。
执行链下合约
图1显示了正常的Algorand执行,其中每5秒生成一个包含5000个事务的块。(一个区块中的5000个事务确实可能包含Algorand的Layer-1智能合约,而不会减慢区块的生产。)图2显示了向每个区块添加10秒合约调用的效果:显然不可能维持5秒区块时间,如果每次合约通话都需要额外的10秒。图3显示了链下执行合约调用的好处:合约调用可以与常规交易并行执行,而不会损害区块链的吞吐量。
就像主要的共识委员会一样,合约执行委员会由Algorand的安全,随机,自选算法选择。由于合约执行不同于块共识,而是确定性的,因此合约执行委员会可以使用更少的验证程序(约150个验证程序,而不是数千个验证程序)实现相同的安全级别。
链下合约代码以高级语言编写,并由虚拟机(VM)执行。链下合约具有其自身的长期状态,称为合约存储。为了保护隐私,合约存储本身未出现在区块链上。为了安全起见,每个合约调用都会发布一个承诺到最新的合约存储。链下合约可以读取账户余额和其他链上信息,并且可以发出交易(例如付款)来修改区块链状态。与传统的以太坊式合约不同,这些“效果交易”不是直接执行的。取而代之的是,该请求的效果由合约执行委员会验证者的法定人数来验证。通话效果交易被打包为第1层“全有或全无”交易,保证一起成功或失败。
合约执行委员会还跟踪每个调用的依存关系。例如,将100个令牌从Alice转移到Bob的合约请求取决于Alice的令牌余额至少为100。委员会在执行效果之前会生成一个清单,供共识委员会检查。(这些检查是快速,简单,标量的比较。)每个原子事务及其证书和依赖关系,与任何其他事务序列一样,都提交给共识委员会,后者检查原子事务的证书和依赖关系,包括未来的原子交易。
链下合约调用是“投机性的”,从某种意义上来说,链上状态(例如帐户余额)可能会在验证合约调用到调用效果到达区块链之间的时间间隔内发生变化。即使这样,也可以保证正确性。链外合约实现跟踪合约调用的依赖关系,确保违反依赖关系的调用的影响永远不会包含在区块链中。
如果合约调用反复通过合约执行委员会验证,但由于反复违反其链上依赖关系而从未进入链,该怎么办?回到支票的类比,常规支票比收银员的支票更快,更方便,但是即使支票签名时帐户中有足够的钱,支票仍可能退回。但是,尽管支票有时会退回,但它们比收银员支票使用更广泛,因为大多数支票写者不会透支其帐户。同样,链下合约有时可能会失败,但我们希望它们在大多数情况下都能成功,因为它们的依赖关系大部分在用户的控制之下,并且用户将避免违反自己的依赖关系。