Skip to content

什么是以太坊

什么是以太坊

随着比特币开始受到开发者等技术人员更多的关注,一些利用比特币网络实现不同于比特币逻辑的代币交易,或者除代币之外其他数字资产交易的新项目开始出现。由于比特币不太灵活,这些项目大多基于比特币系统做了一些改变,添加了一些新的特征和功能,然后独立地运行在不同的节点上。或者说,每一个新项目都要重复、独立地建立一个类似比特币的系统。

能不能设计一个更通用的系统呢?通过应用层的编写,让不同的数字资产运行在统一的平台之上?以太坊的发明者Vitalik Buterin就在思考这个问题。

以太坊的出现

  • 2014 年1月, Vitalik Buterin在自己任编辑的比特币杂志(Bitcoin Magazine)上发表了《以太坊:一个下一代智能合约和去中心化应用平台》(Ethereum: A Next-Generation Smart Contract and Decentralized Application Platform)
  • 2014年的迈阿密比特币会议中,布特林宣布了以太坊项目,并且提出了多项创新性区块链技术,该年7月,启动以太坊众筹募资,募得3.1万枚比特币(当时约合1840万美元)
  • 2015年7月30日,当时作为以太坊项目CCO的成员Stephan Tual在官方博客上正式宣布了以太坊系统的诞生,以太坊主网上线。

以太坊与比特币的异同

与比特币类似,以太坊是一个去中心化的区块链平台。在这个区块链平台上有众多节点参与,它们组成了一个P2P网络,这些节点彼此平等,没有任何一个节点有特殊的权限,也不存在由一个或多个节点进行协调或调度。以太坊网络中的各个节点都可以发出交易,也可以进行记账,即记录并执行网络上发出的交易。这些交易会被节点打包成一个个区块,其中每个区块包含上一个区块的索引,因此这些区块依次相连接,形成一条区块链。如上文所述,这些节点之间通过共识机制以达成数据一致性,从而形成一个整体。早期版本的以太坊像比特币一样使用工作量证明(Proof of Work,PoW)这种共识机制来保证一致性。

以太坊与比特币不同的地方有很多,从性能表现以及特性上来看,主要有以下几点区别。

  • 以太坊有更快的出块速度以及更先进的奖励机制。目前,比特币的出块时间平均为10min,而以太坊的出块间隔为12s,这意味着以太坊具有更大的系统吞吐量和更小的交易确认间隔。
  • 以太坊支持智能合约,用户可以自己定义数字资产和流通的逻辑,通过以太坊虚拟机几乎可以执行任何计算,而比特币只能支持比特币的转账。这一点意味着以太坊可以作为更通用的区块链平台,支持各种去中心化应用(DApp)。

另外,以太坊的社区更加活跃。显然,不像比特币一样满足于虚拟货币,以太坊积极地探索新技术,不断地对系统升级更新。而且其相关技术生态更加完善,在Ethereum官方的GitHub上有147个项目,其中不仅有各种不同语言版本的客户端,还有智能合约编译器、集成开发环境,以及未来将要采用的股权证明(Proof of Stake,PoS)协议和各种技术文档。

以太坊的特色技术

如上文所述,以太坊是一个可编程的区块链。形象一点地理解,在以太坊区块链上发送的交易不仅仅可以是转账金额,还可以是调用一段代码,而该代码可以由用户自定义。

因此可以想象,在以太坊区块链上处理的交易逻辑不再是单一的转账,而可能是任意的函数调用;记录在区块链账本里的不仅仅是账户余额,还有函数调用后变量的新状态。因为代码可以任意定义,所以应用就都可以在区块链上运行了。

支持用户在以太坊网络中创建并调用一些复杂的逻辑,这是以太坊区别于比特币区块链技术最大的挑战。以太坊作为一个可编程区块链的核心是以太坊虚拟机(EVM)。每个以太坊节点都运行着EVM。EVM是一个图灵完备的虚拟机,这意味着通过它可以实现各种复杂的逻辑。用户在以太坊网络中发布或者调用的智能合约就是运行在EVM上的。

所谓智能合约其实就是一段EVM可执行的代码,熟悉面向对象编程的读者可以将一个智能合约实例理解成一个对象。简单来说,用户编写一个智能合约类似于编写一个类,其可以在这个类里定义各种变量以及函数。当用户将这个智能合约发布到以太坊网络中时,相当于给这个类生成一个对象,合约发布之后用户会得到一个合约地址,相当于合约对象的指针。当网络中的用户调用这个智能合约时,可以直接给这个合约地址发送交易,并声明本次调用的函数名称和参数,使得智能合约执行对应的逻辑。无论发布还是调用智能 合约,智能合约的信息都被附在交易中,以交易的形式发布到网络中。因此以太坊网络中的节点接收到这些交易后,其中的EVM会执行对应的合约代码,最后各个节点通过PoW或PoS等达成共识,合约的内容和状态也就实现了全网一致。

这里给出一个简单的例子。下面这段代码就是一个智能合约SimpleStorage,里面只有一个变量storedData,以及set和get方法。

solidity
contract simplestorage{
    string storedData;

    function set(string s){
        storedData = s;
    }
    
    function get()constant returns (string){
        return storedData;
    }
}

An image

上图展示,在以太坊网络中创建智能合约的过程。当Bob将一个包含智能合约信息(如上例代码)的交易发送到以太坊网络中后,节点的EVM执行这个交易并生成对应的合约实例,图中的0x6f8ae93...代表了这个合约的地址。节点间通过共识机制达成一致后,这个合约就正式生效了,之后用户就可以调用SimpleStorage合约了。

An image

上图展示,在以太坊上调用智能合约的过程。Bob同样以交易的形式在To字段填上SimpleStorage合约的地址,在Data字段填上调用的方法(set)和参数(Hello),就可以调用智能合约SimpleStorage,将其中的storedData设为Hello。节点收到这条交易后,通过EVM执行对应的操作,并通过共识机制实现以太坊网络上合约状态的改变。之后,当Alice查看这个合约的变量时,就会发现这个合约中storedData变量的值变成了Hello

由于查看的过程不涉及状态的修改,而且以太坊上数据是分布式的,网络中的每个节点都可以在本地保存一份完整的数据,因此Alice可以不通过交易的形式查看到这个变量的值。

以太坊的应用场景

不是所有的应用场景都必须用区块链解决,那么什么样的应用适用以太坊区块链呢?

区块链上的应用需要是跨越组织边界的,也就是说,在区块链上存储流通的资产(数据)的所有权是属于多个机构的。那么用区块链可解决机构间信任问题,减少摩擦,进而减少成本。这里将应用场景分为如下三大类。

时间戳和溯源

由于区块链上数据区块是持续增长且不可篡改的,所以历史上某个时间发生的事情可以从区块链上得到证明。例如,报纸有一定发行量,很多人手里都有一份,即使撕毁你自己的一份,别人手里还有另一份。通常我们也会用旧报纸上的信息来证明当时发生的事情。区块链的作用与之类似。

如果在区块的交易列表中查找到历史某一时刻记录的交易内容Hello,则可以证明该交易发生在区块所代表的时间片段。每个时间点都能得到证明,因此一个事件的来龙去脉就可以得到证明(溯源)。因此,很多应用,如食品的处理、加工、运输流程可以在区块链历史数据上进行验证,再如将证书、资格认证一类的数据记录在区块链上也可以证明自己的资历。

数字资产的发行和流通

在以太坊区块链网络,用户可以定义自己的数字资产(虚拟货币、积分、权限等),这些资产可以在以太坊用户之间自如地按照应用定义的规则来转移和流通。

资产与资产之间也可以通过定义来进行流通。区块链使得组织、个体、数字资产间的流动性变得可行和可靠。该类的应用包括:商家联盟的积分兑换、游戏代币转移、IoT设备之间的权限转移等。

形象地来理解,如在腾讯平台上可以用Q币买东西、玩游戏,Q币也可以在腾讯的用户之间流通,但是Q币无法与支付宝进行流通,因为这两家机构没有建立流通渠道。即使某种应用中两家机构建立了资产流通的渠道,仍然存在难题一这个流通过程中的账本记在谁家?这里只是两家,如果是100家积分共享的应用,这个账本的设计和部署将更加有挑战。而在区块链上的数字资产,比如以太坊上的资产在统一标准(如ERC20标准)下都可以自由地在以太坊用户地址中流通,且流通的记录公开透明。

跨组织的数据共享

An image

如上图冷链物流的例子。将牛奶从牧场运输到零售商,中间经过食品处理和仓库中转,并由两家物流公司共同完成运送。因为是运输牛奶,为了保持新鲜,需要确保在整个运输过程中牛奶的温度低于8℃,湿度大于60%。我们可以将牛奶放在IoT智能设备运输箱里面,该设备可以报告温度和湿度。假设当物流公司运送到零售商的时候,发现温度为10℃,高于保鲜要求的8℃,物流公司2会被惩罚。在这个例子中先不考虑区块链的解决方案,我们使用传统解决方案,如何部署数据库呢?由于有两家物流公司合作运输,数据库放在哪一家公司我们都无法保证完全信任该公司对数据的记录。因此,大家各自记录数据,结果很难实现数据统一和实时更新。有了区块链技术,企业将各自节点加入区块链网络。我们可以把牛奶温度和湿度的要求定义在智能合约中,IoT设备定时将温度和湿度数据以交易的形式发送到区块链的该合约中,交易的签名由IoT设备来完成,防止人为伪造。当温度超过8℃时,合约对物流公司2的扣款(事先把押金付给合约)将自动完成,没有纠纷。所有机构在权限范围内都可以看到物流的状态。在这里,我们看到区块链是一个可信的、大家共同拥有数据的账本(数据库)。类似的应用还有信用管理、评价、保险等。

以太坊的主流开源项目

以太坊作为一个由全世界区块链爱好者共同开发的开放式区块链平台,目前有许多与之相关的开源项目,本节将介绍几类主流的开源项目,包括多种语言版本的以太坊客户端、以太坊浏览器和拓展工具,以及以太坊开发工具等。

以太坊客户端

目前,以太坊协议及其客户端有多种语言版本的实现,其中最受欢迎的包括Go-ethereum、CPP-ethereum、Parity和Pyethapp等,这些开源项目均可在以太坊的官方GitHub目录下找到。

  • Go-ethereum:以太坊协议Go语言实现的版本,既包括了一个独立的以太坊客户端,也可作为一个Go版本的以太坊库被调用。Go-ethereum客户端又称Geth,是目前使用最为广泛的以太坊客户端。
  • CPP-ethereum:以太坊协议C++语言实现的版本,也是目前最受欢迎的以太坊客户端之一。CPP-ethereum的最大特点是可移植性强,适用于Windows、Linux和OSX等各个版本的操作系统以及多种硬件平台。
  • Parity:以太坊协议Rust语言实现的版本。Parity客户端实现了以太坊钱包功能,可用于创建和管理以太坊账户,管理账户中的以太币和各种代币以及创建智能合约等。
  • Pyethapp:以太坊协议Python语言实现的版本,其主要特点为创建了一个易扩展的以太坊核心代码版本。

以太坊浏览器和折展工具

  • Mist:由以太坊官方开发的工具,用于浏览各类DApp项目。
  • MetaMask:一个用于接入以太坊去中心化网络的浏览器插件,目前适用于Chrome和Brave浏览器。用户无需在本地安装运行以太坊节点,只需通过MetaMask便可在浏览器上连接以太坊网络,运行以太坊DApp。

以太坊开发工具

  • Web3js:一个兼容了以太坊核心功能的JavaScript库,为以太坊客户端及DApp提供了一系列以太坊功能调用的JavaScript API接口。
  • Remix:又称为Browser--Solidity,是一个基于网页浏览器的Solidity IDE和编译器。Remix网页终端整合了Solidity代码的编写、调试和运行等功能,为用户提供了开发以太坊智能合约的综合环境。
  • Truffle:一套针对以太坊DApp的开发框架,本身是基于Node.js编写的。Truffle框架对Solidity智能合约的开发、测试、部署等进行全流程管理,帮助开发者更专业地开发以太坊DApp。
  • ENS-registrar:以太坊域名服务(Ethereum Name Service,ENS)是为以太坊账户提供简单、易记域名的服务,类似于互联网的DNS。ENS-registrar是一个基于以太坊的开源DApP项目,在以太坊区块链上为以太坊账户提供域名注册服务。