摘要
Celo API 是一个 JSON-RPC 接口,允许你的应用程序读取链上状态、提交交易并订阅 Celo 主网上的事件。你通过 HTTPS 端点使用标准 EVM 方法(如 eth_blockNumber、eth_getBalance 和 eth_call)以及 Celo 特有的费用货币和移动友好型 Gas 抽象调用来连接它。本文介绍了你需要的链设置、如何发送第一个请求以及如何诊断开发者最常遇到的故障。它还解释了何时共享公共端点就足够,以及何时专用 Celo 节点更适合生产工作负载。
Celo API 是你的应用程序用来与 Celo 主网通信的 JSON-RPC 接口。如果你搜索了“celo api”,你可能需要以下三件事之一:将 Celo 添加到钱包的正确链设置、用于发送第一个请求的可用端点,或调试请求失败原因的方法。本页回答了所有这三个问题,然后帮助你决定共享端点是否足够,或者你的工作负载是否需要专用 Celo 节点。
Celo 是一个 EVM 兼容的 Layer 1,因此你的大部分以太坊工具无需修改即可使用。重要的区别在于链 ID、原生货币符号以及围绕费用货币和 Gas 抽象的 Celo 特有方法。把这些弄对,剩下的就是标准 JSON-RPC。
链设置一览
在编写任何代码之前,请确认网络参数。这些是你输入到钱包、Hardhat 配置或 viem 链定义中的值。
| 设置 | 值 |
|---|---|
| 网络名称 | Celo Mainnet |
| 链 ID | 42220 |
| 原生货币 | CELO(18 位小数) |
| RPC 传输 | HTTP |
| 区块浏览器 | https://celoscan.io |
| 公共端点 | https://celo.api.onfinality.io/public |
如果你要将 Celo 添加到钱包,请完全按照所示使用网络名称和链 ID。链 ID 不匹配是钱包拒绝签名或 dApp 报告“错误网络”的最常见原因。
对于你可以在开发中使用的托管端点,OnFinality 公开了一个公共 Celo RPC URL。对于生产流量,请查看 RPC 定价 和 Celo 网络页面,以选择与你的请求量匹配的计划。
发送你的第一个 Celo API 请求
每个 Celo API 调用都是一个 POST 请求,其 JSON 正文包含 jsonrpc、method、params 和 id。从 eth_chainId 开始,确认你连接到了正确的网络,然后使用 eth_blockNumber 检查节点是否已同步。
curl -X POST https://celo.api.onfinality.io/public \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "eth_chainId",
"params": [],
"id": 1
}'
响应以十六进制返回链 ID。对于 Celo 主网,该值为 0xa4ec,即十进制的 42220。如果你得到不同的值,说明你指向了错误的网络。
链 ID 检查通过后,查询余额并读取合约:
curl -X POST https://celo.api.onfinality.io/public \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "eth_getBalance",
"params": ["0xYourAddressHere", "latest"],
"id": 2
}'
eth_call 的工作方式与在以太坊上相同。传入 to 地址、编码后的函数数据和区块标签。Celo 的 EVM 兼容性意味着 ethers 和 viem 等 ABI 编码库无需特殊处理即可工作。
从 JavaScript 连接
如果你更喜欢客户端库,viem 和 ethers 都通过自定义链定义支持 Celo。下面的示例使用 viem 并指向公共端点。
import { createPublicClient, http, defineChain } from "viem";
const celo = defineChain({
id: 42220,
name: "Celo Mainnet",
nativeCurrency: { name: "CELO", symbol: "CELO", decimals: 18 },
rpcUrls: {
default: { http: ["https://celo.api.onfinality.io/public"] },
},
blockExplorers: {
default: { name: "Celoscan", url: "https://celoscan.io" },
},
});
const client = createPublicClient({ chain: celo, transport: http() });
const blockNumber = await client.getBlockNumber();
const balance = await client.getBalance({ address: "0xYourAddressHere" });
console.log({ blockNumber, balance });
对于基于钱包的应用,相同的值会放入 wallet_addEthereumChain。保持钱包配置和后端之间的链 ID 和 RPC URL 一致,这样用户就不会在会话中途看到网络切换提示。
何时公共端点足够,何时不够
共享公共端点适用于本地开发、原型和低流量读取路径。一旦你有真实用户,它就不太适合,因为你与其他所有人共享吞吐量,并且无法控制延迟峰值。
使用此表来决定你的工作负载实际需要什么。
| 工作负载 | 共享公共端点 | 专用 Celo 节点 |
|---|---|---|
| 本地开发和测试 | 适合 | 不必要 |
| 少量用户的原型 | 通常可以 | 可选 |
| 稳定流量的生产 dApp | 负载下有风险 | 推荐 |
| 索引器或后端工作进程 | 不适合 | 推荐 |
| 许多并发用户的钱包 | 不适合 | 推荐 |
| 归档或历史查询 | 通常不可用 | 必需 |
如果你不确定自己属于哪种情况,请从 RPC 提供商选择指南 开始,然后在 定价页面 上比较计划。OnFinality 提供共享 RPC API 访问和 专用节点,适用于需要隔离容量的团队。
值得了解的 Celo 特有方法
由于 Celo 是为移动支付设计的,它添加了以太坊没有的方法。有两个值得尽早了解。
eth_gasPrice 返回 Gas 价格,但 Celo 还支持使用批准的 ERC-20 代币支付 Gas。如果你的应用允许用户使用稳定币支付费用,你将与费用货币合约交互,而不仅仅是原生 CELO 余额。在构建交易之前读取当前的费用货币,并检查账户是否有足够的该代币。
Celo 还支持与以太坊相同过滤形状的 eth_getLogs。如果你正在索引事件,请保持区块范围适中并进行分页。大型无界日志查询是任何提供商(不仅仅是 Celo)超时的常见原因。
常见 Celo API 错误的调试路径
大多数 Celo API 问题属于少数几类。按顺序处理它们。
| 症状 | 可能原因 | 该怎么办 |
|---|---|---|
eth_chainId 返回错误值 | 端点指向另一个网络 | 重新检查 URL 和链 ID 42220 |
-32601 method not found | 节点不支持该方法 | 确认方法名称和节点类型 |
eth_getLogs 上的 -32000 | 区块范围太大 | 减小范围并分页 |
| 交易卡在待处理状态 | Gas 价格太低或 nonce 间隙 | 重新检查 nonce 和费用设置 |
429 响应 | 在共享端点上被限速 | 迁移到专用计划 |
| 代币余额读取失败 | 合约或小数位数错误 | 验证代币地址和 ABI |
每次调试会话都从确认链 ID 开始。如果正确,检查失败的调用是读取还是写入。读取通常因参数格式错误或查询过大而失败。写入通常因 nonce、Gas 或费用货币问题而失败。
有关适用于各网络的更广泛检查清单,请参阅 RPC 端点指南。
运行自己的节点与使用托管 Celo API
一些团队考虑运行自己的 Celo 节点。这是一个合理的选择,但运营成本很容易被低估。你需要配置硬件、在网络升级期间保持客户端更新、监控磁盘增长,并在节点落后时处理故障转移。
托管 Celo API 消除了这些维护工作。你获得一个端点,提供商处理升级、监控和可用性。权衡是你依赖提供商的基础设施,这就是故障转移规划很重要的原因。
对于生产应用,一个实用的折中方案是使用主托管端点,并保留第二个提供商或自托管节点作为备用。配置你的客户端在主端点反复返回错误时重试备用端点。这比自己运行两个节点更简单,并且覆盖了最常见的故障场景。
生产就绪检查清单
在发布之前,确认以下每一项。
- 链 ID 硬编码为 42220 并在启动时验证。
- RPC URL 来自环境配置,而不是源代码。
- 你有备用端点和带退避的重试策略。
- 日志查询是分页且有界的。
- 你监控错误率和延迟,而不仅仅是正常运行时间。
- 如果用户使用代币支付 Gas,费用货币逻辑已经过测试。
- 你已经根据预期请求量审查了 RPC 定价。
一个检查链 ID 和区块高度的简单监控探针可以在用户之前发现大多数连接问题:
async function healthCheck(url) {
const res = await fetch(url, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
method: "eth_blockNumber",
params: [],
id: 1,
}),
});
const data = await res.json();
return parseInt(data.result, 16);
}
定期运行此检查,并在区块高度停止推进时发出警报。高度停滞比 HTTP 请求失败是更清晰的信号。
关键要点
- Celo 兼容 EVM,因此标准以太坊 JSON-RPC 方法在链 ID 42220 下可用。
- 在调试任何其他内容之前,始终验证
eth_chainId。 - 共享公共端点适合开发;生产工作负载受益于专用容量。
- Celo 的费用货币模型增加了以太坊应用没有的代币 Gas 逻辑。
- 对
eth_getLogs进行分页,并监控区块高度,而不仅仅是 HTTP 状态。 - 在发布前规划备用端点,而不是在事件发生后。
常见问题解答
什么是 Celo API?
它是 Celo 主网的 JSON-RPC 接口。你向端点发送 POST 请求,并使用标准 EVM 方法接收链数据或提交交易。
Celo 链 ID 是什么?
Celo 主网使用链 ID 42220,十六进制为 0xa4ec。
我可以将以太坊工具与 Celo 一起使用吗?
可以。由于 Celo 兼容 EVM,ethers、viem 和 Hardhat 等库可以通过设置链 ID 和 RPC URL 的自定义链定义来使用。
为什么我的 Celo 请求返回 429 错误?
429 表示你被限速,这在负载下的共享公共端点上很常见。迁移到专用计划或减少请求突发通常可以解决。
Celo 支持使用稳定币支付 Gas 吗?
Celo 支持使用批准的费货币支付 Gas。你的应用需要读取费货币合约,并在发送交易前确认账户持有足够的该代币。
我应该运行自己的 Celo 节点吗?
如果你需要完全控制或归档数据,并且能够承担维护工作,请运行自己的节点。否则,对于生产应用,托管 Celo API 加上备用端点通常更简单。
如果你想从公共端点迁移到托管基础设施,请从 Celo 网络页面 开始,比较 RPC 计划,如果你跨多个链运营,请查看 支持的 RPC 网络 的完整列表。