Архитектура транзакций
Parano1d разделяет физическую страницу транзакции, включаемую в блок, и логический платёж, который авторизует кошелёк.
Физическая запись Tx8x2 содержит не более восьми входов и двух выходов в
фиксированной 323-байтной кодировке. PagedSpend объединяет до 128
таких страниц в одну атомарную логическую транзакцию с одним идентификатором и одной
капсулой авторизации.
| Уровень | Лимит | Назначение |
|---|---|---|
Страница Tx8x2 |
8 входов, 2 выхода | Фиксированная запись консенсуса и доказательства |
PagedSpend |
128 страниц | Одна атомарная операция кошелька |
| Логическая транзакция | 1 020 входов, 256 выходов | Максимум активных записей с учётом маркеров страниц |
Фиксированные физические страницы
Каждая страница содержит общий input_owner, якорь эпохи, поле комиссии,
восемь записей входов, две записи выходов и битовую карту активности. Неактивные записи
обязаны быть каноническими нулями.
Вход идентифицируется как:
{slot_index, amount, creation_id}
Выход идентифицируется как:
{slot_index, amount, owner}
При материализации выхода аллокатор назначает новый creation_id. Благодаря
этому устаревшая ссылка на вход не станет допустимой, если числовой индекс слота
позже будет использован повторно.
Одна логическая транзакция
Первая страница содержит комиссию и начальный маркер, последняя — конечный маркер. Все страницы используют одного владельца и один якорь эпохи, а активные записи должны быть плотно упакованы. Число страниц обязано быть минимальным для заявленного количества входов и выходов.
Идентификатор логической транзакции фиксирует:
- версию протокола;
- число страниц;
- хеш каждой физической страницы в заданном порядке.
Он вычисляется губчатой конструкцией (sponge) Poseidon2b с разделением доменов. Авторизация кошелька привязана к этому логическому ID, а не к отдельной странице.
Вся группа принимается, выбирается, доказывается и включается атомарно. Майнер не может взять только выгодные страницы большого расходования.
Построение в кошельке
Для обычного платежа кошелёк расходует выходы активного владельца. Сначала он выбирает самые крупные значения, чтобы сократить число входов доказательства, создаёт выход получателю, а сдачу возвращает тому же активному владельцу. Слоты выходов берутся из подсказок ноды о свободных позициях.
При построении есть две границы доказательств:
- кошелёк доказывает знание секрета активного владельца;
- майнер доказывает текущее наличие входов, пустоту выходов, сохранение
значений, правила комиссий и точный
Stateпосле перехода.
Доказательство кошелька строится вне блокировки состояния кошелька. Майнинг может продолжаться, но локальная работа над транзакцией получает приоритет, чтобы пользователь не ждал завершения текущего доказательства майнера.
Приём в мемпул
Процедура приёма намеренно повторяет дешёвые проверки до и после дорогой проверки доказательства:
- декодировать канонические сетевые данные и проверить семантику группы;
- под блокировкой мемпула проверить комиссию, эпоху, конфликты и текущий
State; - снять блокировку и проверить капсулу авторизации в пределах выделенного бюджета CPU;
- снова взять блокировку и повторить дешёвые проверки
Stateи конфликтов; - зарезервировать каждый активный вход и выходной слот, затем ретранслировать логическую транзакцию.
Вторая дешёвая проверка закрывает гонку между проверкой авторизации и новым блоком либо конкурирующей транзакцией. Повторная отправка идемпотентна.
Мемпул хранит не более 1 024 логических транзакций и 384 МиБ их сериализованных данных. Резервирование слотов даёт постоянное время обнаружения конфликтующих входов и выходов.
Выбор для блока
Майнеры сортируют допустимые группы по ставке комиссии, а при равенстве — по идентификатору транзакции. Группы остаются неделимыми. При выборе также учитываются:
- активный класс доказательства B64 или B255;
- не более 1 020 активных входов в блоке;
- не более 510 пользовательских выходов в блоке;
- не более 256 затронутых сегментов
State; - доступные позиции физических страниц.
Запланированная выплата фондам развития занимает одну позицию физической страницы, поэтому в таком блоке остаётся 254 пользовательские страницы. В остальных блоках доступны все 255.
Подтверждение и чеки
Отправка означает, что локальная нода приняла и ретранслировала полную логическую транзакцию. Это ещё не означает включение в блок. После включения и подтверждения кошелёк может восстановить чек из сохранённого блока.
Консолидация тому же владельцу намеренно не попадает в чеки. Платежи любому другому владельцу, включая другой неактивный адрес того же кошелька, сохраняются как доказательство исходящего платежа.
Нормативные правила корректности приведены в протоколе транзакций, а поведение интерфейса — в разделе «Отправка NOID».