Архитектураdocs/architecture/transactions.md

Архитектура транзакций

Parano1d разделяет физическую страницу транзакции, включаемую в блок, и логический платёж, который авторизует кошелёк.

Физическая запись Tx8x2 содержит не более восьми входов и двух выходов в фиксированной 323-байтной кодировке. PagedSpend объединяет до 128 таких страниц в одну атомарную логическую транзакцию с одним идентификатором и одной капсулой авторизации.

Уровень Лимит Назначение
Страница Tx8x2 8 входов, 2 выхода Фиксированная запись консенсуса и доказательства
PagedSpend 128 страниц Одна атомарная операция кошелька
Логическая транзакция 1 020 входов, 256 выходов Максимум активных записей с учётом маркеров страниц

Фиксированные физические страницы

Каждая страница содержит общий input_owner, якорь эпохи, поле комиссии, восемь записей входов, две записи выходов и битовую карту активности. Неактивные записи обязаны быть каноническими нулями.

Вход идентифицируется как:

text
{slot_index, amount, creation_id}

Выход идентифицируется как:

text
{slot_index, amount, owner}

При материализации выхода аллокатор назначает новый creation_id. Благодаря этому устаревшая ссылка на вход не станет допустимой, если числовой индекс слота позже будет использован повторно.

Одна логическая транзакция

Первая страница содержит комиссию и начальный маркер, последняя — конечный маркер. Все страницы используют одного владельца и один якорь эпохи, а активные записи должны быть плотно упакованы. Число страниц обязано быть минимальным для заявленного количества входов и выходов.

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

  • версию протокола;
  • число страниц;
  • хеш каждой физической страницы в заданном порядке.

Он вычисляется губчатой конструкцией (sponge) Poseidon2b с разделением доменов. Авторизация кошелька привязана к этому логическому ID, а не к отдельной странице.

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

Построение в кошельке

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

При построении есть две границы доказательств:

  1. кошелёк доказывает знание секрета активного владельца;
  2. майнер доказывает текущее наличие входов, пустоту выходов, сохранение значений, правила комиссий и точный State после перехода.

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

Приём в мемпул

Процедура приёма намеренно повторяет дешёвые проверки до и после дорогой проверки доказательства:

  1. декодировать канонические сетевые данные и проверить семантику группы;
  2. под блокировкой мемпула проверить комиссию, эпоху, конфликты и текущий State;
  3. снять блокировку и проверить капсулу авторизации в пределах выделенного бюджета CPU;
  4. снова взять блокировку и повторить дешёвые проверки State и конфликтов;
  5. зарезервировать каждый активный вход и выходной слот, затем ретранслировать логическую транзакцию.

Вторая дешёвая проверка закрывает гонку между проверкой авторизации и новым блоком либо конкурирующей транзакцией. Повторная отправка идемпотентна.

Мемпул хранит не более 1 024 логических транзакций и 384 МиБ их сериализованных данных. Резервирование слотов даёт постоянное время обнаружения конфликтующих входов и выходов.

Выбор для блока

Майнеры сортируют допустимые группы по ставке комиссии, а при равенстве — по идентификатору транзакции. Группы остаются неделимыми. При выборе также учитываются:

  • активный класс доказательства B64 или B255;
  • не более 1 020 активных входов в блоке;
  • не более 510 пользовательских выходов в блоке;
  • не более 256 затронутых сегментов State;
  • доступные позиции физических страниц.

Запланированная выплата фондам развития занимает одну позицию физической страницы, поэтому в таком блоке остаётся 254 пользовательские страницы. В остальных блоках доступны все 255.

Подтверждение и чеки

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

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

Нормативные правила корректности приведены в протоколе транзакций, а поведение интерфейса — в разделе «Отправка NOID».

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