[ 04 / 16 ] · Monad课程

第 04 课:Monad 架构

11 分钟200 XP

踏上构建生产级应用的旅程。

本课会一层一层地讲清楚 Monad 是怎么搭起来的。

每条区块链的架构其实大同小异:六层,各司其职。以太坊有,比特币有,Monad 也有。差别不在于这些层本身,而在于每条链如何实现这些层。

可以这样想:人眼和蝴蝶眼都是为了看见东西,但它们由不同的部件组成,因此实现「看」的方式完全不同。一旦你理解了每一层在做什么,你就能理解之后出现的任何区块链。

这六层是:

  1. 硬件层(Hardware Layer):物理机器
  2. 网络层(Network Layer):节点之间如何发现并互相通信
  3. 数据层(Data Layer):数据如何在本地存储
  4. 共识层(Consensus Layer):节点之间如何就「发生了什么」达成一致
  5. 执行层(Execution Layer):交易如何被处理
  6. 应用层(App Layer):用户实际打交道的部分

我们会逐层讲解。每一层都会简单说明以太坊是怎么实现的,再说 Monad 的实现有什么不同。这并不是要把它们对立起来。以太坊证明了这套架构是可行的,Monad 在它的基础上为性能而重新实现。

重要: 本课讲的是每一层在做什么、它为什么重要,而不是它们工作的深层技术细节。在后续的进阶课程里,我们会深入 MonadBFT、并行执行(parallel execution)、MonadDB 等等的内部机制。现在的目标,是先建立起对完整架构的清晰心智模型。


1. 硬件层

每条区块链都跑在物理机器上。硬件层很简单,就是为网络提供算力的那些机器。

以太坊可以跑在各种各样的硬件上。你可以在云端虚拟机(如 AWS)、消费级笔记本,或专用服务器硬件上运行以太坊节点。门槛很低,这也是以太坊拥有数千个节点的原因之一。

Monad 要求使用裸金属服务器(bare metal servers):不接受云端虚拟机。云虚拟化会引入额外延迟,会破坏 Monad 的亚秒级时序。它的硬件规格相比其他高性能链已经算适中,但比以太坊更严格:16 核 CPU、基础主频 4.5 GHz 以上、32GB 以上内存、存放状态数据的 2TB NVMe SSD 加上一块 500GB 的共识盘、全节点带宽 100 Mbit/s(验证者 300 Mbit/s)。

这为什么重要?硬件门槛越低,越多人能负担得起跑节点。节点越多,去中心化程度越高。Monad 的硬件规格是一个有意为之的折衷:足够严格以保证性能,又足够亲民以保证去中心化。

为什么 Monad 要求使用裸金属服务器,而不是云端虚拟机?


2. 网络层

你的节点已经存在了。现在它需要找到其他节点,并开始通信。这就是网络层。没有它,交易无法流转,区块链也无法运转。

每条链的网络层都做着同样的两件事:节点发现(peer discovery)(找到其他节点)和节点通信(node communication)(与它们对话)。实现方式可以不同,但活儿是一样的。

以太坊用了好几个组件来完成这件事。Discv5 负责发现其他节点。DevP2P 负责建立通信通道。线协议(wire protocols)负责发送区块头和交易公告。GossipSub 负责在已同步的节点之间广播更新。以太坊大约有 13,000 多个全节点和大约 100 万个活跃的验证者密钥,全部通过这些协议协调。

Monad 完成同样的两项工作,但思路不同:

  • 节点启动: 你的节点会带着一份配置文件以及由 MonadBFT 算法预设的种子地址(seed addresses)启动。这些就是你最初的连接点。
  • 节点发现: 你的节点联系种子地址,获取验证者联系列表(IP 地址 + 加密签名),验证它们的真实性,然后直接连接到验证者。
  • 节点通信: 节点在一个专用端口上通信。每条消息都附带证明发送者身份的数字签名。区块头会立即开始到达,但你的节点会先把它们缓存下来,直到完全同步。
  • 状态同步(state sync): 你的节点从已同步的对等节点处下载状态快照(账户余额、合约存储、字节码),以追上整个网络。
  • 区块同步(block sync): 状态同步完成后,如果你的节点离链上最新区块只差几个区块,就用区块同步来收尾。请求几个单独的区块,比再跑一次完整的状态同步要快得多、轻量得多。区块同步还能用来恢复因丢包而漏掉的区块。

你不需要把这些步骤背下来。要带走的结论是:所有区块链都有一个负责节点发现与通信的网络层,而 Monad 用一套快速的同步流程来实现,让你的节点能尽快赶上进度。

网络层的两项主要工作是什么?


3. 数据层

你的节点现在已经接入网络,并开始接收数据。这些数据要去哪里?数据层负责把它们本地存储到你的机器上。

这一层对去信任(trustlessness)至关重要。如果你的节点没法在本地存储链上数据,那它每次想验证什么都得去问外部来源。这会彻底毁掉去中心化。

以太坊用通用数据库(LevelDB 或 RocksDB)来存数据,而这些数据库最初并不是为区块链设计的。进入的数据被组织成 Merkle Patricia Tries:一种树状结构,保存账户余额、交易和事件日志。这些 Trie 随后被转换成键值对(key-value pairs),再存入数据库。

Monad 使用 MonadDB,这是一个专为区块链数据定制的数据库。关键差别在于:以太坊必须把它的树形结构转成键值对,再交给一个通用数据库;而 MonadDB 直接存储 Merkle Patricia Trie,不需要转换。它还使用异步 I/O(asynchronous I/O)(一种叫 io_uring 的技术)来高速地读写你的 SSD。

数据是同样的数据,结构也是同样的结构。不同之处在于:MonadDB 是为区块链量身打造的,而以太坊则是把通用数据库强行拿来做一件它原本并非为之设计的事情。

MonadDB 是什么?

MonadDB 与以太坊的数据存储有何不同?


4. 共识层

你的节点已经在线并完成同步。当有人发起一笔交易时,整个网络需要决定:这笔交易合法吗?应该按什么顺序记录?这就是共识层(consensus layer)。

共识(consensus)就是数千台独立计算机如何就同一个版本的「真相」达成一致。如果有人提出了一个欺诈区块,诚实节点会拒绝它。如果两个验证者同时提出区块,整个网络会从中选一个。没有共识,就没有共享的现实。

以太坊使用一种叫 Gasper 的共识机制,它把两种算法结合在一起:

  • LMD-GHOST 让链不停下来:当多个区块同时被提出时,它负责决定跟随哪个分叉。它会选择获得验证者票数最多的那一边。
  • Casper FFG 把历史「锁死」。它通过对特殊的检查点区块进行两阶段投票来确定区块的最终性(finality)。一旦某个区块被最终确定,它就再也无法回滚。

二者合起来:LMD-GHOST + Casper FFG = Gasper。这套流程依赖每 32 个 slot 一个 epoch 以及检查点投票,需要时间。以太坊的出块时间是 12 秒,而最终性大约需要 13 分钟(2 个 epoch,每个 32 slot)。

以太坊证明了权益证明(proof-of-stake)共识在大规模场景下是可行的。它用这套系统保护了价值数千亿美元的资产,这是奠基性的成就。

Monad 使用 MonadBFT,目标相同(就有效区块达成一致),但快得多:

  • MonadBFT 让验证者轮流担任「领导者(leader)」。领导者每 400 毫秒轮换一次。领导者提出一个区块,其他验证者通过两轮投票来表决。两轮过后,区块即被最终确定。Monad 也有 epoch,但与以太坊不同的是,epoch 并不用于区块的最终性——最终性在单个区块层面就完成,每 800 毫秒一次。
  • 抗 Tailforking(tailforking resistance) 防止恶意领导者跳过前一位领导者的区块以窃取奖励或制造 MEV 漏洞。MonadBFT 强制领导者必须包含前一位领导者的区块(或证明它们无法恢复)。
  • RaptorCast 解决了一个带宽问题。如果领导者必须把一个完整的 2MB 区块直接发给每一个验证者,带宽要求会非常巨大,远远跟不上 400 毫秒的出块节奏。RaptorCast 通过纠删编码(erasure coding)把区块拆成上千个小块,使得只要拥有这些小块中足够大的一个子集,就能重建出完整区块。这些小块以两级扇出(two-level fan-out)方式分发:领导者把小块发给第一层验证者,第一层验证者再转发给其他所有人。这样带宽负载就分摊到了整个网络,而不是堵在领导者那里。

最终的结果:400 毫秒的出块时间,800 毫秒的最终性。 以太坊以分钟计,Monad 不到一秒。

MonadBFT 是什么?

RaptorCast 是做什么的?

在 Monad 上,一个区块达到最终性需要多长时间?


5. 执行层

共识已经决定了哪些区块有效,以及它们的顺序。但区块链的状态实际上还没更新。执行层(execution layer)会处理这些区块里的交易,并更新账户余额、合约存储以及一切其它状态。

以太坊通过 **EVM(Ethereum Virtual Machine,以太坊虚拟机)**执行交易,这是一台「全球计算机」,会在每个节点上完全相同地运行智能合约代码。当一笔交易到来时,EVM 会一步一步地执行该智能合约的字节码,每次一条指令,每次一笔交易。

最后那一点正是瓶颈所在。以太坊**串行(sequentially)**处理交易。第 1 笔完成,第 2 笔才开始,然后是第 3 笔。一笔接一笔。这把以太坊平均限制在大约每秒 15-25 笔交易(TPS)。

还有另一个限制。在以太坊里,共识和执行是**交错(interleaved)**的,意味着一个区块必须执行完毕,共识才能进入下一个区块。以太坊出块时间是 12 秒,但其中大部分时间被共识和区块传播吃掉了,留给真正执行的窗口很有限。这也是为什么以太坊的区块通常只能装下大约 150-250 笔交易。

以太坊把 EVM 确立为智能合约执行的全球标准。每一个 Solidity 开发者、每一种工具、每一个 dApp 都是围绕它建立的。这正是 Monad 所继承的根基。

Monad 运行的就是同样的 EVM(为以太坊编写的应用无需改代码就能在 Monad 上运行),但重新实现了交易处理的方式:

  • 乐观并行执行(optimistic parallel execution): Monad 不是一笔一笔地处理交易,而是在多个 CPU 核心上同时运行它们。它乐观地假设交易之间不会冲突。如果两笔交易确实冲突(例如两笔都想从同一个余额里扣钱),那么受影响的交易会被重新执行。最终状态总是按正确顺序应用,结果与串行执行完全一致。
  • 异步执行(与共识解耦): 在以太坊里,执行必须先完成,共识才能继续往前。Monad 把它们分开。当共识就第 N 个区块的交易顺序达成一致时,执行在后台处理第 N-1 个区块。这样一来,执行就能用上整段出块时间,而不是只用其中很小一部分,吞吐量因此大幅提升。
  • MonadDB: 数据层那个定制数据库在这里也起作用。传统数据库会强迫交易排队,哪怕它们只是要读数据。MonadDB 允许成千上万次并行的状态读取,因此许多交易可以同时访问账户余额,而不会成为瓶颈。

并行执行、共识与执行解耦、再加上 MonadDB,这套组合让 Monad 能达到大约每秒 10,000 笔交易,比以太坊快几百倍,同时仍然完全兼容 EVM。

以太坊执行的主要瓶颈是什么?

「乐观并行执行(optimistic parallel execution)」是什么意思?

为什么把共识和执行解耦很重要?


6. 应用层

整条区块链现在已经全面运转。交易在被处理,状态在更新。应用层(app layer)就是用户真正体验这一切的地方——通过钱包、DEX、游戏、借贷协议,以及其他所有建立在链上的应用。

以太坊奠定了我们今天所知的应用层。MetaMask、Uniswap、Aave、OpenSea。这些应用定义了「使用区块链」意味着什么。它们证明了去中心化应用是可行的、用户会接受它们,而且整个经济体都可以跑在智能合约之上。

Monad 把这一切都继承了下来。因为 Monad 完全兼容 EVM,以太坊上的应用无需改代码就能在 Monad 上运行。开发者只需要用 Monad 的 chain ID 把同一份合约重新部署到 Monad 上即可。同样的 Solidity,同样的工具,同样的钱包连接。从开发者的视角来看,部署到 Monad 与部署到以太坊几乎别无二致;从用户的视角来看,这些应用的用法也完全一样,只是更快、更便宜。

这是把一切融汇起来的一层。用户不需要懂 MonadBFT、并行执行或 MonadDB。他们只是在交换代币、下注,或者与任何链上应用交互时,体验到了又快又便宜的交易。

为什么以太坊上的应用无需改代码就能在 Monad 上运行?


把所有层串起来

每一层都建立在前一层之上:

  1. 硬件提供算力
  2. 网络把节点连接在一起
  3. 数据把链上状态存到本地
  4. 共识就有效区块达成一致
  5. 执行处理交易并更新状态
  6. 应用把服务交付给用户

以太坊搭起了这套架构,并证明了它确实可行。Monad 在此基础上为性能而重新实现:用 MonadBFT 实现快速共识,用并行执行实现高吞吐,用 MonadDB 实现高效存储。最终的结果是 10,000 TPS 加上 800 毫秒最终性,同时仍然完全兼容以太坊开发者已经熟悉的一切。


下一步是什么

你已经拿到了 Monad 是怎么搭起来的分层地图。接下来,在 10,000 TPS 下会变得可能的事(What Becomes Possible at 10,000 TPS) 会看看这种速度和亚秒级最终性对你能构建的应用类型究竟意味着什么改变——以及如何把诚实的说法和炒作分开。

0/11 正确

0% — 全部答对即可完成

注册以记录进度