Тестирование
Parano1d использует три слоя тестов: инварианты отдельных крейтов, межмодульные релизные тесты и интеграционные сценарии в отдельных процессах.
Контракты Pruv
Проверки компилятора, CLI и нативных контрактов:
cargo test --release --locked -p noid_pruv -p noid_tx
PRUV_TEST_Z3=/path/to/z3 cargo test --release --locked -p noid_pruv -p noid_tx -- --include-ignored
Вторая команда запускает отдельные тесты Z3: постусловия, контрпримеры и соответствие SMT-модели native interpreter для всех операций, источников предиката, инверсий и назначений. Сравнение исходника и нативного исполнения покрывает границы u64, весь контекст, порядок инструкций, вложенные условия и временные регистры. Проверки CLI включают лимиты, повторяющиеся параметры и сохранность существующих выходных файлов.
live_pruv_contract_scenario.py проверяет реальные RPC, пополнение, все десять
операций, запрещённые вызовы, восстановление на дедлайне, pruning, перезапуск и
проверку чеков новым узлом. live_pruv_cli_scenario.py проходит команды CLI:
preview, привязку просмотра, ожидание подтверждения, автоматический чек,
файл преемника и закрытие.
Первый сценарий использует копию остановленного успешного изолированного стенда с каталогами
branch-a и branch-b; второй — остановленный результат первого. Для каждого
нужен новый каталог вывода и loopback-only namespace. Изолированный бинарник
isolated_v2_node собирается с isolated-v2-fork-testnet и соответствующим
локальным банком доказательств; CLI и miner берутся из той же версии исходников.
Переменные окружения перечислены в начале скриптов. Запуск сохраняет
report.json, логи, хеши, определения и чеки.
NOID_PRUV_LIVE_DIR=/absolute/path/to/fresh-output \
NOID_PRUV_SOURCE_FIXTURE=/absolute/path/to/passed-v2-fixture \
NOID_PRUV_NODE=/absolute/path/to/isolated_v2_node \
NOID_PRUV_CLI=/absolute/path/to/parano1d-cli \
NOID_PRUV_MINER=/absolute/path/to/parano1d-miner \
NOID_PRUV_BIN=/absolute/path/to/pruv \
NOID_PRUV_Z3=/absolute/path/to/z3 \
unshare --user --map-root-user --net python3 scripts/live_pruv_contract_scenario.py
Быстрые проверки
Перед локальным изменением:
cargo fmt --all -- --check
cargo check --release --locked --workspace --all-targets
cargo test --release --locked -p CHANGED_CRATE
Для протокольного кода добавляйте непосредственно зависящие крейты. Изменение транзакции обычно требует как минимум:
cargo test --release --locked \
-p noid_tx \
-p noid_chain \
-p noid_mempool \
-p noid_miner \
-p noid_rpc \
-p noid_node
Вычислительные ядра системы доказательств
Тесты штатных вычислительных ядер запускаются в релизном режиме:
cargo test --locked --release \
-p noid_core \
-p noid_poseidon2b \
-p noid-ivc-core
На x86-64 принудительно проверьте минимальную штатную реализацию:
NOID_CPU_BACKEND=pclmul \
cargo test --locked --release \
-p noid_core -p noid_poseidon2b -p noid-ivc-core
Скалярная реализация используется только для дифференциальной проверки:
NOID_CPU_BACKEND=scalar \
cargo test --locked --release \
-p noid_core -p noid_poseidon2b
Обязательные проверки релиза
scripts/build_release.sh аутентифицирует и встраивает релизные пакеты матриц,
затем проверяет запуск нативных программ. Проверки исходников и тесты запускаются
отдельно до упаковки. Проверки пакета включают:
- предварительную проверку оборудования;
- справку ноды и границу запуска;
- CLI;
- внешний майнер;
- self-check упакованного GUI.
Отладочный бинарный файл или нода, запущенная вне релизного пакета, не проверяет производственный путь построения блоков.
Интеграционные сценарии с реальными процессами
Сценарии создают чистые каталоги под target/live-tests. Они запускают
настоящие процессы, RPC, P2P, MDBX и штатный конвейер доказательств.
| Сценарий | Покрытие |
|---|---|
live_cli_wallet_scenarios.py |
CLI трёх нод, ретрансляция, адреса, отправка, история и жизненный цикл чека |
live_single_transaction_scenario.py |
Кошелёк → мемпул → майнер → канонический блок |
live_multi_transaction_mempool_scenario.py |
Три непротиворечивые логические транзакции и ретрансляция |
live_large_mempool_single_miner_scenario.py |
Обработка 128 логических транзакций активным классом тестовой сети |
live_large_mempool_two_miners_scenario.py |
Большой мемпул при конкуренции майнеров |
live_two_miner_fork_reorg_scenario.py |
Конкурирующие ответвления и неглубокая реорганизация |
live_connected_miner_restart_sync_scenario.py |
Перезапуск майнеров и защита от устаревшего родителя |
live_mining_peer_gate_scenario.py |
Обычный кворум пиров |
live_sync_scenarios.py |
Чистая синхронизация и границы 5/19 блоков |
live_incremental_snapshot_scenario.py |
Полная и инкрементальная публикация снимка |
live_sync_announced_tip_scenario.py |
Догоняющая синхронизация до объявленной вершины цепи |
live_state_restart_scenario.py |
Перезапуск компактного State и первый новый блок |
live_state_slot_lifecycle_scenario.py |
Очистка, повторное использование, плотность и перезапуск слотов |
live_receipt_lifecycle_scenario.py |
Сохранение, подмена, перезапуск и проверка чека после удаления тела |
live_wallet_active_address_scenario.py |
Создание, пополнение, активация и сохранение владельцев |
live_wallet_mining_payout_switch_scenario.py |
Атомарная смена владельца выплаты |
live_wallet_receive_online_scenario.py |
Инкрементальное обновление получателя онлайн |
live_wallet_receive_offline_shallow_scenario.py |
Восстановление получателя по сохранённым блокам |
live_wallet_receive_offline_snapshot_scenario.py |
Восстановление получателя через синхронизацию по снимку |
live_slot_mempool_wallet_scenarios.py |
Salted-подсказки, отправки между нодами и сходимость |
live_p2p_identity_handshake_scenario.py |
Постоянный peer ID и симметричное установление соединения |
live_p2p_fan_in_scenario.py |
Нагрузка при параллельном установлении входящих соединений |
live_p2p_inbound_sybil_scenario.py |
Лимит входящих соединений на IP |
live_p2p_outbound_diversity_scenario.py |
Разнообразие сетевых групп исходящих пиров |
live_p2p_mesh_block_scenario.py |
Ретрансляция блока за пределы предпочтительного графа GossipSub |
В начале каждого скрипта описаны переменные окружения и ожидаемые бинарники. Запускайте из корня репозитория:
python3 scripts/live_two_miner_fork_reorg_scenario.py
Изменения на границах
Изменения рядом с финальностью, эпохами и расширением State требуют
отдельных граничных векторов, а не только длинного успешного сценария. Покрывайте:
- высоты 143, 144 и 145 для анкеров транзакций;
- глубину ответвления 17 и 18 блоков;
- разрыв синхронизации 18 и 19 блоков;
- финализированные окна расширения с заполнением 9/9 и 10/8;
- перезапуск с полным сохранённым окном расширения из 36 заголовков;
- границы выплат и последнюю высоту периода распределения;
- расширение
Stateс одного уровняlog_slotsна следующий; - восстановление terminal с общими путями, повреждённые кодировки и пределы декодирования;
- границы заполнения мемпула 50% и 80% по числу и байтам, сброс после опустошения и повторы Auto;
- частичную дозагрузку мемпула, повторные доставки и отключение источников;
- выбор Small/Large и резервы слотов системных выплат, включая запасной выбор при полном резервировании.
Тесты должны использовать изолированные каталоги. Для параллельного запуска они могут использовать разные порты, но не должны менять тестовые или рабочие данные.
Сценарии живых тестов
Сценарии live_v2_* используют изолированные сети только с loopback и бинарные
файлы с ранними тестовыми высотами. До запуска прочитайте требования сценария
к банку матриц, окружению и остановленным исходным сетям. В исходниках mainnet
задана H210537; пакет для ранней высоты нельзя использовать в mainnet-сборке.
| Сценарий | Покрытие |
|---|---|
live_v2_contract_scenario.py |
Программы, обе стороны, удаление старых тел и перезапуск |
live_v2_capacity_scenario.py |
Полные платежи и вызовы Small/Large; Small после Large |
live_v2_boundary_reorg_scenario.py |
Граница форка, конкурирующие ветви и восстановление |
live_v2_parent_target_scenario.py |
Одинаковая сложность у конкурирующих блоков v2 и сходимость трёх узлов |
live_v2_retired_sync_scenario.py |
Холодная синхронизация без встроенных старых матриц |
live_v2_retired_mining_scenario.py |
Продолжение майнинга без старых матриц |
live_v2_contract_discovery_scenario.py |
Связанные состояния и обнаружение сохранённых чеков |
live_v2_shared_receipts_scenario.py |
Общее хранение терминалов и целостность чеков |
live_v2_contract_wallet_scenario.py |
Два кошелька, обе стороны, офлайн и объединение после удаления тел |
Граничные векторы также проверяют H−1/H/H+1, оба старых класса перед форком, смешанные интервалы ASERT, годовые ступени эмиссии, сроки контрактов, контролируемую арифметику u64 и конфликтующие расходы. Полные нагрузки соблюдают общие лимиты страниц, входов и вызовов. Банк mainnet проверяется отдельно от банка ранней высоты; замеры указывают артефакты.