Атомарные транзакции¶
Платформа Waves Enterprise поддерживает выполнение атомарных операций. Такие операции состоят из нескольких действий, и либо выполняются полностью, либо не выполняются вообще. Для этого в системе существует 120 транзакция, представляющая собой контейнер, в который помещаются две и более подписанные транзакции.
120 транзакция поддерживает следующие типы транзакций:
4 Трансфер ассета, версия 3
102 Добавление / удаление прав, версия 2
103 Создание контракта, версия 3
104 Вызов контракта, версия 4
105 Исполнение контракта, версии 1 и 2
106 Деактивация контракта, версия 3
107 Обновление контракта, версия 3
112 Создание группы приватности, версия 3
113 Обновление группы приватности, версия 3
114 Добавление приватных данных, версия 3
Ключевым отличием новых версий транзакций, которые поддерживаются атомарной транзакцией 120, является наличие поля-метки atomicBadge. Это поле содержит доверенный адрес отправителя транзакции trustedSender для добавления в контейнер транзакции 120. Если адрес отправителя не указывается, тогда отправителем становится адрес, с которого в блокчейн отправляется 120 транзакция.
Обработка атомарной транзакции¶
120 транзакция имеет две подписи. Первым транзакцию подписывает отправитель для её успешной отправки в сеть. Вторая подпись формируется майнером и необходима для добавления транзакции в блокчейн. При добавлении 120 транзакции в пул неподтверждённых транзакций проверяется её подпись, а также подписи всех транзакций, входящих в контейнер. Валидация таких транзакций выполняется по следующим правилам:
Количество транзакций должно быть больше одной.
Все транзакции должны иметь разные идентификаторы.
Список транзакций должен содержать только поддерживаемые типы транзакций. Вкладывать одну атомарную транзакцию в другую не допускается.
Внутри атомарной транзакции, отправляемой в UTX пул, не должно быть исполненных (executed) транзакций, и поле miner
должно быть пустым.
Внутри атомарной транзакции, попавшей в блок, не должно быть исполняемых (executable) транзакций, и поле miner
не должно быть пустым.
После исполнения атомарной транзакции в блок попадает ее «копия», сформированная по следующим правилам:
Поле
miner
не участвует в формировании подписи транзакции и заполняется публичным ключом майнера блока.Майнером блока формируется массив
proofs
, источником которого служат идентификаторы транзакций, входящих в атомарную транзакцию. При включении в блок атомарная транзакция имеет 2 подписи – подпись исходной транзакции и подпись майнера.Если в списке присутствуют executable транзакции, то они заменяются на executed транзакции. При валидации атомарной транзакции в составе блока проверяются обе подписи.
Создание атомарной транзакции¶
Для создания атомарной транзакции необходим доступ к REST API ноды.
Пользователь подбирает из списка поддерживаемых транзакций те транзакции, которые должны выполняться как атомарная операция.
Корректно заполняет поля всех транзакций и подписывает их, используя метод sign.
Далее пользователь заполняет поле
transactions
120 транзакции данными подписанных, но не отправленных в блокчейн транзакций.После внесения всех данных о транзакциях пользователь подписывает и отправляет в блокчейн 120 транзакцию.
Внимание
Если вы создаёте атомарную транзакцию с включением 114 транзакции, то при её подписании установите значение параметра broadcast = false
.