【涨姿势】从何而来:以太坊的诞生日记

  将区块链网络平台想象成一个大型商场,而去中心化的应用就是这个商场里的商店。在这种模式中,商店只需要关心自己的运营,不需要考虑比如商场的维护,如水电、物业等内容。对于商场来说,通过提供一些基本的服务能够获得回报,而不需要担心具体商店的管理。

  而在区块链网络平台中,对于区块链的维护指的是保证区块链的唯一性(共识机制)、安全性(不可篡改)、分布式结构以及对区块链的治理等内容。在这样的平台上,对于开发者来说,开发一个新的去中心化应用就不再需要从头考虑区块链的结构设计,而只需要专注于应用程序的开发。这种模式正是亚当·斯密在其《国富论》中所倡导的社会分工,分工能够极大程度地促进各方以及整个经济系统的效率。

  其实我们当前社会的经济运行许多方面都是这样的模式。拿我们最熟悉的手机来说。目前主流的智能手机操作系统有两个,一个是谷歌公司的安卓(Android),另一个是苹果公司的iOS。在这两个系统中都存在着应用商店,有意向开发新的手机应用程序的开发者都能够参与,在这两个平台上专注于应用程序的开发,而不需要考虑安卓或iOS系统的维护。

  所以从这个角度来说,在应用程序领域,区块链技术只是这种分工模式的一次升级。在传统的模式中,无论是平台或是在平台上提供的服务,二者都是中心化的,信息是非对称的。还是拿手机操作系统来举例,负责维护iOS系统的是苹果公司,对于iOS系统的更新,规则都是苹果公司制定的,用户使用操作系统产生的信息也都是由苹果公司储存、处理。用户不知道自己的信息是被如何使用的,不知道是否遭到泄露等。另外一点就是,由于是中心化的储存方式,一旦储存用户信息的设备出现了问题,例如遭到的攻击,那么也将损害用户的利益。同理,用户对于平台上应用程序的使用产生的信息、数据也都以中心化的方式受到应用程序的开发者控制。而利用区块链技术后,理论上这些问题都能够被解决。

  假设有一个村落,这个村落中并不存在货币。对于村落中的交易活动,村民使用这样的方式进行:对于每隔一段时间内出现的所有交易信息,村落中有一个广播能够将这个信息传达到每一个村民耳中,然后村民将这笔信息记录到自己的账本中。这样在理想情况下,每个村民的账本都应该是一模一样的。在非理想情况下时,比如村民对于某笔交易信息私自在自己的账本上篡改,使得所有账本并不是一模一样的。这时候就采取少数服从多数的原则,因为在大多数人账本是另外一个版本,因而这个私自篡改版本的账本就是无效的。这唯一能够对账本进行作假的办法是将村落中每一个村民的账本都做相同的修改,如果这个村落的村民数量众多,这种情况很明显是不现实的。

  这样在理想情况下账本只有唯一的版本,在非理想情况下采用少数服从多数原则,也会有一个大多数村民一样版本的账本,这样一个唯一版本的账本被称为公共账本。这个公共账本有着这样的特点:

  在理解了上面的例子后,我们将村民称作节点,将每隔一段时间内出现的交易信息成为区块,而每个村民版本一致的公共账本就可以理解为区块链。

  由于采用了区块链技术,使得在区块链网络平台上开发的应用程序也具有去中心化的特点。因而这种应用程序被称作去中心化应用(Decentralized applications,DAPPs)。

  了解了区块链网络平台的基本概念后,本系列文章将对区块链网络平台发展的现状、存在问题以及各个平台的特点进行介绍。一般来说,我们将比特币称为区块链1.0,将以太坊称为区块链2.0,而针对以太坊中存在的问题提出解决方案的区块链网络平台称为区块链3.0,具体包括EOS、DFINITY以及Cosmos等。本文主要介绍以太坊,解释区块链2.0以太坊是如何在区块链1.0比特币基础上诞生的。

  要注意的是,由于这些平台的设计或多或少会涉及到一些专业知识,本系列文章将试图用最浅显易懂的方式向读者解释,而这样的方式非常容易造成在表述方面的不严谨性,但是文章仅仅是为了向读者解释这些技术的原理。对其技术细节有兴趣的读者可以查阅相关资料,或者直接与作者联系探讨。

  以太坊(Ethereum)是现阶段发展相对最为成熟,并且已经存在开发的应用程序能为用户提供服务的区块链网络平台。

  以太坊的诞生背后其实还有一个小插曲。我们知道比特币是利用区块链设计的一个价值交换网络,用户可以利用比特币网络交易比特币。在比特币区块链中,只能(只能的说法其实不严谨,比特币区块中还可以加入非常少的信息,比如一句话)记录交易信息,因而其并不能作为基础平台为应用程序的开发提供服务。以太坊的创始人VitalikButerin看到了区块链技术的潜力以及比特币网络中的局限性,曾经提议比特币核心团队增加比特币网络的功能,但是遭到了拒绝。所以他就选择了自己开发一个平台来实现自己的目的。这个平台就是以太坊。

  以太坊与比特币最大的区别在于区块链上记录的信息。除了交易信息之外,VitalikButerin提出在区块链中还可以记录智能合约(Smart contract),以实现更复杂的功能。关于智能合约最简单直白的理解就是现实中合约的电子化。但是很显然,这样理解是很粗糙的。我们这里用一个简单的例子来说明。

  假设A和B打赌,如果未来一周北京下雨的话,A给B十元钱,如果没有下雨的话,B给A十元钱。用智能合约来处理这个赌约,将赌约的内容确定之后,A和B利用自己的以太坊账户,分别向智能合约中转入十元钱(智能合约中也存在账户),然后智能合约将这二十元锁定。等到一周后,如果北京在这一周下了雨,智能合约就将这二十元转入B的账户,如果没有,则转入A的账户。

  这里由于智能合约是储存在以太坊区块链中,一旦确定就没有任意一方能够对其进行修改。这里需要注意的一点是,以太坊是一个封闭的系统,智能合约是不能自己执行的,读取现实世界中的信息(是否下雨)通过一个叫做Oracle的服务机制。这个服务能够将现实中的信息传入以太坊网络,并将信息作为智能合约触发条件,执行智能合约(赌约)。当然这个例子非常简单,但是当智能合约能够实现的功能也就更加多样化。

  所以以太坊在比特币的基础上,加入了智能合约的特性,将利用以太坊开发的应用程序所能实现的功能,仅受编写智能合约开发应用程序人员的想象力(当然这也只是理想情况下的说法,实际上开发者还受到诸多限制)限制。

  上面说到,在以太坊的区块链中是可以储存智能合约的。以太坊上的账户分为两种,外部账户和合约。外部账户由用户控制,用户可以在外部账户中储存自己的以太坊代币:以太币。用户可以利用外部账户发送或者接收消息,这个消息包括以太币转账。合约由用户编写,一旦发布后,就不再受单独用户控制,而是永久储存在以太坊区块链中。合约中包含合约的内容以及合约账户余额。合约只对接收到的消息作出反应,正如上面例子中,合约一旦收到赌期内北京是否下雨的结果后便自动执行,将结果发送给相应的外部账户,完成转账。

  以太坊上的所有应用程序的运行都是由这两种账户驱使的,外部账户可以向合约发送消息,以触发合约执行;也可以向其他外部账户发送消息,这时候只能完成转账(以太币)操作。对于合约来说,并不受人控制,也不能自我执行。合约的执行依靠接收到的消息触发,其执行结果有两个方向,一个通向外部账户,如果是外部账户的话,便执行相应的转账操作(如我们上面的例子中将智能合约中的20元转到赢家账户)另一个方向是通向另一个智能合约,其方式是通过可以产生一个新的消息,然后触发下一个智能合约。

  在我们假设的村落的例子中,我们说每隔一段时间产生的交易信息都会通过广播传到每一个村民耳中,然后村民再记录到自己账本中。但是事实上在区块链中并不是这么简单。在区块链中,一个节点接收到一笔交易信息后,这个节点会将这个交易信息广播给其他节点。但是区块链中的节点可能分布于全世界的任意一个角落,这就要考虑到节点之间的通讯问题,某些节点可能由于网络延迟等因素,没有收到某些交易信息,那么就会导致不同节点在同样一段时间内计划打包记录到区块链中的交易信息是不一样的。那这种情况出现的时候,以哪一个节点的记录为准呢?

  这就自然衍生出一个记账权的问题。在传统的情况下,存在一个权力中心点,所有的节点都听从中心点的指挥。但是我们说过,区块链最大的特点之一就是去中心化,也就是各个节点都有发言权,不存在权力中心。这时候就需要一种“绝对公平”的机制来产生一个记账员,所有的节点都在每一轮都以记账员记录的交易信息为标准。

  而解决这个记账员问题的办法有很多,以太坊采用的方式和比特币是一致的,都是工作量证明(Proof of work)机制。工作量证明机制指各个节点通过自己为解决这个问题“付出了多少努力”来决定谁是记账员。用简单的话说,在每一轮中,存在着一个没有任何人知道的数字,各个节点需要“猜”出这个数字是多少,第一个猜出这个数字的人,就获得本轮记账的权力。每一轮的数字都是不一样的,没有人能够提前知道这个数字是多少,并且猜出这个这个数字的难度非常大。各个节点解出这个数字是多少的办法除了一个一个去尝试之外,没有任何捷径。这样的机制对于每个节点来说就是“绝对公平”的。而作为花费努力的回报,每一轮的记账员都能够获得一定数量的代币奖励。值得注意的一点是,这样的说法是为了读者理解这种机制,事实上的机制设计到密码学的知识,这里就暂时不展开了。

  第一,我们上面说到需要得到共识是因为节点之间存在网络延迟,导致每个人在一段时间内获得的交易信息不同。事实上更重要的是,我们需要考虑到“坏人”的存在,比如在村落的例子中,由于假设不存在货币,一个村民可能“信口开河”。在公共账本(也就是所有村民的共识)中,这个村民只有100元,但是他/她可能对不同的村民说自己有100元,然后在一个村民那里定了100元的食物,同时又在另一个村民那里定了100元的衣服。这时候看到不同交易的村民就可能在自己的账本中记录不同的交易。这个问题就是“双花(Double spending)”。通过这个记账权争夺,我们能够保证一笔钱最终被所有村民承认的交易活动只有一种。

  第二,这样在一个分布式的网络中,在可能存在“坏人”存在的情况下,各个节点达成共识的问题被称为“拜占庭将军问题(Byzantine general problem)”。而在这种不可靠的系统中达成一个可靠的共识的机制/算法就被称为“拜占庭容错(Byzantine faulty tolerant)”。

  第三,上问提到的“绝对公平”是有引号的,这是因为不同节点用于猜测每一轮的随机数的设备不同,使得拥有设备最好的节点获得记账权的机会也就越大,如果当绝大部分的机会都被一个节点占据了,那这个去中心化也就没有那么 “去中心化”了。

  第四,关于解决记账权问题的共识机制有很多,一般分为三类:除了比特币和以太坊中的工作量证明,还有权益证明(Proof of stake)以及代理权益证明(Delegate proof of stake)。关于这部分内容,我们以后再详细介绍。

  在共识机制中我们说到,作为争夺记账权而耗费的努力的补偿,每一轮的记账员都能够获得一定数量的代币奖励。那节点获得的代币奖励有什么用处呢?如果这个虚拟的代币奖励没有实际的效用,节点便不会为了代币去努力争夺记账权而维持每一轮的交易信息共识。

  在账户中,我们提到了以太坊中合约实际上也是一种账户类型。用户编写好智能合约后,将其发布到区块链网络中,由共识机制来将这个智能合约放入到区块链中。但是当这个智能合约在实际执行的时候,需要耗费一定数量的燃料。也就是说智能合约的执行并不是免费的,如果是转账的合约,那么用户需要为这个转账付出一定数量的手续费。当智能合约跨越了转账的范畴,比如某一个开发者通过编写智能合约,开发了一个应用程序为用户提供服务。那么这个应用程序在以太坊网络上运行的时候需要支付燃料费。

  而这个燃料费与节点争夺记账权获得的奖励一样,都是代币。这样对于代币的需求便产生了,供给与需求机制一起便能够决定代币的市场价值。所以,如果利用以太坊网络平台开发的应用程序越多时,应用程序执行变会增大对燃料的需求,从而提升代币的价值。所以从这个角度来说,以太坊以及其他的区块链网络平台都是在试图建立一个完整的经济系统。

  通过以上的介绍,我们知道了比特币是依托着区块链技术建立的一种价值转移系统,在比特币系统中,各个节点能够通过比特币区块链完成转账交易。而以太坊将这个转账交易升级为智能合约处理,在包括了转账交易功能的同时,还加入了智能合约的成分,使得以太坊能够实现由智能合约决定的更复杂的功能。

分享: