Sui.

Допис

Діліться своїми знаннями.

Винагорода+15

Xavier.eth.
Jun 27, 2025
Питання та відповіді експертів

Невдала операція 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 для подання транзакцій. Один і той же ідентифікатор об'єкта з'являється кілька разів у списку блокування. Помилка виникає навіть при ретельному послідовності транзакцій.

  1. Що призводить до того, що об'єкти «зарезервовані» для інших транзакцій?
  2. Як правильно перевірити наявність об'єкта, перш ніж використовувати його в транзакції?
  3. Чи існують найкращі методи роботи з блокуванням об'єктів у Sui?
  4. Чи може це бути пов'язано з термінами остаточності транзакції?

Хтось стикався з цією проблемою раніше? Будь-яка інформація про правильне управління об'єктами в транзакціях Sui буде дуже вдячна!

  • Sui
  • Transaction Processing
  • Move
2
4
Поділитися
Коментарі
.

Відповіді

4
Owen.
Owen496
Jun 30 2025, 11:03

Sui використовуєоптимістичний контроль паралельності, тобто об'єкти блокуються, коли вони використовуються в транзакції, поки ця транзакція не буде завершена або закінчиться.

Навіть якщо ви чекаєте 3 секунди між транзакціями, якщо попередня не була завершена, об'єкт залишається заблокованим. Це означає, що транзакція все ще знаходиться в очікуванні та має ексклюзивний доступ до об'єкта.


Як перевірити, чи є об'єкт доступний

Використовуйте метод Sui RPC:

sui_getObject

Перевірте відповідь на "status": "Locked"або"owner": "locked".

Приклад запиту:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "sui_getObject",
  "params": ["0x...object_id..."]
}

Якщо заблоковано, просто зачекайте більше і повторіть спробу пізніше.

4
Коментарі
.
0xduckmove.
Jun 30 2025, 07:04

Гей, ви намагаєтеся зробити транзакцію занадто швидко, і об'єкти заблоковані.

Спробуйте надіслати одну транзакцію з одними і тими ж об'єктами одночасно, якщо ви надсилаєте дві транзакції, деякі валідатори можуть прийняти першу, деякі можуть прийняти другу, а ваші об'єкти будуть заблоковані, оскільки кожна транзакція потребує 66.7% валідаторів, і ви можете отримати лише 50%.

=> просто дочекайтеся скидання епохи, це скоро

Перевірте більше: https://forums.sui.io/t/beginner-tutorial-error-when-deploying-simple-sui-package/44842

3
Коментарі
.
MiniBob.
Jun 30 2025, 11:50

Помилка означає, що об'єкти, які використовує ваша транзакція, все ще заблоковані попередніми транзакціями, які ще не завершені. Навіть із затримками об'єкти залишаються зарезервованими, поки ці транзакції не завершаться в ланцюжку.

Щоб виправити:

  1. Завжди підтверджуйте, що попередні транзакції, пов'язані з об'єктами, повністю завершені, перш ніж використовувати їх знову.
  2. Перевірте статус об'єкта за допомогою Sui RPC, щоб переконатися, що вони розблоковані.
  3. Уникайте відправки паралельних або швидких транзакцій на одних і тих же об'єктах.
  4. Реалізуйте повторні спроби з перевіркою відмови та остаточності замість фіксованих затримок.

Це блокування запобігає конфліктним оновленням і є нормальним для об'єктної моделі Sui. JsonRpcErrorПравильне послідовність та підтвердження остаточності є ключовими для уникнення.

3
Коментарі
.
harry phan.
Jun 30 2025, 15:00

Ця помилка трапляється, якщо ви намагаєтеся запустити дві транзакції одночасно (наприклад, запустити одну до завершення попередньої). Якщо ви повторно спробуєте запустити транзакцію публікації, не запустивши іншу транзакцію до або одночасно, вона повинна бути успішною. Можливо, вам також доведеться придбати більше газу з крана (або почекати день - поки епоха перекинеться - щоб об'єкти розблокуються)

Коли ви виконуєте транзакцію, яка включає об'єкти, якими володіє ваша адреса (наприклад, об'єкти gas), валідатори резервують останню версію об'єкта для використання транзакцією, яку він підписує. Якщо спробувати запустити дві транзакції одночасно і вони посилаються на один і той же об'єкт, то вони будуть конкурувати між собою за підписи від валідаторів. У щасливому випадку одна з транзакцій виграє і виконується, а інша транзакція не отримує достатньої кількості підписів. У нещасному випадку обидві транзакції можуть не отримати достатню кількість підписів (якщо обидві отримали більше третини підписів валідатора, то жодна з них не може отримати більше двох третин, що є пороговим значенням), це називається еквівкацією, і з цього моменту об'єкти, які були введені в обидві транзакції, не можуть бути використані для будь-яких інших транзакцій.

Наприкінці епохи (вони тривають приблизно день - ви можете перевірити прогрес до наступної зміни епохи на https://suiexplorer.com), усі блокування звільняються, тому ви можете використовувати об'єкти знову, але якщо у вас не було зміни епохи з моменту останнього спробування, вам потрібно буде придбати більше газу.

3
Коментарі
.

Ви знаєте відповідь?

Будь ласка, увійдіть та поділіться нею.