Document verified history deletion and message-specific delivery
This commit is contained in:
1 parent
aa97e053cd
commit
143788cdcd
2 files changed
+108
-25
No files matched your search
@@ -1,7 +1,9 @@
|
||||
member_sync / merkle_sync — аудит контрактов, 26.10.2026
|
||||
|
||||
Текущий статус: продолжение аудита db_sync остановлено на подтверждённом удалении
|
||||
корректной истории при ошибке проверки и испорченном входящем дубликате (раздел10).
|
||||
Текущий статус: дефекты удаления корректной истории и доставки db_sync исправлены
|
||||
после rebase на03b05094 (раздел11). Общий аудит db_sync остаётся частичным.
|
||||
Новый check.sh:203/203, proxy9/9,burst1/1,load8/8,exit0,195с; STUN PASS отдельно и в общем наборе.
|
||||
ASAN/UBSan/LSan текущего исправления:8/8 PASS с detect_leaks=1.
|
||||
Дефекты очистки MEMBERS и запуска feedback исправлены и проверены.
|
||||
Исключение скрывает результаты, сохраняя историю; отложенные ключи и их межканальное
|
||||
разрешение поддерживаются. Архитектурные пробелы раздела8 устранены реализацией раздела9.
|
||||
@@ -550,3 +552,75 @@ BAD_FORMAT, DEFERRED, ERROR), сохранение корректной суще
|
||||
Предупреждение и уточнение контракта добавлены в db_sync.h/arch.md, задачи — в doc/tasks.md.
|
||||
Новые полный check/sanitizers/GUI/Android/Windows/FreeBSD не запускались; STUN пропущен.
|
||||
Результаты прошлых исправлений member/feedback сохраняются и не объявляются покрытием новых случаев.
|
||||
|
||||
11. Исправление db_sync после rebase — 26.10.2026
|
||||
|
||||
По запросу пользователя выполнен fetch/rebase на origin/master=03b05094.
|
||||
Три локальных коммита аудита перенесены без конфликтов; range-diff:3/3 идентичны.
|
||||
Резервная ветка backup/db-sync-pre-rebase-61f5ab4f сохраняет исходный HEAD.
|
||||
Прежний запрет запуска STUN отменён новым запросом пользователя проверить его после rebase.
|
||||
|
||||
Реализация:
|
||||
- Проверка конкретных байтов возвращает VALID, BAD_SIGNATURE, BAD_FORMAT, DEFERRED или ERROR.
|
||||
Только SC_ERR_AUTH_FAILED завершённой операции означает BAD_SIGNATURE; CRYPTO и SQL lookup error — ERROR.
|
||||
Неизвестный ключ — DEFERRED. SQLITE_NOMEM при чтении BLOB не превращается в BAD_FORMAT.
|
||||
Формат здесь означает непустое тело до4000 байт и подпись ровно64 байта, не проверку JSON-схемы приложения.
|
||||
- Перед удалением дубликата внутри BEGIN IMMEDIATE независимо проверяется сохранённая строка.
|
||||
Корректная строка переживает неверную входящую копию. Доказанная сохранённая порча удаляется;
|
||||
при корректном входе вместо неё атомарно сохраняется исправная копия.
|
||||
Любой отказ чтения, DELETE, INSERT или COMMIT приводит к ROLLBACK без продвижения next_id/позиций.
|
||||
- Выдача пачки проверяет длины и подпись самой сохранённой строки. SELECT завершается до DELETE по rowid.
|
||||
Одна доказанно битая строка удаляется в собственной транзакции, затем пачка старого раунда не отправляется.
|
||||
После COMMIT запускается пересчёт с0 и сбрасываются позиции/состояния пиров; другой канал не затрагивается.
|
||||
- Recalc имеет отдельный pending, не зависящий от наличия таймера. Батч50 атомарен;
|
||||
только успешный COMMIT продвигает позицию. Отказ SQL/хеша/таймера сохраняет работу.
|
||||
Flush возвращает ошибку; обработчики не публикуют заведомо неготовые хеши как успешный результат.
|
||||
Битая длина сохранённой подписи, обнаруженная recalc, удаляется с проверкой SQL и COMMIT.
|
||||
- Парсер не передаёт короткую подпись дальше к чтению64 байт. Ошибка вставки/проверки/формата
|
||||
прерывает SEND_DATA без подтверждения позиций и SYNC_DONE; успешно вставленная часть остаётся для повтора.
|
||||
Старый peer-empty цикл теперь продвигается на фактически отправленное число записей при ограничении буфера.
|
||||
- ACK_PUSH изменён с(timestamp,author) на message_id[32], общий размер33 с типом; совместимость не поддерживается.
|
||||
SQL больше не использует отсутствующую author. Один UPDATE обновляет только нужную запись,
|
||||
повтор ACK от того же пира не увеличивает счётчик; WAS_SENT выставляется только для локального автора.
|
||||
Постановка PUSH в очередь доставкой не считается. Корректный дубликат PUSH тоже получает ACK.
|
||||
Подготовка/bind/step/finalize SQL и неизвестный message_id диагностируются.
|
||||
|
||||
Проверки и доказательства:
|
||||
- Прежний /tmp/db-sync-audit-verify-failure.c теперь exit0, сохранение2/2 PASS;
|
||||
положительные контроли удаления неверной подписи и тела4001 PASS, другой канал и allocations сохранены.
|
||||
Лог /tmp/db-sync-preservation-fixed.log. Исторический EXPLAIN старого неверного SQL
|
||||
в этом стенде ожидаемо остаётся SQLITE_ERROR; новую доставку проверяют штатные тесты ниже.
|
||||
- Новый tests/test_db_sync_integrity.c использует собственную SQLite, настоящие Ed25519 подписи,
|
||||
uasync и точечные --wrap отказы.10 введённых отказов: VerifyInit входа/сохранённой копии/выдачи,
|
||||
BLOB NOMEM во вставке/выдаче/recalc, COMMIT удаления/recalc/вставки, создание recalc-таймера.
|
||||
Дополнительно реальные SQL-триггеры запрещают DELETE, обновление хеша и ACK; проверены откат и повтор.
|
||||
Неизвестный ключ и SQL lookup error сохраняют историю. Проверены две таблицы, reset позиций,
|
||||
замена порчи корректной копией, длины подписи0/1/63/65/255, тело4001 и55 записей (несколько батчей).
|
||||
ACK для двух подписей одного автора при одном timestamp обновляет только конкретную запись и идемпотентен.
|
||||
После teardown tracked allocations восстановлены. Лог /tmp/db-sync-integrity-final.log,exit0.
|
||||
- tests/test_db_sync.c дополнен двумя сообщениями одного автора с одинаковым timestamp:
|
||||
до poll доставки нет, затем реальные PUSH/ACK подтверждают оба сообщения независимо.
|
||||
Все прежние сценарии2/3 узлов, merge, mid/tail PUSH, reply и randomized reconnect также PASS.
|
||||
Лог /tmp/db-sync-network-final.log; схема — /tmp/db-sync-schema-final.log, оба exit0.
|
||||
- Полный ./check.sh в отдельном root network/mount namespace:203/203 PASS,0 failed/0 skipped;
|
||||
proxy9/9,burst1/1 (8388608 байт),load8/8 (134217728 байт),exit0,195с.
|
||||
Лог /tmp/db-sync-full-final-check.log. Финальная целевая сборка без предупреждений.
|
||||
- STUN: отдельный запуск и общий набор PASS. Прежнее падение assert(bind) после rebase не воспроизведено;
|
||||
причина прежнего отказа и первый падающий коммит не установлены, исправление STUN не заявляется.
|
||||
В общем STUN-логе есть штатно пропущенный подслучай bind-to-device (нет разрешения);
|
||||
основные RFC5780/fallback/cache/lifecycle/isolation проверки выполнены.
|
||||
Логи /tmp/stun-after-rebase.log и tests/logs/test_stun_nat.log.
|
||||
- Отдельная копия HEAD9131789c: ASAN+UBSan и detect_leaks=1,halt_on_error=1;
|
||||
core/libuasync/Opus согласованно инструментированы.8/8 PASS: db_sync_integrity,db_sync,
|
||||
db_sync_schema,member_adapter,chat_feedback,chat_poll,chat_poll_network,merkle_protocol.
|
||||
/tmp/db-sync-asan-results.log и /tmp/db-sync-asan-test_*.log; признаков sanitizer errors нет.
|
||||
|
||||
Границы:
|
||||
Полный аудит db_sync не закрыт. В существующем db_handle_sync_done ветка одинакового count
|
||||
с разными chain_hash всё ещё явно принимает состояние как converged; это отдельный дефект
|
||||
финального критерия, не проверявшийся новым runtime-стендом. Wire раундов не имеет generation ID;
|
||||
поведение поздних пакетов прежнего раунда требует отдельного анализа. Также остаются TTL
|
||||
(единицы времени/пересчёт после удаления) и жизненный цикл callback-списка.
|
||||
Эти места не включены в доказанное покрытие текущего исправления. GUI/Android/Windows/FreeBSD не запускались.
|
||||
Следующий этап аудита требует отдельного исправления финального критерия; по AGENTS.md
|
||||
дальнейшее расширение текущей реализации остановлено на этом замечании.
|
||||
Reference in new issue
Block a user