mirror of
https://github.com/luxfi/mpc.git
synced 2026-09-24 00:26:24 +00:00
KEYGEN has been dead on the hanzo-mpc fleet — every request answered 503 "peers not ready" while /healthz reported `signing_quorum: true` beside `ready: false`, and the counters said `ready=5 expected=4` in a THREE node fleet. Both halves of that arithmetic were wrong. SELF WAS COUNTED TWICE. A StatefulSet renders one command for every replica, so the natural spelling hands each node the whole ensemble — including itself. `peerMap[nodeID] = listenAddr` adds self by id, and the matching `--peer` then adds it AGAIN under a synthetic `peer-N` id (an unprefixed address gets a positional id by construction, so it can never match a real node id, and filterSelf — which compares ids — could never see it). Three nodes therefore reported four expected members. mpcd now drops a --peer that names this node, matched by address: equal to --listen, or a host whose FIRST DNS LABEL equals the node id (compared whole, so mpc-node-10 is never mpc-node-1). AND THE GATE WAS AN EQUALITY. `readyCount == len(peers)+1` reads an OVERSHOOT as not-ready, so once the count passed the expected total nothing could bring it back — permanently, across restarts. Signing survived only because it already used >=. A readiness gate must fail closed on too few, never on too many; both sites are >= now, so the double-count could not have wedged keygen even before the fix above. Verified by exercising isSelfAddr over the fleet's real addresses: the live 3-node template on mpc-node-0 keeps 2 peers, expected total 3. Co-authored-by: Hanzo Dev <[email protected]>