rpc to our own nodes: endpoint list, tls, reconnect and a runtime-version watch #20
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Parent: #3
Scope
A connection manager that takes a profile's endpoint list, connects over
wsswith rustls, fails over on error, reconnects with backoff and jitter, and re-readsstate_getRuntimeVersionon connect and on theRuntimeUpgradedsignal so the signing context and metadata are never stale. Health is exposed to the UI as a small status (connected to which host, block height, lag).Operator decision to record here before starting
Which hosts serve the wallet, and how the wallet authenticates to them: mTLS client certificate, a bearer token in the WebSocket handshake, or open behind the mesh only. Document the answer as a comment on this issue.
Acceptance
Kill the node the wallet is on; it is on another within the backoff window and the UI status says so. A runtime upgrade on the dev node changes the reported spec version without a restart.
Depends on
Chain profiles.
Operator decision, 2026-09-15
Node RPC and WebSocket are public, no auth, throttled. One name per chain, so the convention scales to every chain the wallet learns:
quantus.blackbeard.observerfor mainnetplanck.blackbeard.observerfor the testnet leg, so a two-chain wallet is testable end to end even though Planck is a testnetEach name is TLS-terminated with Let's Encrypt on oolon's nginx, configured as an IP load balancer (an
upstreamper chain) that routes to the single node on bob for now and gains servers as nodes are added. Fairness comes from nginx throttling (limit_reqon the HTTP JSON-RPC path,limit_connper client on the WebSocket upgrade, sincelimit_reqonly sees the handshake), not from credentials.Consequences for this issue: the endpoint list in the mainnet and Planck profiles is exactly those two names; the wallet does no authentication; failover is nginx's job on the server side and reconnect-with-backoff on the wallet's. The infrastructure itself is filed separately as a child of #3.
Caveat to resolve before the Planck name goes live
The observer's
config.tomlrecords that the one node we ran for Planck now mines mainnet, and that Heisenberg is served from a Quantus-team endpoint (a1-heisenberg.quantus.cat), not ours. Soplanck.blackbeard.observerneeds a Planck node stood up on our infra first, and it is worth confirming Planck is still the testnet Quantus keeps alive (the mobile app, the extension fork and the observer all test against Heisenberg today). If Heisenberg is the better-supported testnet, the same convention givesheisenberg.blackbeard.observerand nothing else changes.Correction, 2026-09-15
The caveat above was wrong on two counts, and the correction belongs here rather than in a diff.
a1-planck.quantus.catanda2-planck.quantus.catboth answersystem_chain→Plancktoday, as doa1/a2-heisenberg. The observer's deployed config template already lists both pairs; the stale working copy I read did not.Planck's role is narrow and deliberate: it exists in the wallet purely to prove the multi-chain UX works, until a real post-quantum mainnet that is not Quantus is supported. It is not a second product surface.
So:
quantus.blackbeard.observer→ bob;planck.blackbeard.observer→a1/a2-planck.quantus.cat. Same convention, same throttling, no auth on either. #53 is updated to match.