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 |
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.head— newer txs resolve hottest (tip-local traffic wins) - Pure-Rust consensus/scripts on rust-bitcoin (no
libbitcoinconsensus) - Reproducible static musl builds for ordinary Linux hosts
- On-disk archive — map-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. - 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. - Pure-Rust consensus — structure, connect, and script verification in
Rust; only secp256k1 (via rust-bitcoin) as the crypto primitive — no
libbitcoinconsensusdual-eval. Tests:docs/consensus-tests.md.
Full narrative and Core / Fulcrum contrasts: docs/architecture.md.
Product surface: COMPAT.md.
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 120Pinned 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 digestsDo 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.
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.mdOperator binary: always the static install under ./target/release/ (or
./result/bin/). Operator knobs: OPERATOR.md. Experimental
mainnet: docs/experimental-mainnet.md.
| 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 |
| 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 |
- 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 0for full scripts) - A multi-OS port — Linux is the supported IO target today
Licensed under either of:
- Apache License, Version 2.0 (
LICENSE-APACHEor http://www.apache.org/licenses/LICENSE-2.0) - MIT license (
LICENSE-MITor http://opensource.org/licenses/MIT)
at your option.
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.