Как устроена платформа

Атомарные транзакции

Платформа Waves Enterprise поддерживает выполнение атомарных операций. Атомарные операции состоят из нескольких действий, при невыполнении одного из действий все остальные также не выполняются. Для этого в системе существует транзакция 120 AtomicTransaction, представляющая собой контейнер, в который помещаются две и более подписанные транзакции.

Поддерживается включение 2 и более транзакций следующих типов:

После активации функциональной возможности 1122 также поддерживается включение в атомарную транзакцию транзакций следующих типов:

Ключевым отличием версий транзакций, которые поддерживаются атомарной транзакцией, является наличие поля-метки atomicBadge. Это поле содержит доверенный адрес отправителя транзакции trustedSender для добавления в контейнер транзакции 120. Если адрес отправителя не указывается, отправителем становится адрес, с которого в блокчейн отправляется транзакция 120.

Обработка атомарной транзакции

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

Валидация таких транзакций выполняется по следующим правилам:

  • Количество транзакций должно быть больше одной.

  • Все транзакции должны иметь разные идентификаторы.

  • Список транзакций должен содержать только поддерживаемые типы транзакций.

Вкладывать одну атомарную транзакцию в другую не допускается.

Внутри атомарной транзакции, отправляемой в UTX пул, не должно быть исполненных (executed) транзакций, и поле miner должно быть пустым. Это поле заполняется при передаче атомарной транзакции в блок.

Внутри атомарной транзакции, попавшей в блок, не должно быть исполняемых (executable) транзакций.

После исполнения атомарной транзакции в блок попадает ее «копия», сформированная по следующим правилам:

  • Поле miner не участвует в формировании подписи транзакции и заполняется публичным ключом майнера блока.

  • Майнером блока формируется массив proofs, источником которого служат идентификаторы транзакций, входящих в атомарную транзакцию. При включении в блок, атомарная транзакция имеет 2 подписи – подпись исходной транзакции и подпись майнера.

  • Если в списке присутствуют executable транзакции, они заменяются на executed транзакции. При валидации атомарной транзакции в составе блока проверяются обе подписи.

Создание атомарной транзакции

Для создания атомарной транзакции необходим доступ к REST API ноды.

  1. Пользователь подбирает из списка поддерживаемых транзакций те транзакции, которые должны выполняться как атомарная операция.

  2. Затем корректно заполняет поля всех транзакций и подписывает их.

  3. Далее пользователь заполняет поле transactions атомарной транзакции данными подписанных, но не отправленных в блокчейн транзакций.

  4. После внесения всех данных о транзакциях пользователь подписывает и отправляет в блокчейн готовую атомарную транзакцию.

Структуры данных для подписания и отправки атомарной транзакции приведены в списке транзакций.

Внимание

Если вы создаёте атомарную транзакцию с включением 114 транзакции, то при её подписании установите значение параметра broadcast = false.