This document shows two ways a rogue-node attempt is detected.
./scripts/simulate-rogue-node-attack.shThe script writes report artifacts to:
deployments/compose/reports/rogue-node-attack-*.jsondeployments/compose/reports/rogue-node-attack-*.md
Attempt: add role: "rogue" to relay config.
Expected result: relay refuses to start during config validation.
Example:
go run ./cmd/votechain-anchor-relay -config /tmp/relay-rogue.yamlOutput:
config error: nodes[3].role must be one of federal|state|oversight
Attempt: keep allowed roles, but set wrong ack_key_id for one role (for example federal) and require all 3 ACKs.
Expected result:
- Relay cannot count spoofed ACK.
- Outbox event is marked retry with explicit error.
- Observer shows
outbox_pending > 0(overall: degraded) until a valid relay recovers.
Example DB evidence:
SELECT id, status, attempts, last_error
FROM anchor_outbox
ORDER BY id DESC
LIMIT 1;Sample last_error:
federal:ack key id mismatch: got ed25519:9d8a7d8ed1dcf6e4 want ed25519:0000000000000000
- Relay node roles are fixed and validated:
federal|state|oversight. - Relay ACKs are verified against pinned public keys and expected key IDs.
- Failed ACK verification is not counted toward quorum.
- Observer/outbox metrics surface failures operationally.