Вики ZooBC
Транзакции

Транзакции

Транзакция — это подписанное указание цепочке: заплатить кому-то, выпустить токен, разместить ордер, привязать адрес к группе. В ZooBC нет виртуальной машины для пользовательского кода. Каждая возможность — встроенный тип транзакции с фиксированными правилами, которые каждый узел применяет в точности одинаково, поэтому кошелёк ещё до подписания знает всё, что может сделать транзакция, и какой будет её минимальная комиссия.

Встроенные типы

Начиная с версии 0.5.8 ZooBC определяет 73 номера типов транзакций, включая тип 0, в двенадцати семействах.

Двенадцать плиток, по одной на семейство типов транзакций, у каждой — число её типов, в сумме 73
Двенадцать плиток, по одной на семейство типов транзакций, у каждой — число её типов, в сумме 73

Номер типа — это группа плюс 256, умноженное на подтип, поэтому нумерация разрежённая: 2 — это NodeRegistration, а 258 (группа 2, подтип 1) — её обновление. Номер, который цепочка не определяет, отклоняется, а каждый определённый тип принимается с блока 1.

Два номера особые. Тип 0, Empty, ничего не перемещает: он существует, чтобы нести сообщение, всё равно должен платить комиссию больше нуля и не увеличивает nonce отправителя — счётчик, который цепочка ведёт для каждого отправителя. Тип 53, CancelLongevity, выведен из употребления: каждая цепочка его отклоняет, а вместо него используется CloseLongevity (309).

Жизнь транзакции

  1. Кошелёк собирает конверт, одинаковый для всех типов, и подписывает его для одной цепочки.
  2. Он отправляет подписанные байты запросом POST /api/v1/transactions. HTTP 202 означает, что узел принял транзакцию в свой пул, а не что она уже в блоке. Повторная отправка тех же байтов безопасна: копия помечается как дубликат.
  3. Узлы передают транзакцию дальше, и производитель блока включает её. Блок содержит не более 2 000 транзакций и 524 288 байт полезных данных и не более одной транзакции от каждого аккаунта (см. Одна транзакция на аккаунт в блоке и пакеты).
  4. GET /api/v1/transactions/<hash>/status сообщает о её продвижении: staging, mempool (с позицией), confirmed (с высотой блока), rejected (с причиной) или not_found.

Транзакция, которую ни один блок не включил в пределах её окна, истекает (см. Срок действия и метки времени).

Когда состояние успевает измениться

Между подписанием и включением в блок другие транзакции могут изменить то, от чего зависит транзакция: эскроу завершено, предложение принял кто-то другой, срок токена истёк. Такая транзакция становится оплаченной пустой операцией: она включается в блок, платит свою комиссию и больше ничего не меняет. Блок остаётся действительным на каждом узле, поэтому никто не может застопорить цепочку, отправляя транзакции, которые вот-вот устареют.

Блок недействителен только из-за ошибок, которые каждый узел видит одинаково, например неверной подписи, комиссии ниже минимальной (см. Комиссии) или платежа, превышающего баланс отправителя.

Статьи этого раздела

См. также

Статьи по этой теме