主页 > 海外版imtoken > 3.3 区块链2.0架构:以太坊区块链

3.3 区块链2.0架构:以太坊区块链

海外版imtoken 2023-12-19 05:13:35

2021-09-01

比特币的区块链架构主要围绕支持虚拟货币的变现展开。 虽然它具有一定的灵活性,但在支持虚拟货币以外的应用场景方面仍然非常有限。 近年来,区块链逐渐受到IT行业的关注,逐渐成为独立于比特币的平台架构,其重要性也越来越受到重视。 区块链2.0的概念也应运而生。 其核心思想是将区块链作为一种可编程的分布式信用基础设施来支持智能合约应用,以区别于过去作为虚拟货币支持平台的比特币区块链。 具体来说,不仅仅是将区块链作为去中心化的虚拟货币和支付平台,而是通过在链上增加可扩展性功能,扩大区块链的技术范围以支持去中心化的市场,交易的内容可以包括房地产合同、股权和债务凭证、知识产权,甚至汽车、艺术品等。

区块链 2.0 提供了一套新的协议(blockchain 2.0 协议)来支持新的去中心化应用。 如果用互联网协议来类比,区块链1.0相当于TCP/IP协议,区块链2.0相当于HTTP、SMTP、FTP等高级协议。 甚至有人将区块链1.0比作手机,将区块链2.0比作智能手机。 在比特币之后,出现了很多被称为区块链2.0的平台,其中最具代表性的就是以太坊平台。 下面简单介绍一下以太坊架构。

以太坊的设计主要基于比特币架构。 前面的章节已经介绍了以太坊的基本架构。 本章不再详细介绍。 下面将只关注与比特币架构不同的主要方面。 以太坊的架构如图 3-9 所示。

3.3 区块链2.0架构:以太坊区块链

图 3-9 以太坊架构

1.账户设计

比特币没有账户的概念。 每个用户的余额都是根据他们在区块链上的 UTXO 计算得出的。 以太坊有两种账户:一种是外部拥有账户(EOA),另一种是合约(Contract)账户。 所有外部账户都是我们一般意义上的用户账户,由私钥控制。 合约是存在于以太坊区块链上的特殊可编程账户,是代码(其功能)和数据(其状态)的集合。 合约由代码控制并由外部账户拥有。

以太坊的设计是将区块链作为管理对象状态转换的通用去中心化平台,账户是有状态的对象。 所有外部账户的状态都是余额,而合约账户的状态可以是余额、代码执行、合约存储。 以太坊网络的状态是所有账户的状态,由每个区块的交易来更新,需要在全网形成共识。 用户与以太坊区块链的交互需要通过账户的交易来实现。

每个以太坊的所有外部账户都由一对密钥定义,一个是私钥,另一个是公钥。 区块链上的 EOA 账户由其地址索引。 取公钥后20位为地址,与比特币地址不同。 每个公私密钥对都被编码并存储在一个密钥文件(Keyfile)中。 **文件为JSON格式,可以用文本编辑器打开。 **文件的私钥是用创建账户时输入的密码加密的。 **文件存放在以太坊节点数据目录下的keystore子目录下。 **文件需要经常备份,否则如果**文件丢失,账户中的以太坊将无法找回。

合约账户可以执行图灵完备的计算任务,也可以在合约账户之间传递消息。 合约被编译成以太坊虚拟机字节码(Ethereum Virtual Machine Bytecode)并记录在区块链上。

所有外部账户都可以通过向合约发送交易来调用合约。 这就需要提供几个参数,比如EOA的地址,合约的地址,数据。 数据部分包括合约中需要调用的方法(method)及其传递的参数。 这需要使用应用程序二进制接口 (ABI) 作为编码和解码传输数据的标准。 有关 ABI 的更多信息,请参阅以太坊维基页面。

2. 区块链设计

比特币以太坊纳斯达克_以太坊账户和比特币账户_以太坊跟比特币的区别

比特币使用默克尔树将交易的哈希值按照一定的算法形成二叉树结构[1]。 顶级节点的哈希值相当于整个交易列表的指纹,可以用来验证交易列表。 中本聪采用 Merkle 树设计,也为轻量级节点通过 SPV(简化支付验证)轻松验证交易。 SPV不需要下载整个交易列表,只需要区块头中交易列表中最顶端节点的哈希值,以及与自己节点相关的交易,就可以通过向其他节点查询来完成交易其他相邻交易。 验证交易是否包含在区块链的块中。

以太坊区块链的每个区块不仅保存了交易列表,还保存了最新的状态。 以太坊作为一个通用的区块链编程平台,引入了账户的概念,也带来了更复杂的验证和查询需求。 比如查询一个账户的余额,判断一个账户是否存在,单靠比特币的Merkle树是无法满足要求的。 因此,以太坊使用 Merkle Patricia 树来实现交易和状态的验证和查询 [2]。 让我们看看交易和状态所面临的问题。

以太坊的状态包括一个键值映射,其中键是地址,值是账户中声明的变量,包括余额、随机数、代码和账户存储(存储也用树的形式来组织)。 与交易数据只能增加不能改变不同,账户的状态经常变化,其余额和随机数也经常变化。

另外,新账户频繁插入,密钥在商店中频繁插入和删除。 因此,默克尔树不适合这种情况,而是一种可以在插入、更新和删除操作后快速计算出一个新的树根哈希值而无需重新计算整棵树的数据结构。 同时,树的深度是有限的,即使攻击者试图通过故意发送很多交易来增加树的深度,否则攻击者可以操纵树的深度,使每次更新变得很慢,在平台上实施拒绝服务攻击。

还有一个要求就是树的根哈希只与树的数据有关,与更新的顺序无关。 不同的更新顺序甚至重新计算整棵树的根哈希都不会改变树的根哈希。 Patricia 树是满足这些要求的数据结构。

简单来说,以太坊中一个账户的状态由一个键值表(Key-ValueMap)表示。 在 Patricia 树中,密钥被编码为沿着树向下的路径。 在以太坊的 Patricia 中,每个节点都有 16 个子节点以太坊账户和比特币账户,所以路径是用十六进制编码的。 比如键“dog”的十六进制编码为6461567,那么要访问键“dog”对应的值,就必须先从根节点开始,往下到第6个节点,再从这个往下走node 到第4个节点,依此类推,直到结束。

在区块链的区块头中,不像比特币那样只存储一个交易列表的Merkle树根哈希值,而是存储三个根哈希值:一个是交易的Merkle根哈希值,另一个是根哈希状态,一个是收据的根哈希。

与比特币的另一个区别是,以太坊区块链中的每个区块都保存了区块链编号和区块难度。

3.PoW机制

以太坊的PoW(Proof of Work)算法称为Ethash算法(一种改进的Dagger-Hashimoto算法),主要寻找一个随机数作为输入,使得运算结果小于特定的难度阈值。 PoW 机制的前提是没有比一个一个尝试更好的找到随机数的方法,并且验证结果必须非常方便且具有成本效益。 由于哈希运算的结果是均匀分布的(UniformDistribution),因此可以保证找到随机数的时间通常取决于难度阈值。 这样就可以通过控制难度来控制在网络上寻找新区块的时间。 以太坊通过动态调整难度,平均每 15 秒在全网发现一个新区块。 每15s的“心跳”基本上是更新全网系统状态的节奏,保证当攻击者的算力不超过全网算力的一半时,攻击者无法改写交易记录or fork(为了双花交易)。 这就是所谓的“51%”攻击。 矿工对网络的挖矿收益预期,直接反映了他们拥有的算力,或者算力占全网的比例。

比特币的工作量证明机制只依赖于 CPU 计算的难度,而以太坊的 Ethash 工作量证明机制增加了内存难度,使其对单独通过哈希运算优化的 ASIC 矿机具有抵抗力。 内存的难度是通过在算法设计中要求选择一部分由随机数和区块头决定的固定资源来实现的。 这些资源一般都是几GB的数据,称为“有向无环图”(DAG)。 每 30,000 个区块之后需要有一个全新的 DAG。 这相当于一个 125 小时的窗口,或 5.2 天,称为一个纪元。 此图需要一段时间才能生成。 因为DAG只和区块链的深度有关,所以可以提前生成。 如果没有现成的,以太坊客户端需要等待DAG生成后再生成新的区块。 这样,在每个epoch转换的时候,如果客户端没有预先生成DAG,网络就会出现大规模的延迟。 矿工节点首次启动时,需要等待DAG生成后才能开始挖矿。

比特币以太坊纳斯达克_以太坊跟比特币的区别_以太坊账户和比特币账户

以太坊的Go语言实现程序geth和C语言挖矿程序ethminer都实现了DAG的自动生成,并在epoch转换过程中维护两个DAG。 以太坊的 Ethash 算法可以在慢 CPU 环境下进行哈希运算,但可以通过增加挖矿节点的内存和带宽来提高挖矿速度。 对内存的高要求使得大型矿场的所有者不可能有太多比较超线性的收益; 对带宽的高要求使得与超快计算单元共享存储无法带来更好的回报。 这对矿池挖矿没有太大好处,所以以太坊希望通过设计避免像比特币那样的矿池算力中心化。

与比特币类似,以太坊的静态挖矿收益会随着时间的推移逐渐减少。 目前,每挖出一个区块,静态收益为 5 ETH。 未来矿工的收入主要靠用户发送交易支付的“燃料”获取收益。 以太坊的矿工奖励系统比比特币的更复杂。 很多参考资料并没有给出具体的奖励金额,有的甚至是错误的。 比如挖“叔块”矿工的奖励描述中,有资料认为是(7/8)×5=4.375 ETH。 其实,这是不准确的。 笔者参考计算奖金的源码,具体奖金机制说明如下。

矿工每挖出一个区块,都会获得5.0 Ether的静态收益,同时获得区块上的“gas”,其价值取决于当前的“gas”价格。 此外,矿工还将“叔块”(uncle)收录到区块链中获得额外奖励,每收录一个叔块相当于(1/32)×5 Ether。 生产“叔块”的矿工将按照以下公式获得奖励:

挖到“叔块”的矿工奖励=(叔块ID+8-当前块ID)×5/8

例如,假设当前区块ID为1600,叔块ID为1598,那么挖叔块1598的矿工将获得(6/8)×5,即3.75个ETH。 如果叔块ID为1599,那么挖出1599叔块的矿工将获得(7/8)×5,即4.375 ETH奖励。

3.3 区块链2.0架构:以太坊区块链

注:所谓“叔块”是指满足难度条件的块,但块中的交易未被确认,或“陈旧”。 例如,矿工A挖到了一个符合难度要求的合规区块a,矿工B几乎同时也挖到了一个符合标准的区块b,但是由于网络延迟,区块b没有得到确认,成为了废块,而成为网络共识的区块被包含在区块链中。 由于以太坊的区块生成速度比比特币快很多,当网络繁忙时,相比比特币系统更容易出现“废块”。 在比特币系统中,生产废块的矿工只能自认倒霉,没有任何奖励。 在以太坊中,生产“叔块”的矿工和在区块链上包含“叔块”的矿工都会获得奖励。 这样一来,产生废块的算力也被包括在内,有效地增强了安全性,使得攻击者很难追上一条有“叔块”的主链。 同时,通过奖励“叔块”,也可以避免像比特币这样算力高度集中的矿池,因为矿池不像单个挖矿节点那样容易出现废块。 严格来说,一个“叔块”是从当前链接块最多往前推6个的“祖先”废块,每个块最多可以链接两个“叔块”。

以太坊使用与比特币不同的算法,称为 GHOST(幽灵)来构建区块链。 GHOST的全称是GreedyHeaviest ObservedSubtree,中文直译为“贪心最重的观察子树”。 严格来说,以太坊的区块链不是一条链,而是像一棵树,里面包含了前面提到的“叔块”。

在比特币系统中,矿工按照一定的优先级将未确认的交易打包到新发现的区块中。 交易的优先级由交易金额和链龄(指UTXO存在的时间)决定。 交易金额越大,链龄越高,优先级越高。 交易费用是用户输入和输出之间的差额。 如果输入和输出之间的差异为零,随着交易发生的时间越来越长,它在交易池中的优先级将逐渐增加。 所以一般来说,即使是向矿工支付零交易费的交易,也有机会被矿工收录到区块链中。 当然,个别矿工可以有自己的规则,可以零交易费拒绝交易。 在以太坊平台上,不提供“gas”的交易不会被执行,也不会被纳入区块链。 以太坊交易费用根据以下公式计算:

总成本=gasUsed×gasPrice

其中,gasUsed为执行交易消耗的gas。 gas价格由用户和矿工共同决定。 一般来说,当用户创建交易时,可以提高gas价格。 在以太坊发布的第一个版本的前沿(Frontier)中,以太坊客户端默认的 gas price 为 0.05e12wei,大约是每 100,000,000 个 5 个以太币。 矿工一般不会接受低于现行价格的燃料价格。

以太坊账户和比特币账户_以太坊跟比特币的区别_比特币以太坊纳斯达克

4. 计算与图灵完备性

作为一个通用的区块链平台,以太坊需要提供比比特币更强大的算力。 前面提到,从安全的角度出发,比特币的设计特地选择了非图灵完备的脚本引擎。 目前可以使用的比特币脚本命令并不多,但在虚拟货币的应用场景中已经绰绰有余了。 在以太坊上,与比特币的一个非常大的区别是选择了图灵完备的计算环境——以太坊虚拟机(EVM)。 这意味着所有可以想到的计算都可以在 EVM 上完成,包括无限循环。 EVM指令中包含一条JUMP跳转指令,可以让程序跳回到上一个程序代码。 它还可以像条件判断语句一样进行条件跳转。 当满足某个条件时,程序会跳转到另一个地方执行。 此外,一个合约可以调用其他合约,这提供了潜在递归调用的功能。 这自然会引出一个问题:破坏性用户是否可以通过迫使矿工或全节点进入无限循环来基本上关闭它们? 这实际上是一个“停止问题”,也就是说,通常没有办法确定一个程序是否会停止。 以太坊是如何解决这个问题的? 它首先要求每笔交易给出最大的计算步长,交易的发起方必须提供Gas作为交易费,供矿工将交易加入区块。 如果实际操作超过最大计算步长,计算将终止,交易手续费归挖出区块的矿工所有。 因此,以太坊采用经济的方式来保证以太坊平台的安全。

以太坊网络的每个节点都运行EVM并执行合约代码,所以以太坊就像一台并行运行的“世界计算机”,同时对所有节点进行账户状态转换,形成了所有账户状态的网络层级。 共识。 这种P2P的运行方式虽然不是最高效的,但却是最安全的。 可以说,这台“世界计算机”永远不会停止。

5.EVM高级语言

比特币不提供对高级语言的支持,而以太坊提供高级语言供用户编写智能合约。 以太坊的高级语言最终会被编译成EVM字节码(bytecode)在EVM中执行并部署在以太坊区块链上。 以太坊提供 3 种编程语言:Solidity、Serpent 和 LLL。

Solidity 类似于 JavaScript 语言,是目前以太坊上最流行的智能合约编程语言。

·Serpent类似于Python编程语言,结合了低级语言的高效和易于使用的编程。 Serpent 是用 LLL 语言编译的。

· LLL是Lisp Like Language的缩写,顾名思义就是一种类似Lisp的语言。 它有点像汇编语言,设计非常简单,基本上是 EVM 之上的一个小包。

另一种类 C 语言 Mutan 已基本弃用,不再维护。

6. 以太坊 P2P 网络

(1) RLPx协议

以太坊跟比特币的区别_比特币以太坊纳斯达克_以太坊账户和比特币账户

以太坊网络节点之间的通信采用DΞVp2p在线协议。 RPLx[3]编码和认证的通信传输协议用于节点之间传输消息包,即提供发送和接收消息的协议功能。 节点可以在任何TCP端口上安全地发布和接受连接,默认端口为30303。目前RLPx的正式版本实现了以下功能:

· 单一协议的UDP节点发现

· ECDSA签名的UDP

· 加密握手/认证

· 节点持久化

加密/认证 TCP

·TCP帧处理

DΞVp2p节点使用RLPx的发现协议DHT(Distributed Hash Table)来实现邻居节点的发现。 节点之间的连接也可以通过特定客户端的RPC API进行,提供peer endpoint连接相邻节点。

当两个节点连接并握手时,它们会相互交换状态信息,包括总难度和它们的区块哈希值。 总难度等于该节点所有区块链上的出块难度之和。 其中一个总难度较小的节点会向对方询问对方整个区块链中区块的哈希值。 这些散列链存储在所有连接的邻居共享的“工作池”中。 当一个节点发现哈希链中有一个自己没有的区块哈希值时,它会从该哈希值所代表的区块中向邻居节点索取N个区块,并进行标记。 这样就不会从其他节点获取N个区块。

RLP(递归长度前缀)是一种编码,其目的是对任意嵌套的二进制数据数组进行编码。 在以太坊中,RLP 是用于对对象进行编码的主要方法。

(2) 耳语协议

以太坊账户和比特币账户_以太坊跟比特币的区别_比特币以太坊纳斯达克

Whisper 协议是用于 DApp 之间通信的通信协议。 Whisper结合了DHT和分组消息系统(如UDP)以太坊账户和比特币账户,所以它同时具有以上两种协议的特点。 Whisper 是一个纯粹的标识消息系统,它提供了一个低级(与应用程序无关)但易于使用的 API,而无需记住底层硬件属性。 此外,与 DHT 一样,每个条目和签名或加密规则都有一个可配置的 TTL(生存时间)。 从这个意义上讲,Whisper 提供了多个索引,而不是单个记录,这意味着同一条记录可以有多个键,有些键可能与其他记录相同。

Whispher 不是一个典型的通信系统,它不是为了取代 TCP/IP、UDP、HTTP 或其他通用协议而设计的,也不是用来提供面向连接的通信系统,也不是简单地在两个节点之间传输数据。 它的主要目标不是增加带宽或减少延迟,而是直接为新的应用程序开发模型设计新的通信协议。 它是一种从头开始设计的协议,用于轻松高效地使用多播和广播场景。 类似的低级部分异步通信也是一个重要的设计目标。 减少低价值流量或滞后也是另一个目标,相当于 QoS 控制。 Whisper专为下一代需要大规模多对多数据发现、信号协商和最小传输通信、完整隐私保护的DApp而设计。

Whisper 可用于以下场景:

·DApp需要发布少量信息,发布的信息必须长期保存。 例如,外汇交易所公布一种货币的上市售价。 此优惠可能需要保留几分钟或几天。

· DApp需要向其他DApp发送信号,希望它们参与某笔交易的协调。

·DApps需要提供非实时提示或一般通信,如聊天室应用等。

·DApp需要提供暗通信,即通信的双方除了知道对方的哈希值外,不知道对方的更多细节。

七、活动

当区块被验证时,合约由交易触发。 如果你想象在函数调用的情况下,合约的执行是异步的,所以它没有返回值。 合约通过日志事件与外界通信。 日志事件是执行事务时生成的收据的一部分。 收据存储在收据树上,其完整性由当前收据树的根节点保证。 收据树的根与状态树和交易树的根一起存储在块的头部。 从外部看,收据是以太坊系统状态的一部分,只是无法在合约中读取收据的数据。

以太坊中的事件是以太坊日志记录和事件监控协议的抽象。 日志记录提供合约的地址、一组最多4个主题(Topics)和一些任意长度的二进制数据。 事件利用现有的 ABI 功能来解析日志记录。 根据一个事件名称和一些事件参数,可以分为两个系列:一个是有索引的,一个是没有索引的。 被索引的(最多可以有 3 个)是用作问题的日志记录以及事件的 Keccak 哈希签名; 未索引的用于组成事件的字节数组。

[1] 维塔利克·布特林。 以太坊中的默克林。 2015 年 15 日。

[2] 以太坊维基,帕特里夏树。

[3] RLPx是一种以密码方式进行通信的P2P网络协议,为在P2P网络上通信的应用程序提供通用的传输和接口。 RLPx是专门为去中心化应用设计的P2P通信协议。