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
4
8
Поделиться
Комментарии
.

Ответы

8
Owen.
Owen4622
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..."]
}

Если заблокировано, подождите еще раз и повторите попытку позже.

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

Эй, вы пытаетесь выполнить транзакцию слишком быстро, и объекты заблокированы.

Попробуйте отправлять по одной транзакции с одними и теми же объектами за раз. Если вы отправите две транзакции, некоторые валидаторы могут принять первую транзакцию, другие могут принять вторую, а ваши объекты будут заблокированы, так как для каждой транзакции требуется 66,7% валидаторов, а вы, возможно, получаете только 50%.

=> просто дождитесь перезагрузки эпохи, скоро

Узнайте больше: https://forums.sui.io/t/beginner-tutorial-error-when-deploying-simple-sui-package/44842

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

Ошибка означает, что объекты, используемые в транзакции, по-прежнему заблокированы предыдущими транзакциями, которые еще не завершены. Даже несмотря на задержки, объекты остаются зарезервированными до завершения транзакций в блокчейне.

Для исправления:

  1. Всегда проверяйте, что предыдущие транзакции с объектами полностью завершены, прежде чем использовать их снова.
  2. Проверьте состояние объектов с помощью Sui RPC, чтобы убедиться, что они разблокированы.
  3. Избегайте параллельной или быстрой отправки транзакций по одним и тем же объектам.
  4. Вместо фиксированных задержек применяйте повторные попытки с проверкой сроков выполнения заказа и выполнения заказа.

Такая блокировка предотвращает появление конфликтующих обновлений и является обычным явлением в объектной модели Sui. JsonRpcErrorПравильная последовательность действий и подтверждение окончательности — ключ к тому, чтобы избежать ошибок.

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

Эта ошибка возникает, если вы пытаетесь выполнить две транзакции одновременно (например, начать одну до завершения предыдущей). Если вы повторите попытку запуска транзакции публикации, не выполняя другую транзакцию ранее или одновременно, она должна завершиться успешно. Кроме того, вам, возможно, придется добыть больше газа из крана (или подождать целый день, пока эпоха не закончится, а объекты разблокируются)

Когда вы проводите транзакцию с объектами, принадлежащими вашему адресу (например, газовые объекты), валидаторы резервируют последнюю версию объекта для использования в подписываемой транзакции. Если вы попытаетесь запустить две транзакции одновременно, и они относятся к одному и тому же объекту, они будут конкурировать друг с другом за подписи валидаторов. В счастливом случае одна из транзакций выигрывает и выполняется, а другая транзакция не получает достаточного количества подписей. В печальном случае обе транзакции могут не набрать достаточного количества подписей (если обе транзакции набрали более трети подписей валидатора, то ни одна из них не сможет набрать более двух третей, что является пороговым значением). Это называется двусмысленностью, и с этого момента объекты, использовавшиеся в обеих транзакциях, нельзя использовать для других транзакций.

В конце эпохи (они длятся примерно один день — вы можете следить за переходом к следующей эпохе на сайте https://suiexplorer.com) все блокировки снимаются, поэтому вы можете снова использовать объекты, но если вы не меняли эпоху с момента последней попытки, вам нужно будет купить больше газа.

3
Комментарии
.
24p30p.
24p30p2032
Jul 9 2025, 04:14

В сети Sui, когда транзакция пытается получить доступ к объекту, который уже участвует в другой незавершенной транзакции, сеть возвращает ошибку резервирования. Это прямое следствие объектно-ориентированной модели исполнения Sui. Любая транзакция, изменяющая объект или использующая его, должна быть заблокирована исключительно на нем. После отправки такой транзакции объект остается зарезервированным до тех пор, пока транзакция не завершится. Это резервирование предотвращает преждевременное взаимодействие других транзакций с одним и тем же объектом, тем самым обеспечивая анонимность и избегая условий конкуренции. Однако если окончательная обработка задерживается из-за задержки в сети, задержки валидатора или неожиданного поведения при выполнении, объект может оставаться заблокированным дольше, чем ожидалось.

Чтобы определить, находится ли объект в пригодном для использования состоянии, можно использовать sui_getObjectэтот метод через интерфейс Sui JSON-RPC или интерфейс командной строки Sui. Изучение поля владельца объекта или метаданных блокировки транзакций может дать представление о его статусе. Если кажется, что объект используется или он не возвращает права собственности по ожидаемому адресу, скорее всего, он все еще зарезервирован. Еще более надежный подход заключается в программном опросе сети до тех пор, пока блокировка объекта не будет снята. Это особенно удобно при автоматизированных потоках или при организации нескольких последовательных транзакций.

Эффективное управление этими блокировками требует нескольких ключевых методов. Крайне важно избегать повторного использования изменяемых объектов в транзакциях до тех пор, пока предыдущие операции с ними не будут полностью завершены. Во избежание разногласий следует по возможности использовать отдельные или вращающиеся друг от друга газовые монеты и экземпляры объектов. Кроме того, использование логики повторных попыток и интеллектуальных механизмов опроса, таких как экспоненциальное прерывание, позволяет свести к минимуму количество сбоев транзакций. При параллельной организации транзакций изоляция использования объектов в каждом процессе или потоке значительно повышает надежность.

Важно отметить, что такое поведение тесно связано с окончательностью транзакции. Даже если транзакция принята в пул памяти и передана в эфир, блокировки связанных объектов остаются в силе до тех пор, пока кворум валидатора сети не подтвердит окончательное состояние транзакции. Любая предварительная попытка повторного использования этого объекта, независимо от произвольных временных задержек, скорее всего, приведет к ошибке резервирования.

Чтобы упростить обработку блокировок объектов, вот утилита Bash, которую можно использовать в рабочем процессе разработки. Она опрашивает весь узел и ожидает разблокировки объектов, прежде чем приступить к транзакции. Это обеспечивает безопасное повторное использование объекта и предотвращает преждевременный сбой.

Скрипт Bash: wait-for-unlock.sh

#!/bin/bash

# Sui Fullnode RPC endpoint (adjust as needed)
RPC_ENDPOINT="https://fullnode.testnet.sui.io:443"

# Checks if object is locked
is_locked() {
    obj_id=$1
    lock_info=$(curl -s -X POST $RPC_ENDPOINT \
        -H "Content-Type: application/json" \
        -d '{
            "jsonrpc": "2.0",
            "method": "sui_getObject",
            "params": ["'"$obj_id"'"],
            "id": 1
        }')
    
    echo "$lock_info" | grep -q '"owner":{"AddressOwner"' && return 1 || return 0
}

# Waits until each object is no longer locked
wait_for_unlock() {
    for obj_id in "$@"; do
        echo "Checking object $obj_id..."
        while is_locked $obj_id; do
            echo "Object $obj_id is still locked. Retrying in 2s..."
            sleep 2
        done
        echo "Object $obj_id is now unlocked."
    done
}

# Main handler
main() {
    if [ $# -eq 0 ]; then
        echo "Usage: $0 <object_id_1> <object_id_2> ..."
        exit 1
    fi

    wait_for_unlock "$@"
    echo "All objects unlocked. Safe to proceed with transaction."
}

main "$@"

Чтобы использовать скрипт, просто сделайте его исполняемым и укажите идентификаторы объектов, которые вы хотите отслеживать. Он будет проводить опрос до тех пор, пока эти объекты больше не будут зарезервированы отложенными транзакциями. Таким образом, следующая транзакция пройдет гладко.

chmod +x wait-for-unlock.sh
./wait-for-unlock.sh 0xYOUR_OBJECT_ID

Этот тип автоматизации особенно эффективен при интеграции в сценарии развертывания или конвейеры CI/CD, обеспечивая уровень устойчивости в высокопроизводительных или многопользовательских приложениях.

1
Комментарии
.
casey.
Aug 14 2025, 03:01

Вы просто его ошибка из-за того, что вы пытаетесь выполнить несколько транзакций одновременно, возможно, пытаетесь отправить пакетные транзакции.

1.Почему объекты «зарезервированы» для других транзакций?

Ответ: Эта ошибка означает, что ваша транзакция пыталась использовать объект (токен, nfts и т. д.), в данном случае вашу газовую монету (tx.gas), которая уже «заблокирована» другой транзакцией в полете в сети Sui. Объекты Sui можно использовать только один раз в каждой транзакции, и пока блокирующая их транзакция не будет подтверждена или не истечет срок ее действия, вы не сможете сразу использовать их снова (например, когда вы недавно отправили транзакцию, сеть, возможно, все еще обрабатывает ее, поэтому монета временно зарезервирована до полного выполнения транзакции).

2.Как правильно проверить, доступен ли объект, прежде чем использовать его в транзакции?

Ответ: вы ждете завершения или неудачи первой транзакции. Это означает, что tx.gasзарезервированная сетью газовая монета () временно была выпущена после завершения транзакции или неудачи. Вы можете проверить статус транзакции, используя:

bash

sui client tx-status <digest>

3.Существуют ли передовые методы работы с замками объектов в Sui?

Ответ: да, дождитесь завершения или сбоя предыдущей транзакции (в тестовой сети это может занять до 20 секунд), прежде чем выполнять новую транзакцию, и вы всегда можете подтвердить, что транзакция уже завершена, прежде чем выполнять новую транзакцию. Вы также можете попробовать SPLIT YOUR SUI INTO MULTIPLE GAS COINSэто сделать. Даже если одна монета заблокирована, вы можете сразу же использовать другую, используя

js


const tx = new Transaction();
const [newGas] = tx.splitCoins(tx.gas, [tx.pure.u64(1_000_000_000n)]); // 1 SUI
tx.transferObjects([newGas], tx.pure.address(ownAddress));

Запустите его один раз, и на вашем счету будет несколько небольших газовых монет.

4.Может ли это быть связано со сроками завершения транзакции?

Ответ:Да, это связано с окончательностью транзакции. Думаю, дополнительных 3-секундных задержек между транзакциями недостаточно для полного завершения транзакции, вы всегда можете проверить статус транзакции, используя sui client tx-status <digest>

1
Комментарии
.
d-podium.
Aug 15 2025, 00:03

Ошибка, с которой вы столкнулись, связана с механизмом блокировки транзакций Sui, который предотвращает двойные расходы и обеспечивает атомарные операции. Позвольте мне точно объяснить, что происходит и как это исправить.

Общие сведения о блокировке транзакций в Sui Когда транзакция отправляется в сеть Sui, валидаторы блокируют принадлежащие указанным объектам, чтобы предотвратить одновременное внесение изменений. Этот механизм блокировки крайне важен для предотвращения двойных расходов и обеспечения анонимности транзакций.

Почему текущие решения не работают Ваш текущий подход, заключающийся в добавлении 3-секундных задержек между транзакциями, неэффективен по следующим причинам:

  1. Завершение транзакции может занять более 3 секунд.
  2. Несколько транзакций могут конкурировать за одни и те же объекты.
  3. Сеть не гарантирует немедленную доступность объекта после завершения транзакции.

Пошаговое решение

  1. Внедрить надлежащую проверку статуса транзакции;
async function waitForTransaction(txDigest) {
    const MAX_RETRIES = 30;
    const RETRY_DELAY_MS = 1000;
    
    for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
        try {
            const result = await suiClient.transactionBlock({
                digest: txDigest,
                options: { showEffects: true }
            });
            
            if (result.status === 'SUCCESS') {
                return result;
            }
            
            if (attempt === MAX_RETRIES - 1) {
                throw new Error(`Transaction ${txDigest} failed`);
            }
        } catch (error) {
            if (error.message.includes('not found')) {
                await new Promise(resolve => setTimeout(resolve, RETRY_DELAY_MS));
                continue;
            }
            throw error;
        }
    }
}
  1. Проверяйте объективную доступность перед транзакциями;

async function checkObjectAvailability(objectId) {
    try {
        const result = await suiClient.objects({
            ids: [objectId],
            options: { showPreviousVersion: true }
        });
        
        // Object is available if we can fetch it successfully
        return result.details.length > 0;
    } catch (error) {
        return false;
    }
}
  1. Реализуйте повторные транзакции с возвратом;

async function executeTransactionWithRetry(txBuilder, signer) {
    const MAX_RETRIES = 5;
    const INITIAL_BACKOFF_MS = 500;
    
    for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
        try {
            const tx = await txBuilder.sign();
            const result = await suiClient.submitTransaction(tx);
            
            // Wait for transaction completion
            await waitForTransaction(result.digest);
            return result;
        } catch (error) {
            if (attempt === MAX_RETRIES - 1) {
                throw error;
            }
            
            const backoffMs = INITIAL_BACKOFF_MS * Math.pow(2, attempt);
            console.log(`Attempt ${attempt + 1} failed, retrying in ${backoffMs}ms`);
            await new Promise(resolve => setTimeout(resolve, backoffMs));
        }
    }
}

Лучшие практики управления объектами

1.Всегда проверяйте статус транзакции

  • Дождитесь получения сертификатов эффектов, прежде чем считать транзакции завершенными

  • Регулярно проверяйте статус транзакции во время обработки

  • Реализуйте правильную обработку ошибок для заблокированных объектов

2.Проверки доступности объектов

  • Проверьте доступность объекта перед созданием транзакции

  • Рассматривайте случаи, когда объекты блокируются во время подготовки

  • Рассмотрите возможность внедрения механизмов резервирования объектов в смарт-контрактах

3.Последовательность транзакций

  • Используйте сертификаты эффектов в качестве подтверждения завершения

  • Внедрите экспоненциальное отставание при повторных попытках

  • Поддерживайте порядок транзакций за счет надлежащего управления зависимостями

4.Обработка ошибок

  • Различайте временные ошибки блокировки и постоянные сбои

  • Реализуйте правильную логику повторных попыток с отключением

  • Сохраняйте историю транзакций для целей отладки

Дополнительные соображения

1.Эпохальные смены

  • Транзакции могут завершиться неудачей при смене эпох

  • Реализуйте логику повторов специально для ошибок, связанных с эпохами

  • Учитывайте время транзакций в зависимости от границ эпох

2.Перегрузка сети

  • Отслеживайте нагрузку на сеть в часы пик

  • Настройте стратегии отключения в зависимости от состояния сети

  • Рассмотрите возможность введения ограничения скорости для высокочастотных транзакций

Внедряя эти решения и следуя описанным выше передовым практикам, вы сможете эффективно обрабатывать сценарии блокировки объектов и предотвращать возникшую ошибку JSONRPC. Помните, что надлежащая обработка ошибок и механизмы повторных попыток необходимы для надежной обработки транзакций в блокчейне Sui.

0
Комментарии
.
BigDev.
Aug 15 2025, 16:24

Эта ошибка означает, что используемые вами объекты по-прежнему заблокированы предыдущими транзакциями, которые еще не завершились. Даже в случае задержек компания Sui сохраняет их в резерве до тех пор, пока цепочка не подтвердит завершение сделки.

Чтобы исправить эту проблему, убедитесь, что все предыдущие транзакции с использованием этих объектов полностью завершены, прежде чем использовать их повторно. Вы можете проверить их статус через Sui RPC, чтобы узнать, разблокированы ли они. Избегайте отправки нескольких или быстрых транзакций с использованием одних и тех же объектов. Вместо того чтобы полагаться на фиксированные задержки, используйте повторные попытки с возвратом и подтвердите окончательность перед повторной попыткой.

Эта блокировка является частью того, как Sui обеспечивает ��езопасные обновления, поэтому правильная последовательность и проверка окончательности — это способ избежать ошибки JSONRPCError

0
Комментарии
.

Знаете ответ?

Пожалуйста, войдите в систему и поделитесь им.

Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.

721Посты1836Ответы
Sui.X.Peera.

Заработай свою долю из 1000 Sui

Зарабатывай очки репутации и получай награды за помощь в развитии сообщества Sui.

Кампания вознагражденийАвгуст