Skip to main content

配置 Web 托管以控制成本

  • Vercel 和 Railway 提供了方便的无服务器平台来托管您的应用,相对于直接使用云提供商, 抽象了 web 托管的运维事务。您可能会为便利性付出溢价,尤其是在高流量时。
  • AWS 和其他云提供商提供了更大的灵活性和商品化的定价。
  • 在选择任何服务之前,请检查定价,并注意许多提供商在较低流量下提供亏本引流的定价,但一旦达到某个阈值, 就会收取更高的费用。
    • 例如,假设有一个 $20 的套餐,包括每月 1 TB 的数据传输,超出后 $0.20/GB。做一下算术就会发现第二 TB (以及之后)将花费 $200。如果下一个套餐说”联系我们”,不要假设下一个套餐会按 $20 每 TB 收费。
    • 如果您正在构建高流量应用,并且不注意更便宜地提供静态文件,那么很容易超出亏本引流的层级, 并支付比预期高得多的费用。
  • 对于 AWS 上的生产部署,请考虑:
    • Amazon S3 + CloudFront 用于静态文件托管和 CDN
    • AWS Lambda 用于无服务器函数
    • Amazon ECS 或 EKS 用于容器化应用
    • Amazon RDS 用于数据库需求
    • 这种设置通常为高流量应用提供精细的成本控制和可扩展性。

如果 gas 使用量是静态的,使用硬编码值代替 eth_estimateGas 调用

许多链上操作具有固定的 gas 成本。最简单的例子是原生代币的转账始终花费 21,000 gas,但还有许多其他情况。 这使得每笔交易调用 eth_estimateGas 变得没有必要。 请改用硬编码值,如此处所建议。 消除 eth_estimateGas 调用可以大幅加速钱包中的用户工作流程,并避免一些钱包在 eth_estimateGas 回滚时可能出现的不良行为(在链接页面中讨论)。

通过并发提交多个请求来降低 eth_call 延迟

串行发起多个 eth_call 请求会由于到 RPC 节点的多次往返而引入不必要的延迟。您可以并发发起许多 eth_call, 方法是将它们压缩为单个 eth_call 或提交一批调用。或者,您可能会发现切换到索引器更好。

将多个 eth_call 压缩为一个

  • Multicall: Multicall 是一个实用智能合约,允许您将多个读取请求(eth_call)聚合为单个请求。 这对于同时获取代币余额、授权或合约参数等数据点特别有效。标准 Multicall3 合约部署在 Monad 主网和 Monad 测试网上的 0xcA11bde05977b3631167028862bE2a173976CA11。 许多库都提供辅助函数来简化 multicall 的使用,例如 viem。 在此处阅读有关 Multicall3 的更多信息。
  • 自定义批处理合约: 对于复杂的读取模式或标准 multicall 合约无法轻易处理的场景, 您可以部署一个自定义智能合约,在单个函数中聚合所需的数据,然后通过单个 eth_call 调用它。
Multicall 按序列执行调用,如您从此处的代码中可以看到。 因此,虽然使用 multicall 避免了到 RPC 服务器的多次往返,但仍然不建议将过多昂贵的调用放入一个 multicall 中。 一批调用(接下来解释)可以在 RPC 上并行执行。

提交一批调用

大多数主要库支持将多个 RPC 请求批处理到单个消息中。 例如,viem 通过将 promise 数组作为单个批次提交来处理 Promise.all():

对读取密集型负载使用索引器

如果您的应用频繁查询历史事件或派生状态,请考虑使用索引器,如下所述。

使用索引器代替反复调用 eth_getLogs 来监听事件

以下是最流行的数据索引解决方案的快速入门指南。有关更多详情,请查看索引器文档

使用 Allium

另请参见:Allium您将需要 Allium 帐户,可以在此处申请。
  • Allium Explorer
    • 提供基于 SQL 访问历史区块链数据(区块、交易、日志、trace 和合约)的区块链分析平台。
    • 您可以通过 GUI 创建 Explorer API, 以查询和分析历史区块链数据。在此处为 API 创建查询时 (使用 New 按钮),从链列表中选择 Monad MainnetMonad Testnet
    • 相关文档:
  • Allium Datastreams
    • 通过 Kafka、Pub/Sub 和 Amazon SNS 提供实时区块链数据流(包括区块、交易、日志、trace、 合约和余额快照)。
    • 通过 GUI 为链上数据创建新流。 创建流时,从 Select topics 下拉菜单中选择相关的 Monad MainnetMonad Testnet 主题。
    • 相关文档:
  • Allium Developers
    • 支持获取钱包交易活动和跟踪余额(原生、ERC20、ERC721、ERC1155)。
    • 对于请求体,使用 monad_mainnet(Monad 主网)或 monad_testnet(Monad 测试网)作为 chain 参数。
    • 相关文档:

使用 Envio HyperIndex

  • 遵循快速入门 来创建索引器。在 config.yaml 文件中,使用网络 ID 10143 来选择 Monad 测试网 (在下面的示例中使用)或网络 ID 143 用于 Monad 主网。
  • 示例配置
    • 示例 config.yaml 文件
      config.yaml
    • 示例 EventHandlers.ts
      EventHandlers.ts
  • 重要:网络下的 rpc_config 部分(查看 config.yaml 示例)是可选的, 仅当您在使用默认 Envio 设置时遇到问题时才应配置。此配置允许您:
    • 使用您自己的 RPC 端点
    • 配置块获取参数以获得更好的性能
  • 相关文档:

使用 GhostGraph

另请参见:Ghost

使用 Goldsky

另请参见:Goldsky
  • Goldsky Subgraphs
    • 要部署 Goldsky subgraph,请遵循此指南
    • 作为网络标识符,使用 monad-mainnet(Monad 主网)或 monad-testnet(Monad 测试网)。有关 subgraph 配置示例,请参考下面的 The Graph 协议部分
    • 有关查询 Goldsky subgraph 的信息,请参见 GraphQL API 文档
  • Goldsky Mirror
    • 支持将链上数据直接流式传输到您的数据库。
    • 在为管道创建 source 时,dataset_name 字段的链名请使用 monad_mainnet(Monad 主网)或 monad_testnet(Monad 测试网)(查看下面的示例)
    • 示例 pipeline.yaml 配置文件
      pipeline.yaml
    • 相关文档:

使用 QuickNode Streams

另请参见:QuickNode Streams
  • 在您的 QuickNode 仪表板上,选择 Streams > Create Stream。在创建流的 UI 中, 在 Network 下选择 Monad Mainnet 或 Monad Testnet。或者,您可以使用 Streams REST API 来创建和管理流 — 使用 monad-mainnet(Monad 主网)或 monad-testnet(Monad 测试网)作为网络标识符。
  • 您可以通过在流创建期间选择目的地来消费流。 支持的目的地包括 Webhooks、S3 存储桶和 PostgreSQL 数据库。 在此处了解更多信息。
  • 相关文档:

使用 The Graph 的 Subgraph

另请参见:The Graph
  • 网络 ID:使用 monad-mainnet(Monad 主网)或 monad-testnet(Monad 测试网)
  • 示例配置
    • 示例 subgraph.yaml 文件
      subgraph.yaml
    • 示例 mappings.ts 文件
      mappings.ts
    • 示例 schema.graphql 文件
      schema.graphql
  • 相关文档:

使用 thirdweb 的 Insight API

另请参见:thirdweb
  • 提供广泛的链上数据的 REST API,包括事件、区块、交易、代币数据(如转账交易、余额和代币价格)、 合约详情等。
  • 构造请求 URL 时,使用链 ID 143(Monad 主网)或 10143(Monad 测试网)。
  • 相关文档:

如果快速连续发送多笔交易,请在本地管理 nonce

这仅适用于您手动设置 nonce 的情况。如果您将此委托给钱包,则无需担心。
  • eth_getTransactionCount 需要网络请求。如果您有来自同一钱包的多笔连续交易, 您应该实现本地 nonce 跟踪。

并发提交多笔交易

如果您要提交一系列交易,请实现并发交易提交以提高效率,而不是顺序提交。 之前:
之后: