Как устроена платформа
Атомарные транзакции¶
Платформа Waves Enterprise поддерживает выполнение атомарных операций. Атомарные операции состоят из нескольких действий: при невыполнении одного из действий все остальные также не выполняются. Для этого в системе существует транзакция 120 AtomicTransaction, представляющая собой контейнер, в который помещаются две и более подписанные транзакции.
Поддерживается включение 2 и более транзакций следующих типов и версий:
4. Transfer Transaction, версия 3
102. Permission Transaction, версия 2
103. CreateContract Transaction, версия 5
104. CallContract Transaction, версия 6
105. ExecutedContract Transaction, версия 3
106. DisableContract Transaction, версия 3
107. UpdateContract Transaction, версия 4
112. CreatePolicy Transaction, версия 3
113. UpdatePolicy Transaction, версия 3
114. PolicyDataHash Transaction, версия 3
Примечание
При включении транзакции 114 в атомарный контейнер транзакция не должна содержать адрес trustedSender
.
После активации функциональной возможности 1122 также поддерживается включение в атомарную транзакцию транзакций следующих типов:
3. Issue Transaction, версия 3
5. Reissue Transaction, версия 3
6. Burn Transaction, версия 3
8. Lease Transaction, версия 3
9. LeaseCancel Transaction, версия 3
10. CreateAlias Transaction, версия 4
11. MassTransfer Transaction, версия 3
12. Data Transaction, версия 3
14. Sponsorship Transaction, версия 2
111. RegisterNode Transaction, версия 2
Ключевым отличием версий транзакций, которые поддерживаются атомарной транзакцией, является наличие поля-метки atomicBadge
.
Это поле содержит доверенный адрес отправителя транзакции trustedSender
для добавления в контейнер транзакции 120.
Если адрес отправителя не указывается, отправителем становится адрес, с которого в блокчейн отправляется транзакция 120.
Обработка атомарной транзакции¶
Атомарная транзакция имеет две подписи. Первым транзакцию подписывает отправитель для её успешной отправки в сеть. Вторая подпись формируется майнером и необходима для добавления транзакции в блокчейн. При добавлении атомарной транзакции в UTX-пул, проверяется её подпись, а также подписи всех транзакций, входящих в контейнер.
Валидация таких транзакций выполняется по следующим правилам:
Количество транзакций должно быть больше одной.
Все транзакции должны иметь разные идентификаторы.
Список транзакций должен содержать только поддерживаемые типы транзакций.
Вкладывать одну атомарную транзакцию в другую не допускается.
Внутри атомарной транзакции, отправляемой в UTX пул, не должно быть исполненных (executed) транзакций, и поле miner
должно быть пустым.
Это поле заполняется при передаче атомарной транзакции в блок.
Внутри атомарной транзакции, попавшей в блок, не должно быть исполняемых (executable) транзакций.
После исполнения атомарной транзакции в блок попадает ее «копия», сформированная по следующим правилам:
Поле
miner
не участвует в формировании подписи транзакции и заполняется публичным ключом майнера блока.Майнером блока формируется массив
proofs
, источником которого служат идентификаторы транзакций, входящих в атомарную транзакцию. При включении в блок, атомарная транзакция имеет 2 подписи – подпись исходной транзакции и подпись майнера.Если в списке присутствуют executable транзакции, они заменяются на executed транзакции. При валидации атомарной транзакции в составе блока проверяются обе подписи.
Создание атомарной транзакции¶
Для создания атомарной транзакции необходим доступ к REST API ноды.
Пользователь подбирает из списка поддерживаемых транзакций те транзакции, которые должны выполняться как атомарная операция.
Затем корректно заполняет поля всех транзакций и подписывает их.
Далее пользователь заполняет поле
transactions
атомарной транзакции данными подписанных, но не отправленных в блокчейн транзакций.После внесения всех данных о транзакциях пользователь подписывает и отправляет в блокчейн готовую атомарную транзакцию.
Структуры данных для подписания и отправки атомарной транзакции приведены в списке транзакций.
Внимание
Если вы создаёте атомарную транзакцию с включением 114 транзакции, то при её подписании установите значение параметра broadcast = false
.