Четыре условия, которые должны совпасть в доказательстве
Поле или событиеЧто требуетсяЧто ломает вывод
SenderОдин и тот же адрес отправителяТот же Lease у другого отправителя
LeaseОдинаковые ненулевые 32 байтаНовый Lease или ошибка декодирования base64
ОкноFirstValid и LastValid кандидатов не оставляют повтору хвост после защитыУ второго платежа более поздний LastValid
Первая транзакцияОна действительно вошла в подтверждённый раундТолько pending или сообщение локального узла
Четыре условия, которые должны совпасть в доказательстве
Поле или событие
Sender
Что требуется
Один и тот же адрес отправителя
Что ломает вывод
Тот же Lease у другого отправителя
Поле или событие
Lease
Что требуется
Одинаковые ненулевые 32 байта
Что ломает вывод
Новый Lease или ошибка декодирования base64
Поле или событие
Окно
Что требуется
FirstValid и LastValid кандидатов не оставляют повтору хвост после защиты
Что ломает вывод
У второго платежа более поздний LastValid
Поле или событие
Первая транзакция
Что требуется
Она действительно вошла в подтверждённый раунд
Что ломает вывод
Только pending или сообщение локального узла

Lease привязан к отправителю, а не к назначению платежа

В протокольном Header поле Lease имеет тип [32]byte и кодируется как lx. Нулевое значение не создаёт защиту. После включения транзакции сеть удерживает пару Sender–Lease до тех пор, пока не пройдёт LastValid этой подтверждённой транзакции. Такой же набор байтов у другого Sender — другая пара, а одинаковые получатель и сумма без Lease вообще не дают этой гарантии.

Не смешивайте Lease с обычным transaction ID. Изменение fee, FirstValid, LastValid или любого другого поля меняет подписанные байты и обычно txID, но одинаковая ненулевая пара Sender–Lease всё ещё связывает кандидатов. Общая инструкция по проверке перевода полезна для сети, суммы и получателя; Lease отвечает только за взаимное исключение.

Окна кандидатов проверяют целиком, а не по одному LastValid

FirstValid задаёт первый допустимый раунд, LastValid — последний. Если первый кандидат подтвердился, его Lease блокирует ту же пару до прохождения собственного LastValid. Но второй кандидат с более поздним LastValid может остаться валидным после снятия защиты. Поэтому официальный пример повышения fee сохраняет Lease, FirstValid и LastValid без изменений, меняя только комиссию.

Как собрать доказательство одного платежа

  1. 1
    Декодируйте обе транзакции

    Сохраните сеть и genesis hash, Sender, Receiver, Amount, Fee, FirstValid, LastValid, Lease и txID. Сравнивайте исходные 32 байта Lease, а не укороченную строку интерфейса.

  2. 2
    Найдите подтверждённого победителя

    Через синхронизированный algod или Indexer установите раунд включения одной транзакции. Карточка pending, успешный broadcast и наличие в локальном пуле не подходят.

  3. 3
    Проверьте область взаимного исключения

    Убедитесь, что Sender и Lease совпадают. Сверьте, что конкурирующий кандидат не имеет допустимого хвоста после LastValid подтверждённой транзакции.

  4. 4
    Дождитесь исхода второго txID

    Зафиксируйте его отказ либо отсутствие в подтверждённых раундах до завершения собственного окна. Ошибка конкретного SDK полезна для диагностики, но доказательством остаётся состояние сети.

  5. 5
    Сверьте конечное состояние

    Проверьте баланс и платёж получателя после подтверждённого раунда. Одного Lease недостаточно, если первая транзакция сама завершилась не тем действием, которое ожидалось.

Atomic group решает другую задачу: либо включается вся группа, либо ни один её элемент. Rekey меняет адрес, который вправе подписывать за Sender. Эти механики нельзя подменять Lease при разборе повторного платежа.

После LastValid защиту нельзя считать постоянной

Что делать после проверки окна
НаблюдениеВыводСледующее действие
Первый tx подтверждён, второй имеет то же окноВторой не может подтвердиться в этом окнеСохранить оба payload и раунд результата
Второй имеет более поздний LastValidПосле снятия Lease у него может остаться времяНе ждать молча: отслеживать его txID до конца собственного окна
Первый так и не подтвердилсяLease не был приобретёнПосле всех LastValid доказать отсутствие и только затем строить новый платёж
Окна закончились и платежа нетСтарая защита завершиласьСобрать новый intent с актуальными раундами и новой подписью
Платёж уже подтверждёнПовтор не нуженНе переиспользовать старый подписанный payload
Что делать после проверки окна
Наблюдение
Первый tx подтверждён, второй имеет то же окно
Вывод
Второй не может подтвердиться в этом окне
Следующее действие
Сохранить оба payload и раунд результата
Наблюдение
Второй имеет более поздний LastValid
Вывод
После снятия Lease у него может остаться время
Следующее действие
Не ждать молча: отслеживать его txID до конца собственного окна
Наблюдение
Первый так и не подтвердился
Вывод
Lease не был приобретён
Следующее действие
После всех LastValid доказать отсутствие и только затем строить новый платёж
Наблюдение
Окна закончились и платежа нет
Вывод
Старая защита завершилась
Следующее действие
Собрать новый intent с актуальными раундами и новой подписью
Наблюдение
Платёж уже подтверждён
Вывод
Повтор не нужен
Следующее действие
Не переиспользовать старый подписанный payload

Когда все известные окна закончились, не отправляйте старый blob повторно. Возьмите свежие suggested parameters, заново проверьте получателя и сумму, выберите осмысленный Lease и подпишите новый payload. Число подтверждений и история раундов помогают отделить локальный отказ от результата сети.

Стоп-сигналы

  • интерфейс не показывает полный Sender, Lease и оба окна;
  • для второго кандидата незаметно изменили FirstValid или LastValid;
  • успех объявляют по broadcast без подтверждённого раунда;
  • одинаковый Lease называют глобальным запретом для всех отправителей;
  • после LastValid обещают постоянную защиту от повтора.

Источники

Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.

  1. Algorand Developer Portal — Leases Algorand Foundation · Проверено 30 августа 2026 г. в 15:40 GMT+5
  2. Algorand Developer Portal — Transaction Reference Algorand Foundation · Проверено 30 августа 2026 г. в 15:40 GMT+5
  3. Algorand Developer Portal — Transaction Types Algorand Foundation · Проверено 30 августа 2026 г. в 15:40 GMT+5
Материал носит информационный характер и не является индивидуальной рекомендацией. Криптоактивы связаны с риском волатильности, технических сбоев, хищения и полной потери средств.