1.2.1 以太坊的通俗介绍
1. 以太坊和比特币的关系
比特币开创了去中心化密码货币的先河,十多年的时间已经充分检验了区块链技术的可行性和安全性。比特币的区块链事实上是一套分布式的数据库,如果再在其中加入一个符号——比特币,并规定一套协议使得这个符号可以在数据库上安全地转移,以及无须信任的第三方,这些特征的组合完美地构造了一个货币传输体系——比特币网络。
然而,比特币系统并不完美,其中协议的扩展性存在不足,例如比特币网络里只有一种符号——比特币,用户无法自定义另外的符号,这些符号可以是代表公司的股票或者债务凭证等,这就损失了一些功能。另外,比特币协议定义了一套基于堆栈的脚本语言(可用于实现多重签名、外带数据等),然而该脚本语言由于过分强调安全而不具备图灵完备,因此并不足以构建更高级的应用,如去中心化交易所等。而以太坊从设计上就是为了解决这种扩展性不足的问题。
2. 图灵机和以太坊的图灵完备语言
图灵机(turing machine)是图灵在1936年发表的On Computable Numbers,with an Application to the Entscheidungsproblem(《论可计算数及其在判定性问题上的应用》)中提出的数学模型。图灵在文章中证明了只要图灵机可以被实现,那么就可以用来解决任何可计算问题。
图灵机模型的结构如图1-7所示。
● 一条无限长的纸带被分成一个个相邻的格子,每个格子都可以写至多一个字符。
● 一个字符表,即字符的集合,它包含纸带上可能出现的所有字符。其中包含一个特殊的空白字符,意思是此格子没有任何字符。
● 一个读写头,可理解为指向其中一个格子的指针。它可以读取、擦除、写入当前格子的内容,此外也可以每次向左或右移动一个格子。
图1-7 图灵机模型的结构
● 一个状态寄存器,它追踪运算过程中整个机器的每一个状态(运行或终止)。当这个状态从运行变为终止,则运算结束,机器停机并交回控制权。简单来说,它对应着有限状态机里的“状态”。
● 一个有限的指令集,它记录着读写头在特定情况下应该执行的行为。可以想象读写头随身有一本操作指南,里面记录着很多条类似于“当你身处编号53的格子并看到其内容为0时,擦除,改写为1,并向右移一格;此外,令下一状态为运行”这样的命令。其实在某种意义上,这个指令集就对应着程序员所写的程序。
在计算开始前,纸带可以是完全空白的,也可以在某些格子里预先写上部分字符作为输入。运算开始时,读写头从某一位置开始,严格按照此刻的配置,即当前所处位置和当前格子内容来一步步地对照指令集进行操作,直到状态变为停止,运算结束。而后纸带上留下的信息,即字符的序列(比如…011001…)便作为输出,由人来解码为自然语言。
图灵机是一种抽象的计算模型,将人们使用纸笔进行数学运算的过程进行抽象,由虚拟的机器代替人类进行数学运算。图灵机的本质是人类思维在异度空间的映射,数据则是这种映射和其自运行的结果。
注意,以上只是图灵机模型的内容,而非具体的实现。所谓的纸带和读写头都只是图灵提出的抽象概念。例如,算盘虽然不是图灵机(因为它没有无限长的纸带,即无限的存储空间),但它的行为与图灵机一致:每一串算珠都是纸带上的一格,一串算珠上展示的数字记录着当前格中的字符(可以是空白,可以是1、2、3、4、5);人类的手即读写头,可以更改每串算珠的状态;算盘的运行遵循人脑中的算法(选择、循环、因果、条件等),当算法结束,算盘停机。
在计算机领域或者自动机领域,我们研究的一切问题都是计算问题,可泛指一切与计算相关的问题。
图灵完备性是针对一套数据操作规则而言的概念,该数据操作规则可以是计算机里具体实现了的指令集,也可以是一种编程语言,当这套规则可以实现图灵机模型里的全部功能时,就称它具有图灵完备性。编程语言图灵不完备的常见原因有循环或递归受限(无法写不终止的程序,如while(true){}; ),因为这会导致无法实现类似数组或列表这样的数据结构(不能模拟纸带),采用这样的编程语言实现的程序在功能上就有局限性。因此,判定图灵完备的简单方法就是看该语言是否具备if…else控制流、while循环等功能。如今主流的编程语言(C++、Java、Python等)都是图灵完备的语言。
当然图灵不完备也不总是没有意义的,有些场景需要限制语言本身,如限制循环和递归,可以保证该语言编写的程序一定是终止的。例如,比特币脚本语言就被特意设计为非图灵完备的,具有一定的局限性,它基于堆栈,遵循从左向右处理的简单原则(类似FORTH语言),没有循环语句和复杂的条件控制语句。恰恰由于存在这种局限性,也就没办法执行一些死循环或者一些能够导致DOS攻击的恶意代码,从而也就避免了比特币网络受到DOS攻击。
以太坊上运行的程序又称为智能合约,可以理解为在区块链上(以太坊基于区块链技术架构)可以自动执行的(由事件驱动的)、以代码形式编写的合同(特殊的交易)。其默认采用的编程语言是Solidity,它和JavaScript相似,是一种图灵完备的编程语言(可以实现一切计算功能),用来开发合约并编译成以太坊虚拟机字节代码(源文件扩展名以.sol结尾)。这就使得以太坊比特币系统更加具备扩展性,可以用来开发基于区块链技术的各种去中心化应用(decentralized application,DApp)。
3. 区块链、去中心化应用、比特币、以太坊之间的关系
以太坊是一个建立在区块链技术之上的去中心化应用平台,它允许任何人在平台中建立和运行基于区块链技术的DApp。简单来说,如果去中心化应用是App,那么以太坊是Android平台。基于Android Framework可以开发Android App,那么基于以太坊可以开发出基于区块链技术的DApp。
(1)区块链是一种综合技术,因比特币的实现架构(数据区块、链式迭代、共识算法)而得名。
(2)去中心化应用程序是一种新的数据记录与传播的方案,可以在大规模分布式网络中实现数据记录的实时性、一致性、合法性和可信性(深圳大学,张胜利)。
(3)在以太坊出现之前,实现区块链去中心化应用的唯一方式是修改比特币的源代码,例如加密算法、共识机制、网络协议等,这样修改出来的应用通常应用于数字货币领域,如果需要应用于其他领域,则其工作量将是非常浩大的。
(4)以太坊平台对底层区块链技术进行了封装,区块链应用开发者可以直接基于以太坊平台进行开发,开发者只需要专注于应用本身的开发,从而大大降低了难度。
目前已经围绕以太坊形成了一个较为完善的开发生态圈,有开源社区的支持,可以选择多种开发框架和工具。借助以太坊,可以创建更加丰富的去中心化应用程序(不再局限于数字货币领域),可以实现去中心化自治组织、跨组织协同应用,是一种提高数据主权、改善生产关系、高效率建立信任的“社会编程”框架。
4. 区块链应用的三大架构类型
随着区块链技术的不断发展,区块链应用程序(即基于区块链技术的DApp)在宏观上演化出了三种架构:公有链、私有链和联盟链。这三种架构并没有绝对的优势与劣势,需要根据不同的应用场景来选择合适的区块链架构类型。
(1)公有链:公有的区块链,读写权限对所有人开放。任何人都可以随时进入公有链系统中读取数据、发送可确认交易、竞争记录存储,因为没有任何人或机构可以控制或者篡改其中数据的读写,公有链通常被认为是完全去中心化的。公有链一般会通过某种奖励机制(通常是代币)鼓励参与者竞争记账,来确保数据的安全性。比特币、以太坊都是典型的公有链。主要特点:所有数据公开透明;是高度去中心化的分布式数据库,数据几乎无法篡改;吞吐量低,运作速度慢。
(2)私有链:私有的区块链,读写权限由某个组织和机构控制,参与节点的资格会被严格限制。由于参与的节点是有限和可控的,因此私有链往往具有极快的交易速度、更好的隐私保护、更低的交易成本,不容易被恶意攻击,并且能够做到身份认证等特殊安全要求。主要特点:属于中心化数据库,能防止机构内单节点篡改数据;运作成本低(无须奖励机制)、交易速度非常快。蚂蚁金服的区块链应用是典型的私有链应用。
(3)联盟链:联盟区块链本质上是私有链的一种,只是私有程度低(读写权限对通过授权并加入联盟的所有节点开放,由联盟内成员节点共同维护),因此比纯粹的私有链更具可信度,但其权限设计要求比私有链更复杂。主要特点:由若干个机构共同参与管理,具备一定的去中心化属性,是公有链和私有链的结合版。1.3.3节介绍的Fabric超级账本就是典型的联盟链应用框架。