Skip to main content
本页面总结了在 Monad 上开发或部署智能合约时您需要了解的内容。

从这里开始

支持的工具和基础设施

以下是一些最常请求的工具:
有关完整的支持列表,请参见工具和基础设施,包括:

账户

地址空间与以太坊相同的地址空间(ECDSA 公钥的最后 20 字节)
EIP-7702支持。参见 EIP-7702 参考

智能合约

有关部署和验证指南,请参见:
Opcodes支持截至 Fusaka 分叉的所有 opcode
预编译截至 Fusaka 分叉的所有以太坊预编译(0x010x11),加上 0x0100 的 P256 签名验证(EIP-7951)和 0x1000 的质押预编译。参见预编译
最大合约大小128 kb(以太坊为 24.5 kb)

交易类型

完整文章:交易
交易类型支持:
  • 0(“legacy”)
  • 1(“EIP-2930”)
  • 2(“EIP-1559”,以太坊上的”默认”)
  • 4(EIP-7702)
不支持:
  • 3(“EIP-4844”)

Gas 限制

每交易 gas 限制30M gas
区块 gas 限制150M gas
区块 gas 目标80%(120M gas)
Gas 吞吐量500M gas/秒(150M gas/区块 ÷ 0.3 秒/区块)

Gas 定价

完整文章:Gas 定价
收取的 gas收取的是gas 限制。即:从发送者余额中扣除的代币总量为 value + gas_price * gas_limit。参见讨论
EIP-1559 动态Monad 兼容 EIP-1559;base fee 和优先费的工作方式与以太坊相同。EIP-1559 说明
Base fee最低 base fee 为 100 MON-gwei(100 * 10^-9 MON)。
Base fee 控制器类似于以太坊,但保持较高水平的时间更短(详情)。

Opcode 定价

完整文章:Opcode 定价 Opcode 定价与以太坊相同(参见:evm.codes),除了以下由于 Monad 优化需要重新定价以重新平衡资源相对稀缺性的调整。
项目以太坊Monad说明
冷访问成本 - 账户2,60010,100受影响的 opcode:BALANCEEXTCODESIZEEXTCODECOPYEXTCODEHASHCALLCALLCODEDELEGATECALLSTATICCALLSELFDESTRUCT
参见详情
冷访问成本 - 存储每 slot 2,100每 128 个 slot 一页 8,100受影响的 opcode:SLOADSSTORE。存储的 warm 单位是每 128 个连续 slot 一页,因此冷成本按页支付一次。
参见存储详情
SSTORE 写入与状态增长全新 slot 20,000
覆盖 2,900
每页首次写入 2,800
每页新增净 slot 17,000
在上述冷访问成本之上收取。
参见详情
内存扩展成本3*w + w^2/512w/2w 是以 32 字节字为单位的内存大小。每笔交易的内存上限为 8 MB。
参见详情
ecRecoverecAddecMulecPairingblake2fpoint_eval 预编译参见详情

预编译 0x010x060x070x080x090x0a

时间考量

出块频率300 ms
TIMESTAMP opcode与以太坊一样,TIMESTAMP 是秒级粒度的 unix 时间戳。由于区块每 300 ms 出一次,这意味着 3-4 个区块可能具有相同的时间戳。
最终性区块在两个区块后(600 ms)最终确认。一旦区块被最终确认,就不能被重组。参见 MonadBFT 以了解更完整的讨论。
推测性最终性当区块被标记为处于 Voted 阶段时,它可以在一个区块后(300 ms)推测性最终确认

推测性最终性在非常罕见的情况下可能会回滚(参见更完整的讨论)。

Mempool

完整文章:本地 Mempool Monad 没有全局 mempool,因为这种方法不适合高性能区块链。 每个验证者维护一个包含其所知交易的本地 mempool。当 RPC 收到交易时,它会策略性地转发给即将 到来的 leader,并在未观察到交易被包含时重复此过程。 尽管这是 Monad 设计的重要部分,但通常不应影响智能合约开发者在其系统设计中的工作。

并行执行和 JIT 编译

Monad 利用并行执行JIT 编译来提高效率, 但智能合约开发者无需为此做任何更改。 在 Monad 中,交易仍然是线性排序的,执行的唯一正确结果与串行执行交易的结果相同。 智能合约开发者可以将并行执行的所有方面视为实现细节。 参见进一步讨论

异步执行

完整文章:异步执行 Monad 利用异步执行以提高效率,但大多数开发者不应需要做任何更改。 具有大量链下财务逻辑的开发者(例如交易所、跨链桥和稳定币/RWA 发行方)应该等到区块达到 Verified阶段(即状态根最终性), 比Finalized晚三个区块, 以确保整个网络认同其自己节点对最终确认区块的本地执行。
异步执行是一种技术,通过将共识与执行解耦,允许 Monad 大幅提高执行吞吐量。 在异步执行中,验证者先投票,后执行 - 因为一旦交易顺序确定,状态就确定了。 之后,每个节点在本地执行。三个区块后有一个延迟 merkle 根 确认网络得到了与本地执行相同的状态 trie。从开发者的角度来看:
  • 有人通过您的前端提交了一笔与您的智能合约交互的交易。您记下哈希。
  • 一个包含该交易的区块被Proposed
  • 一个区块后,该区块被Voted(推测性最终确认)。(T+1)
  • 一个区块后,该区块被Finalized(T+2)
  • 三个区块后,该区块被Verified(状态根最终确认)(T+5)
您通过调用 eth_getTransactionReceipt 来监听交易收据。 收据将在区块变为 Proposed(推测性执行)后首次可用。您选择何时更新 UI 以向用户提供反馈取决于风险偏好,但对于大多数应用, 在区块变为 Proposed 时这样做是合理的,因为推测性最终性回滚极其罕见。更保守的方法是等到 区块 Finalized,因为那时您就永远不必处理重组。通常不需要等到 Verified (除了前面提到的具有链下财务逻辑的开发者)。

储备余额

完整文章:储备余额 Monad 引入了储备余额机制以支持异步执行。 储备余额机制在共识时对交易何时可以被包含施加轻度限制,并对交易在执行时回滚的条件施加一些约束。 储备余额机制旨在在保持异步执行下的安全性的同时不干扰正常使用模式。大多数用户和开发者 无需担心储备余额约束。

EIP-7702

支持 EIP-7702;完整说明请参见此处 有两个注意事项:
  1. 如果一个 EOA 被 EIP-7702 委托,由于储备余额规则, 其余额不能降至 10 MON 以下。(如果委托被移除,则允许低于 10 MON。) 讨论
  2. 如果一个 EOA 被 EIP-7702 委托,当它被当作智能合约调用时, CREATECREATE2 opcode 会被禁止。讨论

读取区块链数据

支持以下方法读取区块链数据:
JSON-RPC参见 RPC API。Monad 支持所有来自以太坊的标准 RPC 方法。差异在 RPC 差异 中说明。速率限制请参见此处
WebSocket参见 WebSocket 指南

Monad 使用以下订阅类型实现 eth_subscribe 方法:
  • newHeadslogs
  • monadNewHeadsmonadLogs(类似,但包含跟踪每个区块通过共识进度的额外数据)
不支持 syncingnewPendingTransactions 订阅类型。 有关更多详情,请参见实时数据源
执行事件参见执行事件

执行事件系统允许开发者构建高性能应用,这些应用通过共享内存队列从 Monad 节点接收最低延迟的事件数据。
您也可以使用支持的索引器

历史数据

Monad 全节点提供对所有历史账本数据(区块、交易、收据、事件和 trace)的访问。 Monad 全节点不提供对任意历史状态的访问,如此处所述。 有一个特殊的 RPC 服务位于 提供对历史数据的访问。

推荐的开源工具版本

  • foundry >= 1.8.0:启用 Monad 执行网络 以获得 Monad 的 gas 定价、hardfork 和预编译
  • viem >= 2.40.0(只是为了引入 monad.ts)
  • alloy-chains >= 0.2.20

权威合约地址

参见权威合约

源代码

运行全节点

参见节点运维

需要帮助?

请在开发者 discord 中提问。我们随时准备提供帮助!