区块链网站|NFTS 以太坊(ETH) 不知道以太坊是什么?这个超长的图形告诉你答案

不知道以太坊是什么?这个超长的图形告诉你答案

广告位

不了解以太坊到底是什么,这篇超长图文告诉你答案

你可能不知道以太坊到底是什么,但我肯定你听说过。最近在很多新闻杂志上都有出现,但是如果你不知道以太坊到底是什么,看相关文章可能会觉得很难理解。

本质上,以太坊是一个永久记录和保存数字交易的公共数据库。与普通数据库不同,这种数据库不需要任何中央机构来维护和保护。它作为一个“无信任”的交易系统运行,在这个系统中,个人可以在不信任第三方或彼此的情况下进行点对点交易。

看了上面的介绍,你还觉得迷茫吗?这也是我想写这篇文章的原因。希望从技术角度解释以太坊是什么,但不引入复杂的数学公式。即使您不是程序员,也可以通过本文更好地利用区块链技术。如果这篇文章中有一些部分太难理解,可以不深究。希望读者能对以太坊有一个整体的了解。

本文很多内容来自《以太坊黄皮书》。我只是补充了个人的讲解和图表,让大家更好的理解以太坊。如果你够勇敢,也可以直接从《以太坊黄皮书》阅读。

我们开始吧!

区块链定义

区块链是一种共享状态的加密安全交易singleton。这个概念很难理解吧?我们来拆解一下:

“加密安全”是指数字货币的创造受到复杂的数学算法的保护,非常难以破解。你可以想到各种各样的防火墙。您在区块链上的任何交易都不能欺骗整个系统(例如,创建虚假交易、删除交易等。).“事务单例机器”:意味着只有一个机器实例,负责系统中创建的所有事务。换句话说,每个人都相信一个真理。“共享状态”:指本机存储的所有状态都是为大家共享开发的。以太坊已经实现了上面提到的几个区块链范例。

区块链范式解读

以太坊区块链本质上是一个基于事务的状态机。在计算机科学中,状态机是指可以读取一系列输入并根据这些输入转移到新状态的东西。

以太坊一开始没有交易的时候,叫做“创造状态”。你可以把它想象成一张什么都没有的白纸。当事务被执行时,“创建状态”改变到某个最终状态。在任何时间点,这个最终状态都代表以太坊的当前状态。

现在以太坊状态下记录的交易有上亿笔,这些交易被分组为“块”。一个块包含一系列事务,每个块都与其前一个块相链接。

为了触发从一个状态到下一个状态的转换,交易必须是合法的。为了使一项交易被认为是合法的,它必须经过一个被称为“挖掘”的验证过程。挖掘是指一组节点(即计算机)消耗它们的计算资源来创建合法块。

网络上任何自称为挖掘者的节点都可以尝试创建和验证块。但与此同时,来自世界各地的许多矿工都在尝试创建和验证区块。每个矿工在向区块链提交区块时都会提供一份数学“证明”。这个证明起到了保障作用。如果证据存在,该块是合法的。

要想在主区块链增加一个区块,矿商必须比其他竞争对手更快证明这一点。通过要求矿工提供数学证明来验证每个区块的过程被称为“工作证明”。

验证新区块的矿工因完成这项工作而获得奖励。这是什么奖励?以太坊区块链使用一种名为以太坊的本地数字货币作为奖励。矿工每证明一块,就会产生一个新的以太坊,并获得奖励。

你可能想知道:什么能保证所有人都在以太坊的区块链上?一群矿工生成积木后不会形成新的区块链吗?

前面,我们将区块链定义为具有共享状态的事务单体。使用这个定义,我们可以理解当前状态是每个人都必须接受的单一全球事实。如果你有多个状态(或链),它会破坏整个系统,因为所有节点无法就哪个状态是正确的达成一致。如果链分支,你可能在一条链上有10个以太币,在另一条链上有20个以太币,在另一条链上有40个以太币。在这种情况下,将无法确定哪个链是最“有效”的。

每当生成多条路径时,就会出现“分叉”。我们通常希望避免叉子,因为它们会破坏系统,迫使人们选择他们“相信”的链条。

在以太坊中,使用“GHOST协议”的机制来确定哪条路径是有效的,并且可以避免多条链。

Ghost协议:贪婪最重观察子树

简单来说,ghost协议意味着我们要选择的路径是计算量最大的路径。一种确定方法是选择具有最大块号的块。该块号表示当前路径中所有块的数量(不包括创建块)。块数越大,矿工在这条路径上采矿要付出的计算量就越大。这样,就可以对当前状态的版本达成一致。

现在您已经对区块链有了一个大致的了解,让我们更深入地了解一下以太坊区块链的主要组成部分:

帐户状态(州)天然气和天然气费用交易(区块)交易执行(交易执行)采矿工作证书帐户

以太坊的全局“共享状态”由许多对象(“帐户”)组成,这些对象可以通过消息传递框架相互交互。每个帐户都有一个与之相关的状态和一个20字节的地址。即以太坊中的地址使用160位标识符来标识账户地址(1字节=8位)。

在以太坊中,有两种类型的帐户:

外部帐户:私钥控制,没有与之关联的代码。合同账户:受合同代码控制,有与之关联的代码。

外部账户与合同账户

理清对外账户和合约账户的区别非常重要。外部帐户可以通过用自己的私钥创建和签署交易来向其他外部拥有的帐户或其他合同帐户发送消息。两个外部拥有的账户之间的消息只能是以太坊转账的值。但是从外部帐户到合约帐户的消息将激活合约帐户的代码,允许各种操作(例如转移令牌、写入内部存储、铸造新令牌、执行计算、创建新合约等。).

与外部账户不同,合约账户不能自行发起新的交易。相反,合约账户只能响应它们接收的其他交易(从外部账户或从另一个合约账户)。我们将在“事务和消息”一节中了解更多关于合同和合同调用的信息。

因此,在以太坊区块链上发生的任何操作都是由外部账户发起的交易。

账户状态(账户状态)

账户状态由四部分组成,外部账户和合同账户都有这四部分:

Nonce:如果帐户是外部帐户,此数字表示从帐户地址发送的交易数。如果账户是合同账户,nonce是账户创建的合同数量。余额:账户地址拥有的以太坊数量,其中以卫为单位,1Ether等于1e 18卫。StorageRoot:夏树根节点的hash(后面会解释什么是夏树)。该树对账户存储数据的哈希值进行编码,默认为空。CodeHash:这个账户的EVM(ether eum Virtual Machine——稍后会详细介绍)代码的哈希值。对于合约帐户,这是经过哈希处理并存储为codeHash的代码。对于外部帐户,codeHash字段的哈希值是一个空字符串。

全球状态

我们知道以太坊的全局状态由账户地址和账户状态的映射组成。这个映射存储在一个叫做夏树的数据结构中。

Merkle树(也称为Markle trie,以下统称为Markle trie)是由一组节点组成的二叉树,由以下几部分组成:

位于树底部的包含底层数据的大量叶节点是一组中间节点。中间节点的每个节点都是另外两个子节点的散列,也是由它的两个子节点的散列形成的,代表了树的顶端。

将树底部的数据分成块,然后将块分成桶,最后取每个桶的哈希,重复相同的过程,直到剩余哈希的总数变成只有一个:根哈希。

这个树需要为每个存储的数据存储一个键值。从树的根节点开始,这个键值决定了是哪个子节点,从而得到相应的值,存储在叶节点中。在以太坊的例子中,状态树的键/值映射是在地址和它们关联的账户之间,包括每个账户的balance、nonce、codeHash和storageRoot(其中storageRoot本身就是一棵树)。

资源:以太坊白皮书

相同的trie结构也可以存储交易和收据。更具体地说,每个块都有一个“头”,它存储三种不同Merkle trie结构的根节点的散列,包括:

状态Trie交易Trie收据Trie

(译者补充:上图中的StateRoot、TransactionsRoot、ReceiptsRoot分别取自上述三个mpt的根节点的哈希值:State Trie、Transaction Trie、Recipts Trie)。

对于以太坊中的“轻客户端”和“轻节点”,Merkle trie可以有效地存储所有信息。记住,区块链是由成千上万个节点维护的,这些节点大致可以分为两类:全节点和轻节点。

所有节点将把创建块的完整链下载到当前块,以同步整个区块链并执行其中包含的所有事务。通常,挖掘者存储完整的归档节点,因为他们在挖掘过程中需要它们。当然,您也可以下载完整的节点,而不必执行每个事务。在任何情况下,任何完整的节点都包含整个区块链。

但是,有些节点实际上并不需要执行每个事务,也不需要查询历史记录。这种节点不需要保存整个区块链数据。这样的节点就是上面提到的光节点。该节点不是下载并存储整个链并执行所有事务,而是仅将块头从创建块下载到当前块,而不执行任何事务或检索任何相关联的状态。但是,light节点存储块头数据,它还存储上述三个Merkle trie结构的哈希值。因此,轻节点仍然可以生成和接受交易、事件和余额的验证答案。

因为Merkle树中的哈希值是向上传播的,如果恶意用户试图将虚假交易交换到Merkle树的底部,这种变化会导致上层节点的哈希值发生变化,从而改变上层节点的哈希值。以此类推,直到最后改变树根。

节点可以使用Merkle proof来验证一段数据。Merkle的证书包括:

要验证的数据块及其哈希树的根哈希分支(从数据块到根的升序路径上的所有哈希)

任何使用这个证明的人都可以验证这个分支的hash和树的关系是一致的,所以给定的块实际上是在树的那个位置。

总之,使用Merkle Patricia树的好处在于,这种结构的根节点依赖于加密存储在树中的数据,所以根节点的hash可以作为这些数据的安全标识。由于块头包含状态、事务和收据树的根hash,任何节点都可以验证以太坊状态的一小部分,而不需要存储整个状态,因为整个状态可能是无限的。

煤气和费用

以太坊中一个很重要的概念就是成本的概念。每一次因以太坊网络上的交易而发生的计算都会产生费用(天下没有免费的午餐!),这笔费用是以一种叫做“气”的面额支付的。

气是用来衡量计算成本的单位。气价是每单位气你愿意花的以太币,单位是“gwei”。“卫”是以太坊的最小单位,1个以太坊等于11018卫。1gwei就是1 x 109wei。

对于每笔交易,发送方通常设置气限和气价。气价乘以气限,代表发件人愿意为此交易支付的最大魏数。

例如,交易的发送方将燃气限额设置为50,000,燃气价格设置为20g魏,这意味着发送方愿意为这笔交易费用花费最大值:

5000 x 20g魏=1,000,000,000,000魏=0.001以太坊。

Gas limit表示交易发送者愿意为此交易花费的最大值。如果账户里有足够的以太币,那么这个交易就会成功执行。如果没有用气,就按以太坊原价退还给寄件人。

如果发送方没有为本次交易提供足够的汽油,那么本次交易将因“汽油用完”而无效。在这种情况下,交易将被终止,并在以太坊中记录为失败记录,所有状态将回滚到交易开始前的初始状态。而且由于计算资源是在“没气”之前投入的,按理说气已经消耗完了,不会返还给发送方。

你可能会想,气,这钱去哪了?答案是钱会寄到矿工的地址。因为这笔交易是矿工们算计好的,所以交易的合法性得到了验证。所以天然气应该奖励给矿工。

一般来说,如果发送方支付的瓦斯较高,矿工会选择验证交易,因为可以获得较高的奖励。如果气费太低,矿商也可能主动忽略这笔交易。为了指导发送方设定合理的天然气价格,矿工可以选择公布他们将执行交易的最低天然气价格。

保管费用

燃气不仅仅是上面说的,它只会在交易计算的时候消耗,它也是用来支付仓储的。存储的总成本与所用32字节的最小倍数成正比。

存储成本的计算有更多的细节。比如增加存储空间会同时增加以太坊中所有节点的存储空间,所以存储空间越小越有优势。为此,如果一个事务有释放存储空间的操作,执行该操作的计算成本将被免除,计算将被返回,存储控制将被释放。

费用的作用是什么?

我们知道以太坊网络中任何事务的执行都会同时影响所有节点。然而,EVM的计算成本非常高。因此,以太坊的智能合约应该用于执行一些简单的任务,例如运行一个简单的业务逻辑、验证签名或其他加密场景,而不应该用于执行存储数据、发送电子邮件或机器学习等可能耗费巨大计算资源并使整个以太坊网络过载的任务。成本就是为此而设计的。

以太坊是一个图灵完全区块链。要知道图灵机是无法判断一段代码是否会最终结束的。而运行在以太坊的智能合约可以进行循环运算,所以如果没有计算的成本,智能合约的开发者可能会编写一个无限循环的代码段,从而拖累整个以太坊网络。因此,成本设计可以确保整个网络不会陷入这种恶意攻击。

你可能还会想,“为什么我们要为存储付费?”。其实就像计算一样,以太坊网络上的存储是整个网络必须承担的成本。

和消息。

如上所述,以太坊是一个基于事务的状态机。不同账户之间交易后,整个以太坊网络会从一种状态转移到另一种状态。

该交易实质上是由外部账户生成的加密签名指令,该指令被序列化,然后被提交给区块链。

事务分为两类:消息调用和契约创建。

这两种类型的交易包括以下字段:

Nonce:发送方发送的交易数量,gasPrice:发送方希望执行该交易的每单位汽油的价格,gasLimit:发送方愿意为执行该交易支付的最大汽油量。这个金额需要提前设置,在交易执行前支付到:收款人地址。在合同创建类型的交易中,合同账户的地址还没有生成。此时,该字段为空值:发送方和接收方发送的以太币数量(单位为魏)。在合同创建类型的事务处理中,该值是新合同地址的余额值。v,r,s:用于生成标识事务发送方的签名init(仅存在于创建合同的事务中):用于初始化新合同帐户的EVM代码片段。Init只运行一次,然后被丢弃。init第一次运行时,会返回账户代码的主体,这是一段与契约账户永久关联的代码数据(只存在于消息调用的可选字段中):消息调用的输入数据(即参数)。例如,如果将智能协定用作域注册服务,对协定的调用可能需要输入字段,如域名和IP地址。

我们在上面的“账户”一章中了解到,交易总是由外部账户发起并提交给区块链,对于消息调用和合同创建这两种交易分类也是如此。我们可以说,交易是连接外界和以太坊内部状态的桥梁。

但这并不意味着一个契约不能与另一个契约对话。以太坊全局范围内存在的契约可以与同一范围内的其他契约对话。这种方式是通过“消息”或“内部交易”来实现的。你可以把这种变现比作交易,不同的是发起方不是外部账户,而是合约账户。与事务不同,它们没有序列化,只作为虚拟对象存在于以太坊的执行环境中。

如果一个契约向另一个契约发送内部事务,则作为接收者的契约中的代码将被执行。

内部交易或报文不需要Gasl限额,因为gas限额由原始交易的外部账户决定。由外部账户设置的Gas限额需要覆盖从该交易派生的子交易,例如合同和合同之间的消息。如果在这个事务的执行链中,某个特定的消息由于气体耗尽而无法执行,那么所有执行的事务都将回滚到初始状态。唯一的例外是在契约中使用原始的CALL操作码(除非万不得已,否则不建议这样做)。在这种情况下,对另一个协定的调用可能会失败,但如果父协定不检查和处理错误,执行将正常进行,结果可能会显示成功。

街区

所有的交易被分组到块中,一系列链接的块形成一个区块链。

在以太坊中,一个块包含:

该块的事务集数据是当前块中一组ommers的块头。什么是OMMER?

一个ommer也是一个块,它的父级是当前块的父级的父级(这就是为什么叫OMMER,有时叫大叔)。我们先简单了解一下三级块的用途。为什么一个块需要包含第三个块的头?

由于以太坊的构建方式,封出时间(约15秒)远短于比特币等其他区块链(约10分钟),可以实现更快的交易处理。但块释放时间短也有劣势。缺点之一是可能同时产生多个块。这些由于竞争而产生的块也称为“孤儿块”(即不会进入主链的块)。

块叔是为了奖励同时开采有效孤块的矿工,因为这些矿工也付出了计算的工作。

但是三级块收到的奖励低于打包进主链的块。尽管如此,因为奖励的存在,矿工们还是有动力去包装这些孤件,获得奖励。

分程序首部

让我们回到街区本身。如上所述,每个块都有一个块头。那么什么是块头呢?

块标题由以下字段组成:

括号:父块的哈希值(这也是块形成区块链的原因)ommersHash:多个三级块的哈希收益:生成该块的miner地址所获得的回报state root:Merkletrie的根哈希,存储系统事务的整体状态root:该块中列出的所有事务接收者的trie根节点的哈希logsBloom: Bloom filter(一种数据结构)包含日志数据难度:挖掘该块的难度number:当前块计数(创建块的块号为零;每个后续块的块号增加1)gasLimit:用于块中的事务设置的总gas limit gas:该块中所有事务消耗的总gastimestamp:挖掘该块的挖掘器的时间戳:extraData:挖掘器附加到该块的任何额外数据:散列值。当与nonce字段结合时,Nonce可用于证明该块是由足够的计算生成的:当与mixHash字段结合时,hash值可用于证明该块是由足够的计算生成的。

每个块头包含前面提到的梅克尔帕特里夏树的三种特里结构:

州(州根)交易(交易根)收据(收据根)以上条款将在以下几页详细说明。

杂志

以太坊设计了日志来处理不同的事务和消息。如果一个契约想要记录日志,可以通过定义一个事件来实现。

日志包括:

日志的帐户地址不同。事务携带的主题以及与该事件相关的任何数据日志都存储在Bloom filter中。这种数据结构可以有效地存储大量数据。

交易收据

标头中存储的日志来自交易收据中包含的日志信息。就像你去超市买东西后收到收据一样,以太坊也会为每一笔交易生成收据。收据包含有关此交易的信息,包括:

块号、块散列、事务散列、事务中使用的gas、当前事务执行后在该块中使用的gas的累积值、当前事务的日志生成等.阻滞难度

块的“难度”是用来衡量挖一个块所需要的平均操作次数,反映了在一定难度下挖一定数量的块需要多长时间。创建一个方块的难度是131072,然后用一个特殊的公式计算每个方块的难度。如果一个块的验证速度比前一个块快,以太坊协议会增加这个块的难度。

难度会影响nonce,因为这个hash必须由矿工通过挖掘,使用工作量证明算法计算出来。

块难度和随机数之间的关系可以由下面的数学公式表示:

找到满足难度阈值的随机数的唯一方法是使用工作量证明算法枚举所有可能性。找到解决方案的预期时间与难度成正比。——难度越高,就越难找到nonce,所以验证块的难度就越大,进而增加了验证新块所需的时间。因此,通过调整块的难度,可以调整验证块所需的时间。

另一方面,如果验证时间慢,协议将降低难度。通过这种方式,验证时间会自动调整以保持恒定的速率—平均每15秒一个数据块。

交易执行

我们已经到了以太坊协议最复杂的部分:事务执行。当你在以太坊网络上发送交易时,以太坊会经历怎样的状态转换?

首先,所有事务必须满足一组基本要求才能执行:

交易必须是格式正确的RLP。“RLP”代表“递归长度Prifix”,这是一种用于编码二进制数据嵌套数组的数据格式。RLP是以太坊用来序列化对象的格式。合法交易签名,合法交易随机数。回想一下,我们之前提到过,帐户的nonce是从该帐户发送的交易计数。因此,交易的noce必须等于交易发送方帐户地址的nonce。交易的gas限制必须大于或等于该交易的固有gas。固有gas包括:执行事务的预定义成本为21,000 gas和随事务发送的数据的gas费用(每个等于0的数据或代码字节需要4 gas,每个非零数据或代码字节需要68 gas。)如果该交易包括合同创建交易,则在交易执行期间,增加操作步骤消耗的额外32,000gas。

发送者的账户余额必须有足够的以太币来支付必须支付的“预付”燃气费。前期用气成本的计算很简单:首先将交易的用气限额乘以交易的用气价格,确定最大用气成本。然后,这个最大成本被加到从发送方转移到接收方的总价值中。

如果交易通过上述验证,那么它将进入下一阶段:

首先,我们将直接从发送方的余额中减去刚才提到的预付燃气费,并在发送方账户的nonce上加1。此时,我们可以计算剩余气体=交易的总气体限制-使用的固有气体。

接下来,将执行该事务。在整个交易执行过程中,以太坊会跟踪“子状态”。子状态是记录交易期间积累的信息的一种方式,当交易完成时将使用该信息。它包含:

待销毁的一组账户:交易完成后将被丢弃的一组账户(如果有)。系列:虚拟机代码执行的归档和索引的检查点退款余额:交易完成后返回发送方账户的金额。还记得我们怎么提到以太坊的存储是要花钱的,发件人清理存储会得到退款吗?以太坊使用退款计数器来跟踪这一点。退款计数器从0开始,并在每次合同删除存储中的内容时递增。接下来,处理事务所需的各种计算。

如果处理了交易所需的所有步骤并且没有出现异常状态,则通过确定要返回给发送者的未消耗气体的量来最终确定状态。除了没用完的气,发件人还会从我们上面说的“退款余额”里得到一些补偿。

寄件人收到退款后:

天然气成本将奖励给矿工。使用的气体将被添加到该区块的气体计数器中(用于记录该区块消耗的总气体,该值将在验证该区块时使用)。废弃账户(如有)销毁。最后,这个事务留下了一个新的状态和一系列日志。

现在,我们已经大致了解了交易执行流程的所有知识点。让我们看看契约创建和消息调用之间的区别。

合同创建

回想一下上面提到过以太坊有两种类型的账户:合约账户和外部账户。当我们说一个交易是“合同创建”交易时,这意味着这个交易的目的是创建一个合同帐户地址。

为了创建合同帐户的地址,我们需要首先以特定的方式声明新帐户的地址。然后初始化一个新的帐户地址:

将合同帐户地址的随机数设置为0。如果发送方在本次交易中发送以太币,用这些以太币作为本账户的余额,从发送方账户中减去要发送的以太币的值,设置为null,将本合同的codeHash设置为空字符串的哈希值。一旦我们初始化了帐户,我们就可以使用与交易一起发送的初始化代码来创建帐户。在这个初始化代码的执行过程中,可能会发生很多事情。根据契约的构造者,它可以更新帐户的存储,创建其他契约帐户,进行其他消息调用等。

当执行初始化协定的代码时,它将使用gas。交易消耗的燃气不得超过剩余燃气。如果是,执行将遇到气体耗尽(OOG)和退出的异常,此时状态将恢复到事务前的状态。在汽油用完之前,发送方不会退还所消耗的汽油。

但是,如果发送方在交易中发送任何以太币价值,即使合同创建失败,以太币也会被退还。

如果初始化代码成功执行,将支付最终的合同创建成本。这个成本是一个存储成本,和创建的合同代码大小成正比(记住天下没有免费的午餐!)。如果没有足够的剩余气体来支付这个最终的存储成本,那么交易将声明气体耗尽异常并被中止。

如果一切顺利,那么未消耗的气体将返回给交易的发送方。

消息呼叫

消息的执行基本上类似于契约创建过程,但是有一些不同。

消息调用将不包含任何需要初始化的代码,但是它可以输入数据,这些数据是由事务的发送方提供的。消息调用还有一个包含输出数据的附加组件,如果后续执行需要这个输出数据,就应该使用这个组件。

就像创建契约一样,如果消息调用耗尽gas或者事务无效(比如堆栈溢出、无效跳转目标或者无效指令)退出,消耗的gas不会返回给原发送方。所有剩余的未使用的气体被消耗,并且状态被重置为先前的状态。

起初,以太坊不允许在消耗提供的气体之前停止或恢复交易。比如你的一个合约被打电话的人私自打了电话,剩余的气还是会在之前的以太坊里消耗掉,不会返还给打电话的人。但拜占庭更新后,以太坊增加了revert代码,允许合同执行中断或恢复,并返还未使用的气体。

执行模式

在上一篇文章中,我们已经看到了从事务开始到结束的步骤。现在,让我们来看看交易是如何在EVM(以太坊虚拟机)中执行的。

EVM是一个图灵完全虚拟机。EVM唯一的限制是gas,这是其他图灵完全虚拟机所没有的。因此,在EVM上可以完成的计算总量基本上受到所提供的气体量的限制。

EVM是基于堆栈的,基于堆栈的机器是一台使用后进先出堆栈来存储临时值的计算机。

EVM中每个堆栈项目的大小是256位,最大堆栈大小是1024位。

EVM有内存,其数据存储为字寻址字节数组。存储在内存中的数据不是永久数据。

EVM也有外部记忆。与内部存储器不同,外部存储器是作为系统状态的一部分来维护的,并且可以存储永久数据。EVM将程序代码单独存储在虚拟ROM中,只有特殊指令才能访问。在这方面,EVM不同于典型的冯诺依曼架构,后者将程序代码存储在内存或存储器中。

EVM也有自己的语言:“EVM字节码”。当程序员编写运行在以太坊上的智能合约时,我们通常会使用更高级的语言(比如Solidity)来编写代码,然后编译成EVM可以理解的EVM字节码。

介绍完EVM的基本概念后,让我们来看看具体的实施步骤。

在执行计算之前,处理器将报告以下信息可用且合法:

系统计算剩余的气体量。合同代码的创建帐户地址。发起该执行的交易的发送者地址导致代码执行的账户地址(可能与原始发送者不同)。交易执行的气体输入数据是所执行的机器代码的以太值(单位为wei)。当前块的当前块头由当前消息或契约创建的堆栈深度调用。当执行开始时,内存和堆栈都应该为空,程序计数器的值应该为0。

然后,EVM递归地执行事务,并计算每个周期的系统状态和机器状态。系统状态是以太坊的全局状态。机器状态包括:

可用气体程序计数器存储器每个循环的数据存储器中的有效字堆栈内容,相应的气体将从剩余的总气体中减去,程序计数器将增加1。

机器达到异常状态(如气体不足、指令无效、堆栈内存不足、跳转/跳转目标无效等。).此时,必须停止计算,更改将被作废并继续处理。机器将进入下一个循环,并达到受控停止(执行过程的结束)。假设执行没有遇到异常状态,达到“受控”或正常停止,机器将生成结果状态、执行后剩余气体、应计子状态和结果输出。

现在,我们来看看以太坊最复杂的部分之一。即使没有完全理解这部分也没关系。除非你想成为一名区块链架构师,并且需要了解很多底层的知识,否则你实际上不需要知道具体的实现细节。

区块是如何确定的?

最后,让我们了解一下包含许多事务的块是如何确定的。

块的确定可能意味着不同的事情,这取决于该块是新生成的还是已经存在的。如果这是一个新区块,我们指的是生产该区块的采矿过程。如果这是一个现有的块,它指的是块验证过程。在这两种情况下,区块确定需要四个要素:

验证第三级块头中的每个第三级块必须具有合法的块头,并且在当前块的第六代内。

验证交易块中使用的气体数量必须等于交易块中使用的气体累计数量。

奖励(仅在采矿时可用)采矿者的地址因开采此区块而获得5以太。(根据以太坊提案EIP-649,这个5 ETH的奖励已经减少到3 ETH)。此外,每三级区块,当前区块的矿工将额外获得当前区块奖励的1/32。最后,三级块的参考块也会获得一定的奖励(有专门的计算公式)。

验证状态和随机数。在确保所有交易和结果的状态已经改变之后,奖励该块。此时,块的新状态最终被确定和定义。

工作证明

“格挡”一节简单介绍了格挡难度的概念。给块难度的算法叫做工作证明(PoW)。

以太坊的工作量证明算法叫做“Ethash”(原名Dagger-Hashimoto)。

该算法的正式定义如下:

M mixHash,n nonce。Hn是新生成的块头(不包括mixHash和nonce,因为这两部分需要计算),Hn是块头的nonce,D是DAG,这是一个大数据集。

在“块”一章中,我们提到过块头由几个不同的字段组成。上面的mixHash和nonce是块头中的字段:

mix hash:hash与nonce一起使用,可以证明块提供了足够的计算。nonce:一个hash,和mixHash一起使用,可以证明这个块提供了足够的计算量。工作负载证书用于计算这两个哈希。

至于计算mixHash和nonce的具体细节,比较复杂。以后可以写一个更深入的专栏来分析。工作量证明算法大致如下[1]:

为每个块计算一个种子。Seed可以根据种子计算出一个初始大小为16MB的伪随机缓存。客户端略微保存该缓存,以帮助检查数据块和生成数据集。根据缓存,可以生成初始大小为1GB的DAG数据集。数据集(64字节)中的每个条目仅依赖于缓存中的少量条目。数据集随时间线性增长,每30,000个数据块更新一次。数据集只存储在完整的客户端和挖掘器节点,但大部分时间挖掘器的工作是读取这个数据集,而不是改变它。挖掘就是在数据集中随机选取部分,散列在一起。可以根据缓存只生成验证需要的部分,这样就可以用少量的内存进行完整的验证,所以对于验证来说,只需要保存缓存即可。采矿安全机制

一般来说,POW (proof of workload)的目的是证明已经花费了一定数量的计算,以加密和安全的方式生成了一些输出(比如nonce)。之所以采用这种方法,是因为没有比穷举法更好的方法来找到低于所需阈值的随机数。重复哈希函数的解具有空间均匀分布的特点。因此,我们可以确定,平均来说,找到这样一个随机数所需的时间取决于难度阈值。难度越高,求解随机数的时间越长。这样,PoW算法可以通过调整难度来加强区块链的安全性。

区块链安全是什么意思?很简单,我们想创造一个人人都信任的区块链。如前所述,如果有多个链,用户无法合理确定哪个链是“有效的”链,从而使链失去用户的信任。为了让用户接受存储在区块链上的底层状态,我们需要让人们相信区块链是一个遵循单一规范的区块链。

这正是PoW算法所做的:它确保特定的区块链保持标准化,使攻击者难以创建覆盖特定历史部分的新块(例如,通过清除交易或创建虚假交易)或维护分叉。为了验证他们的块,攻击者需要总是比网络中的任何人更快地计算出nonce,从而使整个网络认为他们的链是最重的链(基于我们前面提到的GHOST协议的原理)。除非攻击者有一半以上的网络挖掘能力,否则这是不可能的,这叫51%攻击。

矿业财富分配机制

除了提供安全的区块链,PoW还是一种财富分配机制,将财富分配给为确保区块链安全做出计算贡献的矿工。文中提到矿工挖出一个区块有奖励,包括:

3ETH创建一个新的区块奖励,以在该区块的交易中获得gas三级区块奖励。为了保证使用PoW共识机制的安全和财富分配的长期可持续性,以太坊努力做到这两点:

让尽可能多的人了解区块链。人们不应该需要特殊或专用的硬件来运行算法。这样做的目的是让财富分配模式尽可能开放,让任何人都可以提供任意数量的计算能力来赚取以太坊。降低单个节点获取巨大以太坊的可能性。如果发生这样的事情,说明这个单个节点对区块链的影响很大,会降低整个网络的安全性。在比特币区块链网络中,与上述两点相关的一个问题是PoW算法是SHA256哈希函数。这种算法的缺点是可以通过使用特殊的硬件(也称为ASIC)来更有效地计算散列。

为了缓解这个问题,Ethereum中采用了Ethash算法,这是精心设计的。用Ethash计算nonce需要大量的内存和带宽。大内存的要求使得计算机很难有足够的内存同时发现多个nonce,而高带宽的要求使得即使是超级计算机也很难同时发现多个nonce。这降低了集中化的风险,并为节点验证创造了更公平的竞争环境。

需要注意的是,以太坊正在从PoW共识机制向所谓的“PoS(权益证明)”转变,预计2022年下半年迁移。

摘要

本文翻译自《How does Ethereum work, anyway?》。

文章里可能有很多东西需要消化,可能需要看很多遍才能理解。写这篇文章之前也看了以太坊黄皮书、白皮书、代码库的很多部分。

尽管如此,我希望这个概述对您有所帮助。如有错误,请在评论区花掉。

参考数据

[1]或许是国内第一篇从算法层面清晰阐述以太坊工作量证明的论文——小熊座。

[2]以太坊到底是如何运作的?

广告位
本文来自网络,不代表区块链网站|NFTS立场,转载请注明出处:https://www.qklwz.com/jzb/ytf/13188.html
上一篇
下一篇

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

返回顶部