Skip to content

giga/v2 receipt-parity rollout gates (CON-368 follow-ups) #3754

Description

@bdchatham

Problem

PR #3753 closes the validation-failure receipt divergence between the v2 and giga executors (CON-368) by routing those failures through the v2 fallback. The xreview of that PR identified the remaining parity exposures that should gate the mixed-fleet giga rollout — none blocked the PR, all are load-bearing before giga becomes the default on a fleet with v2 validators running LastResultsHash validation.

Gates, in priority order

  1. Executed-tx receipt-gas parity has no fallback backstop (MEDIUM). Txs that pass validation and execute (success, revert, out-of-gas, EIP-7623 floor) get giga-stamped receipts (GasUsed = execResult.UsedGas); parity with v2 rests entirely on giga's gas accounting matching, with no safety net. giga/tests/data/skip_list.json already catalogs 60 result_code and 33 gas_mismatch divergences in the state-test corpus — on a mixed fleet, each is a CON-368-shaped halt candidate if the tx shape lands in a block. Gate: parity-fuzz over executed txs (burn down the skip list), not just validation failures.
  2. v2 BasicDecorator checks giga does not pre-validate. Intrinsic-gas floor (etx.Gas() < intrinsicGas), MaxInitCodeSize, and block MaxGas are rejected fee-free in v2's ante but neither checked by validateGigaEVMTx nor routed to fallback — a gas-below-intrinsic tx would execute (and charge a fee) under giga while v2 rejects it: a latent LastResultsHash/AppHash fork sibling to CON-368. Either add these checks to validateGigaEVMTx (falling back like the others) or document why unreachable.
  3. app_giga_fallback_to_v2 rate alert. The counter now carries a reason label (PR fix(giga): route EVM validation failures to v2 fallback (CON-368) #3753); add a dashboard alert — sustained fallback ≈ block rate means either someone forcing degradation (drain-pairs / fresh unassociated addresses) or a new divergence class leaking into the fallback path. Doubles as the canary for gate 1.
  4. Normalize nil-slice serialization surfaces. generateDefaultWhitelistedCwCodeHashesForDelegateCall returns [][]byte(nil), which JSON-marshals as null where a seeded empty slice marshals as [] — a 2-byte param-store difference is enough to skew ante store-gas and fork receipts if the two write paths ever run on different nodes. Return [][]byte{} (state-serialization surface; needs its own review).
  5. (Minor) The tx-ordering ineligibility fallback (delegatedToV2, block not "all EVM then all Cosmos") re-routes to v2 without incrementing the fallback metric — outside the abort family, worth a label for complete fallback observability.

Context

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions