比特币在本质上是一种完全基于点对点网络的电子现金系统,只能给用户一系列预先设定好的操作(例如比特币交易)。随着区块链技术的发展,人们需要一种更加通用、友好且能使用真正的编程语言来创建去中心化应用的开发框架。
以太坊允许用户按照自己的意愿任意创建复杂的操作,开发者能够使用图灵完备的Solidity编程语言创建出在以太坊虚拟器上运行的通用应用,这就是“区块链2.0”。图1-6为以太坊创始人Vitalik Buterin。
图1-6 以太坊创始人Vitalik Buterin
比特币开创了去中心化密码货币的先河,十多年的时间已经充分检验了区块链技术的可行性和安全性。比特币的区块链事实上是一套分布式的数据库,如果再在其中加入一个符号——比特币,并规定一套协议使得这个符号可以在数据库上安全地转移,以及无须信任的第三方,这些特征的组合完美地构造了一个货币传输体系——比特币网络。
然而,比特币系统并不完美,其中协议的扩展性存在不足,例如比特币网络里只有一种符号——比特币,用户无法自定义另外的符号,这些符号可以是代表公司的股票或者债务凭证等,这就损失了一些功能。另外,比特币协议定义了一套基于堆栈的脚本语言(可用于实现多重签名、外带数据等),然而该脚本语言由于过分强调安全而不具备图灵完备,因此并不足以构建更高级的应用,如去中心化交易所等。而以太坊从设计上就是为了解决这种扩展性不足的问题。
图灵机(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)。
以太坊是一个建立在区块链技术之上的去中心化应用平台,它允许任何人在平台中建立和运行基于区块链技术的DApp。简单来说,如果去中心化应用是App,那么以太坊是Android平台。基于Android Framework可以开发Android App,那么基于以太坊可以开发出基于区块链技术的DApp。
(1)区块链是一种综合技术,因比特币的实现架构(数据区块、链式迭代、共识算法)而得名。
(2)去中心化应用程序是一种新的数据记录与传播的方案,可以在大规模分布式网络中实现数据记录的实时性、一致性、合法性和可信性(深圳大学,张胜利)。
(3)在以太坊出现之前,实现区块链去中心化应用的唯一方式是修改比特币的源代码,例如加密算法、共识机制、网络协议等,这样修改出来的应用通常应用于数字货币领域,如果需要应用于其他领域,则其工作量将是非常浩大的。
(4)以太坊平台对底层区块链技术进行了封装,区块链应用开发者可以直接基于以太坊平台进行开发,开发者只需要专注于应用本身的开发,从而大大降低了难度。
目前已经围绕以太坊形成了一个较为完善的开发生态圈,有开源社区的支持,可以选择多种开发框架和工具。借助以太坊,可以创建更加丰富的去中心化应用程序(不再局限于数字货币领域),可以实现去中心化自治组织、跨组织协同应用,是一种提高数据主权、改善生产关系、高效率建立信任的“社会编程”框架。
随着区块链技术的不断发展,区块链应用程序(即基于区块链技术的DApp)在宏观上演化出了三种架构:公有链、私有链和联盟链。这三种架构并没有绝对的优势与劣势,需要根据不同的应用场景来选择合适的区块链架构类型。
(1)公有链:公有的区块链,读写权限对所有人开放。任何人都可以随时进入公有链系统中读取数据、发送可确认交易、竞争记录存储,因为没有任何人或机构可以控制或者篡改其中数据的读写,公有链通常被认为是完全去中心化的。公有链一般会通过某种奖励机制(通常是代币)鼓励参与者竞争记账,来确保数据的安全性。比特币、以太坊都是典型的公有链。主要特点:所有数据公开透明;是高度去中心化的分布式数据库,数据几乎无法篡改;吞吐量低,运作速度慢。
(2)私有链:私有的区块链,读写权限由某个组织和机构控制,参与节点的资格会被严格限制。由于参与的节点是有限和可控的,因此私有链往往具有极快的交易速度、更好的隐私保护、更低的交易成本,不容易被恶意攻击,并且能够做到身份认证等特殊安全要求。主要特点:属于中心化数据库,能防止机构内单节点篡改数据;运作成本低(无须奖励机制)、交易速度非常快。蚂蚁金服的区块链应用是典型的私有链应用。
(3)联盟链:联盟区块链本质上是私有链的一种,只是私有程度低(读写权限对通过授权并加入联盟的所有节点开放,由联盟内成员节点共同维护),因此比纯粹的私有链更具可信度,但其权限设计要求比私有链更复杂。主要特点:由若干个机构共同参与管理,具备一定的去中心化属性,是公有链和私有链的结合版。1.3.3节介绍的Fabric超级账本就是典型的联盟链应用框架。
比特币的交易是可以编程的,但是比特币脚本有很多限制,能够编写的程序也有限,而以太坊则更加完备(在计算机科学术语中,称它为是图灵完备的),可以像使用任何高级语言一样来编写几乎可以做任何事情的程序(智能合约)。智能合约是代码和数据(状态)的集合,可以理解为在区块链上可以自动执行的(由事件驱动的)、以代码形式编写的合同(特殊的交易)。
智能合约非常适合对信任、安全和持久性要求较高的应用场景,比如数字货币、数字资产、投票、保险、金融应用、预测市场、产权所有权管理、物联网、点对点交易等。虽然目前除数字货币之外,真正落地的智能合约应用还不多,但相信未来1~3年,各种应用会遍地开花。
“智能合约”这个词其实并不陌生,从其被提出大概已经有几十年的历史。笼统来说,智能合约就是一套以数字形式定义的承诺,合约参与方按规定执行合约上承诺的协议。比如我们常见的自动售货机本质上就可以理解为一个智能合约,通过数字方式来控制合约。智能合约具有动态性和主动执行的属性。
智能合约是指建立一套个人、机构以及财产之间的关系,是一种达成一致性认识的协定。像抵押、产权划分这些操作都可以做成一种智能合约模型来约束人的行为。以我们常见的购买虚拟商品为例,当买家已经购买并完成付款,那么自动售货机制就自动发货。由此可见,只要参与者达成协定,智能合约给予参与方的权利和义务就可以像一台计算机一样自动执行。
从技术层面来说,智能合约的执行机制就像计算机语言的if…then条件判断语句,某一个事件发生了,那么随之而来另一件事就会自动发生;反之,要发生某件事的条件哪怕有一个达不到,这件事也不会发生。在某种意义上智能合约本身也是一个系统参与者,可以对接收到的信息进行回应,也可以接收和存储一些有用信息。
要实现智能合约,首先需要使用计算机语言编写合同中的条款,然后将编写的程序部署到区块链上去执行。从计算机用户的角度来看,智能合约可以限定为更容易理解的智能合约代码。智能合约最早的形式是比特币中的扩展脚本,由于比特币设计之初并没有考虑智能合约,因此这种扩展脚本受到诸多限制,后来以太坊平台设计了合约编程语言Solidity,提供了执行合约的虚拟机,进一步提升了智能合约的表述能力。而Fabric的智能合约直接采用Java、Go这些传统编程语言编写,功能和权限更加强大。由于区块链智能合约在商业上的应用面临法律效力问题,因此现有智能合约一般会在代码中存储一份相应的法律合同文本文件,以应对法律风险。目前,除了法律合同,智能合约已经应用到了更多的场景中,如数字化交易所、供应链、物流等。
随着区块链技术的应用和发展,区块链几大关键技术正在快速演进,如共识算法、智能合约、跨链事务、隐私保护等,与用户最相关的是能为用户带来价值的、运行在区块链之上的智能合约。智能合约可以看作一个跨学科的复合名词,合约取自法律上的合同概念,智能指的是能自动执行的计算机程序,智能合约就是能像计算机程序一样自动执行的法律合同。
智能合约的实现需要底层协议的支持,这个协议需要考虑诸多因素,具体的执行过程也是基于上文提到的脚本执行过程。以比特币脚本为例,可以在脚本语言中嵌入已经达成一致协定的合约语言来进行智能资产的管理,同时来约束参与方的行为。
基于区块链的智能合约需要同时具有事务处理和保存机制,事务处理无须多言,这是智能合约的根本,保存机制可以让智能合约的执行过程有迹可查。类似于一个完备的状态机,状态机的每个状态以及对于特定事件的响应都保存在区块链中。当一个特定时间的触发条件都满足时,该合约就会自动执行。作为一个事务处理模块,本身不会产生额外的智能合约,也不会对其合约语言进行修改,目的只是让一组复杂的、带有触发条件的、达成一致协定的多种事务自动触发执行,其流程可以简单概括为以下几步。
(1)共识:多方用户或机构共同参与完成一个协定。
(2)上链:上述合约以区块链的形式存入区块链并随全网传播。
(3)执行:合约在区块链上执行并记录。
从比特币到以太坊,区块链架构的演变如图1-8所示。
图1-8 从比特币到以太坊,区块链架构的演变
从智能合约的定义以及原理来看,生活中能使用智能合约的案例太多,房租租赁、彩票发行、购买保险、遗嘱的设立等都可以采用智能合约的形式来发布。比如房屋租赁的智能合约,只有当租赁者以某种形式签订了租房合同并且提交了房租,智能合约系统就将入住的一些条件提供给租赁者,比如钥匙之类的。当然,这些实现的前提需要通过互联网工具的辅助。设立遗嘱的过程也类似,立遗嘱者事先设定好遗产分配机制,只要达到条件,遗嘱上的事项就自动执行,这样可以免去很多不必要的纠纷。
诚然,智能合约在具体的实施中还依然存在一些问题和挑战,如安全性问题和意外性问题。安全性问题不仅仅是指智能合约的安全问题,同样也是指整个区块链体系的安全问题,因为智能合约的执行需要借助区块链的执行,而区块链的不可逆特性会在一定程度上影响智能合约的执行,比如一个误操作的损失需要用户自己承担。意外性问题指的是智能合约就是一个状态机系统,而一个复杂的状态机,其触发条件以及人们可以想到的那些事务可能会有缺陷,正如计算机程序语言的bug一样,这些都是在事情发生后才可以去解决的,而这种意外的发生也很难完全避免。