Пост
Поделитесь своими знаниями.
+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 для отправки транзакций. Один и тот же идентификатор объекта несколько раз появляется в списке блокировок. Ошибка возникает даже при тщательном определении последовательности транзакций.
- Почему объекты «зарезервированы» для других транзакций?
- Как правильно проверить, доступен ли объект, прежде чем использовать его в транзакции?
- Существуют ли передовые методы работы с замками объектов в 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, чтобы убедиться, что они разблокированы.
- Избегайте параллельной или быстрой отправки транзакций по одним и тем же объектам.
- Вместо фиксированных задержек применяйте повторные попытки с проверкой сроков выполнения заказа и выполнения заказа.
Такая блокировка предотвращает появление конфликтующих обновлений и является обычным явлением в объектной модели Sui. JsonRpcError
Правильная последовательность действий и подтверждение окончательности — ключ к тому, чтобы избежать ошибок.
Эта ошибка возникает, если вы пытаетесь выполнить две транзакции одновременно (например, начать одну до завершения предыдущей). Если вы повторите попытку запуска транзакции публикации, не выполняя другую транзакцию ранее или одновременно, она должна завершиться успешно. Кроме того, вам, возможно, придется добыть больше газа из крана (или подождать целый день, пока эпоха не закончится, а объекты разблокируются)
Когда вы проводите транзакцию с объектами, принадлежащими вашему адресу (например, газовые объекты), валидаторы резервируют последнюю версию объекта для использования в подписываемой транзакции. Если вы попытаетесь запустить две транзакции одновременно, и они относятся к одному и тому же объекту, они будут конкурировать друг с другом за подписи валидаторов. В счастливом случае одна из транзакций выигрывает и выполняется, а другая транзакция не получает достаточного количества подписей. В печальном случае обе транзакции могут не набрать достаточного количества подписей (если обе транзакции набрали более трети подписей валидатора, то ни одна из них не сможет набрать более двух третей, что является пороговым значением). Это называется двусмысленностью, и с этого момента объекты, использовавшиеся в обеих транзакциях, нельзя использовать для других транзакций.
В конце эпохи (они длятся примерно один день — вы можете следить за переходом к следующей эпохе на сайте https://suiexplorer.com) все блокировки снимаются, поэтому вы можете снова использовать объекты, но если вы не меняли эпоху с момента последней попытки, вам нужно будет купить больше газа.
Знаете ответ?
Пожалуйста, войдите в систему и поделитесь им.
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Заработай свою долю из 1000 Sui
Зарабатывай очки репутации и получай награды за помощь в развитии сообщества Sui.
- Почему BCS требует точного порядка полей для десериализации, когда структуры Move содержат именованные поля?53
- «Ошибки проверки нескольких источников» в публикациях модуля Sui Move — автоматическое устранение ошибок42
- Сбой транзакции Sui: объекты, зарезервированные для другой транзакции24
- Как ограничения возможностей взаимодействуют с динамическими полями в гетерогенных коллекциях?04