1.2 以太坊设计思路与特色技术
随着比特币开始受到开发者等技术人员更多的关注,一些利用比特币网络实现不同于比特币逻辑的代币交易,或者除代币之外其他数字资产交易的新项目开始出现。由于比特币不太灵活,这些项目大多基于比特币系统做了一些改变,添加了一些新的特征和功能,然后独立地运行在不同的节点上。或者说,每一个新项目都要重复、独立地建立一个类似比特币的系统。能不能设计一个更通用的系统呢?通过应用层的编写,让不同的数字资产运行在统一的平台之上?以太坊的发明者Vitalik Buterin就在思考这个问题。
1.以太坊的诞生
在2013年下半年,Vitalik Buterin(当时他才19岁)提出了“以太坊”的概念——一种能够被重编程用以实现任意复杂计算功能的单一区块链,这种新的区块链包含了之前众多区块链项目的大多数特征。2014年,以太坊基金会成立,Vitalik Buterin、Gavin Wood和Jeffrey Wilcke创建了以太坊项目,作为下一代区块链系统。今天,以太坊作为全球最为知名的公有区块链项目之一,同时拥有全球最大的区块链开源社区。简单地说,以太坊是一个有智能合约(Smart Contract)功能的公共区块链平台。用智能手机打个比方,如果说以太坊是智能手机的操作系统,那么智能合约就是上面搭载的应用(App)。有了以太坊,用户可以直接开发自己的区块链应用,而无须担心底层的区块链系统。到目前为止,以太坊上有880多个应用。
2.以太坊与比特币的异同
与比特币类似,以太坊是一个去中心化的区块链平台。在这个区块链平台上有众多节点参与,它们组成了一个P2P网络,这些节点彼此平等,没有任何一个节点有特殊的权限,也不存在由一个或多个节点进行协调或调度。以太坊网络中的各个节点都可以发出“交易”,也可以进行“记账”,即记录并执行网络上发出的“交易”。这些交易会被节点打包成一个个“区块”,其中每个区块包含上一个区块的索引,因此这些区块依次相连接,形成一条区块链。如上文所述,这些节点之间通过共识机制以达成数据一致性,从而形成一个整体。早期版本的以太坊像比特币一样使用“工作量证明”(Proof of Work, PoW)这种共识机制来保证一致性。
以太坊与比特币不同的地方有很多,从性能表现以及特性上来看,主要有以下几点区别。
□ 以太坊有更快的“出块”速度以及更先进的奖励机制。目前,比特币的出块时间平均为10min,而以太坊的出块间隔为12s,这意味着以太坊具有更大的系统吞吐量和更小的交易确认间隔。
□ 以太坊支持智能合约,用户可以自己定义数字资产和流通的逻辑,通过以太坊虚拟机几乎可以执行任何计算,而比特币只能支持比特币的转账。这一点意味着以太坊可以作为更通用的区块链平台,支持各种去中心化应用(DApp)。
另外,以太坊的社区更加活跃。显然,不像比特币一样满足于虚拟货币,以太坊积极地探索新技术,不断地对系统升级更新。而且其相关技术生态更加完善,在Ethereum官方的GitHub上有147个项目,其中不仅有各种不同语言版本的客户端,还有智能合约编译器、集成开发环境,以及未来将要采用的“股权证明”(Proof of Stake, PoS)协议和各种技术文档。
3.以太坊的特色技术
如上文所述,以太坊是一个可编程的区块链。形象一点地理解,在以太坊区块链上发送的交易不仅仅可以是转账金额,还可以是调用一段代码,而该代码可以由用户自定义。因此可以想象,在以太坊区块链上处理的交易逻辑不再是单一的转账,而可能是任意的函数调用;记录在区块链账本里的不仅仅是账户余额,还有函数调用后变量的新状态。因为代码可以任意定义,所以应用就都可以在区块链上运行了。
支持用户在以太坊网络中创建并调用一些复杂的逻辑,这是以太坊区别于比特币区块链技术最大的挑战。以太坊作为一个可编程区块链的核心是以太坊虚拟机(EVM)。每个以太坊节点都运行着EVM。EVM是一个图灵完备的虚拟机,这意味着通过它可以实现各种复杂的逻辑。用户在以太坊网络中发布或者调用的“智能合约”就是运行在EVM上的。智能合约和EVM将在第4章介绍。
所谓智能合约其实就是一段EVM可执行的代码,熟悉面向对象编程的读者可以将一个智能合约实例理解成一个对象。简单来说,用户编写一个智能合约类似于编写一个类,其可以在这个类里定义各种变量以及函数。当用户将这个智能合约发布到以太坊网络中时,相当于给这个类生成一个对象,合约发布之后用户会得到一个合约地址,相当于合约对象的指针。当网络中的用户调用这个智能合约时,可以直接给这个合约地址发送“交易”,并声明本次调用的函数名称和参数,使得智能合约执行对应的逻辑。无论发布还是调用智能合约,智能合约的信息都被附在“交易”中,以交易的形式发布到网络中。因此以太坊网络中的节点接收到这些交易后,其中的EVM会执行对应的合约代码,最后各个节点通过PoW或PoS等达成共识,合约的内容和状态也就实现了全网一致。
这里给出一个简单的例子。下面这段代码就是一个智能合约SimpleStorage,里面只有一个变量storedData,以及set和get方法,有编程基础的读者可以很轻松地理解。
contract SimpleStorage { string storedData; function set(string s) { storedData = s; } function get() constant returns (string) { return storedData; } }
图1-4展示了在以太坊网络中创建智能合约的过程。当Bob将一个包含智能合约信息(如上例代码)的交易发送到以太坊网络中后,节点的EVM执行这个交易并生成对应的合约实例,图中的“0x6f8ae93.. ”代表了这个合约的地址。节点间通过共识机制达成一致后,这个合约就正式生效了,之后用户就可以调用SimpleStorage合约了。
图1-4 以太坊上智能合约的创建
图1-5展示了在以太坊上调用智能合约的过程。Bob同样以交易的形式在“To”字段填上SimpleStorage合约的地址,在“Data”字段填上调用的方法(set)和参数(“Hello”),就可以调用智能合约SimpleStorage,将其中的storedData设为“Hello”。节点收到这条交易后,通过EVM执行对应的操作,并通过共识机制实现以太坊网络上合约状态的改变。之后,当Alice查看这个合约的变量时,就会发现这个合约中storedData变量的值变成了“Hello”。由于查看的过程不涉及状态的修改,而且以太坊上数据是分布式的,网络中的每个节点都可以在本地保存一份完整的数据,因此Alice可以不通过交易的形式查看到这个变量的值。
图1-5 以太坊上智能合约的调用
通过这个例子,可以理解如何在以太坊区块链上创建和运行一段代码以及代码变量的存储。在实际应用中,合作的几家机构可以用这段代码定义商业运作的规则,区块链作为执行规则的平台不为某个个体的意志所左右,公开公正地执行和记录代码的逻辑和数据,减少了机构合作中的摩擦和成本。