Algorand 链下智能合约架构,满足定制化的复杂合约需求

这篇文章将讨论 Algorand 的链下智能合约架构,该架构由 Jing Chen,Maurice Herlihy,Victor Luchangco,Silvio Micali 和 Liuba Shrira 参与开发。完整的技术论文将在近期发布。 智能合约是赋能区块链可编程性的组件。 就像是一个自动贩卖机,智能合约可以帮助建立起一个清晰的资产流通的流程和逻辑。比如,当 Alice 想要购买 Bob 发行的代币时,她就可以直接将币发送到 Bob 的智能合约里。之后该合约可以检查 Alice 的付款是否正确,还可以检查一下 Alice 是否有权限购买该代币(比如是否为合格投资人),然后再将代币发送到 Alice 的账户。这个过程是透明的:Alice 可以检查合约的代码,整个代码运行过程也无需 Bob 的参与。这篇文章中我们将了解 Algorand 的智能合约架构,以及为何它与之前的解决方案如此不同。具体来讲,我们将介绍 Algorand 的智能合约架构中的几种不同工具,以及这些工具如何帮助 Algorand 的用户们解决不同的问题。

双层架构

首先,Algorand 提供了一个 Layer-1 的智能合约(ASC1),它是一个安全快速的工具,以服务于各种日常交易。(接下来我们也会回顾下这方面)其次,Algorand 提供了一个(Layer-2)链下的合约,用来服务那些“长尾”的定制化的智能合约需求。在这篇文章里我们会分别介绍这两部分的内容。

与以太坊智能合约比较

以太坊区块链是第一个使用了智能合约概念的区块链,所以跟以太坊的智能合约进行比较自然就是一个很好的出发点。社区中已经有了很多关于以太坊智能合约优缺点的讨论,这些讨论也引出了更多新的智能合约的设计方案。这里我们主要讨论其中的两方面问题。

01

Algorand 链下智能合约架构,满足定制化的复杂合约需求

简单的问题却引入了复杂且脆弱的解决方案

假设 Alice 和 Bob 想要进行一笔交易:Alice 给 Bob 发送 100 个“美元代币”,然后 Bob 给 Alice 发送 100 个“Bob 代币”。在这个过程中 Alice 需要确保当她发送了代币之后,她能获得 Bob 这边发送的代币;同时 Bob 也需要一个类似的保障。这类交易涉及两笔区块链交易,同时也涉及到了互不信任但希望这两笔交易可以都发生或都不发生的两个参与方,这类交易我们称为原子交换。在以太坊上实现原子交换时,需要使用一个叫做哈希时间锁定的合约(或其他类似的机制)来实现。而这个方案实际上是使用了一个非常脆弱,花费时间较长,并且有着多个步骤的协议,其中如果出现任何编程开发上的失误的话都会导致灾难发生。

作为对比,就像我们在之前的一篇文章中讨论的那样, Algorand 的 Layer-1 智能合约提供了一个简单且安全的方法来实现原子交换和其他类似的问题。

02

Algorand 链下智能合约架构,满足定制化的复杂合约需求

所有人都在等所有人

让我们想象一个法国奶酪店,它不允许顾客自己上手选择奶酪,而是将奶酪都放在一个玻璃柜台里,由店家帮顾客取出。这些顾客会在柜台前排起长龙。第一位顾客想要买一块从某个地区产出的山羊奶酪,店家告诉他说这类奶酪店里有三种口味的,分别是柔和,中等和浓郁,其中中等口味的奶酪会有一些咸。在经过一些关于这些奶酪的讨论之后,顾客做出了他的选择。店家拿出奶酪,切片,称重,然后用包装纸包好并计算价格。顾客开始从口袋中开始掏钱,接着付钱,并接过包裹,然后满意的离开。“Bonjour,有请下一位顾客~”

就像上面描述的这家传统法国奶酪店一样,每一个以太坊智能合约都会像每一个顾客一样阻塞整条区块链的执行。更惨的是,所有的矿工都需要重头去执行一遍合约的调用,所有的新矿工也都要重头去执行一遍所有的合约调用。以太坊的这种“奶酪店式”架构是不可扩展的,并且大幅限制了处理区块的效率。

Algorand 的链下智能合约结构会更像一个现代的超市。顾客可以自由选择商品而不用经过工作人员。一旦某个顾客决定了要买某个东西,她可以直接前往收款处排队结账。一个犹豫不决的客户不会阻碍其他客户的采购,也不会因为她一个人而限制整个超市的效率。

请注意:Algorand 的链下智能合约和其他 Layer-2 支付系统(比如闪电网络)是不一样的。Layer-2 支付系统是一种专有设计:他们是专门为了完成一端到另一端的支付而设计的。相比之下, Algorand 的链下智能合约是一个更加灵活可定制的编程系统。

Algorand 的 Layer-1(链上) 智能合约

Algorand 的 Layer-1 智能合约是用来执行更加一般和简单的交易逻辑的,并且是直接在链上执行的。举个例子,Algorand 的 Layer-1 智能合约可以大幅减少上述的原子交换交易的花费时间。Layer-1 智能合约原生提供原子交换功能,让由多个互不信任者发出的多笔区块链交易可以原子性的一次性执行完成:要么其中所有的交易都生效,要么都不生效。在我们的例子当中,Alice 可以创建一笔包含两笔交易的原子交易,包括她给 Bob 的和 Bob 给她的交易。Alice 和 Bob 分别对该交易签名,然后将该交易发到 Algorand 上,就可以直接实现原子交换。

再举个例子,假设 Alice 想要发行她自己的代币用来代表她的餐厅的未来收益。以太坊的智能合约为 ETH 代币提供了原生的支持,但是对于自定义代币来说,Alice 需要自己进行发行和管理。即使经过了一段时间的发展,以太坊上已经形成了比较成熟的标准和流程,让用户可以轻松发行自定义代币,但是写这样的代码依然存在着风险。历史上有很多对以太坊上的自定义代币进行成功攻击的案例。

相比之下, Algorand 的智能合约架构为用户自定义代币提供了与 ALGO 代币一样的原生支持。 并且 Algorand 平台还为创建代币提供了一些内置的保护措施,以及不同的管理权限设置,比如冻结代币,召回代币,新增和销毁代币等等。

在之前的文章中,我们也提到了 Algorand 的 Layer-1 智能合约围绕金融资产提供了很多的功能支持,包括挂单交易(Post-and-Sale)、借贷证券化、众筹、合格投资人验证和多签钱包等等。

Algorand 的 Layer-1 智能合约是使用 TEAL 语言编写的。这是一个基于堆栈的类汇编语言。TEAL 语言为实现一些常见的交易逻辑提供了很好的支持。即将于 2020 年夏天上线的支持状态的 TEAL 扩展将会支持链上的状态存储,它将使得合约可以读取账户的余额以及其他链上状态,这使得开发者可以实现更多样的应用。TEAL 也将为链下智能合约提供安全性保证。实际上,它将为接下来描述的链下合约提供强有力的保障。

Algorand 的 Layer-2(链下) 智能合约

虽然很多简单的交易逻辑可以直接使用 Layer-1 智能合约实现,但仍然存在一些“长尾”应用是需要其他专有工具的。比如:

  • 合约可能会占有很多存储资源。 比如一个管理私有股权的合约可能会需要去查询一个合格投资人的数据库,可能还有一个黑名单投资人的数据库。这些数据保存在链上的话可能占用许多空间,或者说这些信息可能不适合公开。

  • 合约可能会需要很多计算资源。 比如,一个提供隐私保护的合约可能需要使用一些计算量很大的库,比如 ZK-STARKs 和 ZK-SNARKs 等。同样,一个管理资产的合约可能需要使用一些断言语法来检查数据完整性。这样的计算可能会阻塞进程,降低出块的速度。

  • 合约的逻辑可能会很复杂。 TEAL 是一个很强大很安全的 Layer-1 编程语言,但是更加复杂的逻辑会需要高级语言的支持。一个好的软件实践一般会将一个应用分成多个合约来实现,有时会由多方来提供不同部分的功能。一个复杂的应用会需要使用模块化的结构来实现,这时也会需要一个高级语言。

链上合约 vs 链下合约

Algorand 区块链中的出块过程,是由一个通过 VRF 算法安全并随机选择出来(Cryptographic Self-Selection)的共识委员会完成的。当一个用户调用一个链下合约时,该调用不是直接由该共识委员会执行的。相反,该调用是由一个并行的委员会进行执行和验证的,我们称这个委员会为合约执行委员会。委员会中的每个人都将执行该合约调用,并且生成一个执行序列:该序列为合约调用所产生的一系列链上交易。接着合约执行委员会会对该执行序列进行签名并生成一个证明。该执行序列和该证明及其他验证条件将被发送到区块链上,由共识委员会进行验证和执行。为了优化效率,多个合约的调用可以并行执行,并且生成的执行序列可以被一同签名。链上的共识委员不会去执行用户自定义的合约逻辑,而是只需要去执行链下发送的执行序列和验证对应的证明。

一个只使用链上合约的区块链,就像是一个银行本票的银行柜台。在处理每一笔交易之前,用户都需要排着长队,等待柜台帮你处理你的付款。相比之下,一个使用链下合约的区块链就像是使用支票账户,用户只需要写好他们的支票然后发送到银行,之后银行就会帮你结算你的交易。

链下合约的执行

Algorand 链下智能合约架构,满足定制化的复杂合约需求

图片 1 展示了 Algorand 执行普通链上合约的流程,每秒钟会出一个有 5000 笔交易的区块。这 5000 笔交易中可以包含智能合约交易,但依然不影响出块速度。

Algorand 链下智能合约架构,满足定制化的复杂合约需求

图片 2 展示了以太坊风格的链上合约流程:在每个区块中增加一个耗费 10 秒钟的合约调用的效果:很明显如果一个合约调用需要 10 秒的话,那么是没法实现 5 秒出块的。

Algorand 链下智能合约架构,满足定制化的复杂合约需求

图片 3 展示了在链下执行合约调用的优势: 合约的调用可以并行执行,并且不影响出块速度。

合约执行委员会是通过 Algorand 的一个安全的随机自选择算法实现的,就像选择共识委员会一样。由于合约执行是确定性的,与区块共识不同,所以在同样的安全水平下,合约的执行可以由一个验证者较少的委员会来执行(大概 150 个验证者,而不是上千个)。

链下合约是基于一个使用高级语言的虚拟机实现的。链下合约拥有其自己的状态存储,成为合约仓库。考虑到隐私,合约仓库中的数据并不会出现在链上。但是为了保证安全性,每一个合约调用都需要提供一个对于最新合约仓库的委托(Commitment)。链下合约可以读取链上的账户等信息,他们也可以向链上发送交易来改变链上状态,比如进行支付。与以太坊风格的智能合约不同,这些交易(执行序列)不会被直接执行。而是需要先由合约执行委员会进行验证。执行序列交易会被打包成一个拥有原子性的交易组,其中的交易要么都执行要么都不执行。合约执行委员会也会跟踪每个合约调用的依赖。举个例子,Alice 要向 Bob 发送 100 个代币,该合约调用需要先判断 Alice 是否拥有至少 100 个代币,然后再执行交易。合约执行委员会会先生成一个依赖列表,让共识委员会进行检查,然后才让共识委员会处理执行序列(这些校验会非常简单且迅速)。每一个原子交易,将会连同其相应依赖及证明一起,被发送给共识委员会,之后会由委员会对这些数据进行验证,并将这些交易打包在一个未来的区块当中。

那么会有哪些潜在的问题呢?其实,链下的合约调用是“未实现”的,因为他们在被执行的时候,链上的状态还没有被更改,所以这之间会产生一些延迟。尽管如此,安全性会得到最大程度的保障。链下合约会保存合约调用的相关依赖,确保与链上状态相冲突的合约调用不会被执行。

那么怎么保证活性呢?如果一个合约调用不断地与链上状态冲突怎么办?回到刚才的支票的例子,普通的支票会比银行本票更快也更便捷,但即使一张发票在签发时账户余额充足,它还是有可能会被拒收。然而,即使支票会被拒收,但它依然比本票拥有更广泛的使用,因为大多数的支票使用者是不会透支他们的账户的。同样的,链下合约可能有时会失败,但是我们会期待它在大多数情况下能够顺利执行。因为合约调用依赖的链上的状态一般都是用户可以自己控制的,而用户会自己确保不会使用与这些状态冲突的合约调用。

未来可期

我们很期待链下合约的实现,因为它将可以支持计算需求大,存储需求大,较为复杂的合约的实现,并且不会堵塞区块链。与大多数将智能合约架构与区块链强绑定的区块链不同,Algorand 的智能合约架构将链下合约执行与链上的共识委员会解耦。Algorand 的智能合约架构是非常灵活的,并且未来可能会支持多个合约执行委员会的实现。他们每一个都可以提供不同等级的服务,可以使用不同的合约语言,使用不同的虚拟机。一个需要大量计算量的隐私代币,与一个强调监管和注重数据的代币,两者的合约执行委员会是不同的。无论您对智能合约有怎样的专业需求,Algorand 智能合约架构都可以支持匹配的语言和对应虚拟机。

寻找一个合适的语言和虚拟机将是让链下合约可以获得广泛使用的一个重要前提。我们计划与其他人一起合作实现这一部分的工作。敬请期待!

相关文章:

Algorand Smart Contracts at Layer 1

https://www.algorand.com/resources/blog/algorand-smart-contracts

A survey of attacks on Ethereum smart contracts

https://eprint.iacr.org/2016/1007.pdf

Algorand 链下智能合约架构,满足定制化的复杂合约需求

加入 Algorand 官方群请扫码添加 Admin

Algorand 链下智能合约架构,满足定制化的复杂合约需求

近期文章更新
Algorand 基金会携手 AIKON,强势发力区块链大规模商业应用 Algorand 链上应用 PlanetWatch 完成种子轮融资,加快实时空气质量监测进程 Props 入选「2.5 亿 ALGO 奖励计划」,加速代币迁至公链 Algorand Algorand 携手加密货币税务与会计公司 Verady,扩大金融服务赋能平台用户 获投 200 万美元的私有链平台 Props 宣布升级迁移,携百万级用户上链 Algorand Algorand 创始人 Silvio Micali 教授提出基于区块链的新冠肺炎追踪方法

Algorand 官方账号

官网:

https://www.algorand.com/

*基金会: *

https://www.algorand.foundation

官方微博:
https://weibo.com/Algorand 【ID:Algorand 官方号】

区块链浏览器:

https://algoexplorer.io/

INC 公示钱包地址:

https://www.algorand.com/resources/blog/algorand_wallets/

基金会公示钱包地址:

https://algorand.foundation/wallet-addresses

Telegram 电报群:

https://t.me/algorand

官方 Bihu 论坛号:

https://bihu.com/people/1353848925

Medium:

https://medium.com/algorand

Naver Blog:

https://blog.naver.com/algorandmarketing

领英 Linkedin:

https://www.linkedin.com/company/algorand/

来源链接:mp.weixin.qq.com