Skip to content

Repository files navigation

rbitcoin

Bitcoin full node in Rust aimed at production server-side use: multi-peer IBD, tip follow, block/tx relay (tip mode), and in-process Electrum for wallet backends and similar infrastructure — built around a libbitcoin-class relational archive and a pure-Rust consensus/script path.

0.x: on-disk format and APIs are unstable until 1.0. Prefer a signet soak before first mainnet cutover; treat early mainnet as high-scrutiny. Security contact and policy: SECURITY.md. Operator notes: docs/experimental-mainnet.md.

License MIT OR Apache-2.0 (LICENSE-MIT, LICENSE-APACHE)
Version 0.1.0 experimental (CHANGELOG.md)
Platform Linux first (io_uring + map-free fd store; other OSes unproven)
Security SECURITY.md
Design docs/architecture.md — why this node is different

Why this node is different

Most full nodes center a UTXO set + block files (Bitcoin Core). Most Electrum backends are external indexers of another node. rbitcoin does neither: no UTXO set (libbitcoin-class archive), Electrum + txindex in-process.

Operator-order facts (mainnet tip moves; treat as ballpark, not a warranty):

  • ~886 GiB full archive including txindex and Electrum scripthash (fits ~1 TB-class disks) — see SCHEMA.md
  • Under ~30 h IBD on a laptop-class host with --milestone 0 (full scripts)
  • Modest RAM during sync — no multi‑GiB dbcache, no long “flush the cache” pauses (confirm is lookup → load → scripts → write)
  • Segmented tx.headnewer txs resolve hottest (tip-local traffic wins)
  • Pure-Rust consensus/scripts on rust-bitcoin (no libbitcoinconsensus)
  • Reproducible static musl builds for ordinary Linux hosts
  1. On-disk archivemap-free Class A/B/C tables (pread/pwrite + fallocate grow; kernel page cache as L0): packed txs, keyless tx.head, spend annotations, native scripthash. Historical blocks are reconstructed from the archive; tip keeps a wire ring and Class C tip durability after catch-up. Confirm/mempool prevouts use the archive (and in-mempool parents), not a separate UTXO hash table. Layout: SCHEMA.md; IO: docs/io-modality.md; concurrency: docs/concurrency.md.
  2. Concurrent IBD / IO — fixed writer roles (one Class A appender), allocate-then-publish HWMs (no map epochs), confirm as lookup → load → scripts → write, bulk io_uring where available (pread/pwrite fallback). Linux-shaped IO; porting needs work. Map: docs/concurrency.md.
  3. Pure-Rust consensus — structure, connect, and script verification in Rust; only secp256k1 (via rust-bitcoin) as the crypto primitive — no libbitcoinconsensus dual-eval. Tests: docs/consensus-tests.md.

Full narrative and Core / Fulcrum contrasts: docs/architecture.md. Product surface: COMPAT.md.

Status

Core pipelines exist (store, consensus, P2P IBD, tip follow, scripthash, Electrum, libre mempool) for the server-side / wallet-backend role. 0.x mainnet is early production: run signet first, then mainnet with monitoring (OPERATOR.md). Finishing any one operator’s first full mainnet sync is not a gate for using or packaging this tree.

Authorship: first-party code is AI-written (Grok / xAI) under Brandon Black (@reardencode) prompting — details in SECURITY.md.

Milestone (default mainnet 840000): at/below --milestone, script/sig checks are skipped on block connect (assumevalid-style speed tradeoff). Prevouts, double-spend, maturity, and fees still run. Use --milestone 0 for full script validation.

# Portable static release (preferred)
nix build .#rbitcoin-musl
install -m 755 result/bin/rbitcoin-node result/bin/rbitcoin-cli target/release/

# Signet lab (time-boxed)
./target/release/rbitcoin-node --datadir ./datadir-signet --network signet \
  --listen 127.0.0.1:38333 --milestone 200000 --max-run-secs 120

Build

Portable static release (recommended)

Pinned nixpkgs + Cargo.lock produce a fully static, portable rbitcoin-node / rbitcoin-cli (musl) that runs on ordinary Linux hosts without Nix or a matching glibc. Byte-identical digests for a given revision + target. Not NixOS-specific — any machine with Nix + flakes:

nix build .#rbitcoin-musl          # default package; fully static
# or: ./scripts/repro-build.sh
install -m 755 result/bin/rbitcoin-node result/bin/rbitcoin-cli target/release/
./scripts/repro-build.sh           # day-to-day musl install (crane-layered)
./scripts/repro-check.sh           # release only: two clean rebuilds; compare digests

Do not use cargo build --release inside nix-shell / nix develop as the operator binary — that links against the Nix store glibc and fails outside the store (No such file or directory at exec). Details: docs/reproducible-builds.md.

Dev / CI path

Requires a recent Rust toolchain (workspace rust-version 1.74+). Prefer the same pin as release builds for tests and clippy:

nix develop   # or: nix-shell  (both use flake.lock, not floating <nixpkgs>)
cargo build --workspace
cargo test --workspace
./scripts/coverage.sh   # PR bar: see CONTRIBUTING.md

Operator binary: always the static install under ./target/release/ (or ./result/bin/). Operator knobs: OPERATOR.md. Experimental mainnet: docs/experimental-mainnet.md.

Crate map

Crate Role
rbitcoin-primitives Shared types / newtypes
rbitcoin-store Map-free Class A/B/C tables (fd pread/pwrite), scripthash, bulk IO
rbitcoin-query Domain API (archive, confirm, reconstruct, Electrum joins)
rbitcoin-wire-cache Tip wire-format block ring
rbitcoin-consensus Validation / confirm; pure-Rust scripts; milestone = scripts only
rbitcoin-net P2P + IBD (modular ibd/), tip follow, relay
rbitcoin-mempool Cluster graph + libre admission
rbitcoin-electrum Electrum TCP server
rbitcoin-rpc Minimal node JSON-RPC (stub)
rbitcoin-cli CLI client
rbitcoin-node Node binary
rbitcoin-test High-level test harness

Documentation index

Doc Audience
docs/architecture.md Design uniqueness (start here)
docs/experimental-mainnet.md Lab mainnet runbook
OPERATOR.md Day-to-day ops, env knobs
SCHEMA.md On-disk schema
docs/concurrency.md Writer roles / lock-free publish
COMPAT.md Intentional differences vs Core / Electrum methods
CONTRIBUTING.md Dev workflow and coverage bar
SECURITY.md Vulnerability reporting
CHANGELOG.md Release notes
docs/reproducible-builds.md Pinned Nix byte-identical builds

What this is not

  • Production multi-tenant Electrum or “drop-in Core”
  • Wallet, mining, GUI, or pruning
  • Full Core JSON-RPC surface
  • A claim of complete mainnet script validation under the default milestone (use --milestone 0 for full scripts)
  • A multi-OS port — Linux is the supported IO target today

License

Licensed under either of:

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. See CONTRIBUTING.md.

About

Bitcoin full node in Rust: map-free relational archive, pure-Rust consensus, multi-peer IBD, Electrum for wallet backends

Topics

Resources

Contributing

Security policy

Stars

10 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages