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

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions