-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathCargo.toml
More file actions
143 lines (139 loc) · 6.17 KB
/
Copy pathCargo.toml
File metadata and controls
143 lines (139 loc) · 6.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
[package]
name = "alphanumeric"
version = "8.0.1"
edition = "2021"
# The node is distributed as signed binaries, not as a crates.io package. This also
# keeps the license gate scoped to third-party code: our own crate carries no
# `license` field, and marking it unpublished says so explicitly rather than
# implying a license we have not chosen.
publish = false
[dependencies]
argon2 = "=0.5.3" # Legacy wallet envelopes depend on these exact KDF defaults.
arrayref = "0.3"
byteorder = "1.4"
blake3 = "1.4.0"
sha2 = "0.10"
rayon = "1.5.3"
chrono = "0.4"
dashmap = "6.1.0"
num_cpus = "1.16"
num-traits = "0.2"
num-bigint = "0.4.6"
nix = { version = "0.30.1", features = ["process", "signal"] }
ipnet = "2.3.1"
rand_core = "0.6.4"
rand = "0.8"
thiserror = "1.0"
socket2 = "0.5.8"
uuid = { version = "1.6.1", features = ["v4", "rng"] }
get_if_addrs = "0.5.3"
ring = "0.17.14"
indicatif = "0.18"
termcolor = "1.1"
log = "0.4"
hex = "0.4"
crossbeam-channel = "0.5.15"
parking_lot = "0.12.1"
lru = "0.8"
reed-solomon-erasure = "6.0.0"
# EXACT pin, and the reason is VERIFICATION, not signing. Signature validity is
# standardised, so a conformant signature verifies under any conformant version —
# but the ACCEPTANCE SET at the edges is where implementations differ: whether a
# repeated hint index, non-zero hint padding or an off-length encoding is rejected.
# tests/mldsa_rejection.rs pins exactly those cases because a patch bump that
# tightened or loosened any of them would have two nodes disagree on whether one
# block's signature is valid, which is a chain split, not a compatibility note.
# Secondary: sign() is deterministic here (a fixed seed yields a fixed signature —
# see the published_test_vector_still_holds vector), and SIGNING_SPEC.md publishes
# that vector for third-party implementers, so changed output breaks interop too.
# Bump deliberately only, re-running the rejection tests and the published vector.
ml-dsa = "=0.1.1"
aes-gcm = "0.10"
zeroize = "1"
# WebRTC DataChannel transport for the NAT-traversal mesh (feature `webrtc_mesh`). Optional so the
# default binary stays lean (AV-false-positive surface) — release builds enable the feature.
webrtc = { version = "0.17", optional = true }
bytes = { version = "1", optional = true }
# rustls 0.23 with the `ring` provider — used by BOTH the DTLS mesh and (since 7.8.2)
# reqwest's HTTPS via `rustls-no-provider`. Non-optional: reqwest pulls it unconditionally
# and main() installs the ring provider process-wide. Pinning ring (not aws-lc-rs) drops
# the aws-lc-sys C build (cmake + NASM), so source builds need only Rust + a C compiler.
rustls = { version = "0.23", default-features = false, features = ["ring"] }
inquire = "0.7.0"
tokio = { version = "1.52", features = ["full"] }
futures = "0.3"
futures-util = "0.3"
fs2 = "0.4.3"
serde = { version = "1.0", features = ["derive"] }
# EXACT PIN — consensus-critical, same rule as ml-dsa above. The Merkle leaf is
# SHA-256 over this crate's output (blockchain.rs calculate_merkle_leaf_hash), and
# the P2P wire contract rides its enum-as-map encoding. A version that shifts one
# byte of encoding is a silent chain split; a lockfile-less source build (the
# Linux/Windows installer path) would float without these pins. `rmp` is the
# transitive crate that actually writes the bytes, pinned for the same reason.
# Bump deliberately only, re-running the codec golden-bytes tests first.
rmp-serde = "=1.3.1"
rmp = "=0.8.15"
libp2p-core = "0.43.2"
libp2p-identity = { version = "0.2.14", features = ["ed25519", "peerid", "rand"] }
libp2p-kad = "0.48.0"
libp2p-noise = "0.46.1"
libp2p-swarm = { version = "0.47.1", features = ["macros", "tokio"] }
libp2p-tcp = { version = "0.44.1", features = ["tokio"] }
libp2p-yamux = "0.47.0"
if-addrs = "0.10"
lazy_static = "1.4"
serde_json = "1.0"
async-trait = "0.1.74"
# Legacy engine, retained ONLY for the one-time sled->redb conversion tool
# (`sled-convert` feature); client and publisher builds carry no sled code.
sled = { version = "0.34.0", optional = true }
redb = "4.1"
env_logger = "0.10"
reqwest = { version = "0.13", default-features = false, features = ["json", "rustls-no-provider"] }
zip = "6"
ed25519-dalek = { version = "2", default-features = false, features = ["alloc"] }
axum = "0.6"
ctrlc = "3.4"
igd-next = "0.15"
sysinfo = "0.30"
rustyline = "18.0.1"
[build-dependencies]
bindgen = "0.64"
winres = "0.1.12"
[features]
# The mesh is part of the product: a plain `cargo build --release` (what every
# source-building Linux/Windows user runs) must produce a mesh-capable binary —
# without this, source builders silently lost direct P2P and never knew (bit real
# users on 2026-07-08). Runtime opt-out remains: ALPHANUMERIC_WEBRTC_MESH=false.
default = ["webrtc_mesh"]
# Enables DB snapshot publishing (zip+upload+sign) and the `push` command.
bootstrap_publisher = []
# One-time sled->redb database conversion tool for nodes migrating in place
# (the explorer's initial cutover). Never in client release builds.
sled-convert = ["dep:sled"]
# Reserved feature flag used by some libp2p/TCP-specific code paths.
tcp = []
# WebRTC DataChannel mesh: NAT'd miners hole-punch direct P2P links, signaled by the gateway.
webrtc_mesh = ["dep:webrtc", "dep:bytes"]
# NOTE:
# Windows Defender ML detections are often triggered by small, stripped, unsigned binaries
# that do heavy filesystem + networking (like bootstrap publish). Keep symbols and avoid
# aggressive LTO/stripping in release builds until the binary is code-signed.
[profile.release]
# Integer overflow PANICS in release, it does not wrap.
#
# Rust's default release profile wraps silently, which means an overflow bug is loud
# in every test run and silent in production, on a codebase whose whole job is exact
# integer money and consensus arithmetic. A wrap there is not a crash, it is a wrong
# balance or a divergent block that every node then agrees on forever. A panic is a
# stopped node an operator restarts.
#
# Measured before enabling: the full suite passes in release with checks on (528/528),
# and the mining hot loop is unaffected (10.74/10.88 MH/s off vs 10.72/10.82 on, inside
# run-to-run noise) because BLAKE3 does its own explicit wrapping arithmetic internally.
overflow-checks = true
debug = 1
strip = "none"
lto = false
panic = "unwind"