> ## Documentation Index
> Fetch the complete documentation index at: https://docs.monad.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# 面向开发者的 Monad

> 面向开发者的 Monad 技术一页速览

<Note>
  本页面为开发者总结"为何选择 Monad"。有关在 Monad 上开发或重新部署所需了解内容的总结,请参见[面向开发者的部署摘要](/zh/developer-essentials/summary)。
</Note>

Monad 是一条与 Ethereum 兼容的 Layer-1 区块链,拥有 10,000 tps 的吞吐量、300ms 的出块频率和 600ms 的最终确定性。

Monad 的 Ethereum 虚拟机实现符合 Fusaka fork。

Monad 客户端已使用历史 Ethereum 交易进行模拟,并生成了完全相同的 merkle 根。

Monad 还提供完全的 Ethereum RPC 兼容性,使用户能够使用 Etherscan 或 MetaMask 等熟悉的工具与 Monad 交互。

Monad 在保持向后兼容性的同时,通过引入以下几项重大创新实现了这些性能提升:

* [MonadBFT](/zh/monad-arch/consensus/monad-bft) — 解决[尾部分叉](https://www.category.xyz/blogs/monadbft-fast-responsive-fork-resistant-streamlined-consensus)问题的前沿 BFT 共识机制
* [RaptorCast](/zh/monad-arch/consensus/raptorcast) — 高效的区块传输
* [异步执行](/zh/monad-arch/consensus/asynchronous-execution) — 将共识与执行流水线化,以扩大执行的时间预算
* [并行执行](/zh/monad-arch/execution/parallel-execution)和 [JIT 编译](/zh/monad-arch/execution/native-compilation) — 高效的交易执行
* [MonadDb](/zh/monad-arch/execution/monaddb) — 高效存储 Ethereum 状态

尽管 Monad 具有并行执行和流水线特性,但需要注意的是,Monad 中的区块是线性的,并且每个区块内的交易也是线性排序的。

第一个 Monad 客户端由 [Category Labs](https://www.category.xyz) 构建,使用 C++ 和 Rust 从头编写。代码在 `GPL-3.0` 许可下开源,地址如下:

* [`monad-bft`](https://github.com/category-labs/monad-bft)
* [`monad`](https://github.com/category-labs/monad)

## 交易

|              |                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 地址空间         | 与 Ethereum 相同的地址空间(使用 ECDSA 的 20 字节地址)                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| 交易格式/类型      | [与 Ethereum 相同](https://ethereum.org/en/developers/docs/transactions/)。Monad 交易使用 [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) 中引入的相同类型化交易信封,并使用 [RLP](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/) 编码。支持交易类型 0("legacy")、1("EIP-2930")、2("EIP-1559";现为 Ethereum 中的默认类型)和 4("EIP-7702")。参见[交易类型参考](https://ethereum.org/en/developers/docs/transactions/#typed-transaction-envelope)。更多详情参见[交易](/zh/developer-essentials/transactions)。 |
| EIP-7702     | 支持。参见 [Monad 上的 EIP-7702](/zh/developer-essentials/eip-7702)                                                                                                                                                                                                                                                                                                                                                                                                                 |
| EIP-155 重放保护 | 请注意,在 Monad 协议层允许[EIP-155](https://eips.ethereum.org/EIPS/eip-155) 之前的交易,因此不建议使用之前发送过 EIP-155 之前交易的 Ethereum 账户。[讨论](/zh/developer-essentials/transactions#transactions-without-a-chain_id)                                                                                                                                                                                                                                                                                  |
| 钱包兼容性        | Monad 与标准的 Ethereum 钱包(如 MetaMask)兼容。唯一需要修改的是 RPC URL 和 chain id。                                                                                                                                                                                                                                                                                                                                                                                                            |
| Gas 定价       | Monad 兼容 EIP-1559;base fee 和 priority fee 的工作方式与 Ethereum 相同。base fee 遵循动态控制器,类似 EIP-1559 控制器,但增速较慢、降速较快。[详情](/zh/developer-essentials/gas-pricing#base_price_per_gas-controller)。**交易按 gas limit 而非 gas 使用量计费**,即从发送方余额扣除的代币总量为 `value + gas_price * gas_limit`。这是异步执行的 DoS 防护措施。更多详情参见 [Monad 中的 Gas](/zh/developer-essentials/gas-pricing)。                                                                                                                               |

## 智能合约

|        |                                                                                                                                                                                                               |
| ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 操作码    | Monad 与 Ethereum(Fusaka fork)在字节码上兼容。截至 Fusaka fork 的所有[操作码](https://www.evm.codes/)均受支持。                                                                                                                     |
| 操作码定价  | 操作码定价与 Ethereum 相同,只有少数由于优化而对资源相对稀缺性重新加权的重新定价。[详情](/zh/developer-essentials/opcode-pricing)                                                                                                                   |
| 存储定价   | 存储 slot 以 128 个连续 slot 为一页进行分组,并按页而不是按 slot 进行 warm。读写连续 slot 的合约,每页仅支付一次冷成本。[详情](/zh/developer-essentials/opcode-pricing#storage-pages)                                                                      |
| 预编译合约  | 截至 Fusaka fork 的所有 Ethereum 预编译合约(`0x01` 到 `0x11`),加上位于 `0x0100` 的 P256 签名验证([EIP-7951](https://eips.ethereum.org/EIPS/eip-7951))和位于 `0x1000` 的 staking 预编译合约。参见[预编译合约](/zh/developer-essentials/precompiles) |
| 最大合约大小 | 128 kb(相较于 Ethereum 的 24.5 kb)                                                                                                                                                                                |

## 共识

|         |                                                                                                                                                                                                                                                                                                                                                                                 |
| ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 抗女巫机制   | 权益证明(PoS)                                                                                                                                                                                                                                                                                                                                                                       |
| 委托      | 允许(协议内)                                                                                                                                                                                                                                                                                                                                                                         |
| 共识机制    | Monad 的共识机制 [MonadBFT](/zh/monad-arch/consensus/monad-bft) 代表了拜占庭容错(BFT)共识领域的一次重大飞跃。它是第一个解决流水线 HotStuff 式共识中关键[尾部分叉](https://www.category.xyz/blogs/monadbft-fast-responsive-fork-resistant-streamlined-consensus)问题的 BFT 共识机制。做到这一点使 MonadBFT 能够实现高吞吐量(10,000+ tps)、频繁的出块时间(300 ms)、快速的最终确定性(600 ms)、线性的消息复杂度以及大型验证者集合(200+),同时不易受尾部分叉的影响——这是先前协议中的一个关键弱点,leader 可能将其前任的区块分叉掉。 |
| 区块传播机制  | [RaptorCast](/zh/monad-arch/consensus/raptorcast)                                                                                                                                                                                                                                                                                                                               |
| 出块频率    | 300 ms                                                                                                                                                                                                                                                                                                                                                                          |
| 最终确定性   | [推测性最终确定性](/zh/monad-arch/consensus/monad-bft)为 300 ms;完全最终确定性为 600 ms                                                                                                                                                                                                                                                                                                          |
| Mempool | Leader 维护[本地 mempool](/zh/monad-arch/consensus/local-mempool)。当 RPC 收到交易时,会将其[转发](/zh/monad-arch/consensus/local-mempool#transaction-lifecycle-in-monad)给接下来的 3 个 leader,这些 leader 会将其保存在其本地 mempool 中。如果 RPC 节点没有观察到该交易被打包,它会将向接下来的 3 个 leader 转发的过程再重复 2 次。未来可能会增加额外的转发。                                                                                                      |
| 共识参与者   | 直接共识参与者对区块提案进行投票并担任 leader。要成为直接参与者,节点必须至少质押 `MinStake`,并且按权益权重排在前 `MaxConsensusNodes` 名参与者之内。这些参数在代码中设定。                                                                                                                                                                                                                                                                       |
| 异步执行    | 在 Monad 中,共识和执行以流水线方式进行。节点在\_执行\_该排序\_之前\_就对官方交易顺序达成共识([异步执行](/zh/monad-arch/consensus/asynchronous-execution));执行结果\_不是\_共识的先决条件。在执行\_是\_共识先决条件的区块链中,执行的时间预算只是出块时间的一小部分。将共识与执行流水线化使 Monad 能够将完整的出块时间用于\_共识和执行两者\_。区块提案由有序的交易列表和来自 `k=3` 个区块之前的延迟状态 merkle 根组成。Monad 引入了[储备余额](/zh/developer-essentials/reserve-balance)系统,以确保节点在共识时只包含(或投票包含)其发送方有足够余额支付其执行的交易。                |
| 状态确定性   | 最终确定性在共识时发生;此时官方的交易排序被确立,对任何全节点而言,结果是完全确定的,通常将在 800 ms 内执行完该新区块的交易。状态 merkle 根的 `D` 区块延迟仅用于状态根验证,例如允许节点确保自己没有出现计算错误。                                                                                                                                                                                                                                                            |

## 执行

每个区块的执行阶段在该区块达成共识后开始,使节点能够继续对后续区块进行共识。

### 并行执行

交易是线性排序的;执行的任务是达到串行执行该交易列表所产生的状态。朴素的做法就是一个接一个地执行交易。我们能做得更好吗?可以!

Monad 实现了[并行执行](/zh/monad-arch/execution/parallel-execution):

* 执行器是用于执行交易的虚拟机。Monad 并行运行多个执行器。
* 执行器接收一笔交易并产生**结果**。结果是该交易的**输入**和**输出**列表,其中输入是执行过程中被 SLOAD 的 (ContractAddress, Slot, Value) 元组,输出是交易结果导致的被 SSTORE 的 (ContractAddress, Slot, Value) 元组。
* 结果最初以待定状态产生;然后按交易的原始顺序提交。当结果被提交时,其输出更新当前状态。轮到某个结果被提交时,Monad 检查其输入是否仍与当前状态匹配;如果不匹配,Monad 会重新调度该交易。得益于这一并发控制,Monad 的执行保证产生与交易串行运行时相同的结果。
* 当交易被重新调度时,许多或全部所需的输入都已缓存,因此重新执行通常相对便宜。请注意,在重新执行时,交易可能产生一组与之前执行不同的输入;

### MonadDb:高性能状态后端

所有活跃状态都存储在 [MonadDb](/zh/monad-arch/execution/monaddb) 中,这是针对固态硬盘(SSD)优化的存储后端,专门针对 merkle trie 数据的存储进行了优化。更新是批量处理的,以便高效地更新 merkle 根。

MonadDb 实现了内存缓存,并使用 [asio](https://think-async.com/Asio/) 进行高效的异步读写。节点应具备 32 GB RAM 以获得最佳性能。

## 与 Ethereum 的比较:用户视角

| 属性                   | Ethereum                                                                                    | Monad                                                                                                                                                                |
| -------------------- | ------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **每秒交易数**(智能合约调用与转账) | \~10                                                                                        | \~10,000                                                                                                                                                             |
| **出块频率**             | 12 秒                                                                                        | 300 ms                                                                                                                                                               |
| **最终确定性**            | [2 个 epoch](https://hackmd.io/@prysmaticlabs/finality)(12-18 分钟)                            | 600 ms                                                                                                                                                               |
| **字节码标准**            | EVM([Fusaka fork](https://www.evm.codes))                                                   | EVM([Fusaka fork](https://www.evm.codes))                                                                                                                            |
| **预编译合约**            | `0x01` 到 `0x11`(Fusaka fork)                                                                | `0x01` 到 `0x11`(Fusaka fork)加上 `0x0100`(P256,[EIP-7951](https://eips.ethereum.org/EIPS/eip-7951))和 `0x1000`(staking)。参见[预编译合约](/zh/developer-essentials/precompiles) |
| **最大合约大小**           | 24.5 kb                                                                                     | 128 kb                                                                                                                                                               |
| **RPC API**          | [Ethereum RPC API](https://ethereum.org/en/developers/docs/apis/json-rpc/)                  | [Monad RPC API](/zh/reference/json-rpc/overview)(通常与 Ethereum RPC API 相同,参见[差异](/zh/reference/json-rpc/overview))                                                    |
| **密码学**              | ECDSA                                                                                       | ECDSA                                                                                                                                                                |
| **账户**               | ECDSA 下公钥的 keccak-256 最后 20 字节                                                              | ECDSA 下公钥的 keccak-256 最后 20 字节                                                                                                                                       |
| **共识机制**             | Gasper(Casper-FFG 最终性小工具 + LMD-GHOST 分叉选择规则)                                                | [MonadBFT](/zh/monad-arch/consensus/monad-bft)(在常见情况下具有线性消息复杂度的抗尾部分叉流水线共识)                                                                                           |
| **Mempool**          | 全局                                                                                          | [本地](/zh/monad-arch/consensus/local-mempool)                                                                                                                         |
| **交易排序**             | Leader 自由裁量(实际中为 PBS)                                                                       | Leader 自由裁量(默认行为:优先 gas 拍卖)                                                                                                                                          |
| **抗女巫机制**            | PoS                                                                                         | PoS                                                                                                                                                                  |
| **允许委托**             | 否;通过 LST 实现伪委托                                                                              | 是;参见[质押](/zh/monad-arch/consensus/staking)                                                                                                                           |
| **硬件要求**(全节点)        | 4 核 CPU、32 GB RAM、4 TB SSD NVMe、25 Mbit/s 带宽([参考](https://eips.ethereum.org/EIPS/eip-7870)) | 16 核 CPU、32 GB RAM、2 x 2 TB SSD NVMe、100 Mbit/s 带宽([更多信息](/zh/node-ops/hardware-requirements))                                                                       |

## 工具与基础设施

许多领先的 Ethereum 开发工具都支持 Monad 测试网。按类别列出的支持提供商请参见[工具与基础设施](/zh/tooling-and-infra)。

## 后续步骤

Monad 的公共测试网已上线。前往[网络信息](/zh/developer-essentials/network-information)以开始使用。

现在您已经熟悉了 Monad 的架构和特性,前往[面向开发者的部署摘要](/zh/developer-essentials/summary)以了解部署所需的所有信息。
