
Upgrades halt by height, by governance vote
Governance upgrades and hard forks
A named plan stops the old binary, and the new one mounts the stores it adds.
You schedule an upgrade as a governance software-upgrade proposal naming a plan and a block height. At that height the running paxd writes data/upgrade-info.json and stops; the new binary reads it, mounts the stores that plan adds, and runs module migrations. Rehearse the whole halt and resume on a disposable single-validator fork of exported state first, and keep a rollback binary plus a data snapshot on every host.
What it does
Protocol upgrades on the Paxeer chain go through a governance software-upgrade proposal that names an upgrade and a block height. Each name embedded in node/tags gets a registered handler, 106 of them, the newest v6.6; when the plan height is reached the running binary writes data/upgrade-info.json and stops, and the new binary reads that file, mounts the module stores that the named plan adds, and runs module migrations. A rehearsal script reproduces the same halt and resume on a disposable single-validator fork built from a stopped node's exported state. A separate chain-scoped hard-fork manager is wired into BeginBlock for height-triggered handlers.
Key capabilities
- Registers an upgrade handler for each of the 106 names embedded in
node/tags, up tov6.6. - Mounts new module stores by plan name: the custody store at
v6.5, five stores atv6.6. - Runs module migrations for every registered upgrade; three upgrades also change a chain parameter.
- Computes the halt height from a measured block rate, submits the proposal, and confirms the scheduled plan.
- Rehearses the halt and the resume on a disposable single-validator fork of exported chain state.
- Executes height-triggered hard-fork handlers from
BeginBlock, filtered by chain identifier.
Who it's for
Validator and node operators upgrading paxd, and protocol engineers adding modules at a fork.
Why it matters
The stores a new module needs are added only by the governance plan, so an upgrade either takes effect on every node at the same height or does not take effect at all. The rehearsal script proves the new binary halts and resumes over real exported state before the live network stops, and the runbook keeps a rollback binary and a data snapshot on every host.
Differentiators
The store upgrade is selected by plan name, so one binary carries both the already-applied v6.5 store set and the pending v6.6 set and picks the one the upgrade file names. The rehearsal script rebuilds a single-validator chain from a stopped node's export, requires the old binary to halt with the UPGRADE NEEDED log line at exactly the plan height, checks that every added module reports a module version, calls a view on each of the five LayerX precompiles 0x1013 to 0x1017, and writes both binary hashes to rehearsal-result.env.
Outcomes
- Take an upgrade at the same height as every other node.
- Prove the halt and resume on exported state before the network stops.
- Track submission deadlines from a measured block rate, not a guess.
Technical notes
- The halt is scheduled by height only.
halt-timeandhalt-heightare both ruled out: only the governance plan makes the old binary writedata/upgrade-info.json, and only that file makes the new binary add the stores. A node stopped any other way comes back up without them. - Governance defaults in code: 48 h voting period, 24 h expedited; quorum 0.334, threshold 0.5, veto threshold 0.334; expedited quorum and threshold 0.667.
- Submission deadlines, with the default 1800 s margin: standard at
T_halt − 48 h − margin, expedited atT_halt − 24 h − margin. The block rate is re-measured 24 h out; if the projected time of the height has drifted more than 30 minutes the plan is cancelled and re-proposed, and the height is never edited on nodes. - Rollback requires every validator at once and is unsafe once any validator has signed the halt height on the new binary. The previous
libwasmvmstays installed because rollback needs it. - The rehearsal needs a spare machine and a copy of a full node's data taken while that node was stopped;
--checkvalidates flags and required tools without touching anything. - Only three upgrades do anything beyond migrations:
1.2.3betasets the community tax to zero,v6.0.2sets the minimum transactions in a block to 10, andv6.0.5sets max gas wanted to 50,000,000.1.2.3betais absent fromnode/tags, so that handler is never registered and its branch cannot run. - The hard-fork manager is constructed and called from
BeginBlock, but no handler is registered with it and the only chain identifier it defines ispax-hard-fork-test, so it has no effect on the live chain.
# dry run: prints every paxd command, both halt-height estimates and the submission deadlines
platform/hosted/paxeer/gov-upgrade.sh --rpc <rpc> --key <operator> --target-utc "$T_HALT_UTC" \
--upgrade-info '{"binaries":{"linux/amd64":"<release URL>?checksum=sha256:<sha256>"}}' \
--voter <operator-1> --voter <operator-2>
platform/hosted/paxeer/gov-upgrade.sh ... --execute # submit, vote, wait, confirm
paxd q upgrade plan --node <rpc> -o json # name v6.6, height HMore in Network
Build on Paxeer.
Give your agent a wallet, set its policy, and settle your first call on LayerX.