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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  2. Корректно заполняет поля всех транзакций и подписывает их, используя метод sign.

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

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

Внимание

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