Why
Multi-provider failover fixes downtime but can amplify disagreement unless responses are compared by block hash and confidence tag. The PoC turns RPC trust into an observable policy.
An RPC provider exposes one node's present view. It may be unavailable, stale, following a temporary fork, or simply wrong. A second endpoint improves availability, but two URLs are not automatically two independent observations: they may share an operator, cloud, client implementation, or upstream node. The goal is failure independence, not endpoint count.
How it works
Query two independent providers for latest, safe, and finalized block number plus hash; inject a stale or disagreeing response; and define when the application degrades, retries, or refuses an irreversible action.
What two providers actually buy
The useful pattern is not "always send every request twice." It is to match the RPC policy to the business risk.
| Pattern | Behavior | Problem solved |
|---|---|---|
| Failover | Use B when A fails | Availability |
| Hedged request | Ask B when A is slow | Tail latency |
| Agreement check | Compare A and B by block hash | Disagreement detection |
With two providers, agreement increases confidence and disagreement tells the application to stop or retry. Two providers cannot decide which answer is correct when they disagree.
Confidence tags
| Tag | Meaning | Typical use |
|---|---|---|
latest |
The node's current proposed head; it can change | UI and reversible reads |
safe |
A head with substantially stronger reorg resistance | Higher-confidence processing |
finalized |
The latest finalized block reported by the node | Irreversible, high-value fulfillment |
The tags are still reported through RPC. They strengthen the requested chain state; they do not make the provider itself a consensus oracle.
PoC
Inject timeout, lag, equal-height/different-hash, and shared-stale-answer cases, and record four separate signals:
| Signal | Question |
|---|---|
| Availability | Did an endpoint answer? |
| Freshness | How far behind is its reported head? |
| Agreement | Do independent nodes report the same block hash? |
| Confidence | Is the block latest, safe, or finalized? |
Allow low-risk reads to degrade with a stale warning. Pause collateral release, expensive fulfillment, or other irreversible actions when the required confidence or agreement cannot be established. A practical default is primary-plus-fallback for ordinary UI reads and explicit finalized-hash agreement for selected high-value actions.
Reference: Ethereum JSON-RPC API.
Where it lands in Jayverse
- Devnet: treat every read as unverified by definition. A single-node hosted Anvil fork has no second independent view, so any finality-confidence logic must actually be tested against Sepolia, or later the OP-Stack L2, where a second provider exists.
- Bridge: gate mint or release on a confidence tag, not "latest." Lock-and-mint should require a finalized (or explicit safe) block hash from at least two independent providers before releasing funds; failing to reach that tag should pause release, not retry against a fresh latest.
- Verex: define per-action risk explicitly. Cheap, reversible reads can use failover; market resolution and payout should require agreement-by-hash across independent RPC providers before being treated as final.
Key expressions
| Expression | 뜻 · 쓰이는 자리 |
|---|---|
| stale | 오래되어 더는 최신이 아닌, 신뢰하기 힘든 · "It may be unavailable, stale, following a temporary fork" |
| amplify | 증폭시키다, 문제를 더 키우다 · "can amplify disagreement unless responses are compared" |
| failure independence | 장애가 서로 독립적으로 발생하는 성질 · "The goal is failure independence, not endpoint count" |
| tail latency | 드물게 발생하는 아주 느린 응답(꼬리 지연) · "Ask B when A is slow" |
| hedge (a request) | 위험 분산을 위해 예비로 같이 요청하다 · "Ask B when A is slow" |
| degrade | 성능·신뢰도가 한 단계 낮은 수준으로 떨어지다 · "Allow low-risk reads to degrade with a stale warning" |
| irreversible action | 되돌릴 수 없는 행동 · "Pause collateral release, expensive fulfillment, or other irreversible actions" |
| confidence tag | 신뢰도를 나타내는 표식 · "compared by block hash and confidence tag" |