以太坊-挣脱数字货币的枷锁

王越joey
王越joey 热门 2018-03-22 13:33
25 20217
以太坊-挣脱数字货币的枷锁
在区块链领域,以太坊项目也是十分出名的开源项目。作为公有区块链平台,以太坊将比特币针对数字货币交易的功能进一步进行了拓展,面向更为复杂和灵活的应用场景,支持了智能合约(smart contract)这一重要特性。
从此,区块链技术的应用场景,从单一基于UTXO的数字货币交易,延伸到图灵完备的通用计算领域。用户不再受限于仅能使用比特币脚本所支持的简单逻辑,而是可以自行设计任意复杂的合约逻辑。这就为构建各种多样化的上层应用开启了大门,可谓意义重大。
本章将参照比特币项目来介绍以太坊项目的核心概念和改进设计等内容。
一、以太坊项目简介
以太坊(Ethereum)项目的最初目标是打造一个智能合约的平台(Platform for Smart Contract),该平台支持图灵完备的应用,按照智能合约的约定逻辑自动执行,理想情况下将不存在故障停机、审查、欺诈,以及第三方干预等问题。



以太坊平台目前支持Golang、C++、Python等多种语言实现的客户端。由于其核心实现是基于比特币网络的核心思想进行了拓展,因此在很多设计特性上都与比特币网络十分类似。

基于以太坊项目,以太坊团队目前运营了一个公开的区块链平台——以太坊网络。智能合约开发者使用官方提供的工具和以太坊专用应用开发语言Solidity,可以很容易地开发出运行在以太坊网络上的“去中心化”应用(Decentralized Application,DApp)。这些应用将运行在以太坊的虚拟机(Ethereum Virtual Machine,EVM)里。用户通过以太币(Ether)来购买燃料(Gas),维持所部署应用的运行。
以太坊项目的官网网站为ethereum.org,代码托管在github.com/ethereum。
1.1、以太坊项目简史
与比特币网络自2009年上线的历史相比,以太坊项目要年轻得多。
  • 2013年底,比特币开发团队中有一些开发者开始探讨将比特币网络中的核心技术,主要是区块链技术,拓展到更多应用场景的可能性。以太坊的早期发明者Vitalik Buterin提出应该能运行任意形式(图灵完备)的应用程序,而不仅仅是比特币中受限制的简单脚本。该设计思想并未得到比特币社区的支持,后来作为以太坊白皮书发布。
  • 2014年2月,更多开发者(包括Gavin Wood、Jeffrey Wilcke等)加入以太坊项目,并计划在社区开始以众筹形式募集资金,以开发一个运行智能合约的信任平台。
  • 2014年7月,以太币预售,经过42天,总共筹集到价值超过1800万美元的比特币。随后在瑞士成立以太坊基金会,负责对募集到的资金进行管理和运营;并组建研发团队以开源社区形式进行平台开发。
  • 2015年7月底,以太坊第一阶段Frontier正式发布,标志着以太坊区块链网络的正式上线。这一阶段采用类似比特币网络的PoW共识机制,参与节点以矿工挖矿形式维护网络;支持上传智能合约。Frontier版本实现了计划的基本功能,在运行中测试出了一些安全上的漏洞。这一阶段使用者以开发者居多。
  • 2016年3月,第二阶段Homestead开始运行(区块数1150000),主要改善了安全性,同时开始提供图形界面的客户端,提升了易用性,更多用户加入了进来。
  • 2016年6月,DAO基于以太坊平台进行众筹,受到漏洞攻击,造成价值超过5000万美元的以太币被冻结。社区最后通过硬分叉(Hard Fork)进行解决。
  • 2017年3月,以太坊成立以太坊企业级联盟(Enterprise Ethereum Alliance,EEA),联盟成员主要来自摩根大通,微软,芝加哥大学和部分创业企业等。
目前,以太坊网络支持了接近比特币网络的交易量,成为广受关注的公有链项目。
后续按照计划将发布第三阶段Metropolis和第四阶段Serenity,主要特性包括支持PoS股权证明的共识机制,以降低原先PoW机制造成的能耗浪费;以及图形界面的钱包,以提升易用性。
包括DAO在内,以太坊网络已经经历了数次大的硬分叉,注意每次硬分叉后的版本对之前版本并不兼容。
1.2、主要特点
以太坊区块链底层也是一个类似比特币网络的P2P网络平台,智能合约运行在网络中的以太坊虚拟机里。网络自身是公开可接入的,任何人都可以接入并参与网络中数据的维护,提供运行以太坊虚拟机的资源。
与比特币项目相比,以太坊区块链的技术特点主要包括:
  • 支持图灵完备的智能合约,设计了编程语言Solidity和虚拟机EVM;
  • 选用了内存需求较高的哈希函数,避免出现强算力矿机、矿池攻击;
  • 叔块(uncle block)激励机制,降低矿池的优势,并减少了区块产生间隔(10分钟降低到15秒左右);
  • 采用账户系统和世界状态,而不是UTXO,容易支持更复杂的逻辑;
  • 通过Gas限制代码执行指令数,避免循环执行攻击;
  • 支持PoW共识算法,并计划支持效率更高的PoS算法。
此外,开发团队还计划通过分片(sharding)方式来解决网络可扩展性问题。
这些技术特点,解决了比特币网络在运行中被人诟病的一些问题,让以太坊网络具备了更大的应用潜力。
二、核心概念
基于比特币网络的核心思想,以太坊项目提出了许多创新的技术概念,包括智能合约、基于账户的交易、以太币和燃料等。
2.1、智能合约
智能合约(Smart Contract)是以太坊中最为重要的一个概念,即以计算机程序的方式来缔结和运行各种合约。最早在上世纪90年代,Nick Szabo等人就提出过类似的概念,但一直因为缺乏可靠执行智能合约的环境,而被当作一种理论设计。区块链技术的出现,恰好补充了这一缺陷。
以太坊支持通过图灵完备的高级语言(包括Solidity、Serpent、Viper)等来开发智能合约。智能合约作为运行在以太坊虚拟机(Ethereum Virual Machine,EVM)中的应用,可以接受来自外部的交易请求和事件,通过触发运行提前编写好的代码逻辑,进一步生成新的交易和事件,可以进一步调用其他智能合约。
智能合约的执行结果可能对以太坊网络上的账本状态进行更新。这些修改由于经过了以太坊网络中的共识,一旦确认后无法被伪造和篡改。
2.2、账户
在之前的章节中,笔者介绍过比特币在设计中并没有账户(Account)的概念,而是采用了UTXO模型记录整个系统的状态。任何人都可以通过交易历史来推算出用户的余额信息。而以太坊则采用了不同的做法,直接用账户来记录系统状态。每个账户存储余额信息、智能合约代码和内部数据存储等。以太坊支持在不同的账户之间转移数据,以实现更为复杂的逻辑。
具体来看,以太坊账户分为两种类型:合约账户(Contracts Accounts)和外部账户(Externally Owned Accounts,或EOA):
  • 合约账户:存储执行的智能合约代码,只能被外部账户来调用激活;
  • 外部账户:以太币拥有者账户,对应到某公钥。账户包括nonce、balance、storageRoot、codeHash等字段,由个人来控制。
当合约账户被调用时,存储其中的智能合约会在矿工处的虚拟机中自动执行,并消耗一定的燃料。燃料通过外部账户中的以太币进行购买。
2.3、交易
交易(Transaction),在以太坊中是指从一个账户到另一个账户的消息数据。消息数据可以是以太币或者合约执行参数。
以太坊采用交易作为执行操作的最小单位。每个交易包括如下字段:
  • to:目标账户地址;
  • value:可以指定转移的以太币数量;
  • nonce:交易相关的字串;
  • gasPrice:执行交易需要消耗的Gas价格;
  • startgas:交易消耗的最大Gas值;
  • signature:签名信息。
类似于比特币网络,在发送交易时,用户需要缴纳一定的交易费用,通过以太币方式进行支付和消耗。目前,以太坊网络可以支持超过比特币网络的交易速率(可以达到每秒几十笔)。
2.4、以太币
以太币(Ether)是以太坊网络中的货币。
以太币主要用于购买燃料,支付给矿工,以维护以太坊网络运行智能合约的费用。以太币最小单位是wei,一个以太币等于10的18次方个wei。
以太币同样可以通过挖矿来生成,成功生成新区块的以太坊矿工可以获得5个以太币的奖励,以及包含在区块内交易的燃料费用。用户也可以通过交易市场来直接购买以太币。
目前,每年大约可以通过挖矿生成超过一千万个以太币,单个以太币的市场价格超过300美元。
2.5、燃料
燃料(Gas),控制某次交易执行指令的上限。每执行一条合约指令会消耗固定的燃料。当某个交易还未执行结束,而燃料消耗完时,合约执行终止并回滚状态。
Gas可以跟以太币进行兑换。需要注意的是,以太币的价格是波动的,但运行某段智能合约的燃料费用可以是固定的,通过设定Gas价格等进行调节。
三、主要设计
以太坊项目的基本设计与比特币网络类似。为了支持更复杂的智能合约,以太坊在不少地方进行了改进,包括交易模型、共识、对攻击的防护和可扩展性等。
3.1、智能合约相关设计
3.1.1、运行环境
以太坊采用以太坊虚拟机作为智能合约的运行环境。以太坊虚拟机是一个隔离的轻量级虚拟机环境,运行在其中的智能合约代码无法访问本地网络、文件系统或其他进程。
对同一个智能合约来说,往往需要在多个以太坊虚拟机中同时运行多份,以确保整个区块链数据的一致性和高度的容错性。但另一方面,这也限制了整个网络的容量。
3.1.2、开发语言
以太坊为编写智能合约设计了图灵完备的高级编程语言,降低了智能合约开发的难度。目前,Solidity是最常用的以太坊合约编写语言之一。
智能合约编写完毕后,用编译器编译为以太坊虚拟机专用的二进制格式(EVM bytecode),由客户端上传到区块链当中,之后在矿工的以太坊虚拟机中执行。
3.2、交易模型
出于智能合约的便利考虑,以太坊采用了账户的模型,状态可以实时地保存到账户里,而无需像比特币的UXTO模型那样去回溯整个历史。UXTO模型和账户模型的对比如表7-1所示。


表7-1 UXTO模型和账户模型

3.3、共识

以太坊目前采用了基于成熟的PoW共识的变种算法Ethash协议作为共识机制。
为了防止ASIC矿机矿池的算力攻击,跟原始PoW的计算密集型Hash运算不同,Ethash在执行时候需要消耗大量内存,反而跟计算效率关系不大。这意味着很难制造出专门针对Ethash的芯片,即通用机器可能更加有效。
虽然,Ethash对原始的PoW进行了改进,但仍然需要进行大量无效的运算,这也为人们所诟病。
社区已经有计划在未来采用更高效的Proof-of-Stake(PoS)作为共识机制。相对于PoW机制来讲,PoS机制无需消耗大量无用的Hash计算,但其共识过程的复杂度要更高一些,还有待进一步的检验。
3.4、降低攻击
由于以太坊网络中的交易更加多样化,也就更容易受到攻击。
以太坊网络在降低攻击方面的核心设计思想仍然是通过经济激励机制防止少数人作恶:
所有交易都要提供交易费用,避免DDoS攻击;
程序运行指令数通过Gas来限制,所消耗的费用超过设定上限时就会被取消,避免出现恶意合约。
这就确保了攻击者试图消耗网络中虚拟机的计算资源时,需要付出经济代价(支付大量的以太币);同时难以通过构造恶意的循环或不稳定合约代码来对网络造成破坏。
3.5、提高扩展性
可扩展性是以太坊网络承接更多业务量的最大制约。以太坊项目未来希望通过分片(sharding)机制来提高整个网络的扩展性。分片是一组维护和执行同一批智能合约的节点组成的子网络,是整个网络的子集。
支持分片功能之前,以太坊整个网络中的每个节点都需要处理所有的智能合约,这就造成了网络的最大处理能力会受限于单个节点的处理能力。
分片后,同一片内的合约处理是同步的,彼此达成共识,不同分片之间则可以是异步的,可以提高网络整体的可扩展性。
3.4、相关工具
3.4.1、客户端和开发库
以太坊客户端可用于接入以太坊网络,进行账户管理、交易、挖矿、智能合约等各方面操作。
以太坊社区现在提供了多种语言实现的客户端和开发库,支持标准的JSON-RPC协议。用户可根据自己熟悉的开发语言进行选择:
  • go-ethereum:Go语言实现;
  • Parity:Rust语言实现;
  • cpp-ethereum:C++语言实现;
  • ethereumjs-lib:javascript语言实现;
  • Ethereum(J):Java语言实现;
  • ethereumH:Haskell语言实现;
  • pyethapp:Python语言实现;
  • ruby-ethereum:Ruby语言实现。
上述实现中,go-ethereum的独立客户端Geth是最常用的以太坊客户端之一。用户可通过安装Geth来接入以太坊网络并成为一个完整节点。Geth也可作为一个HTTP-RPC服务器,对外暴露JSON-RPC接口,供用户与以太坊网络交互。Geth的使用需要基本的命令行基础,其功能相对完整,源码托管于github.com/ethereum/go-ethereum。
3.4.2、以太坊钱包
对于只需进行账户管理、以太坊转账、DApp使用等基本操作的用户,则可选择直观易用的钱包客户端。
Mist是官方提供的一套包含图形界面的钱包客户端,除了可用于进行交易,也支持直接编写和部署智能合约,如图7-1所示。


图7-1 Mist浏览器

所编写的代码编译发布后,可以部署到区块链上。使用者可通过发送调用相应合约方法的交易来执行智能合约。

3.4.3、IDE
对于开发者,以太坊社区涌现出了许多服务于编写智能合约和DApp的IDE,例如:
  • Truffle:功能丰富的以太坊应用开发环境;
  • Embark:DApp开发框架,支持集成以太坊、IPFS等;
  • Remix:用于编写Solidity的IDE,内置调试器和测试环境。
3.4.4、网站资源
已有一些网站提供对以太坊网络的数据、运行在以太坊上的DApp等信息进行查看,例如:
  • ethstats.net:实时查看网络的信息,如区块、价格、交易数等;
  • ethernodes.org:显示整个网络的历史统计信息,如客户端的分布情况等;
  • dapps.ethercasts.com:查看运行在以太坊上的DApp的信息,包括简介、所处阶段和状态等。
四、小结
以太坊项目将区块链技术在数字货币的基础上进行了延伸,提出了打造更为通用的智能合约平台的宏大构想,并基于开源技术构建了以太坊为核心的开源生态系统。
本章内容介绍了以太坊的相关知识,包括核心概念、设计、工具等。
比照比特币项目,可以掌握以太坊的相关改进设计,并学习智能合约的编写。实际上,智能合约并不是一个新兴概念,但区块链技术的出现为智能合约的“代码即律法”提供提供了信任基础和实施架构。通过引入智能合约,区块链技术释放了支持更多应用领域的巨大潜力。
25条回应 最新 最早
凤飞飞
沙发# 凤飞飞 2018-03-22 13:34
随着人们对加密数字货币和区块链初创公司的投入越来越大,上周比特币价格再次创下了18000美元的记录。但尽管如此,区块链技术依然没有在很多大型项目上普及应用。
邓克
板凳# 邓克 2018-03-22 13:40
比特币大涨出现在股市上扬、利率仍处低位、全球经济增长信心持续增强的背景之下。换句话说,市场上存在让投资者追逐新的热门资产的条件。
傾晴
地板# 傾晴 一级码农 2018-03-22 13:45
大赞!整理这个真的很不容易 受益匪浅!
张瀚文
4楼# 张瀚文 2018-03-22 13:45
令人脑洞大开的好文,认真阅读。
淺草一一
5楼# 淺草一一 2018-03-22 13:45
多中心化只是表像,竞争的无门槛,生态圈能动态自调整并始终达到力量(能量)的恐怖平衡,这才是去中心化。所谓比特币算力集中只是个伪命题,迄今为止比特币还是去中心化程序最高的。
曾欣
6楼# 曾欣 2018-03-22 13:51
区块链应用场景很多。
永别
7楼# 永别 2018-03-22 13:59
好文章,解了我的迷惑,期待下文!
馬旭剛
8楼# 馬旭剛 2018-03-22 14:11
比特币也是一种科技产品,它的上涨出现在科技股引领市场走高之际。对比特币的兴趣增长吸引了投资界的广泛关注,进而吸引了华尔街的目光。
lixue
9楼# lixue 2018-03-22 15:13
这说明区块链产业生态复杂性,除了加密货币本身之外,各种的交易和服务也是难以找现实世界很明确对应的归口管理机构,因为虚拟世界的规则与实体世界存在很大的不同…
付锦斌
10楼# 付锦斌 2018-03-22 15:17
币圈意见分裂导致比特币分叉,却得出比特币去中心化已经失败的结论? 无论是Segwit2x还是BCC,推动者绝非所谓“关心的主要是人民币回报”的大资金,而是切身利益与比特币发展休戚相关的从业者。 另外,这次分叉并非矿工不顾用户一意孤行的后果,BCC也是有相当数量用户支持的。
陌影
11楼# 陌影 2018-03-22 15:30
比特币作为一种支付方式也仍然存在疑问。尽管一些企业接受比特币,但很少有交易是以比特币支付的。比特币最终会不会成为一种类似于数字黄金的价值储存手段,或一种支付方式。尽管如此,比特币仍是2017年表现最好的金融资产,已大涨逾1500%。
彦子
12楼# 彦子 2018-03-22 15:59
区块链也许在某些面向企业的场景相比传统技术具有颠覆性。
杜毛毛
13楼# 杜毛毛 2018-03-22 16:35
合理的对区块链进行认知,将一个崭新的技术领域更好的进行应用,推动区块链金融的全球化,成为每一个行业从业者要去认真思考的一个问题。
彩
14楼# 2018-03-22 16:40
大赞!整理这个真的很不容易 受益匪浅!
1
游客
登录后才可以回帖,登录 或者 注册