You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(node): say what the startup check skipped in operator terms
The warning named our own mechanism and left the operator to work out
which of their chains went unchecked; it now lists them.
The docs claimed a `ton` section exists, and that chains without an
inspector report a status name an operator never sees.
The per-chain map key prevents *lookup* confusion: when the node resolves the operator's `ethereum:` section, only `entries[Ethereum]` is consulted, never `entries[Sepolia]`. What it doesn't prevent is a `ChainVote { chain: Ethereum, providers: [ProviderEntry { provider_id: "ankr", chain_routing: PathSegment { segment: "eth_sepolia" }, … }, …], threshold: _ }` getting voted in — the contract just stores what threshold consensus produces; it can't tell whether `"eth_sepolia"` actually corresponds to Ethereum mainnet. Threshold voter review is the first line of defense; the fan-out across a chain's providers is the structural one. The network fingerprint probe is a per-node diagnostic on top of both.
546
546
547
-
At startup, each configured provider gets its self-identifying RPC called and the response is compared against that chain's `expected_network_fingerprint` from the operator's config. The probe is report-only: a provider serving the wrong network is logged, but is not dropped, because a boot-time network blip should not take a chain out of signing. It runs detached, so it never delays startup.
547
+
At startup, every provider of a chain the node can identify gets its self-identifying RPC called and the response is compared against that chain's `expected_network_fingerprint` from the operator's config. The probe is report-only: a provider serving the wrong network is logged, but is not dropped, because a boot-time network blip should not take a chain out of signing. It runs detached, so it never delays startup. A node that configures no foreign chain at all is warned about instead: the chains the code supports are the chains an operator is expected to configure.
548
548
549
549
The result is a line per provider, an `x/y providers healthy` summary counting only the providers a probe covers, and two gauges labelled by chain: `mpc_foreign_chain_rpc_providers_configured` and `mpc_foreign_chain_rpc_providers_healthy`. The gauges are per chain rather than per provider, because a provider name is operator chosen and would put an unbounded label on a time series. A chain whose providers cannot be identified, such as Solana or Ethereum, is left out of both the summary and the gauges: reporting `0` healthy against its configured count would read as every provider failing.
550
550
551
551
Taking the expected value from operator config rather than a constant in the attested binary is a deliberate trade. It makes mixed-network and local deployments checkable at all, since a config may pair one chain's mainnet with another's testnet and no binary can ship a value for a devnet. The cost is that the check no longer binds an operator: they can set the wrong value, or omit the field and get no check at all, and either way they fool only their own node's diagnostics. The network-level defenses against a wrong URL are unchanged: threshold voter review of the whitelist, and the provider fan-out, which fails the individual request when a provider disagrees with its siblings.
552
552
553
-
Every chain with an inspector is probed, each by the RPC below. `solana`, `ethereum`and `ton` have none, so they ignore `expected_network_fingerprint`. The fingerprint values themselves are tabulated once, under [Configuration (Node)](#configuration-node).
553
+
Every chain with an inspector is probed, each by the RPC below. `solana`and `ethereum` have none, so they ignore `expected_network_fingerprint`. The fingerprint values themselves are tabulated once, under [Configuration (Node)](#configuration-node).
554
554
555
555
| chain | probe |
556
556
|---|---|
@@ -720,9 +720,10 @@ each value must match the network of the `rpc_url` beside it. The value is alway
720
720
including the fingerprints that look numeric.
721
721
722
722
Every chain with an inspector is probed, and for those, leaving the field unset is not a silent
723
-
skip: every provider of the chain is reported as `MissingExpectedFingerprint`, because silence reads
724
-
as healthy on a dashboard. `solana`, `ethereum` and `ton` have no inspector, so they report
725
-
`ProbeNotImplemented`whether the field is set or not.
723
+
skip: every provider of the chain is reported as `MissingExpectedFingerprint` and counts against the
724
+
chain's healthy total, because silence reads as healthy on a dashboard. `solana` and `ethereum` have
725
+
no inspector, so their providers are never asked and no health is reported for them, whether the
0 commit comments