主页 > imtoken官网版下载地址 > 区块链2.0架构:以太坊架构简介

区块链2.0架构:以太坊架构简介

imtoken官网版下载地址 2023-12-15 05:11:31

比特币的区块链架构主要围绕支持虚拟货币的变现展开。 虽然它具有一定的灵活性,但在支持虚拟货币以外的应用场景方面仍然非常有限。 近年来,区块链逐渐受到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 所示。

1.账户设计

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

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

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

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

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

2. 区块链设计

比特币使用 Merkle 树将交易的哈希值按照一定的算法形成二叉树结构 1。 顶级节点的哈希值相当于整个交易列表的指纹,可以用来验证交易列表。 中本聪采用 Merkle 树设计,也为轻量级节点通过 SPV(简化支付验证)轻松验证交易。 SPV不需要下载整个交易列表,只需要区块头中交易列表中最顶端节点的哈希值,以及与自己节点相关的交易,就可以通过向其他节点查询来完成交易其他相邻交易。 验证交易是否包含在区块链的块中。 区块链的核心原理 以太坊区块链的每个区块不仅保存了交易列表,还保存了最新的状态。 以太坊作为一个通用的区块链编程平台,引入了账户的概念,也带来了更复杂的验证和查询需求。 比如查询一个账户的余额,判断一个账户是否存在,单靠比特币的Merkle树是无法满足要求的。 因此,以太坊使用 Merkle Patricia 树来实现交易和状态的验证和查询 [2]。 让我们看看交易和状态所面临的问题。

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

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

以太坊有区块链记录一定是真的吗_以太坊区块链数据下载_以太坊区块链查询合约地址

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

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

在区块链的区块头中,不像比特币那样只存储一个交易列表的Merkle树根哈希值,而是存储三个根哈希值:一个是交易的Merkle根哈希值,另一个是根哈希状态,一个是收据的根哈希。 与比特币的另一个区别是,以太坊区块链中的每个区块都保存了区块链编号和区块难度。

3.PoW机制

以太坊的PoW(Proof of Work)算法称为Ethash算法(一种改进的Dagger-Hashimoto算法),主要寻找一个随机数作为输入,使得运算结果小于特定的难度阈值。 PoW 机制的前提是没有比一个一个尝试更好的找到随机数的方法,并且验证结果必须非常方便且具有成本效益。 由于哈希运算的结果是均匀分布的(Uniform Distribution),因此可以保证找到随机数的时间通常取决于难度阈值。 这样就可以通过控制难度来控制在网络上寻找新区块的时间。以太坊通过动态调整难度平均每15s在全网寻找一个新区块

的。 每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环境下哈希

以太坊有区块链记录一定是真的吗_以太坊区块链数据下载_以太坊区块链查询合约地址

但是可以通过增加挖矿节点上的内存和带宽来提高挖矿速度。对内存的高要求使得大型矿场的矿主并没有太多可比的超线性收益; 对带宽的高要求使得与超快计算单元共享内存成为可能

储蓄的方法并没有带来更好的回报。 这对矿池挖矿没有太大好处,所以以太坊希望通过设计避免像比特币那样的矿池算力中心化。

与比特币类似,以太坊的静态挖矿收益会随着时间的推移逐渐减少。 目前每挖出一个区块静态收益为5ETH,未来矿工的收益将主要依靠发送交易的用户支付的“燃料”

收入。 以太坊的矿工奖励系统比比特币的更复杂。 很多参考资料都没有给出具体的奖励金额,有的甚至是错误的,比如挖“叔块”矿工奖励的描述,有的资料认为是(7/8)

×5=4.375 ETH,其实这个是不准确的。 笔者参考计算奖金的源码,具体奖金机制说明如下。

矿工每挖出一个区块,将获得5.0 Ether的静态收益,同时获得区块上的“gas”,其价值取决于当前的“gas”价格。此外,矿工还获得一个“叔块”

”(叔叔)作为额外奖励被收录到区块链中,每收录一个叔块就相当于(1/32)×5个以太币。而生成“叔块”的矿工将按照以下方式获得公式奖:

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

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

(7/8)×5,即 4.375 ETH 奖励。

注:所谓“叔块”是指满足难度条件的区块,但该区块中的交易未被确认,或“陈旧”。例如,矿工A挖到了符合难度条件的合规区块a ,而矿工B也几乎同时挖到了满足难度要求的区块a。

区块b符合标准,但由于网络延迟,区块b未被确认成为废块,而区块a成为网络的共识区块并被纳入区块链。由于以太坊的区块生成速度为比比特币快得多,所以

因此,当网络繁忙时,“废块”比比特币系统更容易出现。 在比特币系统中,产生废块的矿工只能自认倒霉,没有任何回报。在以太坊中,产生“叔块”和“叔块”的矿工

以太坊区块链数据下载_以太坊有区块链记录一定是真的吗_以太坊区块链查询合约地址

包含在区块链中的矿工可以得到奖励。 这样一来,产生废块的算力也算进去了,有效的增强了安全性,使得攻击者很难追上一条有“叔块”的主链。同时通过奖励“叔块”

,也要避免像比特币这样算力高度集中的矿池,因为矿池相对单个挖矿节点来说,更不容易出现废块。严格来说,“叔块”是一种被往上推的“祖辈”废块从当前链接块到 6 个块。

块,每个块最多可以连接两个“叔块”。

以太坊使用与比特币不同的算法,称为 GHOST(幽灵)来构建区块链。 GHOST的全称是Greedy Heaviest Observed Subtree,中文直译为“Greedy Heaviest Observed Subtree”。严格来说,以太坊的

区块链不是一条链,而是像一棵树,包含了前面提到的“叔块”。

在比特币系统中,矿工按照一定的优先级将未确认的交易打包到新发现的区块中。 交易的优先级由交易金额和链龄(指UTXO存在的时间)决定。交易金额越大,链龄越高,优先级越高

. 交易费用是用户输入和输出之间的差额。 如果输入和输出之间的差异为零,随着交易发生的时间越来越长,它在交易池中的优先级将逐渐增加。所以一般来说,即使是向矿工支付零交易费的交易

每个人都有机会被矿工纳入区块链。 当然,个别矿工可以有自己的规则,可以零交易费拒绝交易。 在以太坊平台上,不提供“gas”的交易不会被执行,也不会被纳入区块链。

以太坊交易费用根据以下公式计算:

总成本=gasUsed×gasPrice

其中,gasUsed为执行交易消耗的gas。 gas价格由用户和矿工共同决定。 一般来说,当用户创建交易时,可以提高 gas 价格。在以太坊发布的第一个版本的 Frontier 中

,以太坊客户端默认的 gas 价格是 0.05e12wei,大约是一个以太币的五亿分之一。 矿工一般不会接受低于现行价格的燃料价格。

4. 计算与图灵完备性

以太坊有区块链记录一定是真的吗_以太坊区块链数据下载_以太坊区块链查询合约地址

以太坊作为一个通用的区块链平台,需要提供比比特币更强大的计算能力。如前所述,从安全的角度出发,比特币的设计特意选择了非图灵完备的脚本引擎。

说明不多,但在虚拟货币的应用场景中已经绰绰有余了。 在以太坊上,与比特币的一个非常大的区别是选择了图灵完备的计算环境——以太坊虚拟机(EVM)。这意味着

所有可以想象得到的计算都可以在 EVM 上完成,包括无限循环。 EVM指令中包含了JUMP跳转指令,可以让程序跳回到之前的程序代码,也可以像条件判断语句一样,在满足某个条件时进行条件跳转

将程序跳转到另一个地方执行。 另外,一个合约可以调用其他合约,这提供了潜在递归调用的功能。这自然会引出一个问题:破坏用户是否可以通过强制矿工或全节点

进入无限循环并基本上将它们关闭? 这实际上是一个“停止问题”,也就是说,通常没有办法确定一个程序是否会停止。 以太坊是如何解决这个问题的?它首先要求每笔交易给

为了计算最大步长,交易的发起者必须提供Gas作为矿工将交易添加到区块的交易费用。 如果实际操作超过最大计算步长以太坊区块链查询合约地址,计算将终止,交易手续费归挖出区块的矿工所有。因此

以太坊采用经济的方法来保护以太坊平台。

以太坊网络的每个节点都运行EVM并执行合约代码,所以以太坊就像一台并行运行的“世界计算机”,同时对所有节点进行账户状态转换,形成了所有账户状态的网络层级。 常见的

知识。 这种P2P的运行方式虽然不是最高效的,但却是最安全的。 可以说,这台“世界计算机”永远不会停止。

5.EVM高级语言

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

Fang 提供了 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帧处理