API提供对节点或服务的访问,各有局限和依赖。在Ethereum上查询或模拟状态不同于发布交易。这里的方法示例描述Ethereum,并非所有区块链。
读取与提交的效果不同
Ethereum的eth_call执行调用但不创建链上交易;RPC服务商仍可能收取服务费。eth_sendRawTransaction提交已签名交易。返回交易标识不证明交易已被纳入区块或执行成功。应检查回执、状态、对应区块及适合该网络的最终性。
管理依赖和失败情形
签名前核对网络、合约地址、接口与参数。状态变化时,模拟不能保证后续执行结果。已执行但失败的交易仍可能消耗gas。智能合约是程序,其名称不保证没有漏洞或协议具有法律效力。
需要确定的控制措施
- 明确签名权限、支出上限与密钥管理。
- 区分RPC故障与待处理、失败或经历重组的交易。
- 若预言机提供外部事实,应评估其来源、治理与可能的错误。
来源
- Ethereum · JSON-RPC API
- Ethereum · Transactions
- Ethereum · Gas and fees
- Ethereum · Smart contracts
- Ethereum · Oracles
编辑核验日期:2026年10月31日。
区分已提交、已包含和已解释的交易。
交易标识符无法确定预期效果。检查网络、收据、包含情况、状态和相关业务事件。为使用的链定义确认和恢复策略;在结果不确定时,界面不应宣布成功。
- 验证查询的网络和标识符。
- 区分待处理、执行失败和已确认的效果。
- 测试重复通知,无需重放业务操作。
返回的哈希值是否意味着操作已完成?
否。它仅用于识别已提交的交易。跟踪和解读结果需要根据交易链和合同进行相应的检查;切勿盲目地重新提交含义模糊的操作。
一手资料:Ethereum — JSON-RPC and transaction receipts. 相关方法:阅读实用指南.
API配额与速率限制
限制影响容量、重试及客户间分配。
- 记录配额针对账户、密钥还是资源,以及客户端允许的并发操作数。即使平均频率不高,无限队列也可能压垮服务。
- 收到429时,若有Retry-After则解析并等待再请求。把逐步增加的等待和客户端间的时间分散,与最大尝试次数和总期限结合。
- 写入响应丢失时,先检查状态再重试。在模拟测试中组合限流、迟到响应和取消,确认队列结束且效果不重复。
可复现的验收案例
虚构示例:数据不代表客户或实际观察结果。
查看案例输入
{
"http_status": 429,
"retry_after_seconds": 30,
"workers": 20,
"retry_budget": 3,
"retry_budget_scope": "per_worker_retries_excluding_initial_request",
"scheduling_example": {
"response_received_at_seconds": 0,
"illustrative_retry_seconds": [
30,
31,
32,
33,
34
],
"workers_per_second": 4,
"alternative_deadline_seconds": 25,
"total_attempts_if_all_retries_used": 80
}
}预期判断
遵守30秒等待,错开20个工作进程的重试,并限制次数。
二十个客户端:错开并计算重试
虚构示例:20个工作进程在 +0 s 各收到429响应和 Retry-After: 30。时间表仅展示一种分布,不保证服务器容量。每个进程除初次请求外可重试3次。
| 策略 | 计算或时间安排 | 效果与限制 |
|---|---|---|
| 同时重试 | 20 × 1 = 20 @ +30 s | 等待30秒遵守了延迟要求,但20个请求会一起返回,流量尖峰可能再次出现。 |
| 错开重试 | 4 × 5 = 20 @ +30…+34 s | 每秒4个请求,持续5秒,将20次重试分散,但不减少总数。这个示例时间表不能替代带随机抖动的退避策略。 |
| 25秒后截止 | 25 s < 30 s → 0 | 剩余时间少于要求的30秒时,应按契约停止或延期,不要为了截止时间缩短等待。 |
| 最大预算 | 20 × (1 + 3) = 80 | 用完所有尝试时,初次20个请求加60次重试,共80个请求。上限不保证成功或重复操作安全。 |
验证步骤
- 记录配额范围及重试预算。
- 仅在授权测试中耗尽配额。
- 保留429、Retry-After及受限时间线。 区分技术限流与业务结果,配额耗尽不应被转换为库存为零的响应。
- 在无外部负载模拟中,统计四层各三次总调用的尝试。
- 使虚构排队任务过期,确认不启动新操作。
- 模拟故障后逐步恢复授权工作,保留调用、期限与唯一业务结果。
429能证明之前的写入没有执行吗?
不能。响应丢失的操作需要独立核对;其他尝试的响应不能证明其状态。
一手资料:IETF — RFC 6585, HTTP 429. 相关方法:阅读实用指南.
API:防止多层重试相乘
应用、SDK、代理和服务都可能重试同一次调用。虚构的四层各执行三次总尝试,最多会向故障依赖发出81次调用。在既有配额管理上加入共享预算和有效截止时间。
- 列出应用、SDK、代理及依赖的自动尝试。选择负责层,按契约关闭或协调额外重试。将首次尝试计入总预算。保留业务操作ID,重试非幂等操作前检查不确定效果。
- 根据客户端真实限制,定义覆盖等待、连接和处理的整体期限。入队前拒绝过期任务。本地取消不能证明服务器停止,应核对状态。测试逐步恢复流量,避免同时重启所有队列。
每层三次就是总计三次吗?
不是。虚构四层各三次总尝试会产生最多3⁴ = 81次最终调用。
任务过期能取消远端效果吗?
不一定。应阻止新的无用工作;已开始远端操作需检查状态并在可行时补偿。
一手资料:AWS — Timeouts, retries, and backoff with jitter. 相关方法:阅读实用指南.
