以太坊 协议协议的本质是什么?

关注加密货币的人一定会注意箌最近频频出现的一个词DeFi。

DeFi即开放金融,其中最具代表性的就是去中心化借贷平台MakerDAO及其稳定币Dai的展露头脚

然而,Dai不过是这个不断增长嘚开放金融生态系统中的冰山一角

以太坊 协议的扩容虽然举步维艰,但另外一股搭建在以太坊 协议上的新势力开始初见端倪从借贷协議、债券通证、加密货币衍生品到去中心化交易所,我们看到DeFi生态正在崛起逐渐演变成为一股不可阻挡的新势力。

DeFi即去中心化金融,吔称作是开放金融

它的定义是,“一个建立在无需许可的区块链、点对点协议和去中心化网络上由去中心化应用所组成的生态系统,主要用于促成借贷行为或金融交易”

所谓去中心化金融,其实是相对于传统的中心化金融而言的

在传统金融体系中,银行在货币流动性作用于经济的传导机制中扮演了重要角色

在这个生态系统中,包括央行商业银行和投资银行。

最高级别是央行它创造和发行主权貨币,并通过包括调整存款准备金率流动性监管等在内的一系列经济调控政策控制货币供应量,以有效控制通货膨胀

下一级是商业银荇,通过汇集公民的存款然后以次储备的形式出借这些存款,在此过程中产生信用扩张

再就是投资银行,以IPO、公司债券的形式发行各類资产对公民的银行储蓄进行二次投资。

银行本质上垄断的是廉价资金。

而DeFi则是一个开放的金融生态系统,它不再受传统银行网络嘚控制和物理边界的限制价值在这里以全新方式流动,利用开放的金融基础设施我们可以设计出全新的资金流动体系。

在DeFi生态中由兩种方式产生加密货币。

一种是原生的加密货币它不需要现实资产的抵押或背书,而是通过消耗现实世界中的能源直接生成比如比特幣和以太坊 协议通过挖矿生成,并产生相应的价值

另一种则是直接从交易所兑换,在这个过程中交易者将法币兑换成加密代币,比如說比特币或USDC这样的稳定币在这个过程中,加密货币交易所充当的是法币-数字货币的桥梁

再下一层是,在公链基础设施之上构建的原生數字金融服务

在这个摆脱了商业银行和分销网络制约的开放性生态中,流动性以不同的方式汇聚瓦解了商业银行长期以来积累的比较優势:垄断廉价资金与存款。

通过从根本上重新定义“金融服务”银行的运作方式将发生巨变,由此我们将进入一个全新的一个价值洎由流动的世界。

举个例子通过Metamask浏览器这样的接口,人们就可以从互联网世界跨越到加密货币的世界从这里开始,消费者开始可以直接访问金融服务不需要第三方的信任中介,比如银行

相比于不支持图灵完备的比特币协议,有智能合约功能的以太坊 协议是图灵完备嘚此外,只有以太坊 协议上才能承载最有价值的资产和流动性因此,我们看到以太坊 协议公链成为早期DeFi类项目开发者的首选。

在百婲齐放的以太坊 协议DeFi生态中目前已积聚了上百个基于以太坊 协议的DeFi项目。在The Block列出的生态图谱当中DeFi已经扩展到KYC身份认证、交易所和流动性、借贷市场、衍生品、稳定币、支付、基础设施、预测市场、保险、投资管理、钱包和托管等在内的多个典型用例和项目。

▲无论是交噫所、衍生品、贷款还是预测市场,几乎所有现实世界中的金融服务都可以在以太坊 协议上找到对应的去中心化版本

去中心化金融目湔已经是一个价值高达4.3亿美元的经济体系。

值得注意的是一直以来,以太坊 协议在DeFi生态中独占鳌头Maker、Compound和Dharma分别占据DeFi体量的前三甲。

defi.pulse的数據显示Maker作为以太坊 协议上DeFi的最大组成部分,在整个DeFi生态系统中占据近76.7%的主导地位其CDP抵押智能合约中锁定了价值约为64.2亿美元的ETH,约占以呔坊 协议总量的1.5%

第二名和第三名都属于借贷协议类别的Compound和Dharma,前者Compound是一个无需托管资金池、根据供需自动调节利率的“商业银行”后鍺Dharma则是去中心化的P2P“借贷协议”。

不过值得注意的是以上defi.pulse的数据并未收录EOS平台中的DeFi应用。

事实上以太坊 协议独占鳌头的DeFi生态已被后来突起的EOS打破了。

近期EOS上的DeFi项目异军突起,EOS平台中的EOSREX仅仅用了20多天就将MakerDAO挤到第二

来自defi.review的数据显示,目前EOSREX锁仓5.65亿美元占比49.21%,排名第一位;Maker锁仓4.22亿美元占比37%,排名第二位

不过,目前大多数DeFi创新项目仍然集中在以太坊 协议平台只有少数运行在比特币或EOS等其他公链上。

无論是ICO还是DeFi 本质上都是通过财富效应聚集流量,而赚钱才是加密货币市场发展的内在驱动力。

只要有财富效应在市场就不会消亡。

DeFi的核心除了套利赚钱还有一个非常关键的作用是让持有人不损失加密资产所有权的前提下,获得流动资金

因此,在加密寒冬中DeFi发展仍嘫不受影响,甚至在2018年熊市中整个数字货币市值大幅缩水的情况下DeFi锁仓还增长了112%。

由此我们发现,与昙花一现的1CO模式相比以太坊 协議的DeFi生态,显然具有更顽强的生命力和可持续发展的能力

以“融资工具”兴起的以太坊 协议,虽然因为扩容方案的进展受阻无法成为世堺计算机然而,如今随着DeFi的兴起以太坊 协议的目标愈发清晰起来,以太坊 协议希望成为“全球的结算层”

2019年4月底上线的新版以太坊 協议官网首页上,以太坊 协议官方修订了以太坊 协议的定位特别强调了以太坊 协议在去中心化金融方向的愿景:

以太坊 协议是一个为去Φ心化应用而设计的全球化的、开源的平台。在以太坊 协议上你可以编写代码,控制数字价值这些代码严格按照程序执行,并在全世堺任何地方皆可访问

相比与传统金融系统,DeFi的一个主要优势在于开放具体而言,开放具有以下几层意思:

1没有准入门槛,人人可参與

只要拥有加密货币和互联网连结世界上任何人,无需准入即可访问这个开放的金融系统并与之产生互动,包括创建账户、转账和合約互动等

世界银行的数据显示,全球大约有20亿人没有银行账户大部分是位于非洲、中东以及亚洲部分地区的发展中国家和地区。原因茬于这些地区的人均收入太低,市场盘子不够大导致银行和金融机构不愿意进军这些市场。

但是这并不表示这些地区的人群没有金融服务的需求,在这些没有金融基础设施的地区人们开户的难度很大,成本也很高因此,没有准入机制的开放金融可以将全世界20亿沒有银行账户无缝接入,全球资产以更加分散和颗粒度更细的结构以前所未有的速度自由流动,无疑促进了金融的普惠性(financial inclusion)的DeFi,将會释放出巨大潜力

2,互操作性和可组合型实现模块化使用

可组合性是指,开源协议是互相兼容的彼此之间可以互相组合和调用,开發者可以随意组合和调用不同的协议从而像搭乐高那样组合成更高阶的应用。

一个显而易见的好处开发者无需重新造轮子,比如不用洅重新开发底层的模块从而极大地提高了开发效率。

另一个好处是可以共享和继承上一层协议的安全性和信任,而对于金融行业来说安全和信任是最关键的组成部分。

这意味着可以将已经被市场验证的信任组合在一起信任之间互相叠加、加持产生杠杆效应,DeFi使得信任得以无需允许、无需信任、规模化地进行扩展从而最大化提升效率。

一个典型的例子就是中间件的崛起

Placeholder联合创始人Chris Burniske是这样定义的,“加密货币的「中间件协议」是面向开发者的协议 , 除了底层区块链的共识和核心功能外附加提供服务作为底层区块链和面向DApps的最终用户の间的增值粘合剂 , 中间件协议将使 DApps创建变得更容易和更快。”

粘合底层区块链协议和DApp交互界面的中间层协议

Augur是一个典型的预测市场中间件協议在这个网络中,人们可以质押代币对未来事件的结果下注然而这个平台因为使用体验差而一直为人所诟病。

构建在这个协议之上嘚预测应用Veil改进了Augur的使用体验,与此同时它还继承了用户对Augur的信任。

由于经过了长时间的市场检验可以说Augur的安全性和可靠性是有保證的,因此它一定会比重新做一个新系统更加安全。

正如Kyle Samani所说通过对金融的基本要素进行模块化处理,并通过这种模块化实现信任的商品化才是开放金融的关键创新。

而专注于中间件投资的机构Placeholder曾经撰文公布其投资秘笈“中间层最美,为什么我们不买以太坊 协议”,因为如果ETH升值那么基于以太坊 协议的优质资产(中间件)往往也会随着升值,然而中间件却不会受到Layer1智能合约区块链下行风险的影响,因为互操作性协议能从以太坊 协议上捕捉价值

3,开放意味着金融的透明性

由于传统金融系统是不透明的可以说银行和金融机构對用户资产进行的是“暗箱”操作,用户需要相信机构不作恶本质上是一种主观的信任。事实上发生的很多金融风险和暴雷事件,其實都是由于不透明违规操作引起的

开放金融当中,区块链平台上的代码是开源透明的所有交易和操作都记录在公开的分布式账本上,無法被篡改且可以随时被查看,这是一种基于机器和算法的客观信任

无需委托中心化第三方机构托管资金或确认交易,也可以减少交噫对方风险同时节约交易成本。

虽然DeFi是最具潜力的发展方向然而,DeFi的问题仍然很多

首先,以太坊 协议上呈现出百花齐放的DeFi生态出現了一百多个DeFi项目,然而相比于传统金融,DeFi的体量极小其规模简直不值一提。

根据defi.review的数据DeFi日交易总额不到14亿美元,相对于中心化交噫所的交易量也很弱小

这主要是因为,DeFi主要聚焦在以太坊 协议上以及少数运行在比特币或EOS等其他公链上,这意味着聚焦的大部分就是歭有以太坊 协议的人导致没有增量资金入场。

此外DeFi模式单一,90%的业务上聚焦在借贷场景上

DApp Total的数据显示,DeFi上的锁仓总值其中83.14%来自于Maker,8.46%来自于Compound3.2%来自于Dharma。也就是说虽然有着上千个项目的DeFi生态,但头部效应很明显基本上都被头部三家借贷业务应用给占据了,占据了DeFi超過9成的市场

但潘超认为:“这很正常,因为金融的核心便是借贷不过同时我们也看到更多金融衍生品的出现。比如保证金交易、二元期权等”

一方面是如雨后春笋般涌现出数千个应用的供应端,硬币的另一面是异常冷清的需求端,用户稀少核心需求不明。

相对于傳统金融产品DeFi的使用难度更大,对用户的认知要求较高导致用户稀少,难以吸引新增用户没有新资金入场导致目前仍然停留在存量市场博弈的阶段这也是DeFi向前发展的最大“拖油瓶”。

不仅如此对于去中心化借贷平台而言,由于缺乏信用体系往往需要用户超额抵押,这就导致了资产的利用率不高大大消弱了用户的积极性和资产流动性。

以MakerDao为例为了维持系统的稳定和安全,用户必须以150%的超额抵押率来抵押以太坊 协议生成稳定币Dai也就是说,获得1000美金的Dai必须质押1500美金的以太坊 协议目前,MakerDao全网抵押率已达478%这么高的质押率虽然能够保证系统的安全稳定性,但是却会大大消弱了资金利用率

那么未来,DeFi的命运会走向何处呢是替代传统金融,被传统金融收编还昰平行于传统金融长期共存呢?

可以确定的是DeFi将会作为传统金融的补充长期共存,DeFi既不会替代传统市场也不会被传统金融收编,而是為人们提供一个新的选项

替补传统中心化的金融体系,DeFi代表的开放式金融将主要面向标准化程度低、需求复杂的小规模、不需要信用背書的金融需求

开放意味着平等、人人可参与和解放。

一个开放的系统往往有助于生态的形成和快速发展,能够带来中心化机构难以比擬的力量

正是因为开放,让人人都能参与编写的维基百科后来居上超越了微软旗下老牌的数字百科全书Encarta。

开放的互联网解放了人类信息的获取和交换而接下来,开放的金融体系将把数十亿被排除在现有金融系统之外的民众包括进来在全球开放的市场上,这些资产以任意颗粒度自由交易和高效流动必将释放无限的潜力。

有人预言未来二十年内,传统的金融体系会被开放金融替代并形成数万亿美え的新的资产。

相比于传统的金融服务机构DeFi确实有很多优势,比如金融普惠性、透明度高、交易成本低等等但31QU认为,开放金融不会取玳传统金融而是会成为传统金融的一个有力补充,传统金融和开放金融两个世界会长期共存

传统的中心化金融体系,主要服务于标准囮程度高的大规模资产而标准化程度低、需求复杂、无需中心化主体背书的小规模金融需求,则是DeFi擅长的事

以太坊 协议创始人V神曾说,金融会是区块链技术最先落地的领域之一然而,目前尚处于襁褓期的开放金融受限于低流动性、技术和落地应用,需求不明确、用戶体验和认知门槛等瓶颈未来的应用之路仍然任重而道远。

链圈的人提起「以太坊 协议」三個字想必是如雷贯耳无论是以太币,还是其天才创始人Vitalik Buterin还是关于它的各种新闻,想必闭着眼都能看看而谈

即使如此,你可能还是不知道以太坊 协议到底是个什么东西它包含了哪些部分?又是基于哪些原理运作的这些你真的都知道吗?

本文对以太坊 协议的原理进行┅次大起底尽量深入浅出且全面的让你理解以太坊 协议的本质到底是什么。让你对以太坊 协议有一个整体而深刻的认识

本质上来说,鉯太坊 协议就是一个保存了数字交易永久记录的公共数据库重要的是,这个数据库不需要任何中间方来维护和双方的权益相反,它可鉯作为一种「无需信任」交易系统来运作也就是你可以在不需要第三方的情况下进行点对点交易。

说来说去还是这些啊?别急今天僦从技术层面来更深入的看看以太坊 协议的机制到底是什么。在解释这一概念时我们尽量不去用复杂或看着吓人的数学公式,即使不是程序员也能在阅读后对以太坊 协议的运营原理有更清晰的认识。在阅读的时候你没必要去理解文中的每一个细节,可以聚焦在宽泛的層面上来理解以太坊 协议

区块链是具有「共享状态的加密安全交易单机」。听起来有点拗口我们来分析一下。

  • 加密安全」是指数芓货币的创造是通过复杂的数学算法来保证的,而这些算法很难破解类似于系统的防火墙,你无法在区块链中创建虚假的交易或删除交噫等

  • 交易单机」是指,有一个机器的单个实例就可以负责系统中产生的所有交易。 换句话说每个人都相信「一个单一的全局真相」。

  • 共享状态」意思是在这一系统中所存储的状态对每个人都是透明和开放的。

知道了区块链的定义我们就来看看以太坊 协议区块鏈到底是什么?

以太坊 协议区块链本质上是一个为交易服务的状态机在计算机科学中,一个状态机指的是这样一种东西它可以读取一系列的输入,并基于这些输入产生一个新的状态

以太坊 协议状态机的运行从一个「元状态」开始,这类似于在网络上没有发生任何交易の前的一块空白石板当交易执行时,这个元状态就转变为一些最终状态在任何时候,这个最终状态都代表着以太坊 协议区块链的现状

以太坊 协议系统中运行着数百万笔交易,这些交易被分组归类为「区块」一个区块包含一系列交易,每个块与其前面的区块串联在一起

要从一个状态转到另一个状态,必须证明交易是有效的如果一个交易被认为是有效的,就必须通过一个验证过程这一过程称为「挖矿」。挖矿是指一组节点(即计算机)消耗它们的计算资源来创建一个有效交易的区块

网络中任何声明自己是「矿工」的节点都可以嘗试创建和验证区块,全世界有许多矿工试图同时创建和验证区块每个矿工在向区块链提交一个区块时同时,都要提供一个数学的「证奣」且把这个证明作为一个保证:如果这个数学证明存在,则该区块必然是有效的

如果要在主区块链上添加一个区块,矿工必须比其怹竞争对手更快地对其证明通过让矿工提供数学证明来验证每个区块的过程被称为「工作量证明」。

一个矿工如果验证了一个新的区块这个验证工作就会得到一定数额的价值回报。这个价值是多少呢以太坊 协议区块链使用了一种内部数字令牌,叫做「以太币」 每当┅个矿工证明了一个区块,就会生成并得到一个新的以太币

你可能会想:什么每个节点都在一条链上?矿工如果想创造新的的区块链怎麼办

正如我们在上文给区块链的定义,区块链是一个具有共享状态的交易单机这个定义决定了,区块链的当前状态是一个单一的全局狀态每个人都必须接受。如果拥有多个状态(或链条)会破坏整个系统因为人们不可能就哪个状态是正确的状态达成一致意见。如果這些链条是分开的就会出现一个人在一条链上有10个以太币,在另一条链上有20个的情况在这种情况下,我们没有办法确定哪一个链条最「有效」无法确定哪个人有多少硬币。

多条链的产生被称为「分叉」。因为分叉会破坏系统因此我们通常会避免分叉,迫使人们选擇他们「相信」的链条

为了确定哪个路径是最有效的,并防止分叉的发生以太坊 协议使用了一种叫做「GHOST协议」的机制。

简单地说GHOST协議让我们必须选择在链上做最多计算的路径。确定该路径的一种方法是使用最新区块的数量来表示当前路径中的区块总数(不计算起源塊)。块数越多路径越长,挖矿的难度越大最终就一定会到达最新区块。使用这个方式让我们对当前区块链状态的唯一版本达成一致

到这里,我们就对以太坊 协议区块链就有了一个宏观的认识接下来我们就更深入地看看以太坊 协议系统的主要组成部分:

以太坊 协议的铨球「共享状态」是由许多账户组成的,它们能够通过一个消息传递框架相互通信每个帐户都有一个与它关联的状态和一个20字节的地址。以太坊 协议的地址是一个160位比特的标识符用于识别帐户。

以太坊 协议有两种账户类型:

  • 外部帐户由私人密钥控制没有与之相关的代码。

  • 合约账户由其合约代码控制并具有与其相关的代码。

外部账户可以通过创建和使用其私人密钥签署一项交易向其他外部账户或其他匼约账户发送消息。两个外部账户之间的消息只是一种价值转移但从一个外部帐户到一个合约账户的消息会激活合约账户的代码,使它能够执行各种操作(例如转移代币、写入内存、生成新的代币、执行一些计算、创建新合约等)

与外部账户不同,合约账户不能自行启動新的交易相反,合约账户只能根据它们收到的其他交易(从外部账户或从另一个合约账户)进行交易这点我们会在下文进行探讨。

洇此我们可以得出结论:在以太坊 协议区块链上发生的任何操作都是由外部控制账户的交易引起的

无论帐户是哪种类型,帐户状态都由鉯下四个部分组成

  • nonce:如果帐户是一个外部帐户,这个数字代表从帐户地址发送的交易数量如果帐户是一个合约帐户,nonce是帐户创建的合約数量

  • balance:这个地址拥有的Wei(以太坊 协议货币单位)数量,每个以太币有1e+18 Wei

  • storageRoot :一个Merkle Patricia树根节点的哈希,它对帐户的存储内容的哈希值进行编碼并默认为空。

  • codeHash:EVM(以太坊 协议虚拟机)的哈希值代码 对于合约帐户,这是一个被哈希后并存储为codeHash的代码对于外部帐户,codeHash字段是空芓符串的哈希

我们知道以太坊 协议的全局状态包括帐户地址和帐户状态之间的映射,这个映射存储在一个数据结构中这种结构被称为Merkle Patricia樹。

Merkle Patricia树是一种由一组树状节点构成的二进制结构它包括:

  • 底层有大量的叶子节点,其中包含了潜在的数据;

  • 一组中间节点其中每个节点昰其两个子节点的哈希;

  • 一个单个的根节点,也是由它的两个子节点的哈希形成的代表树的顶部。

树的底部数据是通过把我们想要存储嘚数据分割成块后而生成的然后将这些数据块分成几个桶,然后对每个桶的进行哈希迭代值到剩下的哈希总数变为一个根哈希。  

此外树需要存储在里面的每一个值的密钥。从树的根节点开始密钥告诉你要遵循哪个子节点来获取相应的值,这些值存储在叶子节点中茬以太坊 协议中,状态树的键值对是地址和相关帐户之间的映射包括每个帐户的balance、nonce、codeHash和storageRoot(storageRoot本身就是一棵树)。

同样的树结构也用于存储茭易和收据更具体地说,每个块都有一个「header」它存储三个不同Merkle树结构根节点的哈希,包括:

Merkle树能够高效存储信息的特性在以太坊 协议系統中十分被看重我们可以称之为「轻节点」或「轻客户端」,其实区块链的节点有两种:完整节点和轻节点

一个完整的节点需要下载完整的链从元区块到当前的头部块,执行所有的交易也都包含其中通常情况下,矿工储存完整的档案节点因为他们必须这样做才能完荿挖矿的过程。当然也可以在不执行交易的情况下下载完整的节点。无论如何任何完整的节点都包含整条链。

轻节点的概念与之相对除非一个节点需要执行每个交易或查询历史数据,否则就没有必要存储整个链这就是轻节点的意义所在。轻节点并不下载和存储完整鏈并执行所有的交易而是只下载从元区块到当前头部区块的信息,而不执行任何交易或检索任何关联状态因为轻节点可以访问包含三個树的区块头部哈希,所以仍然可以很容易地生成和接收关于交易、事件、余额等可验证的结果

这样做的原因是因为Merkle树中的哈希会向上傳播ーー如果一个恶意用户试图将一个伪造的交易交换到Merkle树的底部,这种变化将导致上面节点的哈希变化也将改变上面节点的哈希值。

任何想要验证一段数据的节点都可以使用所谓的「Merkle证明」来执行一个Merkle 证明包括:

  1. 需要验证的大量数据及其哈希值;

  2. 「分支」(所有的参與者的哈希沿着路径上升,一直到「树根」)

任何读取该证明的人都可以验证树上所有的分枝是否一致,因此给定的数据块实际上位于樹中的某个位置

总之,使用Merkle树的好处是该结构的根节点依据树中存储的数据进行加密,因此根节点的哈希可以作为该数据的安全证明由于区块头包括状态、交易和收据树的根哈希。因此任何节点都可以在不需要存储整个状态的情况下验证以太坊 协议的一小部分状态,而整个状态的大小可能是无限的

在以太坊 协议中,费用的计算是一个非常重要的概念在以太坊 协议网络上进行的每一笔交易都会产苼费用ーー没有免费的午餐!这笔费用被称为「Gas」。

每次交易发送方都要设置一个Gas Limit和Gas Price。Gas Limit和Gas Price代表发送方愿意为执行交易支付的最大金额

這里需要留意的是,Gas限额是发送方愿意花钱的最大限度如果他们的账户余额中以太币的数量大于这个最大值,那么他就可以进行交易茬交易结束时,发送方将被退还的那些未使用的Gas按原来的价格进行兑换。

如果发送方没有提供执行交易所必需的Gas则该交易运行的结果會是「余额不足」,并被认为无效在这种情况下,交易处理中止其间的产生的任何状态都会发生逆转,这样就可以在交易发生之前返囙到以太坊 协议区块链此外,交易失败的记录会被记录下来显示尝试过哪些交易,失败了哪些交易由于系统已经在Gas用光之前做完了運算工作,所以从逻辑上看Gas不会被退还给发送方。

那么这些Gas的钱到底去哪了呢?发送方花在Gas上的所有钱都寄给了「受益人」地址也僦是矿工地址。由于矿工们正在努力运行计算和验证交易所以收到了Gas作为奖励。

通常情况下发送方愿意支付的Gas价格越高,矿工从交易Φ获得的价值就越大矿工们也就越有可能选择这个交易。通过这种方式矿工可以自由地选择交易。为了给发送者设置Gas Price做参考矿工们鈳以直接提出他们执行交易所需的最低Gas Price。

Gas不仅用于支付计算的费用还用于支付存储的使用费用。存储的总费用与使用的32字节的最小倍数荿正比

存储费用与交易费用有一些不同。由于增加的存储量增加了所有节点上的以太坊 协议状态数据库的大小所以存储数据的数量会變小。由于这个原因如果一个交易有一个步骤可以清除存储中的条目,则可以免除执行该操作的存储费用并且还能因此得到退款。

以呔坊 协议工作方式的一个重要方面是网络执行的每一个操作都同时受到每个完整节点的影响。然而在以太坊 协议虚拟机上的计算步骤非常昂贵。因此以太坊 协议智能合约更适合简单的任务,比如运行简单的业务逻辑或验证签名和加密其他对象而不适合更复杂的用途,比如文件存储、电子邮件或机器学习这些都会给网络带来压力。收费的目的就是使整个网络不会因用户的不当使用而变得负担过重

除此之外,以太坊 协议是一种图灵完整语言(图灵机是一种能够模拟任何计算机算法的机器)这就允许了循环,使得以太坊 协议区块链嫆易受到暂停问题的影响因为在这个问题中,无法确定一个程序是否会无限运行如果没有费用,意图不良的人可以通过在交易中执行┅个无限循环来扰乱网络从而产生不良的影响。因此费用保护了网络免受蓄意攻击。

那么为什么我们还要支付存储费用呢?就像计算一样在以太坊 协议网络上的存储也是整个网络必须承担的一个成本。

我们在上面说到以太坊 协议是一个基于交易的状态机。换句话說不同账户之间发生的交易正是以太坊 协议从一个状态转移到另一个状态的原因。

因此交易可以看做是一个由外部拥有的帐户生成的序列化加密签名指令,然后提交给区块链

交易分为两类:「消息调用」和「合约创建」(创建新的以太坊 协议合约的交易)。不管哪一類所有交易都包含以下组件:

  • Nonce:发送方发送的交易数量的计数;

  • gasPrice:发送方愿意支付每单位Gas所需执行交易的Wei数量;

  • gasLimit:发送方愿意支付的执荇这一交易的Gas最大数量。这个数额是预先设定和支付的;

  • to:接收方的地址在创建合约的交易中,合约帐户地址还不存在因此使用了空徝;

  • Value:从发送方转移到收件方的金额,在创建合约的交易中这个Value作为新创建合约账户内的起始余额;

  • v, r, s:用于生成识别交易发送方的签名;

  • Init(只存在于创建合同的交易中):用于初始化新合约帐户的EVM代码片段,它只运行一次然后被丢弃,当init第一次运行时它会返回帐户代碼的主体,这个代码是与合约帐户永久关联的一段代码;

  • data(只存在于消息调用中的可选字段):消息调用的输入数据(即参数)例如,洳果一个智能合约充当域名注册服务那么对该合约的调用可能会有诸如域名以及IP地址等输入字段。

在说「账户」的时候我们看到,交噫(包括消息调用和合约创建的交易)总是由外部账户启动并提交给区块链的。另一种思考方式是交易是连接外部世界与以太坊 协议內部状态的桥梁。

但这并不意味着一个合约不能与其他合约对话在全局范围内存在的合约,可以与同一范围内的其他合约进行交流它們是以通过「消息」或「内部交易」的方式来实现的。我们可以认为消息或内部交易类似于交易其主要区别在于它们不是由外部账户所產生的,相反是由合约产生的,是虚拟对象与交易不同,合约不是序列化的而是只存在于以太坊 协议的执行环境中。

当一个合约将┅个内部交易发送到另一个合约时存在于接收方合约账户上的关联代码就会被执行。

需要注意的一点是内部交易或消息不包含Gas Limit。这是洇为Gas Limit是由原始交易的外部创建者(即部分外部帐户)来决定的外部账户集合的Gas Limit必须足够高,以便进行交易这包括由这一交易而导致发苼的任何次级处理运行,例如合约对合约的消息如果在交易和消息链中,特定的消息执行耗尽了Gas那么该消息的执行将与执行引发的所囿后续消息一起恢复。不过上一级的执行不需要恢复。

所有的交易都被组合成「区块」区块链则包含一系列这样被链接在一起的区块。在以太坊 协议中一个区块包括「区块头」、关于包含在此区块中交易集的信息,与当前块的ommers相关的一系列其他区块头Ommer解释

比起比特币の类的区块链以太坊 协议的构建方式使区块生成时间要低很多。这样可以更快地处理交易然而,缩短区块生成时间的一个缺点是矿笁们要找到更多相互竞争的区块解决方案。这些相互竞争的区块也被称为「孤儿区块」不能进入主链。

Ommer的目的是帮助奖励矿工也包括這些孤儿区块。矿工的ommer必须是「有效的」也就是说在目前区块的第六代或更小的范围内。六代之后陈旧的孤儿区块就不能再被引用。仳起完整的区块Ommer块获得的奖励要小一些。尽管如此矿工们仍然有一定的动力去挖掘这些孤儿区块并获得回报。

回到区块本身之前提箌每个区块都有一个区块头,但到底什么什么是区块头区块头是区块的一部分,包括:

  • Parenthash:一个父区块头的哈希(这就是为什么区块链被稱为区块「链」);

  • beneficiary:收取采矿费用的帐户地址;

  • Stateroot:状态树的根节点哈希;

  • transactionsRoot:包含在此区块中列出的所有交易树根节点的哈希值;

  • receiptsRoot :包含夲区块中列出的所有交易树根节点的哈希的收据;

  • difficulty:这个区块的难度水平;

  • 编号:当前区块的记数(元区块的编号为0;每个后续区块的块數增加1);

  • gasUsed:本区块交易所使用的总Gas之和;

  • 时间戳:这个区块注入的unix时间戳;

  • extraData:与此区块相关的其他数据;

  • mixHash:当与nonce结合时证明这个区块執行了足够计算的哈希值;

  • Nonce:当与mixHash结合时,证明这个区块已经执行了足够计算的哈希值;

每个区块头包含三个树结构:

这些树结构只不过昰之前讨论过的Merkle树而已没有什么特别的。不过从上面的描述中可以看到,有一些术语还需要进一步说说

以太坊 协议允许log跟踪各种交噫和消息。合约也可以通过定义需要记录的「事件」来显式生成log

  • 一系列主题,它们表示此交易所进行的各种事件以及,

  • 任何与这些事件有关的数据

log存储在一个bloom过滤器中,它以有效的方式存储海量的日志数据

区块头中存储的日志来自于交易收据中包含的日志信息。就潒在商店买东西时收到收据一样以太坊 协议会为每笔交易生成一张收据。不出所料每张收据都包含有关交易的某些信息。 这样的收据包括以下内容:

  • 当前交易所使用的Gas;

  • 在当前交易执行后当前区块中使用的Gas;

  • 执行当前交易时创建的日志。

区块的「难度」用于在验证区块嘚时间内来加强一致性元区块的难度为131,072,并用一个特殊的公式来计算后面每个区块的难度如果某个区块比前一个区块更快地被验证,那么以太坊 协议协议会增加该区块的难度

该区块的难度会影响nonce,这是一个哈希必须在挖矿时使用工作量证明算法来计算。

区块的难度與nonce之间的关系在数学上表示为:

这里Hd代表了难度找到满足难度阈值的nonce的唯一方法是使用工作量证明算法来枚举所有的可能性。 寻找解决方案的预期时间与难度成正比难度越大,找到nonce就越困难因此验证区块的难度就越大,这反过来增加了验证新区块的时间通过调整区块嘚难度,协议可以调整验证区块的时长

另一方面,如果验证时间变慢那么协议就会减少难度。通过这种方式验证时间可以自我调整從而保持一个常量ーー平均每15秒一个区块。

看到这你已经来到了以太坊 协议协议中最复杂的部分之一。假设将一个交易发送到以太坊 协議网络进行处理如果以太坊 协议状态要将你的交易包括在内,会发生什么

首先,所有交易都必须满足初始的一组需求才能执行 其中包括以下几个部分。

  • 交易必须是正确的RLP格式(RLP是「递归长度前缀」的缩写是用于二进制数据编码嵌套数组的数据格式,RLP是以太坊 协议使鼡的序列化对象的格式)

  • 有效的交易nonce,回想一下一个帐户的nonce是从该帐户发送的交易的统计,为了有效交易nonce必须与发送方帐户的nonce相等。

  • 交易的Gas限额必须等于或大于交易所使用的内部Gas 内部Gas包括:1)为执行交易预先确定的费用为21,000 Gas;2)与该交易一起发送的数据Gas费用(对于每┅个等于零的数据或代码的每个字节收取4个Gas,每个非零字节的数据或代码为68个Gas);3)如果这笔交易是一笔合约创建交易则额外收取32,000 Gas。

  • 发送方的账户余额必须有足够的以太币来支付前期的Gas费用前期Gas成本的计算很简单:首先,交易的Gas Limit乘以交易的Gas Price以确定最大的Gas成本。 然后這个最大的成本被算在从发送方转移到接收方的总额中。

如果交易符合上述有效性的所有要求那么,就可以进入下一个步骤

首先,从發送方的余额中扣除执行的前期成本并将发送方帐户的nonce加1。我们可以计算剩余的Gas因为交易的Gas Limit要减去所使用的内在Gas。

然后交易开始执荇。在交易的整个执行过程中以太坊 协议都跟踪「子状态」。子状态记录交易中产生的信息这些信息也是交易完成后所马上需要用到嘚。具体来说它包含:

  • 自毁集合:交易完成后将丢弃的一组帐户(如果有的话);

  • 日志序列:虚拟机代码执行的存档和可索引的检查点;

  • 退款余额:交易完成后退还给发送者账户的余额。

一旦处理完交易中的所有步骤并假定没有无效状态,则通过确定向发送方退还未使鼡的Gas数量来最终判定最终状态。除了未使用的Gas外发送方还从上文所述的「退款余额」中退还了一些余额。

  • Gas(以太币)就会给到给矿工;

  • 该交易所使用的Gas被添加到区块的Gas计数器(该计数器记录该区块中所有交易使用的总Gas);

  • 删除自毁集合中的所有帐户(如果有的话);

最後只剩下了新的状态和已创建交易的一组log。至此我们就讲完了交易执行的基本原理,下面再来看看合约创建的交易和消息调用之间的┅些差异

前面说过,以太坊 协议的账户分为两类:合约帐户和外部账户当交易是「契约创建」(Contract Creating)时,意思是交易的目的是创建一個新的合约账户

为了创建一个新的合约帐户我们首先使用一个特殊的公式来声明新账户的地址,然后通过以下方式初始化新帐户:

  • 将nonce設置为零;

  • 如果发送方在交易中发送了一定数量的以太币作为价值则将帐户余额设置为该价值;

  • 从发送方的余额中扣除这个新账户余额嘚增加部分;

  • 将合约的codeHash设置为空字符串的哈希值;

一旦帐户完成了初始化就可以创建帐户了,使用与交易一起发送的init代码在执行这个init代碼的过程中,可能发生很多情况根据合约的构造函数,它可能更新帐户的存储创建其他的合约账户,或其他的消息调用等等。

一旦初始化合约的代码被执行就将开始消耗Gas交易使用的Gas不能超出账户的余额,一旦超出将会出现「Gas耗光」的异常并且退出。如果交易由于Gas耗光的异常而退出

但是,如果发送方在交易中发送了一些以太币这时合约创建失败也会退还以太币吗?答案是不会。

如果初始化代碼执行成功则支付最终的合约创建成本。这是一个存储成本并且与创建合约代码的大小成正比。如果剩余的Gas不足以支付这笔最终成本那么这笔交易将再次声明为一个「Gas耗光」异常。

如果一切顺利而且没有遇到任何异常,那么剩余的Gas都会退还给交易的原始发送方并尣许改变状态继续存在!

消息调用的执行类似于合约创建,但有一些不同之处

消息调用的执行不包含任何init代码,因为没有创建新的帐户但是,如果这些数据是由交易发送方提供的它可以包含输入数据。一旦执行消息调用也有一个额外的组件,其中包含输出数据如果后续执行需要此数据,则使用这些数据

如同合约创建一样,如果由于Gas耗尽或交易无效(例如堆栈溢出、无效的跳转目的地或无效指令)则所使用的任何Gas都不会退还给原来的调用者,取而代之的是所有剩余的Gas都会被消耗掉,并且状态被重置到余额转移之前的情况

现茬,我们来看看在VM中交易实际上是如何执行的。

实际处理交易的部分是以太坊 协议自己的虚拟机被称为EVM。就像之前定义的那样EVM是一個「图灵完备」的虚拟机。唯一的不同是EVM有内在Gas的约束因此,可以完成的计算总量本质上受到所提供Gas数量的限制

此外,EVM 有一个基于栈機器的架构栈机器是一种使用「后入先出」的堆栈来保存临时值的计算机。EVM中每个栈条目的大小为256位最大为1024位。

EVM具有内存其中存储嘚条目是字地址字节数组(word-addressed byte arrays)。 内存是易失性的这意味着它不是永久性的。

EVM还有存储空间与内存不同,内存的存储是非易失性的并莋为系统状态的一部分来维护。EVM在一个虚拟ROM中独立存储程序代码只能通过特殊的指令访问虚拟ROM。这就是EVM与典型的冯·诺伊曼结构的不同,冯·诺伊曼结构中程序代码是在内存或存储中。

EVM也有自己的语言——EVM字节码当程序员在以太坊 协议上写智能合约的时候,通常用高级語言写代码比如Solidity。然后可以编译成EVM字节码,以便EVM可以理解执行

接下来我们来看看EVM如何运行。在执行特定的计算之前处理器要确保鉯下信息是可用且有效的:

  • 用于计算的剩余Gas;

  • 拥有执行代码的帐户地址;

  • 产生此执行交易的发送方地址;

  • 引发代码执行的帐户地址(可能與原始发送方不同);

  • 产生此次执行交易的Gas Price;

  • 作为当前执行的一部分,价值(以Wei为单位)传递到这个帐户;

  • 当前消息调用或合约创建的栈罙度;

  • 在执行开始时内存和栈是空的,程序计数器归零

然后,EVM递归执行交易计算系统状态和每个循环的机器状态。简单地说这个系统状态就是全局状态。机器状态包括:

栈中条目是从该系列最左边的部分中添加或删除表现为,在每个循环中从剩余的Gas中减少适当的Gas,并且程序计数器递增

在每个循环的结束时,有三种可能性:

  1. 机器达到一个特殊状态(例如Gas不足、指令无效、栈条目不足、栈条目溢出超過1024、无效的JUMP/JUMPI等)因此必须停止,任何更改都将被丢弃;

  2. 这个序列继续进入下一个循环;

假设执行没有达到一个特殊状态并达到一个「鈳控制的状态」或正常停止,那么机器就会生成结果状态、保留执行后剩余的Gas

说了这么多,终于结束了以太坊 协议中最复杂的部分即使没有完全理解这部分,也没关系除非是从事底层的开发工作,否则并不需要真正理解这些细节

最后,来看看多个交易块是如何最终唍成的

这里所说的「最终」可能是指两种不同的东西,这取决于区块是新的还是已经存在的如果是一个新区块,「最终」指的是挖掘這个区块所需要的过程如果是一个现有的区块,那么「最终」指的是验证块的过程在这两种情况下,对于要到「最终」状态的区块有鉯下四个要求

  1. 验证(如果是挖矿,就是判定)ommer:每个区块头中的每个ommer区块都必须是一个有效的区块头并且在当前区块的六代以内。

  2. 验證(如果是挖矿就是判定)交易:区块上的gasUsed数字必须等于该区块中所列交易所使用Gas的累积。

  3. 申请奖励(只限于挖矿的情况):受益人地址被授予5以太币用于开采该区块。 (根据以太坊 协议EIP-649这5个ETH的报酬将很快减少到3个)。此外对于每一个 ommer,当前区块的受益者将额外获得當前区块奖励的1/32最后,ommer区块的受益人也可以得到一定数额的赔偿

  4. 验证(如果挖矿,计算一个有效的)状态和nonce:确保应用所有交易和由此产生的状态更改在区块奖励应用于最终交易的结果状态之后,定义新区块的状态通过检查这个最终状态来验证存储在区块头中的状態。

将区块难度赋予意义的算法叫做「工作量证明」(PoW)以太坊 协议的工作量证明算法被称为「Ethash」(之前被称为Dagger-Hashimoto)。

还记得上面谈到的在区塊头中存在的mixHash和nonce两个字段吗

  • mixHash是一个哈希,当与nonce结合时可证明这个区块执行了足够的计算;

  • nonce是一个哈希,当与mixHash结合时可证明这个区块巳经执行了足够的计算

PoW的功能就是评估这两个字段。至于如何使用的PoW函数来精确计算mixHash和nonce说起来有点复杂但从总体上看,它的工作原理是這样的

每个区块都算出一个「seed」,每个「epoch」对应的seed都不相同一个epoch相当于3万个区块的长度。在第一个epochseed是一系列32字节零的哈希。对于后來的每一个epoch来说它都是以前seed哈希的哈希。使用seed一个节点可以计算一个伪随机的「缓存」。

这个缓存非常有用因为它使之前讨论过的「轻节点」成为可能。轻节点的目的是为了使某些节点能够有效地验证交易而没有存储整个块环链数据集的负担。一个轻节点可以完全基于这个缓存来验证交易的有效性因为缓存可以重新生成需要验证的特定区块。

使用缓存节点可以生成DAG数据集,数据集中的每个项都依赖于缓存中的少量伪随机选择(pseudo-randomly-selected)的项为了成为一名矿工,必须生成这个完整的数据集;所有客户和矿工都存储这个数据集并且数據集随时间线性增长。

然后矿工们可以随机抽取数据集的片段,然后通过数学函数将它们混合成一个mixHash矿工将反复生成mixHash,直到输出低于預期目标的nonce当输出满足这个要求时,这个nonce被认为是有效的并且块可以添加到链上。

总体而言PoW的目的是以一种安全加密方式证明工作量,基于特定的计算量生成某些输出(即nonce)这是因为除了穷举所有可能性之外,没有更好的办法来找到低于要求阈值的nonce重复应用哈希函数的输出具有均匀分布,因此我们可以确信找到这样一个nonce所需的平均时间取决于难度阈值。难度越大解决问题的时间就越长。这样PoW算法对难度概念赋予了真实的意义,这个概念被用来增强区块链的安全

那么,区块链安全又是指什么很简单:就是要创建一个每个囚都信任的区块链。正如先前在本文中讨论的那样如果存在一个以上的链,用户将对其失去信任因为他们无法合理地确定哪一个链是「有效的」链。为了让一组用户接受存储在块环链上的基本状态需要一个大家都相信的且单一规范的区块链。

而这正是PoW的作用:它确保┅个特定的区块链可以保持规范使攻击者难以创建新的区块,或者覆盖历史的某一部分(例如擦除交易或创建虚假的交易)或者对一個分叉进行维护。为了验证他们的区块攻击者需要比网络中的其他任何人都更快地解决nonce问题,这样网络就会相信他们的链条是最重链(基于之前提到的GHOST协议的原则)这是基本上不可能的,除非攻击者拥有超过一半的网络挖掘能力因此这种情况被称为「51%攻击」。

挖矿作為一种财富分配机制

除了确保一个安全的区块链环境对那些为了提供这种安全而消耗算力的人,Pow还是一种分配财富的方式回想一下,礦工在开采一个区块时会得到奖励其中包括:

  • 「获胜」区块获得的5以太币(不久将改为3以太币)的奖赏;

  • 该区块所包括的交易在区块内消耗的Gas成本;

  • 将ommer作为区块的一部分的额外奖励。

从长远来看为了确保PoW机制在安全和财富分配方面的使用是可持续的,以太坊 协议努力培養它的两个特性:

  • 让尽可能多的人能够接触到它换句话说,人们不应该需要专门的硬件来运行算法这样做的目的是使财富分配模型尽鈳能开放,以便任何人都可以根据自身的情况提供计算能力以换取以太币。

  • 减少单个节点(或小集)产生不成比例利润的可能性任何節点,如果能够获得不成比例的利润就意味着节点对规范区块链的确定有很大的影响,这会降低网络的安全性

在比特币区块链网络中,与上述两个属性有关的一个问题是PoW算法是一个 SHA256哈希函数。这类函数的弱点在于它可以通过使用专门的硬件更有效地解决问题,也就昰所谓的ASIC

为了解决这一问题,以太坊 协议选择了将PoW算法按顺序存储到内存硬件中这意味着这个算法是经过设计的,所以计算nonce需要大量嘚内存和带宽大量的内存需求使得计算机很难同时使用它的内存来同时发现多个nonce,而且高带宽的要求使得即使是超级计算机也很难同时發现多个nonce这减少了集中化的风险,也为正在进行验证的节点创建了一个更公平的机制

需要注意的是,以太坊 协议正在从PoW机制过渡到PoS机淛这又是另一个话题了,希望可以在今后的文章中探讨

终于到底了,这篇文章是不是有很多东西需要消化

如果真的对以太坊 协议感興趣,建议可以多读几次我也是亲自阅读了以太坊 协议的白皮书和代码,然后才搞清楚以太坊 协议要做的究竟是什么还是那句话,你無需理解文章的每一个细节只要力求对整理原理有把握就很不错了。

我要回帖

更多关于 以太坊 协议 的文章

 

随机推荐