Кто разрешает действие, а кто оплачивает газ
`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Зафиксировать сеть и действие
Отправитель строит байты действия для одной сети и передаёт спонсору именно их вместе со своим ожидаемым адресом. Секретные ключи и сид-фраза между сторонами не передаются.
- 2Добавить оплату
Спонсор получает свежие ссылки на свои газовые монеты, устанавливает `GasData.owner`, `payment`, `price` и `budget`, не меняя согласованный смысл действия.
- 3Получить один канонический массив байтов
Финальный `TransactionData` сериализуют один раз. Для сверки между сторонами вычисляют SHA-256 от окончательного массива байтов и сохраняют все 64 шестнадцатеричных символа. Это контрольный хеш сборки, а не сетевой дайджест транзакции Sui.
- 4Подписать независимо
Отправитель и спонсор проверяют поля и подписывают полное сообщение намерения (`intent message`). Порядок подписей в представлении может различаться, но подписанные сообщения — нет.
- 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`, ссылки на газовые объекты, обе публичные подписи, сетевой дайджест, номер контрольной точки и эффекты. Приватные ключи туда не входят. Если нужно объяснить коллеге, почему адрес и подпись — разные уровни, используйте карту ключей, адреса и подписи.
Источники
Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.
- Sui Docs — Sponsored Transactions Mysten Labs · Проверено 25 августа 2026 г. в 10:10 GMT+5
- Sui TypeScript SDK — signing and execution Mysten Labs · Проверено 25 августа 2026 г. в 10:10 GMT+5
- Sui source — TransactionData and required signers Mysten Labs · Проверено 25 августа 2026 г. в 10:10 GMT+5
- Sui source — signature verification Mysten Labs · Проверено 25 августа 2026 г. в 10:10 GMT+5
