主页 > imtoken苹果下载不了 > 多图详解:以太坊是如何运作的? (一)
多图详解:以太坊是如何运作的? (一)
介绍
无论您是否知道它到底是什么,您都可能听说过以太坊区块链。 因为它经常出现在新闻中。 如果您对以太坊没有基本的了解,阅读本文可能会有些混乱。 那么以太坊到底是什么? 它本质上是一个公共数据库,永久记录数字交易。 重要的是,这个数据库不需要任何中央机构来维护和保护它。 相反,它作为一个“非中介信任”交易系统运行,在这个框架中,个人可以在不信任任何第三方或彼此信任的情况下进行点对点交易。
还是一头雾水? 这就是本文可以发挥作用的地方。 我的目标是在没有复杂数学或可怕公式的情况下解释以太坊如何在技术层面上运作。 即使您不是程序员,我也希望您至少能从中有所收获。 如果有些部分太技术化和晦涩难懂也没关系。 你不需要知道所有的细节。 我建议只是大规模地了解它。
本文提及的主题均为以太坊黄皮书中的概念分析。 我已经添加了我自己的解释和图表,以便更容易理解。 如果你对技术挑战感兴趣,也可以直接阅读黄皮书。
区块链的定义
区块链是“具有共享状态的加密安全事务单例”。 让我们分解一下。
“加密安全”意味着创建的数字货币受到难以破解的复杂数学算法的保护。 想想各种防火墙。 他们几乎不可能欺骗系统,例如创建虚假交易、删除交易记录等。
“单一事务”意味着系统中创建的所有事务都由一个规范实例负责。 换句话说,每个人都相信一个单一的全球真理。
“拥有共享状态”意味着存储在这台机器上的状态是共享的,对所有人开放。
以太坊实现了这种区块链范式。
以太坊区块链范式阐述
以太坊区块链本质上是一个基于交易的状态机。 在计算机科学中,状态机指的是读取一系列输入并根据这些输入转换到新状态的东西。
对于以太坊的状态机,我们从“创世状态”开始。 这类似于一张白纸,网络上从未发生过任何交易。 执行事务时,创世状态转换为某个最终状态。 在任何时间点,最终状态都代表以太坊的当前状态。
以太坊的状态有数百万笔交易。 这些交易形成区块。 一个区块包含一系列交易,每个区块都链接到前一个区块。
对于一个状态转换到下一个状态,交易必须是有效的。 要被认可为有效,交易必须经过验证过程,这称为挖矿。 一组节点(计算机)花费他们的计算资源来创建包含有效交易的区块,这就是挖矿。
网络上的任何节点都可以声称自己是矿工节点,并可以尝试创建和验证区块。 世界各地有许多矿工试图同时创建和验证区块。 当向区块链提交区块时,每个矿工都会提供一个数学“证明”,作为保证,如果证明存在,则该区块必须有效。
对于要添加到主链的区块,矿工必须比其他竞争对手更快地证明它。 通过让矿工提供数学证明来验证每个区块的过程称为“工作量证明”。
验证新区块的矿工将获得一定数量的奖励,以激励他们完成这项工作。 什么样的价值? 以太坊区块链使用原生数字代币“以太币”。 每次矿工证明一个区块时,都会创建新的以太币并奖励给矿工。
你可能会想:用什么来保证大家在同一条链上? 我们如何确定没有一小部分矿工决定创建自己的链?
如上所述,我们将区块链定义为具有共享状态的事务单例。 使用这个定义,我们可以理解正确的当前状态是每个人都必须接受的单一全球事实。 拥有多个状态(或多个链)会破坏整个系统以太坊交易系统,因为不可能就哪个状态是正确的状态达成一致。 如果你有多条链,一条链上可能有 10 个代币,另一条链上有 20 个代币,另一条链上有 40 个代币。 在这种情况下,没有办法确定哪条链最“高效”。
每当有多个路径时,就会出现“分叉”。 我们通常希望避免分叉,因为它们会破坏系统并迫使人们选择要信任的链。
为了决定哪条路径最有效,并防止创建多个链,以太坊使用一种称为“GHOST 协议”的机制。 "GHOST" = "贪心最重观察子树"
简单来说以太坊交易系统,GHOST协议说我们必须选择消耗算力最多的路径。 确定哪条路径的一种方法是使用最近块(“叶块”)的块号,它表示当前在该路径上的块总数(不包括创世块)。 区块编号越高,路径越长,到达“叶区块”所需的挖矿工作量也越大。 使用这种推理方法,我们能够就当前状态的规范版本达成一致。
现在您对区块链有了一些了解,让我们更深入地了解一下以太坊系统的主要组件:
在我们开始之前需要注意一件事:当本文提到 X 的“哈希”时,它通常指的是以太坊使用的 KECCAK-256 哈希。
帐户
以太坊的全球“共享状态”由许多通过消息传递框架相互交互的小对象(账户)组成。 每个帐户都有一个与其关联的状态和一个 20 字节的地址。 以太坊中的地址是标识任何帐户的 160 位标识符。
有两种类型的帐户:
外部帐户与。 合约账户
了解外部账户和合约账户之间的根本区别非常重要。 外部账户可以通过使用其私钥创建和签署交易来向其他外部账户或其他合约账户发送消息。 两个外部账户之间的消息只是价值转移。 但是从外部账户发送到合约账户的消息可以激活合约账户的代码,允许它执行各种操作(例如,转移代币、写入内部存储、发行新币、执行计算、创建新合约、 ETC。)
与外部账户不同,合约账户不能自行发起新的交易。 相反,合约账户只能触发自己的交易以响应他们收到的其他交易。 例如,从外部账户触发或来自其他合约账户的交易。 我们将在“交易和消息”部分了解更多关于合同到合同请求的信息。
因此,在以太坊区块链上发生的任何动作总是由外部账户触发的交易发起的。
帐户状态
帐户状态由四个部分组成,无论帐户类型如何,它们都存在:
Nonce:如果账户是外部账户,这个数字代表从这个账户地址发送的交易数量。 如果账户是合约账户,nonce就是该账户创建的合约数量。
余额:地址拥有的Wei数量。 每个以太币有 1e+18Wei。
StorageRoot:Merkle Patricia树(Merkle树后面会讲解)根节点的哈希值。 Merkle 树对账户存储内容进行哈希编码,默认为空。
CodeHash:账户EVM代码的哈希值。 对于合约账户,这是经过哈希处理并存储为 CodeHash 的代码。 对于外部帐户,codehash 字段是空字符串的哈希值。
世界状况
我们知道以太坊的全局状态包括账户地址和账户状态之间的映射关系。 此映射存储在 Merkle Patricia 树数据结构中。
Merkle 树是由一组节点组成的二叉树,其中:
树底部的数据是通过将我们要存储的数据拆分成块,然后将块拆分成桶,然后取每个桶的哈希并重复相同的过程,直到剩余哈希总数变为只有一:根哈希。
Merkle 树中存储的每个值都需要一个键。 从树的根节点开始,key应该告诉你要跟随哪个子节点得到对应的值,这个值存储在叶子节点上。 以以太坊为例,状态树的key/value映射是地址与其相关账户之间的映射,包括每个账户的balance、nonce、codeHash和StorageRoot(StorageRoot本身就是一棵树)。