doubleentry 0.8.0

An immutable, tamper-evident double-entry bookkeeping engine: one pure rule core, exact integer money, identity derived from the idempotency key, and one append-only RFC 6962 Merkle log with inclusion, consistency and sealed-balance proofs and C2SP checkpoints, in memory (sync) or over SQLite and PostgreSQL (async).
Documentation
//! The reads a write makes do not grow with history, on the in-memory and
//! the SQLite store, counted from the stores' `write` spans.
//! PoC: `perf_history_scaling`. One test in its own binary: the span
//! collector is process-wide.
#![cfg(all(feature = "tracing", feature = "testing"))]
#![allow(clippy::unwrap_used, clippy::expect_used, clippy::panic)]

mod store_checks;

use doubleentry::store::MemoryStore;

#[tokio::test]
async fn regress_qs7_write_reads_do_not_grow_with_history() {
    store_checks::regress_qs7_write_reads_do_not_grow_with_history(MemoryStore::new(), 10_000)
        .await;
    #[cfg(feature = "sqlite")]
    {
        let dir = tempfile::tempdir().unwrap();
        let url = format!("sqlite://{}", dir.path().join("books.db").display());
        let store = doubleentry::store::SqlStore::<doubleentry::store::Sqlite>::sqlite(&url)
            .await
            .unwrap();
        store_checks::regress_qs7_write_reads_do_not_grow_with_history(store, 10_000).await;
    }
}