You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免循环查询交易收据?替代方案及相关疑问

关于Hedera交易收据等待的优化方案、超时设置与调用频率说明

1. 无需手动循环的最优方案

Hedera官方SDK已经内置了自动等待交易收据的机制,完全不需要自己写轮询循环。以主流SDK为例:

  • Java SDK:提交交易后,直接调用TransactionResponse.getReceipt(client),该方法会自动轮询节点直到获取收据或超时:
    TransactionResponse txResponse = transaction.execute(client);
    TransactionReceipt receipt = txResponse.getReceipt(client);
    
  • JavaScript/TypeScript SDK:提交交易后调用transactionResponse.getReceipt(client),内部已处理轮询逻辑:
    const txResponse = await transaction.execute(client);
    const receipt = await txResponse.getReceipt(client);
    

这些内置方法会匹配Hedera网络的区块生成间隔(通常2-3秒)自动调整轮询频率,比手动循环更高效且符合网络规范。

2. 必须设置超时

绝对需要设置超时,避免因交易永久无法上链(如gas不足、节点故障、交易过期)导致程序无限等待:

  • SDK内置方法支持直接指定超时:
    • Java:可以通过client.setDefaultQueryTimeout(Duration.ofMinutes(2))全局设置,或在调用时传入超时参数:
      TransactionReceipt receipt = txResponse.getReceipt(client, Duration.ofMinutes(1));
      
    • JavaScript:调用getReceipt时传入timeout参数(单位毫秒):
      const receipt = await txResponse.getReceipt(client, { timeout: 60000 }); // 1分钟超时
      

建议根据交易有效期(默认120秒)设置超时,比如比有效期短10-20秒,避免不必要的等待。

3. 调用频率限制

Hedera对API调用有速率限制,具体取决于账户服务等级:

  • 免费开发者账户:查询类请求(包括TransactionReceiptQuery)的默认速率限制约为10次/秒,超过会触发TOO_MANY_REQUESTS错误。
  • 付费账户:根据服务等级协议可获得更高的TPS额度。

如果坚持手动实现轮询,建议:

  • 初始间隔设置为2-3秒(匹配区块生成间隔),不要低于1秒,避免给节点造成压力。
  • 采用指数退避策略(比如第一次等2秒,第二次4秒,上限10秒),降低限流风险。

内容的提问来源于stack exchange,提问作者Mulders Michiel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:23:23