帖子
分享您的知识。
+15
Sui 事务失败:为另一笔交易保留的对象
我在JsonRpcError
尝试在 Sui 上执行交易时遇到了持久问题. 该错误表明对象是为另一个事务保留的,尽管我已经实现了延迟的顺序事务处理.
JsonRpcError: Failed to sign transaction by a quorum of validators because one or more of its objects is reserved for another transaction. Other transactions locking these objects:
- AV7coSQHWg5vN3S47xada6UiZGW54xxUNhRv1QUPqWK (stake 33.83)
- 0x1c20f15cbe780ee7586a2df90c1ab70861ca77a15970bea8702a8cf97bd3eed9
- 0x1c20f15cbe780ee7586a2df90c1ab70861ca77a15970bea8702a8cf97bd3eed9
- 0x1c20f15cbe780ee7586a2df90c1ab70861ca77a15970bea8702a8cf97bd3eed9
我试过了: -顺序事务执行(等待前一笔交易完成) -增加了交易之间的 3 秒延迟
而且仍然会持续出现同样的错误.
使用 Sui RPC 提交交易. 同一个对象 ID 在锁定列表中多次出现. 即使仔细安排交易顺序,也会出现错误.
- 是什么导致对象被 “保留” 用于其他交易?
- 在交易中使用对象之前,如何正确检查对象是否可用? 3.是否有在 Sui 中处理对象锁的最佳实践?
- 这可能与交易终结时间有关吗?
以前有人遇到过这个问题吗?如果您对Sui交易中的适当对象管理有任何见解,将不胜感激!
- Sui
- Transaction Processing
- Move
答案
4Sui 使用乐观并发控制,这意味着在事务中使用对象时会被锁定,直到该事务完成或到期.
即使你在两次事务之间等待 3 秒钟,如果前一个事务尚未完成,对象仍处于锁定状态. 这意味着交易仍处于待处理状态,并且持有对该对象的独占访问权限.
如何检查对象是否可用
使用 Sui RPC 方法:
sui_getObject
查看"status": "Locked"
或的回复"owner": "locked"
.
请求示例:
{
"jsonrpc": "2.0",
"id": 1,
"method": "sui_getObject",
"params": ["0x...object_id..."]
}
如果已锁定,请稍等片刻,稍后重试.
嘿,你尝试的交易速度太快了,对象被锁定了.
尝试一次发送一个包含相同对象的交易,如果你发送两个交易,一些验证者可能会接受第一笔交易,有些验证者可能会接受第二笔交易,而你的对象将被锁定,因为每笔交易需要66.7%的验证器,而你可能只得到50%.
=> 等着纪元重置,很快就到了
查看更多:https://forums.sui.io/t/beginner-tutorial-error-when-deploying-simple-sui-package/44842
该错误表示您的事务使用的对象仍被先前尚未完成的事务锁定. 即使有延迟,在这些交易在链上完成之前,对象仍会被保留.
要修复:
- 在再次使用对象之前,请务必确认先前涉及对象的交易已完全完成.
- 通过 Sui RPC 检查物体状态,确保它们已解锁. 3.避免在相同的对象上发送并行或快速交易.
- 使用退避和最终性检查来实现重试,而不是固定延迟.
这种锁定可以防止更新冲突,这在 Sui 的对象模型中是正常的. JsonRpcError
正确的排序和最终性确认是避免的关键.
如果您尝试同时运行两个事务(例如,在前一个事务完成之前启动一个),就会发生此错误. 如果您重试运行发布事务,但之前或同时未运行其他事务,则该事务应该会成功. 你可能还需要从水龙头中获取更多的气体(或者等一天——等待时代结束——物体才能解锁)
当您运行涉及您的地址拥有的对象(例如气体对象)的交易时,验证器会保留该对象的最新版本供其签署的交易使用. 如果你尝试同时运行两个交易,并且它们引用同一个对象,那么它们将相互竞争以获取验证者的签名. 幸运的是,其中一笔交易获胜并运行,而另一笔交易未能获得足够的签名. 在不愉快的情况下,两笔交易都可能无法获得足够的签名(如果两笔交易都获得了验证者三分之一以上的签名,则任何一笔交易都无法超过三分之二,这是阈值),这被称为模棱两可,从那时起,作为两笔交易输入的对象不能用于任何其他交易.
在时代结束时(它们大约持续一天——你可以在 https://suiexplorer.com 上查看下一个纪元变更的进度),所有锁都被释放,所以你可以再次使用这些物体,但是如果你自上次尝试以来没有发生过纪元变化,你将需要获得更多的汽油.
你知道答案吗?
请登录并分享。
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.