涨知识 | 智能合约不智能,怎么办?

链闻ChainNews 2018-04-08

智能合约这个概念从以太坊诞生的那年开始被广泛宣传,但是很多宣传中对智能合约的理解有很多常见的误区。不过好在随着真正静下心钻研区块链和智能合约的人越来越多,一些误区也逐渐的被修正。但是有一个误区并没有被解释清楚,也是「智能合约」这个概念的一个核心问题:大多数人认为智能合约是可以自动执行的。

这是一个错误的理解。现有的平台没有一个是真正支持智能合约自动执行的。

老钱将在这篇文章里给大家科普现有的自动执行智能合约的做法,然后抛砖引玉,给出一个真正支持智能合约自动执行的平台的设计方案。

「自动执行」是什么…

我们先来定义一下什么是「自动执行」。一个自动执行的智能合约应该是:「当条件C达到时,智能合约里的方法F将根据预先设定好的input和规则,无须由外部交易**

external transaction **触发,自动运行,改变智能合约的状态 state,并记录到区块链当前高度。」

这个定义里最重要的一点就是:无须由外部交易触发。现有的智能合约平台,比如以太坊中,一个智能合约 A 里的某个方法 F1 的触发 invocation 一般有 2 种方法:

  • 一个用户发一条外部交易 T 直接 invoke 智能合约 A 里的方法 F1;

  • 一个用户发一条外部交易 T,invoke 另一个智能合约 B 里的方法 F2,F2 从而间接触发智能合约 A 里的方法 F1。

这两种方法的本质都是一样的,都是由一个用户发起的一条交易开始的。如果没有用户发起的那条交易 T,无论如何智能合约 A 里的 F1 都是不会被触发的。

现有的解决办法与问题

搞清楚智能合约触发的本质之后,想要让一个智能合约在一个条件满足时自动触发,现在有这么几个做法:

上述的方法 2 中,用户向智能合约里预存的额外的 ether/gas,是用来经济激励网络里的其他用户或某个指定用户,来为他发起最后那个用户触发智能合约的外部交易的。这两种方法的本质也都是一样的,都是由网络里的某个或某几个用户跑一个轮询脚本,来判断条件是否满足,并且决定是否发起外部交易来触发智能合约。

在以太坊早期有个以太坊闹钟项目,旨在能让用户规划在未来某个时间点,即区块高度,触发一个智能合约。这个以太坊闹钟采用的方法就是上述的方法2。过气网红游戏谜恋猫 CryptoKitties 中,一个猫的诞生需要用户手动发起 2 笔交易,一个交易让两只猫 XXOO,一个交易让母猫分娩,谜恋猫官方提供一个自动分娩服务,让用户能规划在未来的一个时间点,自动让母猫分娩。谜恋猫的这个自动分娩服务用的也是上述的方法 2。

这类方法的问题在于,「自动执行」是一个由区块链外部的脚本控制的过程。区块链外部无论发生什么,区块链本身都没法控制。轮询脚本本身可能有 bug,或者方法 2 中没有人愿意帮你跑脚本轮询,这些轮询脚本也不能保证一直在线,由于这些问题的存在,智能合约的「自动执行」就不能被完全保证,因为这不是区块链协议里规定的,是在区块链外部约定俗成的。

如果智能合约「自动执行」要在区块链协议层里规定好,该怎么样实现呢?

智能合约「自动执行」的新思路

拿以太坊为例,我们先从一个最简单的用例,比如谜恋猫的自动分娩,开始构思理论上的实现:即当区块高度达到X时——这是条件,自动执行智能合约。

我们可以修改以太坊的协议,把自动执行智能合约的责任转移到矿工身上,因为以太坊网络里,在任意一个时间点都会有矿工在线——想象一下,如果哪天以太坊网络里没有矿工了,那某种意义上这个网络就「死」了,所以在某种角度上,矿工可以被看成是整个网络的一个守护进程 daemon process 。

修改完的协议中,全网的矿工都有义务在挖出下一个区块之前,先找出哪些智能合约需要自动执行。找出之后,根据用户预先设置好的输入 input,由矿工创建并执行一条特殊的交易,这个交易可以叫做 「自动交易」,用以和普通的外部交易区分开。

和普通的外部交易一样,这个自动交易完成后,状态将更新并且记录在该区块里。自动执行的条件和执行交易的输入都应该已经存在在合约里。矿工完成一个区块的打包后,广播给全网,网络里的节点收到新区块后验证自动交易,并且验证是不是所有应该在这个区块高度自动执行的智能合约都已经执行了,如若不然,则拒绝接受这个区块,并等待下一个合格的区块。不同的矿工竞争时,各自打包的 candidate 区块里包含的交易可能各不相同,但是他们打包的自动交易应该都一样。

智能合约在部署之前就可以分成两种,一种是支持自动执行的智能合约,一种是普通不支持自动执行的智能合约。支持自动执行的智能合约在部署时需要预留一部分 ether 用作自动执行的 gas fee。自动交易的规则可以在智能合约部署时就创建好,也可以像谜恋猫中的自动分娩方法一样由用户之后创建。

值得探索的几个问题

这个设计有以下几个可能的问题,其中一些是工程方面的问题,一些是理论上的问题,一些是经济机制上的问题。老钱也没有完美的解决办法,只能在这里抛砖引玉给出一些自己的想法,大家也可以在评论里发表你对这些问题的看法。

矿工如何追踪所有需要自动执行的智能合约?

创建一个新的自动执行规则的时候,矿工可以把这个新的规则加入一个注册表中。用户创建新的自动执行规则的交易将收取额外的 gas。用户也可以发起交易把某个自动执行的规则从注册表中删除。不过注册表也可能因此变得很庞大,注册表的检索 ndexing 也不是很好做。

自动交易和其他正常交易的顺序怎么安排?

可以把自动交易放在所有正常交易前面,这样正常交易将基于自动交易执行完之后的状态之上。自动交易之间的顺序可以由矿工自行决定。不过如果自动交易的规则复杂的话,两个不同自动交易可能会因为彼此的顺序不同而产生不同的状态转移。

如果一个区块中的自动交易太多,把区块占满了怎么办?

这是个有意思的问题。区块大小的定夺考量了很多因素,所以不能随意的更改区块的大小。

那如果某个时间段自动交易太多了怎么办?

老钱认为可以引入特殊区块的概念,这个特殊区块里的所有交易都是自动交易,并且不允许存在外部交易。特殊区块不计入区块高度以免自动交易的逻辑改变。在自动交易太多的情况下,可以把自动交易打包进特殊区块。打包特殊区块的挖矿难度可以大大减小。可以有很多个连续的特殊区块,直到下一个正常区块高度到来之前。

自动交易的 Gas 怎么算?矿工经济激励会因此受到影响吗?

矿工执行自动交易自然也是需要 gas 的。这部分 gas 可以是由智能合约在部署的时候就预存好,或者在用户给一个智能合约创建新的自动交易规则时预存好。当预存的 gas 用完时,这个规则就将从注册表中删除。如果智能合约有着全局的自动交易规则的话,那享受这个智能合约的用户可以向这个合约充值来享受服务。自动交易的 gas fee
单价可以以整个区块中正常交易的平均 gas 单价来计算。

总结

综上所述,智能合约自动执行这个概念虽然不难被想到,但是要想出一个完美的设计仍然存在着不少的挑战。Scalability 也会是一个很大的问题。但是当智能合约真正能够自动执行的时候,基于区块链的 DApp 也将拥有更多新的可能。在老钱看来,区块链游戏和一些金融相关的智能合约会变得更好,更方便,去中心化自治组织也真正能够「自动」的去做一些决定。

作者:

老钱(BS'14, MS'18), UIUC 计算机科学系硕士,师承 Zcash Andrew Miller。三年互联网工作经验。目前担任 NAD Grid https://nadgrid.com 技术合伙人。NAD Grid互联能源世界。

该文获得 NAD Grid 老钱授权,并发表于「链闻 ChainNews.com」。

任何中文媒体的转载请与「链闻」联系。

举报

链闻 ChainNews 信息平台,诚邀读者共同监督,坚决杜绝各类代币发行、投资推荐及虚拟货币炒作信息。如您发现这篇文章含有敏感信息,请点击「举报」,我们会及时调查,并进行处理。

你可能感兴趣

    参与讨论

    登录后发布
      App

      链闻 App

      扫码下载

      公众号 小程序