Skip to content

v0.1.35

Pre-release
Pre-release

Choose a tag to compare

@oten91 oten91 released this 12 Aug 15:42
· 5 commits to main since this release
a109dd0

⚠️ Consensus-breaking release. Requires a coordinated network upgrade via the v0.1.35 upgrade handler — all validators and full nodes must run this binary at the upgrade height.

⚠️ Read before upgrading

  • Do not swap the binary early. Nodes halt at the upgrade height and switch there; running it early risks corrupting your state. cosmovisor handles the swap automatically — manual operators swap after the halt.
  • Suppliers: run the v0.1.35 RelayMiner from the upgrade height. An older miner keeps pricing claims under the old rules and can skip a proof the chain requires → PROOF_MISSING → slashing.
  • Upgrade the full node before, or together with, the RelayMiner. ComputeUnitsPerRelayAtHeight is new in v0.1.35. A v0.1.35 miner pointed at a v0.1.34 node falls back to live pricing and logs a warning — it keeps mining, but the session-start pin is inactive until the node catches up.
  • FREEZE all compute_units_per_relay changes (MsgAddService updates that change cupr) from before the upgrade height until the RelayMiner fleet is upgraded. Unfreeze only afterwards.

Highlights

🧾 Service config changes are session-scoped. Claim pricing is now pinned to the height a session started, so a compute_units_per_relay change applies only to sessions that start after it. Same for the global pricing multipliers.

⚡ RelayMiner reliability. Claim/proof transactions are re-broadcast if evicted from the mempool — the main cause of PROOF_MISSING slashing. Additional timing and validation hardening so that valid work is not rejected. Also fixed: a WebSocket goroutine leak, a concurrent-logging crash, and two session-cache bugs.

🪪 Cards: onchain identity for gateways and services. Gateways can now publish a card — a small, self-describing JSON document — via the new MsgUpdateGatewayMetadata. Services already had one, and a routine service edit (e.g. changing compute_units_per_relay) no longer wipes it. Validate either offline before paying gas:

pocketd tx service validate-card ./card.json
pocketd tx gateway validate-card ./gateway-card.json

The canonical schemas live in pkg/cards/ and are compiled into pocketd — nothing is fetched over the network.

🔑 Supplier owners protected. An operator can no longer re-stake repeatedly to cancel an owner-initiated unstake.

💸 Settlement budget redistribution (ships OFF). Makes the split between work done-and-paid and work done-but-unpaid (overservicing) far more visible, plus the machinery to pay for part of it. No economic change at this upgrade — an exact no-op until governance raises overservicing_bonus_multiplier.

🛑 Governance param guard. Shared-params combinations that settlement cannot process are now rejected at validation time.

Behavior Changes

The supplier owner's unstake-cancel is a TWO-step operation. MsgUnstakeSupplier stamps a deactivation height on every service config, and the owner's cancel must be services-less — so it leaves the supplier staked, no longer unbonding, and serving nothing, with a transaction that succeeded silently. The operator must then send a second stake-supplier carrying the services. Automated top-ups signed with the operator key can no longer rescue a supplier force-unbonded by slashing.

Integrators: the service metadata field is renamed. Service.metadata's only field is now card, not experimental_api_specs. The field number is unchanged, so the wire format, the stored state and every hash are byte-identical — this is not a consensus change. But any client that reads the field by name must be updated.

Genesis is incompatible in both directions. A v0.1.34 export containing service metadata fails to load on v0.1.35 (experimental_api_specscard), and a v0.1.35 export fails to load on v0.1.34 (new compute_units_per_relay_history). This does not affect the in-place upgrade — only re-genesis, hard-fork restarts, genesis validate, and devnets seeded from an export.

Consensus-Breaking Changes

  1. Settlement budget redistribution + new overservicing_bonus_multiplier param (ships as an exact no-op at m = 1)
  2. compute_units_per_relay resolved at session-start height for claim validation AND settlement; new cupr history state
  3. compute_units_to_tokens_multiplier / compute_unit_cost_granularity resolved at session-start height for settlement pricing, matching x/proof
  4. Only the supplier owner may cancel an in-progress unstake
  5. Dead GetBlockHash reads removed from the claim/proof commit-height calculation (changes gas on MsgCreateClaim / MsgSubmitProof)
  6. x/shared params validation rejects an all-zero claim/proof window offset set that settlement cannot process
  7. MsgAddService preserves stored service metadata when the message omits it
  8. Gateway gains a metadata card + new MsgUpdateGatewayMetadata; gateway lifecycle events no longer embed the card
  9. A claim is no longer settled before its own proof window closes

Dependencies

Go 1.25.8 → 1.26.5. google.golang.org/grpc → v1.82.1, closing GHSA-hrxh-6v49-42gf (HIGH). ring-go → v0.2.0 — behaviourally neutral onchain (Verify byte-identical; all functional changes confined to the signing path the chain never executes).

📖 Full release notes: docs/release_notes_v0.1.35.md


What's Changed

Full Changelog: v0.1.34...v0.1.35