Кто разрешает действие, а кто оплачивает газ

`TransactionData` — полный подписываемый объект: действие, отправитель, данные оплаты `GasData` и срок действия. В схеме с газовыми объектами поле `payment` содержит ссылки на конкретные объекты, `owner` — адрес спонсора, а `price` и `budget` — цену газа и предел расходов. Отправитель указан отдельно. Если адреса различаются, сеть требует авторизацию обоих. Ретранслятор (`relayer`) — сервис, который собирает подписи и отправляет готовую транзакцию; права менять её поля он не получает.

Карта ролей до первой подписи
ЭлементКто задаётЧто зафиксировано в TransactionData
Действие и `sender`Пользователь или его приложениеДействие и адрес отправителя
`GasData.owner`СпонсорАдрес плательщика газа
`GasData.payment`СпонсорИдентификатор, версия и дайджест каждого газового объекта
`budget`, `price`, `expiration`Стороны до подписанияПредел расходов, цена газа и срок действия
Карта ролей до первой подписи
Элемент
Действие и `sender`
Кто задаёт
Пользователь или его приложение
Что зафиксировано в TransactionData
Действие и адрес отправителя
Элемент
`GasData.owner`
Кто задаёт
Спонсор
Что зафиксировано в TransactionData
Адрес плательщика газа
Элемент
`GasData.payment`
Кто задаёт
Спонсор
Что зафиксировано в TransactionData
Идентификатор, версия и дайджест каждого газового объекта
Элемент
`budget`, `price`, `expiration`
Кто задаёт
Стороны до подписания
Что зафиксировано в TransactionData
Предел расходов, цена газа и срок действия

Обе подписи связывают согласие участников с этими точными полями. Они не доказывают право собственности на `GasData.payment`: принадлежность владельцу газа и актуальность каждой ссылки сеть проверяет отдельно при исполнении.

Передача спонсору байтов действия (`transaction kind`) — лишь промежуточный этап сборки. Они описывают действие, но ещё не образуют окончательный `TransactionData`, который подпишут обе стороны. Спонсор добавляет отправителя, свои газовые объекты и параметры оплаты. После фиксации байтов подпись относится к точному сообщению, а не к красивому описанию в интерфейсе.

Сначала один массив байтов, потом две подписи

Сборка без разъезжающихся байтов

  1. 1
    Зафиксировать сеть и действие

    Отправитель строит байты действия для одной сети и передаёт спонсору именно их вместе со своим ожидаемым адресом. Секретные ключи и сид-фраза между сторонами не передаются.

  2. 2
    Добавить оплату

    Спонсор получает свежие ссылки на свои газовые монеты, устанавливает `GasData.owner`, `payment`, `price` и `budget`, не меняя согласованный смысл действия.

  3. 3
    Получить один канонический массив байтов

    Финальный `TransactionData` сериализуют один раз. Для сверки между сторонами вычисляют SHA-256 от окончательного массива байтов и сохраняют все 64 шестнадцатеричных символа. Это контрольный хеш сборки, а не сетевой дайджест транзакции Sui.

  4. 4
    Подписать независимо

    Отправитель и спонсор проверяют поля и подписывают полное сообщение намерения (`intent message`). Порядок подписей в представлении может различаться, но подписанные сообщения — нет.

  5. 5
    Собрать и проверить

    Ретранслятор прикладывает обе подписи к тем же байтам, выполняет пробный прогон там, где он доступен, и только затем один раз отправляет транзакцию.

Сравните подписи, байты и версии объектов

Диагностика отсутствующей или неверной подписи
НаблюдениеВероятная причинаЧто сравнить
Нет подписи отправителяСпонсор получил только байты действия или подпись другого сообщенияАдрес отправителя, область намерения и финальные байты
Нет подписи владельца газаРетранслятор ошибочно считает спонсора внешним плательщиком`GasData.owner` и список `required_signers`
Обе подписи есть, проверка падаетСтороны подписали разные сериализацииКонтрольный SHA-256 окончательных байтов у каждой стороны
Подписи верны, ссылка устарелаГазовая монета или расходуемый объект уже изменилсяВерсию объекта, сетевой дайджест и эффекты предыдущей попытки
Пробный прогон и исполнение расходятсяСостояние изменилось либо выбрана другая сетьСеть, контрольную точку, ссылки на объекты и фактические эффекты
Диагностика отсутствующей или неверной подписи
Наблюдение
Нет подписи отправителя
Вероятная причина
Спонсор получил только байты действия или подпись другого сообщения
Что сравнить
Адрес отправителя, область намерения и финальные байты
Наблюдение
Нет подписи владельца газа
Вероятная причина
Ретранслятор ошибочно считает спонсора внешним плательщиком
Что сравнить
`GasData.owner` и список `required_signers`
Наблюдение
Обе подписи есть, проверка падает
Вероятная причина
Стороны подписали разные сериализации
Что сравнить
Контрольный SHA-256 окончательных байтов у каждой стороны
Наблюдение
Подписи верны, ссылка устарела
Вероятная причина
Газовая монета или расходуемый объект уже изменился
Что сравнить
Версию объекта, сетевой дайджест и эффекты предыдущей попытки
Наблюдение
Пробный прогон и исполнение расходятся
Вероятная причина
Состояние изменилось либо выбрана другая сеть
Что сравнить
Сеть, контрольную точку, ссылки на объекты и фактические эффекты

Устаревший газовый объект (`stale gas object`) — отдельная ветка: верные подписи не оживляют уже использованную версию. Сначала по сетевому дайджесту ищут эффекты прежней отправки, затем получают свежие ссылки и полностью пересобирают операцию. Подробная диагностика вынесена в материал про устаревший газовый объект и газовую монету.

Подтвердите контрольную точку, эффекты и новое состояние

Успешная отправка ретранслятора не завершает проверку. По сетевому дайджесту дождитесь записи транзакции в контрольную точку (`checkpoint`) и сохраните её номер, статус и эффекты исполнения (`effects`). Затем сверьте владельца газа, использованный газовый объект, созданные и изменённые объекты и событие целевого действия, после чего повторно прочитайте целевое состояние. Базовая проверка транзакции помогает не путать квитанцию приложения с сетевым результатом.

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

  • спонсор просит сид-фразу или приватный ключ отправителя вместо отдельной подписи;
  • ретранслятор не показывает окончательные `sender`, `GasData.owner`, газовые объекты и `budget`;
  • две стороны не могут воспроизвести одинаковый SHA-256 окончательного `TransactionData`;
  • после первой отправки старые подписи повторяют без поиска эффектов и свежих ссылок на объекты;
  • успех объявляют по списанию комиссии, не проверив целевые изменения объектов.

Для журнала инцидента достаточно сохранить публичные данные: сеть, контрольный SHA-256 окончательных байтов, отправителя, `GasData.owner`, ссылки на газовые объекты, обе публичные подписи, сетевой дайджест, номер контрольной точки и эффекты. Приватные ключи туда не входят. Если нужно объяснить коллеге, почему адрес и подпись — разные уровни, используйте карту ключей, адреса и подписи.

Источники

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

  1. Sui Docs — Sponsored Transactions Mysten Labs · Проверено 25 августа 2026 г. в 10:10 GMT+5
  2. Sui TypeScript SDK — signing and execution Mysten Labs · Проверено 25 августа 2026 г. в 10:10 GMT+5
  3. Sui source — TransactionData and required signers Mysten Labs · Проверено 25 августа 2026 г. в 10:10 GMT+5
  4. Sui source — signature verification Mysten Labs · Проверено 25 августа 2026 г. в 10:10 GMT+5
Материал носит информационный характер и не является индивидуальной рекомендацией. Криптоактивы связаны с риском волатильности, технических сбоев, хищения и полной потери средств.