Протоколdocs/protocol/transactions.md

Протокол транзакций

Пользовательская транзакция — один канонический логический PagedSpend. Он состоит из 1–128 фиксированных страниц Tx8x2 и ровно одной отдельной капсулы авторизации.

Физическая страница

Тело каждой страницы имеет фиксированную кодировку длиной 323 байта:

Поле Значение
epoch_anchor Текущий 144-блочный якорь защиты от повторного воспроизведения
fee Логическая комиссия на первой странице; ноль на продолжениях
input_owner Общий владелец всех активных входов
inputs[8] Возможные записи {slot_index, amount, creation_id}
outputs[2] Возможные записи {slot_index, amount, owner}
validity_bitmap Активные записи и логические маркеры начала и конца
is_coinbase false для каждой пользовательской страницы

Биты 0–7 выбирают входы, биты 8–9 — выходы. Биты 10 и 11 отмечают начало и конец логической группы. Остальные биты битовой карты обязаны быть нулевыми.

Если бит активности записи равен нулю, запись должна быть полностью нулевой и канонической. Это исключает альтернативные кодировки одного утверждения.

Корректность группы

Корректный PagedSpend удовлетворяет всем правилам:

  • число страниц от 1 до 128;
  • маркер начала есть только на нулевой странице;
  • маркер конца есть только на последней странице;
  • у всех страниц одинаковые input_owner и epoch_anchor;
  • ненулевую комиссию несёт только первая страница;
  • активные входы и выходы плотно упакованы в порядке страниц;
  • число страниц минимально для этих записей;
  • имеется хотя бы один активный вход;
  • ни один вход не повторяется;
  • ни один выходной слот не повторяется;
  • выходной слот не является одновременно входным слотом того же расходования;
  • входов не более 1 020, выходов не более 256;
  • сумма входов равна сумме выходов плюс комиссия;
  • отдельная авторизация не превышает 256 КиБ.

Максимальная каноническая кодировка логической транзакции занимает 303 495 байт.

Идентификатор логической транзакции

Локальные хеши тел страниц по отдельности не идентифицируют платёж. Логический ID вычисляется губчатой конструкцией Poseidon2b с разделением доменов над:

text
version || page_count || ordered_page_hashes

Стартовая версия равна 1. Перестановка, добавление или удаление страницы изменяет ID. Для этого точного логического ID капсула авторизации доказывает знание прообраза input_owner.

Проверки State

Для каждого входа текущий слот должен быть занят заявленным владельцем, значением и creation_id. Целевой слот каждого выхода должен быть пуст и находиться в активном домене.

Значения creation_id выходов не являются полями транзакции. Консенсус назначает их из последовательности аллокатора State после перехода. Пользователь не может выбрать или повторно использовать идентификатор.

Переход блока применяет все проверки State атомарно ко всей логической группе.

Комиссии

Минимальная комиссия:

text
5,000
+ 100 × live_inputs
+ 700 × live_outputs
+ growth_price × max(0, live_outputs - live_inputs)

Все суммы указаны в μNOID. growth_price начинается с 2 500 μNOID за каждый чисто новый слот и умножается на 1, 2, 4 или 8 в зависимости от занятости родительского State.

Компонент роста State сжигается. Всё сверх обязательного минимума является добровольной надбавкой, которую может получить майнер. Транзакции, не увеличивающие число занятых слотов, не платят сжигаемую комиссию за рост.

Якорь эпохи

Каждая страница использует текущий якорь эпохи транзакций. Для дочерней высоты C это ID блока на высоте:

text
floor((C - 1) / 144) × 144

при C > 0. Высота 144 всё ещё использует якорь высоты 0; высота 145 начинает использовать высоту 144. Мемпул удаляет логическую транзакцию с устаревшим якорем.

Авторизация и State разделены

Авторизация кошелька доказывает только владение. Она не доказывает текущее членство слота и не содержит путь Merkle для State.

HistoryStep блока доказывает текущее членство, пустоту, баланс, аллокацию, корень и счётчики State после перехода. Оба утверждения связывают одну и ту же публичную логическую транзакцию.

Системные записи

Основная награда и запланированная выплата фондам развития используют тот же фиксированный тип физического тела, но не являются пользовательскими PagedSpend. Их форма, позиция, получатели и суммы полностью выводятся из контекста блока. Авторизация кошелька им не требуется.

Поток кошелька и мемпула описан в архитектуре транзакций.

Техническая документация ParanO(1)dПоведение консенсуса определяется исходным кодом.