在实际操作中,使用CITA-JAVA-SDK发送交易调用智能合约,会同步返回交易hash。在示例代码中我们知道,要用交易hash查询交易的receipt获取交易结果。
因为链上接收到这笔交易,打包、共识是需要时间的。我们遇到的问题是,在这段时间里,java是查询不到确切交易结果的。原因是java既不知道交易是在pending队列里,还是已经打包,还是在其它状态。所以我们现在的做法是设置定时器轮询上链结果。而轮询多久也是不可预期的的,还是因为查询不出确切上链结果的原因,不知道是没上链成功还是将要上链成功。
请问链上是否可以提供交易共识之前各种状态的查询,或者对于定时器设置的周期时间和策略有一些最佳实践可以分享给我们?
CITA-JAVA-SDK使用疑问,如何确定一个交易上链成功了?
发送交易到区块链时需要设置一个上链有效性的阀置: valid_until_block 。含义是到达这个有效值之后,如果交易还不没有上链,那么这个交易将永远不会上链,这是 CITA 系统对应用的约定。举例说明:
- 假设发送交易 tx1 时的调度为 100, tx1 的 valid_until_block 设为 150;
- 发送交易取得 hash 后可以启动定时器 对交易上线情况进行查询;对同一个交易的查询间隔时间可以指数增加。
- 当前高度已经高于 150, 但仍然没有查看上链记录,则说明 tx1 将不会链。
附加说明:
pending 查询交易时传入的块高表达。块高可以写指定的 id, latest 或 pending。
1赞
对于应用来说,这个信息其实没啥用。
即使看到交易所处的状态,应用也做不了什么。
换句话说,这些都是cita内部的状态,应用无需了解。
可以跟出块时间保持一致。
链的状态是出一个块才刷新一次的,轮询太频繁是浪费的。
这个就是valid_until_block的作用,前面 @leeyr 已经说了。
如果不想等太久,可以把这个值设置的离当前高度近一点。
2赞