Summary
crates/node/Cargo.toml (the arc-node-execution binary — the Execution Layer) declares a remote-signer feature gating protox and tonic-build as optional build-dependencies:
remote-signer = ["dep:protox", "dep:tonic-build"]
integration = ["remote-signer"]
[build-dependencies]
protox = { workspace = true, optional = true }
tonic-build = { workspace = true, optional = true }
crates/node has no build.rs, so nothing in this crate ever invokes either dependency:
$ find crates/node -iname build.rs
(no output)
$ grep -rn 'remote-signer' crates/node/src/
(no output)
Both dependencies still get pulled and compiled — they're resolved in Cargo.lock under arc-node-execution — for no observable effect.
Why this looks like leftover wiring, not intentional
arc-node-execution doesn't depend on arc-remote-signer at all, directly or transitively (confirmed against Cargo.lock). That tracks: remote signing is a validator/consensus-layer concern, and arc-node-execution is the execution layer — it has no reason to talk to a remote signer in the first place.
The crate that does need this is wired correctly and shows the intended pattern: crates/malachite-app depends on arc-signer, whose remote feature optionally pulls in arc-remote-signer — which has its own build.rs that compiles the proto definitions once. Every consumer downstream of that just links the already-built crate. No consumer needs protox/tonic-build as its own build-dependency except arc-remote-signer itself.
So crates/node's copy of this wiring isn't gating anything real — it's a feature name and two build-deps that do nothing, most likely left over from before proto compilation was consolidated into crates/remote-signer.
This is an isolated case, not a class
Checked every crate in the workspace with a [build-dependencies] section: crates/remote-signer, crates/types, and crates/version each have their own build.rs and genuinely consume their build-deps. crates/node is the only one that doesn't — so this is a single leftover, not a pattern worth a broader sweep.
Also worth noting for anyone re-verifying: arc-node-execution isn't published (publish = false at the workspace root), so there's no external consumer who could be depending on the remote-signer feature name by spelling it out — removing it breaks nothing outside this repo either.
Impact
cargo clippy --all-targets --all-features (CI) and any local --features integration build compile protox + tonic-build for arc-node-execution on every run, with zero effect — wasted build time, and a remote-signer feature name on the EL binary that misleadingly suggests it does something signing-related.
Worth noting this is invisible to the cargo hack --each-feature job proposed in #240 — it wouldn't fail a build either way, since the deps compile fine unused. It's a correctness-of-intent gap, not a build failure.
Suggested fix
Remove protox, tonic-build, the remote-signer feature, and its listing inside integration = [...] from crates/node/Cargo.toml. Nothing in the crate references any of them. Happy to send the PR.
Summary
crates/node/Cargo.toml(thearc-node-executionbinary — the Execution Layer) declares aremote-signerfeature gatingprotoxandtonic-buildas optional build-dependencies:crates/nodehas nobuild.rs, so nothing in this crate ever invokes either dependency:Both dependencies still get pulled and compiled — they're resolved in
Cargo.lockunderarc-node-execution— for no observable effect.Why this looks like leftover wiring, not intentional
arc-node-executiondoesn't depend onarc-remote-signerat all, directly or transitively (confirmed againstCargo.lock). That tracks: remote signing is a validator/consensus-layer concern, andarc-node-executionis the execution layer — it has no reason to talk to a remote signer in the first place.The crate that does need this is wired correctly and shows the intended pattern:
crates/malachite-appdepends onarc-signer, whoseremotefeature optionally pulls inarc-remote-signer— which has its ownbuild.rsthat compiles the proto definitions once. Every consumer downstream of that just links the already-built crate. No consumer needsprotox/tonic-buildas its own build-dependency exceptarc-remote-signeritself.So
crates/node's copy of this wiring isn't gating anything real — it's a feature name and two build-deps that do nothing, most likely left over from before proto compilation was consolidated intocrates/remote-signer.This is an isolated case, not a class
Checked every crate in the workspace with a
[build-dependencies]section:crates/remote-signer,crates/types, andcrates/versioneach have their ownbuild.rsand genuinely consume their build-deps.crates/nodeis the only one that doesn't — so this is a single leftover, not a pattern worth a broader sweep.Also worth noting for anyone re-verifying:
arc-node-executionisn't published (publish = falseat the workspace root), so there's no external consumer who could be depending on theremote-signerfeature name by spelling it out — removing it breaks nothing outside this repo either.Impact
cargo clippy --all-targets --all-features(CI) and any local--features integrationbuild compileprotox+tonic-buildforarc-node-executionon every run, with zero effect — wasted build time, and aremote-signerfeature name on the EL binary that misleadingly suggests it does something signing-related.Worth noting this is invisible to the
cargo hack --each-featurejob proposed in #240 — it wouldn't fail a build either way, since the deps compile fine unused. It's a correctness-of-intent gap, not a build failure.Suggested fix
Remove
protox,tonic-build, theremote-signerfeature, and its listing insideintegration = [...]fromcrates/node/Cargo.toml. Nothing in the crate references any of them. Happy to send the PR.