02 BlockChain-- ETH

Ethereum 以太坊与比特币有什么不同?

以太坊立足比特币创新之上,于 2015 年启动,两者之间有一些显著不同。

从宏观的方面:

  • 比特币就仅仅是比特币;以太坊(Ethereum)包括以太币(Ether),以太币才是和比特币对等的存在。
  • 比特币使我们能够互通基本信息;以太坊则更进一步,不仅可以互通信息,用户还能编写任何常规程序或合约。可以创建和达成共识的合约种类没有限制。
  • 比特币只是一个支付网络,而以太坊更像是一个金融服务、游戏、社交网络和其他应用程序的市场。

从细节方面:

  • ETH 中存在账户这个概念;相区别,BTC 只有 UTXO 的概念。
  • ETH 没有发行数量限制,但每次交易过程中,都会有一定数量的 ETH 被燃烧,这就是 Base Gas Fee 基础燃料费。特别是网络需求量高时,燃烧的以太币数量可以多于铸造的以太币数量,有效地抵消了以太币的发行。

ETH Account 账户

一个以太坊帐户是一个具有以太币 余额的实体,可以在以太坊上发送交易。
帐户可以由用户控制,也可以作为智能合约部署。

账户类型

以太坊有两种帐户类型:

  • Externally-owned account (EOA) 外部所有的帐户 – 由任何拥有私钥的人控制
    • 创建帐户是免费的
    • 可以发起交易
    • 外部所有的帐户之间只能进行以太币和代币交易
    • 由一对加密密钥组成:控制帐户活动的公钥和私钥
  • Contract account 合约帐户 – 部署到网络上的智能合约,由代码控制。
    • 创建合约存在成本,因为需要使用网络存储空间
    • 只能在收到交易时,作为回应,发送交易
    • 从外部帐户向合约帐户发起的交易能触发可执行多种操作的代码,例如转移代币甚至创建新合约
    • 合约帐户没有私钥。 相反,它们由智能合约代码逻辑控制

以太坊的账户模型

以太坊使用 账户模型(Account Model),在此模型中,所有的账户都存储在一个全局状态数据库中,称为 世界状态(World State)

以太坊使用一种被称为 Merkle Patricia trie (MPT) 默克尔压缩前缀树的数据结构来存储世界状态和账户存储状态。
这种树形结构结合了前缀树(Patricia Trie)和哈希树(Merkle Tree)的优点,

以太坊有两棵重要的树:

  • 世界状态树:
    • 每个账户的状态都存储在 Trie 中,账户地址作为键,账户状态作为值。
    • 这个状态树的根节点的哈希值称为 stateRoot,并存储在每个区块的区块头中。当交易执行导致账户状态发生变化时,这棵状态树会更新,新的状态树的根哈希也会变化,成为新区块头中的新的 stateRoot。
  • 账户存储树:每个智能合约账户的存储是另一个独立的 Trie,存储在 storageRoot 中。这个 Trie 负责存储智能合约的数据,例如映射、数组等复杂数据结构。

以太坊帐户有四个字段:

  • nonce :一个计数器,用来显示外部帐户发送的交易数量或合约帐户创建的合约数量。 每个帐户只能执行具有一个给定随机数的一笔交易,以防范重放攻击,重放攻击指多次广播和重复执行已签署的交易。
  • balance – 这个地址拥有的 Wei 数量。 Wei 是以太币的计数单位,每个 ETH 有 1e+18 个 Wei。
  • codeHash - 该哈希表示 EVM 上的帐户代码。 合约帐户具有编程的代码片段,可以执行不同的操作。 如果帐户收到消息调用,则执行此 EVM 代码。 与其他帐户字段不同,不能更改。 所有代码片段都被保存在状态数据库的相应哈希下,供后续检索。 此哈希值称 codeHash。 对于外部所有的帐户,codeHash 字段是空字符串的哈希。
  • storageRoot – 有时被称为存储哈希。
    在这里插入图片描述

EVM 以太坊虚拟机

EVM 是一个去中心化虚拟环境,它在所有以太坊节点上一致地方式执行代码。

节点运行以太坊虚拟机,以执行智能合约,利用“燃料”度量执行操作所需的计算工作。
因此我们说:存储以太坊虚拟机状态的实体计算机就是 Node 节点。

任何参与者都可以请求在以太坊虚拟机上执行任意代码,只是要付出一定费用,这个费用就是“燃料”;
代码执行会改变以太坊虚拟机的状态。

从 Ledger 账本 到 State Machine 状态机

通常使用“分布式账本”的类比来描述像比特币这样的区块链。 账本保存着活动记录,而活动必须遵守一套规则,这些规则限制用户在修改账本时可以做什么和不可以做什么。 例如,比特币地址不能花费比之前收到的更多的比特币。 这些规则是比特币和许多其他区块链上所有交易的基础。

以太币遵循几乎完全相同的直观规则,但它也支持更强大的功能:智能合约
不同的是:以太坊不是分布式账本,而是分布式状态机
以太坊的状态是一个大型数据结构,它不仅保存所有帐户和余额,而且还保存一个机器状态,根据区块执行的交易的不同,机器状态会发生不同。

在这里插入图片描述

EVM 的行为就像一个数学函数:在给定输入的情况下,它会产生确定性的输出。
给定一个旧的有效状态 (S)和一组新的有效交易 (T),以太坊状态转换函数 Y(S,T) 产生新的有效输出状态 S’

Y(S, T)= S'

State 状态

在 ETH 语境下,状态指的是改进的 MPT树,在这课树中,存储着巨量数据。

每个账户的状态都会存储到这棵树中的某一节点,通过哈希的方式,树上的某一节点和某一账户会形成关联。
此外,通过递归地将子节点的哈希值与其父节点链接,从而确保任何数据的变化都会影响树的上层,直到根节点。
经过这种递归的哈希计算,整棵树最终会汇总为一个单一的根哈希值(称为“状态根”)。这个根哈希值是整个系统状态的唯一代表,它被存储在区块链的每个区块中。如果任何账户的状态发生变化,这个根哈希值也会相应变化。由于哈希的不可逆性和一致性,根哈希值能够快速验证整个树中任意账户的状态是否正确且未被篡改。

Gas 燃料费

从 EVM 执行智能合约代码的例子开始

这张图展示了以太坊虚拟机的工作原理:智能合约代码被逐步执行,Gas 用于支付执行每个原子操作的计算成本,操作的结果通过栈和内存管理,账户的长期状态则保存在存储中。执行期间,消息调用和存储操作会消耗更多的Gas,而当 Gas 耗尽时,执行会停止。
在这里插入图片描述

  • Gas Available:这是执行 EVM 代码时可用的 Gas 数量。每执行一条指令都会消耗一定的 Gas,当 Gas 耗尽时,执行将被中止。
  • EVM Code:智能合约代码在以太坊虚拟机中被执行。EVM 是一个运行环境,执行合约的字节码,这些代码可以包括数学计算、存储操作和消息调用等。
  • Operations (操作):EVM 执行的每条指令,包含一系列的操作,比如加法、存储、加载等。每次操作都会消耗 Gas。
  • Gas:每个操作在执行时都会消耗特定数量的 Gas。这是以太坊系统中的一种机制,用于防止合约运行时耗尽资源或者陷入无限循环。
  • Stack (栈):EVM 是一个基于栈的虚拟机,所有的操作都在栈中完成。栈是临时存储的区域,操作数和结果会被压入和弹出栈。
  • Memory (内存):这是 EVM 执行合约时使用的临时内存,用于存放中间计算结果。与栈不同,内存是可随意读写的,可以存放临时数据。
  • Account Storage (账户存储):智能合约的长期存储区域,所有数据永久存储在区块链上。访问和修改存储通常会消耗大量 Gas。
  • Message Call (消息调用):当合约与其他合约交互时(例如调用其他合约或向其他账户发送交易),会发生“消息调用”,这通常会消耗额外的 Gas。
  • More Gas:图中火焰图标表示在特定操作(例如消息调用和存储修改)中需要消耗更多 Gas。这些操作比简单的数学运算要复杂得多,因此需要额外的资源。

如何理解 燃料

燃料是一种度量,用来衡量在 ETH 网络上执行特定操作所需要的计算资源。

由于每笔以太坊交易都需要使用计算资源来执行,因此必须为这些资源付费,以确保以太坊不容易受到垃圾信息的攻击,并且不会陷入无限的计算循环。 计算费用以燃料费的形式支付。

燃料费 = 执行某些操作的燃料数量 X 每单位燃料的成本。

无论交易成功与否,都要支付燃料费。
燃料费必须用以太币支付。 燃料通常以 gwei 计价, 一个 gwei 等于一个以太币的十亿分之一(10-9 个以太币)。“Gwei” 是 “giga-wei” 的缩写,意思是 “十亿个 wei”。 一个 gwei 等于十亿个 wei,而 wei 又是以太币的最小单位。

如何计算燃料费

当提交交易时,你可以设置你愿意支付的燃料数量。
通过提供一定数量的燃料,你的出价将你的交易添加到下一个区块中。 如果你提供的燃料太少,验证者就不太可能选择添加你的交易,这意味着你的交易可能会延迟执行或不会被执行。 如果提供太多,你可能浪费一些以太币。 那么,怎么知道你应该支付多少燃料费呢?

你支付的总燃料费分为两部分:base fee 和 priority fee(小费)。

Base fee 由协议设定——你必须至少支付这些金额,然后你的交易才会被视为有效。 Priority fee 是基础费以外的小费,它可以吸引验证者选择将你的交易添加到下一个区块。

只支付 base fee 的交易从技术上讲是有效的,但不太可能被添加到区块,因为它没有激励验证者优先选择它而不是其他交易。

例如,假设 Jordan 要向 Taylor 支付 1 个以太币。 一笔以太币转账需要 21,000 单位的燃料,基础费是10 gwei。 Jordan 支付了 2 gwei 作为小费。

总费用 = 使用的燃料单位数 *(基础费 + 优先费)
即 21,000 * (10 + 2) = 252,000 gwei(0.000252 个以太币)。

当 Jordan 转账时,将从 Jordan 帐户中扣除 1.000252 个以太币。 Taylor 的帐户增加 1.0000 个以太币。 验证者收到价值 0.000042 个以太币的小费。 0.00021 个以太币的 base fee 被销毁。

基础费

每个区块都有一个基础费作为底价。
要想有资格添加到区块中,燃料费出价必须至少等于基础费。
基础费独立于当前区块计算,是由当前区块之前的区块决定的,这使得用户更容易预测交易费。
在创建区块时,它的基础费将被“销毁”并退出流通。

基础费由一个公式计算得出。
简单来说,该公式将上一个区块所有交易中使用的燃料数量与目标大小进行比较。 如果超过目标区块大小,每个区块的基础费将最多增加 12.5%。

当网络活动非常活跃,导致区块持续超过理想大小时,基础费用将自动上升,这将促使矿工选择打包较小的区块,从而恢复网络的正常运作效率。反之,如果区块大小低于目标大小,则基础费用会下降,鼓励更多的交易进入网络。

通过这种方式,以太坊网络试图维持一个较为稳定的区块大小。

节点和客户端

“节点”是指任何以太坊客户端软件的实例。

一个节点需要运行两种客户端软件:共识客户端和执行客户端。

  • 执行客户端(也称为执行引擎、EL 客户端或旧称“以太坊 1”客户端)侦听网络中广播的新交易,并在 EVM 中执行它们,并保存所有当前以太坊数据的最新状态和数据库。
  • 共识客户端(也称为信标节点、CL 客户端或旧称“以太坊 2”客户端)实现权益证明共识算法,使网络能够根据来自执行客户端的经验证数据达成一致。 此外还有名为“验证者”的第三种软件,它们可被添加到共识客户端中,使节点能参与保护网络安全。

这些客户端软件相互协作,以追踪以太坊的链头,并允许用户与以太坊网络进行交互。
这种模块化设计称为封装复杂性,包含多个协同运作的软件。

这张图显示了 Web3 库如何通过不同的接口与以太坊节点的不同部分进行交互,以实现完整的区块链功能。
通过这种方式,开发者可以轻松地构建去中心化应用(DApps),而无需直接处理底层的复杂细节。
在这里插入图片描述

  • Web3 Library:左侧的蓝色框代表 Web3 库,它是开发人员用来连接到以太坊网络并与之交互的工具。开发者可以通过 Web3 库发送交易、查询余额、部署智能合约等等。
  • web3.beacon 和 web3.eth:Web3 库有两个不同的接口,分别对应共识客户端(Consensus client)和执行客户端(Execution client)
    • web3.beacon 用于与信标链(Beacon Chain)交互,这是以太坊2.0的核心组件,负责协调权益证明(Proof-of-Stake, PoS)共识算法。
    • web3.eth 则用于与执行层(Execution layer)交互,也就是我们常说的以太坊主网。
  • Ethereum node:右侧的橙色框代表以太坊节点,它分为两个主要部分:共识客户端和执行客户端。共识客户端处理 PoS 共识逻辑,执行客户端则负责处理交易执行和状态更新。
    • Consensus client:这部分处理以太坊2.0 的共识逻辑,包括验证新区块的有效性、管理验证人(Validator)、参与随机数生成等任务。
    • Execution client:这部分处理以太坊1.x 的事务执行,包括验证交易、维护状态树、生成新区块等。

节点类型

Full Node 完全节点

  • 完全节点存储了完整的区块链副本,这意味着它们拥有从创世区块到最新区块的所有数据。完全节点可以独立验证交易的有效性,并且可以向网络中的其他节点广播新的交易或区块。
  • 会定期修剪,所以全节点并不存储包含创世块在内的所有状态数据)

Archive Node 归档节点

  • 归档节点除了拥有全节点的所有特性外,还保留了历史上的每一个状态,这样就可以查询任意历史时刻的账户余额或其他状态信息。
  • 存储完全节点中保存的所有内容,并建立历史状态存档。
  • 节点所占存储极大,但对于区块浏览器、钱包供应商和链分析等服务是必需的。

Light Node 轻节点

轻节点只下载区块头,而不会下载每个区块。 这些区块头包含区块内容的摘要信息。

轻节点会向全节点请求其所需的任何其他信息。 然后,轻节点可以根据区块头中的 StateRoot(世界状态树根节点的哈希值) 独自验证收到的数据。

轻节点可以让用户加入以太坊网络,而无需运行完全节点所需的功能强大的硬件或高带宽。

轻节点不参与共识(即它们不能成为矿工/验证者)

同步模式

执行层同步模式

执行层同步模式指的是节点如何与执行层保持同步的方式。

  • Full Sync 完整同步 :
    • 在这种模式下,节点从创世块(Genesis Block)开始下载所有的区块头,并验证每一个区块及其包含的所有交易。这种同步方式最耗费时间和资源,但它提供了最完整的安全性保障。
    • 完整同步适合那些希望成为完全节点并且愿意承担较高硬件要求的用户。
  • Fast Sync 快速同步:
    • 快速同步模式下,节点不会下载所有历史交易数据,而是从其他节点获取最新的状态数据库(State Trie)。这样可以避免下载大量的历史交易记录,从而加快同步速度。
    • 节点在获取状态数据库后,会从某个较新的区块开始同步区块头,并验证从那个点开始的所有新区块。这种方法牺牲了一定的安全性和完整性,但是可以更快地达到最新状态。
    • 快速同步适合那些希望快速加入网络并且对安全性的要求相对较低的用户。
  • Light Sync 轻同步:
    • 轻同步模式下,节点只下载区块头,而不下载区块体(Block Bodies)和状态数据库。这意味着轻客户端不需要存储完整的区块链状态,只需要验证区块头的有效性即可。
    • 这种模式非常适合移动设备或者其他资源受限的环境,因为它们不需要大量的存储空间就能保持与区块链的同步。
    • 轻客户端依赖于全节点来提供交易数据和状态证明,所以它们的安全性依赖于信任的全节点。

共识层同步模式

共识层同步模式负责确保网络中各个节点对区块链的状态达成一致,共识层的同步通常不涉及具体的交易执行,而是关注区块的生成和验证过程。

  • Optimistic sync 乐观同步

    • 乐观同步是一种合并后同步策略。 节点假设收到的区块都是有效的,快速进行同步。
    • 仅在发现不一致或无效区块时才进行详细验证,降低了延迟。
  • CheckPoint Sync 检查点同步

    • 通过定期的检查点来确保同步的有效性。
    • 节点在特定的检查点时验证状态,确保整个区块链的安全性和一致性。

执行客户端和共识客户端

  • 执行客户端负责交易处理、交易广播、状态管理和支持以太坊虚拟机(以太坊虚拟机)。
  • 共识客户端处理使节点与以太坊网络保持同步的全部逻辑。 这包括从对等节点接收区块并运行分叉选择算法,从而确保节点始终遵循累积证明最多的链(由验证者有效余额加权计算而得)。\
  • 共识客户端质押 32ETH 后,可以成为一个验证者。

在这里插入图片描述

以太坊网络

以太坊只有一个主网,但可以创建符合相同协议规则的独立网络用于测试和开发。
实际上,存在有许多独立的“网络”,但彼此之间没有交互。
你甚至可以在自己的计算机上本地启动一个以太坊网络,以测试你的智能合约和 web3 应用程序。

公共网络

以太坊主网 Mainnet

以太坊主网是以太坊的正式、实际运行的区块链网络,所有具有实际价值的交易都发生在该链的分散账本中。
当我们谈及 ETH 价格时,指的就是主网中的 ETH 价格。

以太坊测试网 Testnet

公共网络主要由主网和测试网组成。
智能合约开发者可以使用它们测试尚未部署在主网上的智能合约。

尽管测试网中的 ETH 是没有价值的,但是,在测试网中,依然需要以太币支付燃料费以运行智能合约、处理交易
此时,可以向 faucets 发送一个地址,请求向这个地址中注入以太币。

在测试网中,拥有两种共识机制。

  • 大部分测试网采用需要权限的权威证明共识机制。在这种机制下,只有一小部分被选择的节点成为验证节点。
  • 少部分测试网采用与主网一致的 PoS 共识机制。

二层网络测试网

二层网络 (L2) 是一种统称,用来描述一系列特定的以太坊扩容解决方案。 二层网络是一条扩展以太坊并继承以太坊安全保障的独立区块链。 二层网络测试网通常与公共以太坊测试网紧密关联。

共识机制

首先必须明确什么是共识:对于以太坊区块链来说,达成共识的过程是标准化的,达成共识意味着全网络中至少 66% 的节点就网络的全局状态达成一致。

区块创建

每个时隙中都会随机选择一个验证者成为区块提议者。
区块提议者的共识客户端请求自己的执行客户端对交易打包,作为“负载”。
然后将“负载”包装成共识数据并形成一个区块,再把这个区块发送给以太坊网络上的其他节点。
这样的区块生产会得到以太币奖励。
在极少数情况下,一个时隙中产生了多个可能的区块,或节点在不同时间收到区块,分叉选择算法就会选择具有最大认证权重的那个区块(认证权重是指验证质押的以太币余额)。

PoS

  • 简单来说,PoS意味着:
    • 某个人向存款合约中质押 32 个以太币后,其可化身为验证节点,若顺利完成任务,其最终可以取回 32 个 ETH,以及工作的奖励。但是,如果被证实发生不诚实活动,部分甚至全部质押金额将被销毁。
    • 在每个时隙(12 秒的时间间隔)中,会随机选择一个验证者作为区块提议者。 区块提议者将交易打包为一个区块后执行,然后确定一个新的“状态”。 区块提议者将这些信息包装到一个区块中并传送给其他验证者以供验证。
    • 其他获悉新区块的验证者再次执行区块中包含的交易,确定他们同意对全局状态提出的修改。 假设该区块是有效的,验证者就将该区块添加进各自的数据库。
    • 如果验证者获悉在同一时隙内有两个冲突区块,他们会使用自己的分叉选择算法选择获得最多质押以太币支持的那一个区块。

以太坊堆栈

  • 第一层 :EVM
    • EVM 是智能合约的运行环境。
    • 更具体来说:交易处理以太坊区块链上的所有智能合约、状态改变,而 EVM 控制着交易的过程。
    • 在 EVM 内部,使用 opcode 操作码执行任务; EVM 是图灵完备的,这意味着,只要提供足够计算资源, EVM 可以将任何任务分解成操作码形式并执行完毕。
  • 第二层:智能合约
    • 智能合约是在以太坊区块链上运行的可执行程序。
    • 这与 Java 的后端特别相似,运行在 JVM 之上。
  • 第三层:以太坊节点
  • 第四层:以太坊客户端应用程序接口
    • 其实就是一些封装好的库,它们抽象并消减了与以太坊节点直接互动的大部分复杂性。 它们还提供好用的函数(例如:将 ETH 转化为 Gwei),而作为开发者,你可以花费更少的时间处理以太坊客户端的复杂问题,从而将更多的时间集中于处理你的应用程序的独特功能。
  • 第五层:终端用户程序

Web3

  • Web 1.0 主要是由公司拥有的静态网站,用户之间的互动几乎为零 - 个人很少创造内容,导致它被称为只读网络。
  • Web 2.0 时期于 2004 年开启。 网络不再是只读的,它演变成读写网络。 互联网公司除了向用户提供内容外,还开始提供平台来共享用户生产的内容,并参与用户间的交互。
  • Web3 的核心是通过区块链、加密货币和非同质化代币将权力以所有权的形式归还用户。Web1 是只读的,Web2 能读/能写,未来的 Web3 能读/能写/能拥有。

SmartContract 智能合约

智能合约只是一个运行在以太坊链上的一个程序。 它是位于以太坊区块链上一个特定地址的一系列代码(函数)和数据(状态)。
简单来说,可以把智能合约想象成一种自动售货机:通过特定参数调用脚本后,如果满足某些特定条件,就会执行一些操作或计算。

  • 任何开发者都可以创建智能合约,并部署到链上,将其公开给网络,但要向网络支付费用;然后,任何用户都可以调用智能合约来执行其代码,并再次向网络支付费用。
  • 智能合约也是账户,即合约账户。这意味着,合约也能有余额、合约也能成为交易对象。

自动售货机

对于智能合约最恰当的比喻是自动售货机,要从售货机中获取零食:

money + snack selection = snack dispensed
//指定了编译此智能合约所需的Solidity语言版本
pragma solidity 0.8.7;

contract VendingMachine {
    // 声明状态变量,solidity 的状态变量和传统语言中的全局变量很像。区别是每次访问状态变量需要收费。
    address public owner;

	// 就是一个Map,键是 address 类型(用户的以太坊地址),值是 uint 类型(用户的纸杯蛋糕余额)
    mapping (address => uint) public cupcakeBalances;
    
    // When 'VendingMachine' contract is deployed:
    // 1. set the deploying address as the owner of the contract
    // 2. set the deployed smart contract's cupcake balance to 100
    constructor() {
        owner = msg.sender;
        cupcakeBalances[address(this)] = 100;
    }
    
    // Allow the owner to increase the smart contract's cupcake balance
    function refill(uint amount) public {
        require(msg.sender == owner, "Only the owner can refill.");
        cupcakeBalances[address(this)] += amount;
    }
    
    // Allow anyone to purchase cupcakes
    function purchase(uint amount) public payable {
        require(msg.value >= amount * 1 ether, "You must pay at least 1 ETH per cupcake");
        require(cupcakeBalances[address(this)] >= amount, "Not enough cupcakes in stock to complete this purchase");
        cupcakeBalances[address(this)] -= amount;
        cupcakeBalances[msg.sender] += amount;
    }
}

深入智能合约

数据的存储

任何合约数据都必须分配到一个位置:要么是存储(storage),要么是内存(memory)。在智能合约中修改存储(storage)是很昂贵的,因此你需要考虑你的数据应该存放在哪里。

一般来说,状态变量存在存储中,局部变量存在内存中。

contract ExampleContract {
    // 状态变量
    uint256 public totalSupply;

    function addNumbers(uint256 a, uint256 b) public pure returns (uint256) {
        // 局部变量,存储在内存中
        uint256 result;
       
        result = a + b;
        return result;
    }

}

存储

存储是在智能合约生命周期中持久化的数据存储区。这意味着一旦写入数据,即使重启节点也不会丢失这些数据。

由于存储操作需要记录在区块链上,所以每次读写操作都会产生一定的 Gas 费用,这使得频繁的读写操作变得非常昂贵。

内存

内存则是智能合约执行期间临时使用的数据存储区。这意味着当一个交易执行完毕后,内存中的所有数据都会被清除。

由于内存操作不会记录在区块链上,所以其读写操作比存储便宜得多。

Dapp 去中心化应用程序

去中心化应用程序 (dapp) 是在去中心化网络上构建的应用程序。

一般来说,一个网页应用 = 后端 + 前端。

一个**Dapp = 智能合约 + 前端用户界面 **,即智能合约就是 Dapp 的后端代码。

优点

  • 零停机时间:一旦将某 dapp 的智能合约部署到区块链上,整个网络都能为那些希望与合约互动的客户提供服务。 因此,恶意参与者无法针对单个
    dapp 发起 DoS 攻击。

缺点

  • Dapp 更难维护,因为发布到区块链的代码和数据更难修改,即使在旧版本中发现了漏洞或安全风险。、
  • 巨大的性能开销,而且难以扩展更多性能。 为了达到以太坊所追求的安全、完整、透明和可靠的水平,每个节点都会运行和存储每一笔交易。 除此之外,达成权益证明共识也需要时间。
  • 网络拥塞:至少在当前模型中,如果一个 dapp 使用了太多的计算资源,整个网络都会承担影响。 目前,该网络每秒只能处理约 10-15 笔交易;如果交易发送的速度超过这个速度,未确认的交易池会迅速膨胀。

迈向 ETH2

在这里插入图片描述
以太坊网络同时存在主链和信标链( ETH2 的一部分,现在作为共识层)。

随着以太坊网络的增长,原有架构已经难以支撑日益增长的交易量和复杂的应用场景。为了应对这些问题,以太坊社区启动了以太坊 2.0 项目,即 ETH2,旨在通过一系列的技术革新提升整个网络的性能。

在2020年底,以太坊推出了信标链,这是以太坊向权益证明(PoS) 转换的第一步。
这个新的链与原有的工作量证明(PoW)主链并行运行。在合并之前,信标链主要负责处理以太坊网络未来的 PoS 机制,并且逐步地将接管整个网络的共识机制。

“合并”是指以太坊的 PoW 共识机制向 PoS 机制的转变,这一过程发生在2022年9月。合并后,以太坊的共识层(即之前的信标链)和执行层(即之前的以太坊主网)相结合,形成了一个更加节能高效的区块链网络。

在原有的 PoW 区块链转变为 PoS 区块链的过程中,引入了一个名为“信标链”的新组件,它是 ETH2 的核心部分,负责协调整个网络并向 PoS 机制过渡、管理验证者的集合、分配奖励和惩罚,并协调未来的分片链(Shard Chains)。

信标链是一个由“空”区块组成的链。在以太坊上停止 PoW 并启动 PoS 时,需要先让信标链接受来自执行客户端的交易数据,将它们打包到区块,再将区块组织到一条运行 PoS 共识机制的区块链上。 与此同时,原有的以太坊客户端停止挖矿、区块传播及旧的共识逻辑,并将这一切转交给信标链。 这一事件称为合并。

在合并发生后,就不再有两个区块链。 相反,只有一个 PoS 以太坊,与 PoW 以太坊不同,现在每个节点需要两个不同的客户端
信标链现在是 PoS 以太坊的共识层,即一个处理区块消息和共识逻辑的共识客户端的点对点网络,而原始客户端形成执行层,负责传播消息和执行交易,以及管理 ETH 的状态。
这两层可以使用引擎 API 相互通信。

PoS 、信标链、质押、分片和 ETH2 的关系
迈向 ETH2 的目的是更低能耗更可持续,而 ETH2 最关键的特征就是 PoS。
为了将主链从 PoW 转向 PoS ,引入了信标链和质押,且在完成合并后,信标链就是系统的一部分。
为了进一步横向扩展 ETH ,分片概念得以产生。

ETH1、ETH2、ETH?
“以太坊 2”一词已弃用。 在将“以太坊 1”和“以太坊 2”合并为一条链之后,将不再需要区分两个不同 的以太坊网络,只有以太坊。
但是,若专门提到,以下两个词都特定的含义:

  • “以太坊 1”现在是处理交易和执行的“执行层”。
  • “以太坊 2”现在是处理权益证明共识的“共识层”。

Merge 合并

在这里插入图片描述

合并是指在 ETH 的原有执行层(从创世块开始就一直存在的主网)中加入其新的权益证明共识层,即信标链。
合并摒弃了消耗大量能源的挖矿,而是通过质押以太币来保护网络的安全。

信标链最初是与主网分开上线的。 以太坊主网(所有帐户、余额、智能合约和区块链状态)仍继续由 PoW 保护,与此同时,与之一起运行的信标链采用 PoS。 合并是指这两个系统最终整合在一起之时,且 PoW 被 PoS 永久取代。

信标链最开始并不处理主网上的交易。 而是通过对活跃的验证者及其帐户余额达成一致来就自己的状态达成共识。
经过广泛测试后,即合并后,信标链将成为所有网络数据的共识引擎,包括执行层交易和帐户余额。

合并代表正式转变成使用信标链作为区块生产引擎
同时,挖矿将不再生成区块,该任务交由 PoS 验证者,PoS 现在负责处理所有交易的有效性及创建区块。

功能

信标链是在以太坊质押人开始验证真实的以太坊区块之前管理和协调以太坊质押人网络的帐户账本的名称。 它不处理交易或智能合约交互,因为这些任务在执行层完成。 信标链负责处理区块和证明、运行分叉选择算法以及管理奖励和惩罚等。

  • 共识机制:信标链引入了 PoS 机制,允许用户通过质押一定数量的 ETH(通常为 32ETH)成为验证者,参与区块的创建和验证过程。这与 PoW 相比,减少了计算资源的需求,使得系统更加环保和高效。
  • 分片链管理:信标链不仅负责维护自身的状态,还管理着多个分片链(Shard Chains)。分片链是独立的数据块链,它们可以并行处理交易和智能合约,从而极大地提高了系统的吞吐量。

Beacon Chain 信标链

信标链是 PoS 区块链,它可以让验证者可以参与质押系统、替代矿工的角色而成为链的构建者。
也就是说信标链上管理着验证者的名单,以及分片验证者任务。

信标链由多个部分组成,诸如分片(shards)、质押验证者 (staking validators)、证明 (attestations)、委员会 (committees)、检验点 (checkpoints) 和最终确定性 (finality)。

一个简单的例子

怎么样才可以成为信标链的验证者呢?

首先你需要向当前以太坊主链上的一个合约发送押金( 32 个以太币),然后经过一系列的审核检查之后,你就会收到一张电子收据(以太坊智能合约中的事件),从此你就拥有了验证资格,成为了验证者。
成为验证者之后,信标链就会给你安排任务了。

它会将你随机分配到一到两个分片中去做验证。我们知道,在 PoW 机制下,也就是我们现在的以太坊主链上,矿工通过挖矿生成下一个区块,但是在 PoS 机制下,不存在挖矿,下一个区块的产生是由验证者们选择出来的。这个选择具有随机性,不是一个验证者所能掌控的,这也体现了去中心化的特点。

假如你很“活跃”,就可能被选中成为区块提议者(block proposer)。
假如你不是很“活跃”,信标链将可能将你指定为验证者 (validators),并分配到某一分片,此后你需要同该分片的其它验证者一起从候选区块中选择出新的区块。

然后该分片的区块提议者就会为这个分片收集交易,并且将这些交易纳入到刚刚验证者们选出的区块中去,虽然由于你不是区块的提议者,也就没有将交易纳入新区块的权力,但是作为验证者的你这个时候可以验证这个过程中区块提议者是否行为妥当。

如果你表现良好,做了身为验证者应该做的事就会得到奖励,相反,如果你违反规则就受到惩罚,惩罚就是从你抵押的 32 ETH 中扣除一部分,当抵押金低于 16 个以太币之后,信标链就会将你从验证者列表中移除。

如果有一天你不想当验证者了,你抵押的以太币加上你得到的奖励以及减去你因惩罚而扣除的以太币将不会回到你之前的以太坊主链中,而是会被存进某一个分片链中。

除了管理验证者之外,信标链还需要存储一些认证( Attestation )。

我们知道当前的以太坊区块链上存储了我们平时的那些资产转移等交易的数据信息,但是信标链不同于当前的以太坊主链,它存储的是一系列经过哈希运算的字符串。

在信标链中,验证者验证并签名交易,比如一笔转账交易,然后经过哈希变成一段字符串,将这个字符串存到信标链中,此时这个字符串就代表了一笔交易的数据,这样做的好处就是,你不用去深入探究这笔交易到底在哪个分片中发生。

分片中的状态一旦发生改变(比如某个账户余额发生了丁点改变),验证者都会把这个变化汇报给信标链。因此,信标链实时跟踪者分片的变化,也建立起了个分片间的联系与通信。

Staking 质押

质押是指存入 32 个以太币以激活验证者( validator)的行为。
质押者每质押 32 个以太币,就可激活一个验证者,即,一个质押者可激活多个验证者。

作为验证者,你将负责存储数据,处理交易并向区块链添加新的区块。这将保证以太坊的安全,并在此过程中为你赚取新以太币。

质押的目的和以前的挖矿相似,都是为了保证区块链正常运行。
但又在很多方面不同。 挖矿的前期支出庞大,需要投入强大的硬件和消耗大量能源,从而产生规模经济并促进集中化。
挖矿也没有提出任何将资产锁定作为抵押品的要求,这限制了被攻击后协议惩罚不良行为者的能力。

ETH2 中存在着多种形式的质押
  • 独立质押(Solo Staking)/(Home Staking)
    概述:用户自己运行一个验证者节点,直接参与区块提议和验证。
    要求:必须持有至少32 ETH,具备技术能力来设置和维护验证节点,还需要持续运行高可用的节点。
    优点:完全去中心化,用户自己控制资金,并且可以获得完整的质押奖励。
    缺点:技术门槛高,需承担运营节点的责任,若节点下线或表现不佳,可能会被罚款或削减质押的 ETH。

  • 质押即服务(Staking as a Service)
    概述:以太坊协议本身并不支持质押委托, 如果你有 32 个以太币需要质押,但是没有合适的硬件设备,那么质押即服务可以使你在使用运营商硬件设施的同时获得区块奖励。
    优点:对于那些拥有 32 个以太币但是不能解决运行节点的技术问题的人来说,这是个很好的选择
    缺点: 出于安全原因,用于转移或提取资金的密钥是单独分开的,即每个帐户都由 BLS 签名密钥和 BLS 提款密钥组成。用户会将签名密钥授权给运营商使用。

  • 池化质押/联合质押(Pooled Staking)
    概述:用户可以将少量 ETH 投入质押池,与其他用户共同筹集 32 ETH 来运行一个验证者节点。
    优点:适合小额用户,需达到 32 ETH 的最低限额,通过参与池化质押可以降低技术门槛和资金门槛。
    缺点:质押奖励需要与其他用户共享,管理资金的质押池也可能带来一定的信任风险。

  • 流动性质押(Liquid Staking)
    概述:流动性质押由联合质押而引出。在参与联合质押时,用户可能想在质押过程尚未结束时退出质押(当然还可能有其它原因)。因此,在用户参与联合质押的开始,平台就发给用户代表质押 ETH 的代币(例如 Lido 的 stETH),这些代币可以在二级市场上交易或参与 DeFi 活动。。
    优点:用户可以在质押期间保持资产的流动性,质押代币可以在 DeFi 生态中使用或交易。
    缺点:存在平台风险,流动性质押可能会涉及智能合约的漏洞或平台治理问题。

  • 交易所质押(Exchange Staking)/中心化质押(Centralized exchanges)
    概述:在加密货币交易所(如币安、Coinbase 等)直接质押ETH,用户只需将资金存入交易所账户并参与质押。
    优点:通常没有最低金额要求,用户只需在交易所拥有 ETH 即可,操作最为简单,用户无需管理私钥和节点,质押收益会自动分发。
    缺点:资金完全托管在交易所,存在一定的集中化风险,可能会收取手续费。

PoS

  • 简单来说,PoS意味着:
    • 某个人向存款合约中质押 32 个以太币后,其可化身为验证节点,若顺利完成任务,其最终可以取回 32 个 ETH,以及工作的奖励。但是,如果被证实发生不诚实活动,部分甚至全部质押金额将被销毁。
    • 在每个时隙(12 秒的时间间隔)中,会随机选择一个验证者作为区块提议者。 区块提议者将交易打包为一个区块后执行,然后确定一个新的“状态”。 区块提议者将这些信息包装到一个区块中并传送给其他验证者以供验证。
    • 其他获悉新区块的验证者再次执行区块中包含的交易,确定他们同意对全局状态提出的修改。 假设该区块是有效的,验证者就将该区块添加进各自的数据库。
    • 如果验证者获悉在同一时隙内有两个冲突区块,他们会使用自己的分叉选择算法选择获得最多质押以太币支持的那一个区块。

区块时间

区块时间是指两个区块诞生的时间间隔。

在基于 PoW 的 BTC 中,区块生成时间依赖于挖矿难度调整,是随机的。

在以太坊中,时间划分为每 12 秒一个单位,称为“时隙”。
在每个时隙内,选择一个单独的验证者提议区块。 假设所有验证者都在线且完全正常运行,则每个时隙内都会有一个区块产生,意味着区块时间是 12 秒。 但是,偶尔验证者在被要求提议区块时不在线,导致有时候一些时隙是空的。

即,在 ETH 中,每 12 秒(一个时隙)要么产生一个区块(极大概率),要么不产生,这个时间是确定的。

扩容

二层网络

分片

在计算机科学中,主要有两种扩容方式: A.纵向扩容:即增强节点能力 B.横向扩容:即增加节点数量

为了保证去中心化,区块链需要采取横向扩容方式。 ETH2 其中一个目标就是让节点可以在消费级硬件中运行。
总体来说,ETH2 采用的分片机制指的就是对数据库进行横向分割。

每条分片链都拥有一个节点子集,在该链上进行工作。虚拟矿工和验证者被分配到不同的分片中,并且只处理和验证自己所在分片链上的交易。

以太坊分片上的节点子集是动态的,按照区块顺序处理分片。

区块链实行分片机制的主要挑战在于如何确保分片安全性。
由于验证者分散在不同的分片中,有的节点可能会恶意控制某个分片。

解决该问题的关键在于:

随机分配 (shuffling) 验证者,每个分片区块都有一个委员会,其中的验证者都经由随机挑选。这种做法的目的是,经数学计算,如果攻击者控制的验证者少于总数的三分之一,其想要攻击单个分片是难以实现的。

此外,错误性证明(fraud proofs)、数据托管证明 (custody proofs) 和数据可用性检查 (data availability checks) 都是确保安全的重要因素,不过需要单独的讲解才能说清楚。

Eth2 目前的计划是启用64个分片。尽管分片和信标链是独立运作的,我们还是会针对整个系统的关键部分进行阐述。

PoS 的优势是,在任何给定时间都有全部已批准的区块生产者的记录,每个区块生产者都质押了以太币。 这个记录不但为分开治理奠定了基础,还可靠地划分了具体的网络责任。

这种责任与 PoW 形成对比,在 PoW 中,矿工对网络没有义务,可以立即停止挖矿并永久关闭其节点而不会受到任何影响。 而且,也没有已知区块提议者的记录,并且没有可靠的方法安全地划分网络责任。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值