← На главную

Prolly выпустила Rust-крейт prolly-map с быстрым diff/merge

17.08.2026 01:00 · hackernews

Prolly выпустила Rust-крейт prolly-map. Это content-addressed prolly tree: неизменяемый упорядоченный key-value индекс над байтовыми ключами и значениями. Узлы дерева адресуются по содержимому — CID считается как SHA-256 от детерминированных байтов узла, поэтому одинаковый контент всегда даёт одинаковый CID. Отсюда структурный шеринг, быстрые diff и merge, параллельная bulk-загрузка. На API-границе Tree — небольшой persistent handle: root: Option<Cid> и config с параметрами чанкинга и кодирования. Сами узлы лежат в подключаемом Store. Вся storage-работа реализована один раз в runtime-neutral async-first движке: AsyncProlly<S: AsyncStore> использует его напрямую, а Prolly<S: Store> гоняет ту же операцию через inline-адаптер без создания Tokio-runtime.

Из коробки: лексикографический поиск по байтовым ключам, immutable put/delete/batch (возвращают новый Tree), детерминированный content-defined чанкинг на xxHash64, diff и range diff с обрезкой по равным CID, three-way merge с резолверами конфликтов и CRDT-стратегиями, ленивая range-итерация, курсоры, batch-мутации для sorted/grouped/append-heavy/multi-leaf сценариев, параллельные bulk-билдеры. Хранилище подключается через Store: есть memory, SQLite и опционально RocksDB. Есть снапшот-неймспейсы для веток, тегов и чекпоинтов. Поверх ядра лежат транзакционный VersionedMap и строгий IndexedMap для вторичных индексов. Нативно поддерживаются PostgreSQL, MySQL, Redis, Turso, DynamoDB, Cosmos DB и Spanner; для блокирующих приложений есть синхронные фасады.

Отдельно сделаны доказательства без чтения стора: prove_key, prove_keys, prove_range, prove_prefix, prove_range_page, prove_diff_page. Проверка пересчитывает CID узлов и проверяет ссылки на детей. Канонические байты proof-бандла можно обернуть в HMAC-SHA256 envelope и аутентифицировать одной функцией. Для типизированных значений есть encode_json/decode_json, encode_cbor/decode_cbor, VersionedJsonCodec, VersionedValue, а для логических удалений — Tombstone. Ключевое свойство: маленькие правки переписывают только локальный лист и путь предков, неизменённые поддеревья сохраняют свои CID. В репозитории много готовых примеров: от agent_event_log и background_compaction до офлайн semantic_rag с 1536-мерным ProximityMap, который переживает перезапуск процесса, и prolly-gluesql, превращающего GlueSQL-базу в один транзакционный Prolly tree.

Читать оригинал →