图灵完备性是计算机科学中的一个术语,它描述了一个系统计算任何可能的计算或程序的能力,可以用来描述现代编程语言(Python、C++ 等)。
图灵完备描述的是一个可编程系统,能解决任何计算问题。这一概念来自于图灵机,这是由英国数学家和密码学家艾伦·图灵设计的一种理论计算模型。相反,非图灵完备的系统仅限于执行基于预定义指令的特定任务。
一个常见的类比是,口袋计算器是非图灵完备的,因为它只能执行有限一组数学计算。然而,使用家用电脑,可以编写一个程序来自主执行相同的任务。
比特币和以太坊提供了图灵完备性对比的最佳例子。比特币及其脚本编程语言被设计为功能有限的非图灵完备系统。比特币软件仅被编程用来处理比特币交易,不能支持复杂、多步骤的智能合约逻辑。
然而,以太坊允许开发者使用图灵完备的 Solidity 编程语言编写代码,并使用同样是图灵完备的以太坊虚拟机(EVM)来执行它。理论上,可以为任何用例编写程序并在以太坊上运行它。
因此,图灵完备性对于使用区块链技术可以实现的成就有着重要的意义。
在现代计算机时代之前,研究人员就对计算机可以实现的理论可能性感兴趣。1936 年,艾伦·图灵发表了一篇论文,其中描述了一种假想的机器,它能够根据代码读取一组简单的任意指令。这台机器有一个无限长度的带子,带子被分成许多盒子,机器可以依次读取每个盒子。
每个盒子中都有一条机器可以解读的编码指令。为了简单,指令可以是一个或零。每次机器从盒子中读取指令时,它通过用新的符号——一个或零——重写指令来执行命令。然后机器更新其状态以反映变化,所以每个状态捕捉到执行代码的特定点。
图灵机器模型实际上是在现代计算机发明之前的可编程计算机蓝图。在图灵的时代,科学家们每次需要解决不同的任务时都需要构造一台新机器。即使今天图灵完备的机器和系统司空见惯,计算机科学家仍然使用这个术语来描述计算机系统、程序和语言可以实现的最大极限。
值得注意的是,作为一个概念模型,图灵机模型并不考虑时间、处理能力或除了机器理论处理任意一组编程指令的能力以外的任何其他因素。
以太坊是第一个图灵完备的区块链,可用于编程智能合约和去中心化应用程序(dapp)。
以太坊被设计为图灵完备的两种方式:
EVM 可以处理任何配置的智能合约,即使它们的功能或用途尚未被构想出来。因此,以太坊作为第一个图灵完备的区块链的推出,标志着提高区块链技术能力的一个重要转折点。以太坊不仅局限于有限系列的用例,它允许潜在无限范围的用途。
由于区块链的实际机制,以太坊只能在最理论层面上被认为是图灵完备。以太坊上的每笔交易都需要消耗 gas 以执行,因此如果智能合约进入无限循环——这在图灵机上理论上是可能的——它最终会耗尽 gas。
以太坊图灵完备性的这一限制是设计上的,因为对于一个有限处理能力的公共区块链网络来说,多个智能合约运行无限循环并不可取。因此,以太坊上的每笔交易都需要指定一个 gas 上限,它规定了可以分配给交易的最大计算能力。如果交易在达到限制时未完成,就会被拒绝。
然而,需要注意的是,很少有以太坊智能合约会使用递归循环和其他需要图灵完备的功能。
图灵完备系统的无限编程性是它们最大的优势,但也可能是一个重大的弱点,特别是在公共区块链中,代码对所有人可见。这意味着代码可能容易受到干扰(如智能合约中的错误),或未预期的使用,这些都可能阻碍协议的预期功能。能够编程任何类型的计算允许广泛的可能性,不可能预见所有这些可能性。
如果在中心化系统中出现一个未预料的问题,拥有代码的公司可以立即发布补丁。然而,在基于区块链的系统中,如果有人设法触发开发者未预料的结果,可能会造成相当大的干扰。由于区块链的去中心化特性,软件的更新可能需要更长时间,因为每次改变都需要得到社区的投票。
最著名的例子之一是 The DAO,它是 2016 年在以太坊上设置的一种去中心化风险投资基金类型的智能合约。在一个通常被称为黑客攻击的行动中,一个恶意行为者成功从以太坊智能合约中抽走了超过 1.5 亿美元的投资者资金,导致了一个有争议的决定,即回滚以太坊区块链以从攻击者那里回收资金。这一事件导致了以太坊经典分叉。
尽管这个名字,但这个事件并不是真正意义上的黑客攻击。攻击者利用了当时鲜为人知的基础代码编写方式中的一个漏洞,执行了现在所知的重入攻击,调用一个不可信的合约来抽取资金。
自从 The DAO 事件之后,开发者已经更新了编程最佳实践来修复这个漏洞。然而,在图灵完备系统中,创新者不断编写新代码,可能会持续出现新的漏洞。