ant-node 0.14.2

Pure quantum-proof network node for the Autonomi decentralized network
Documentation
[package]
name = "ant-node"
version = "0.14.2"
edition = "2021"
authors = ["David Irvine <david.irvine@maidsafe.net>"]
description = "Pure quantum-proof network node for the Autonomi decentralized network"
license = "MIT OR Apache-2.0"
repository = "https://github.com/WithAutonomi/ant-node"
keywords = ["p2p", "decentralized", "quantum-safe", "post-quantum", "dht"]
categories = ["network-programming", "cryptography"]
rust-version = "1.75"

[lib]
name = "ant_node"
path = "src/lib.rs"

[[bin]]
name = "ant-node"
path = "src/bin/ant-node/main.rs"

[[bin]]
name = "ant-devnet"
path = "src/bin/ant-devnet/main.rs"

[dependencies]
# Global allocator. musl's default malloc is significantly slower than
# glibc's under concurrent allocation churn, which matches the node's
# steady-state workload. mimalloc neutralises that regression for the
# musl Linux builds (and tends to beat glibc's allocator too).
mimalloc = "0.1"

# Wire protocol — the single version-pin shared with ant-client.
# Bumping ant-protocol's `evmlib`/`saorsa-core`/`saorsa-pqc` pins ripples
# through here automatically; we keep a direct saorsa-core dep for
# node-only DHT internals (DHTNode, TrustEvent, DhtNetworkEvent), which
# Cargo unifies with ant-protocol's version constraint.
#
# TODO: swap to `ant-protocol = "2.0.0"` once 2.0.0 is on crates.io.
# Until then, the git pin tracks the matching saorsa-core lineage
# (the rc-2026.4.2 branch) so Cargo can unify the wire types here
# with ant-protocol's re-exports.
ant-protocol = "2.2.2"

# Core (provides EVERYTHING: networking, DHT, security, trust, storage)
saorsa-core = "0.26.2"
saorsa-pqc = "0.5"

# Payment verification - autonomi network lookup + EVM payment
evmlib = "0.8.1"
xor_name = "5"

# Caching - LRU cache for verified XorNames
lru = "0.16.3"
parking_lot = "0.12"  # Efficient mutex for cache

# Storage - LMDB via heed for content-addressed chunk store
heed = "0.22"

blake3 = "1"

# Async runtime
tokio = { version = "1.35", features = ["full", "signal"] }
tokio-util = { version = "0.7", features = ["rt"] }
futures = "0.3"

# CLI
clap = { version = "4.5", features = ["derive", "env"] }

# Configuration
serde = { version = "1", features = ["derive"] }
toml = "0.8"
directories = "5"

# Auto-upgrade
reqwest = { version = "0.13", features = ["json", "rustls"], default-features = false }
semver = "1"

# Logging (optional — behind `logging` feature flag)
tracing = { version = "0.1", optional = true }
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"], optional = true }
tracing-appender = { version = "0.2", optional = true }

# Error handling
thiserror = "2"
color-eyre = "0.6"

# Serialization
rmp-serde = "1"
hex = "0.4"

# Utilities
bytes = "1"
chrono = { version = "0.4", features = ["serde"] }
tempfile = "3"
rand = "0.8"
serde_json = "1"

# Archive extraction for auto-upgrade
flate2 = "1"
tar = "0.4"
zip = "2"

# SHA-256 hashing for binary cache integrity
sha2 = "0.10"

# Cross-platform file locking for upgrade caches
fs2 = "0.4"

# System page size (for LMDB map alignment during resize)
page_size = "0.6"

# Protocol serialization
postcard = { version = "1.1.3", features = ["use-std"] }

[target.'cfg(unix)'.dependencies]
libc = "0.2"

[target.'cfg(windows)'.dependencies]
self-replace = "1"

[target.'cfg(target_os = "macos")'.dependencies]
objc2 = "0.6"
objc2-foundation = { version = "0.3", features = ["NSProcessInfo", "NSString"] }

[dev-dependencies]
tokio-test = "0.4"
proptest = "1"
alloy = { version = "1", features = ["node-bindings"] }
serial_test = "3"

# E2E test infrastructure (run with --features test-utils)
[[test]]
name = "e2e"
path = "tests/e2e/mod.rs"
required-features = ["test-utils"]

# v12 storage-bound audit attack PoCs. Uses the test-only one-shot
# commitment builder/verifier helpers, so it requires the test-utils
# feature. CI runs it via `cargo test --test poc_commitment_audit_attacks
# --features test-utils`.
[[test]]
name = "poc_commitment_audit_attacks"
path = "tests/poc_commitment_audit_attacks.rs"
required-features = ["test-utils"]

# Live responder-handler tests for the v12 audit. Use
# LmdbStorageConfig::test_default(), gated on test-utils.
[[test]]
name = "poc_audit_handler_live"
path = "tests/poc_audit_handler_live.rs"
required-features = ["test-utils"]

# Bootstrap-stall DoS regression marker (documents the unfixed attack; the
# eventual fix must land with a follow-up test asserting bounded drain).
# Declared like the other PoC suites so CI invokes it explicitly.
[[test]]
name = "poc_bootstrap_stall"
path = "tests/poc_bootstrap_stall.rs"
required-features = ["test-utils"]

[features]
default = ["logging"]
# Enable tracing/logging infrastructure.
# Included in `default` so dev builds (`cargo build`, `cargo test`) get logging
# automatically. Release builds strip it:
#   cargo build --release --no-default-features
logging = ["tracing", "tracing-subscriber", "tracing-appender"]
# Expose test helpers (cache_insert, payment_verifier accessor) for
# integration tests and downstream test harnesses.
test-utils = []

[profile.release]
lto = true
codegen-units = 1
panic = "abort"
strip = true

[profile.dev]
# Faster builds for development
opt-level = 1

[lints.rust]
unsafe_code = "deny"
missing_docs = "warn"

[lints.clippy]
all = { level = "warn", priority = -1 }
pedantic = { level = "warn", priority = -1 }
nursery = { level = "warn", priority = -1 }
unwrap_used = "deny"
expect_used = "deny"
panic = "deny"
# Allow async functions that will have await statements added later
unused_async = "allow"
# Allow slightly complex functions during initial development
cognitive_complexity = "allow"
# Allow non-const functions during initial development (may need runtime features later)
missing_const_for_fn = "allow"