# Транзакция
Транзакция — действие на блокчейне от имени аккаунта.
В Waves предусмотрено множество типов транзакций. Например:
- транзакция данных записывает информацию в хранилище данных аккаунта;
- транзакция перевода отправляет заданное количество токена с одного аккаунта на другой.
Набор полей транзакции зависит от ее типа. Типы транзакций перечислены в разделе Тип транзакции.
# Отправитель и подпись
Каждая транзакция содержит открытый ключ аккаунта-отправителя, от имени которого выполняется действие на блокчейне. Транзакция, отправленная с обычного аккаунта (на котором не установлен скрипт), должна содержать цифровую подпись отправителя. Смарт-аккаунты и dApp могут устанавливать собственные правила верификации исходящих транзакций. Подробнее см. в разделе Подпись и подтверждения транзакции.
# Комиссия за транзакцию
Транзакции в Waves очень дешевые, но не бесплатные: с отправителя взимается комиссия. В транзакции можно указать любую сумму комиссии, но не менеe минимальной. Минимальные комиссии представлены в разделе Комиссия за транзакцию.
# JSON-представление транзакции
REST API ноды Waves использует JSON-представление транзакции: через API можно отправлять транзакции на ноду и получать информацию о транзакциях на блокчейне в формате JSON.
Пример JSON-представления:
{
"senderPublicKey": "BVv1ZuE3gKFa6krwWJQwEmrLYUESuUabNCXgYTmCoBt6",
"sender": "3N8S4UtauvDAzpLiaRyDdHn9muexWHhBP4D",
"feeAssetId": null,
"proofs": [
"22QJfRKX7kUQt4qjdnUqZAnhqukqhnofE27uvP8Q5xnBf8M6PCNtWVGq2ngm6m7Voe7duys59D1yU9jhKrmdXDCe"
],
"fee": 100000,
"alias": "91f452553298770f",
"id": "AD7KmXwoVNc2fXsmaxsHsrnT1tfPF3HsWYtfjFijVsvM",
"type": 10,
"version": 2,
"timestamp": 1548443069053,
"height": 466104
}
Поле | Описание |
---|---|
senderPublicKey | Открытый ключ отправителя: байты в кодировке base58 |
sender | Адрес отправителя: байты в кодировке base58 |
feeAssetId | ID токена, в котором указана комиссия: байты в кодировке base58.null означает, что комиссия указана в WAVES.Для транзакций вызова скрипта и транзакций перевода комиссия может быть указана в спонсорском ассете, см. раздел Спонсирование комиссии |
proofs | Массив подтверждений транзакции. До 8 подтверждений, каждое подтверждение до 64 байт, байты в кодировке base58 |
fee | Комиссия за транзакцию. Всегда целое число, выраженное в атомарных единицах ассета. Например, если комиссия составляет 0,001 WAVES, в JSON-представлении указывается 100000, поскольку 1 WAVES = 108 WAVELET |
id | Идентификатор транзакции: байты в кодировке base58. Как вычисляется идентификатор транзакции, см. в разделе Cryptographic practical details |
type | Тип транзакции. Номера типов см. в разделе Тип транзакции |
version | Версия транзакции. Список версий для каждого типа транзакции см. в описании бинарных форматов транзакции |
applicationStatus | Статус выполнения: - succeeded — транзакция успешна.- script_execution_failed — результат выполнения dApp-скрипта или скрипта ассета был неудачным.- elided — транзакция стала невалидной в результате оспаривания блока. Подробнее в разделе Waves 1.5: легкая нода.Поле добавлено с момента активации фичи № 15 “Ride V4, VRF, Protobuf, Failed transactions”. Подробнее о валидации транзакций Значение elided добавлено с момента активации фичи № 22 “Light Node” |
timestamp | Временная метка транзакции, указанная отправителем: Unix-время в миллисекундах. Транзакция не будет добавлена в блокчейн, если значение временной метки транзакции отличается от временной метки текущего блока более чем на 2 часа назад или 1,5 часа вперед |
height | Порядковый номер блока, в который была добавлена транзакция |
Поля sender
, id
, applicationStatus
, height
не нужно заполнять при отправке транзакции, и они не хранятся на блокчейне: их вычисляет нода при предоставлении данных о транзакции через REST API.
В ранних версиях некоторых типов транзакций вместо массива
proofs
используется полеsignature
, содержащее подпись транзакции.
Поля, зависящие от типа транзакции, представлены в описании типов транзакций.
# Бинарный формат транзакции
Транзакции хранятся на блокчейне в бинарном формате (байтовом представлении). Расширения ноды, в частности gRPC-сервер, могут работать непосредственно с данными в бинарном формате.
Подпись транзакции и ее идентификатор также формируются на основе бинарного формата. Правила генерации подписи и идентификатора транзакции представлены в разделе Cryptographic practical details.
Описание бинарного формата транзакции приведено в разделе Бинарный формат транзакции.
# Примеры транзакций
Коллекция транзакций по типам представлена в разделе Примеры транзакций.
Получить транзакцию по ее идентификатору, или список транзакций по адресу аккаунта, или список всех транзакций в блоке можно:
С помощью методов Node REST API:
GET /transactions/info/{id}
— возвращает данные транзакции по ID.GET /transactions/address/{address}/limit/{limit}
— возвращает по адресу аккаунта список относящихся к нему транзакций.GET /blocks/at/{height}
— возвращает данные блока на заданной высоте, в том числе все транзакции блока.
# Как подписать и отправить транзакцию
С помощью одной из клиентских библиотек. См. примеры в разделе Создание и отправка транзакций.
💡 Подписывать и отправлять транзакции от имени пользователей, не запрашивая у них секретную фразу (seed) или закрытый ключ, можно с помощью одного из следующих фреймворков:
- библиотека Signer;
- Keeper Wallet API (требует, чтобы в браузере пользователя было установлено расширение Keeper Wallet).
В Waves IDE с помощью интерактивной консоли JavaScript.
В приложении WX Network, разработанном сторонней командой из сообщества, доступно создание некоторых типов транзакций, таких как перевод токена, выпуск/довыпуск/сжигание токена, настройка спонсирования, установка скрипта ассета, создание псевдонима.
С помощью REST API ноды:
- метод
POST /transactions/broadcast
позволяет отправить на ноду уже подписанную транзакцию; - метод
POST /transactions/sign
позволяет сгенерировать подпись транзакции (однако этот метод доступен только владельцу ноды).
- метод
# Что происходит с транзакцией после отправки
Получив транзакцию, нода проверяет ее валидность: достоверность подписи, достаточность баланса отправителя и др., подробнее см. в разделе Валидация транзакции. Если транзакция валидна, нода добавляет транзакцию в UTX pool — список транзакций, ожидающих попадания в блок, и передает эту транзакцию другим нодам сети блокчейна.
У блока есть ограничения на размер (1 Мбайт), поэтому транзакция может попасть в блок не сразу. В первую очередь ноды добавляют в блок самые «выгодные» транзакции — с наибольшей комиссией за байт.
После добавления в блок транзакция меняет состояние блокчейна: балансы аккаунтов, записи в хранилище данных аккаунта и т. п.
Транзакция из UTX pool может так и не попасть в блок, если во время нахождения в UTX pool она стала невалидной. Например, истекло время жизни транзакции: временная метка оказалась более чем на 2 часа в прошлом относительно текущего времени. Или другая транзакция попала в блок, изменила состояние блокчейна, и теперь баланс отправителя недостаточен для выполнения транзакции или скрипт аккаунта или ассета отклоняет транзакцию.