我已经编写了一个基本的rpc客户端,它轮询Solana帐户的状态以查找特定条件(即写入的唯一int64 Id(。当条件出现时,我调用一个智能合约,该合约使用与可变参数相同的帐户。
在执行任何操作之前,程序会检查是否存在相同的条件。但是,此检查失败。我知道我们处理的是分布式系统,这种状态可能会在一段时间内不一致,但我可以反复调用30秒以上,每次都会失败,然后最终成功。
我读过承诺水平的概念,但总是假设传递到智能合约中的账户状态是世界上最新的状态(即已处理(?我观察到的是,它更像是最终状态。
有人能告诉我们这里可能发生了什么吗?
我会尝试用一个最小的代码示例来演示这个问题,但我只是想先问这个问题,看看是否有人能给我指明正确的方向。
感谢
因此,如果您查看您链接的文档,processed
有一个注释:
the block may still be skipped by the cluster
如果你只是在寻找账户状态的变化,而不想要一些可能是错误的,这是一个非常重要的注意事项。有很多原因可以跳过插槽,或者事务可能被集群拒绝。
如果发生以上任何一种情况,那么集群作为一个整体所接受的帐户状态可能不会反映在processed
中,而是反映在finalized
中。
最终,我的具体问题归结为飞行前检查,使用"最终确定"承诺级别,而我轮询帐户的逻辑使用"已确认"。修改sendTransaction
上的preflightCommitment
参数为我解决了问题。