比特币随想 - 为什么比特币的智能合约不是图灵完备

提到比特币和以太坊,人们喜欢说:

  • 以太坊支持智能合约,比特币不支持
  • 以太坊是图灵完备的,比特币不是图灵完备的

这两个说法,第一个是错的,第二个是对的。但是人们倾向错误的认为图灵完备更加优秀。

我们从头说起。

智能合约

智能合约,Smart Contract,这个词我也不知道是从什么时开始的,但是这个词实际的意思就是:可编程,Programmable。而智能合约语言就是编程语言。对于比特币来说,这个语言叫做 Script;对于以太坊,这个语言叫做 EVM 虚拟机字节码。

有小伙伴问:以太坊智能合约的语言不是 Solidity 吗?对也不对。在区块链的背景下,智能合约语言通常是用支持的字节码来表达的,可以理解成一般计算机语言的机器码或者 JVM 的字节码,然后我们可以在这些基本的字节码基础上设计高级语言和对应的编译器、解释器。

图灵完备?

通俗的说,一个计算系统是不是图灵完备的关键在于是否支持循环指令。在计算机语言中循环是非常重要的特性,可是你是否想过为什么比特币的 Script 语言不支持循环?

我们思考两个可能性:1、中本聪(比特币的设计和最初实现者)不知道循环的重要性,无意中忽略了这个特性;2、中本聪为了比特币的工程特征有意的去掉了循环。

可能 1 很难站住脚,从中本聪的第一版比特币节点的 C++ 实现可看出,他是比较专业的程序员,他在 Forth 的基础上实现了 Script 的解释器。以他对密码学和编译原理的理解,我不觉得他会忽略循环这个特性,而且在他已有的实现基础上加入循环,仅仅是增加一个 if 分支那么简单。

既然如此,我觉得原因只能是 2:他有意的去除了循环,把 Script 设计成非图灵完备。

那么究竟是为啥呢?

我们假设 Script 是图灵完备的,那么任何人都可以部署一个无限循环程序,这样执行该智能合约节点就会陷入死循环,不能继续接受新的请求。换句话说,很容收到拒绝服务攻击,DDoS。一个带有无限循环的智能合约就可能阻塞整个比特币网络。更可怕的是,数学家已经证明:给出任意长的程序,人们无法再执行以前判断是否存在无限循环。以太坊采用了带有循环的智能合约语言,因此它必须引入一个费用,Gas,来迫使任何程序终止,不出现无限循环。

另一个原因是,图灵完备的程序员分析起来非常复杂。最经典的例子就是以太坊的 DAO 漏洞了,该漏洞导致了以太坊最终硬分叉,产生了 ETC,以太坊经典。

结论

综上,Script 的非图灵完备设计师有意为之的,而且是为了比特币网络本身的稳定。

历史在证明了这一点,在短短 13 年的历史里面,比特币没有因为任何智能合约漏洞硬分叉。

另外一个有意思的点就是:比特币网络本身就是一个无限执行的机器。从这个角度看,比特币区块链本身就是图灵完备的,你可以让一个智能合约无限执行下去,即循环。