Skip to content

WIP feat(deployments): gnoland-1.x hardfork content#5376

Open
moul wants to merge 6 commits into
chain/gnoland1from
feat/chain-id-gnoland-1
Open

WIP feat(deployments): gnoland-1.x hardfork content#5376
moul wants to merge 6 commits into
chain/gnoland1from
feat/chain-id-gnoland-1

Conversation

@moul
Copy link
Copy Markdown
Member

@moul moul commented Mar 27, 2026

Summary

Prepares the repo for the `gnoland1` → `gnoland-1` hard fork.

  • New `misc/deployments/gnoland-1/` directory with chain config, GovDAO scripts, and migration script stub
  • `docs/resources/gnoland-networks.md` table updated to show `gnoland-1` as the Betanet chain ID (this is the hardfork branch — the table reflects the post-fork state)

Target branch: `chain/gnoland1` — this PR is rebased onto the chain release branch, not master.

PRs bundled in this hard fork binary

PR Description Status
#5334 `halt_height` config field ✅ merged
#5293 Namereg GovDAO whitelist ✅ merged
#5375 New govdao-scripts ✅ merged
#5368 GovDAO-based halt height via r/sys/params ⏳ awaiting reviews (changes requested)

Valoper fee = 0: Set via a GovDAO transaction on gnoland1 (not a code change); preserved in genesis replay.

Not confirmed (need explicit sign-off from Jae): #5291, #5289, #5274 (gas params)

Upgrade approach: Scenario A — genesis tx-replay

Agreed with Jae. The new `gnoland-1` chain is bootstrapped from a genesis that embeds all historical txs from `gnoland1` with original block heights and timestamps preserved:

  • `tx-archive backup` exports all successful txs with metadata (height, timestamp, chain_id)
  • `tx-archive genesis-assemble` produces `genesis.json` for `gnoland-1`
  • New chain starts at `initial_height = halt_height + 1`
  • `GnoGenesisState.OriginalChainID = "gnoland1"` enables signature verification of historical txs

The big TODO: migration script

`misc/deployments/gnoland-1/migrate-from-gnoland1.sh` is a placeholder. It exits with an error until implemented.

Blockers:

Changes

File Change
`misc/deployments/gnoland-1/migrate-from-gnoland1.sh` Placeholder with Scenario A approach documented
`misc/deployments/gnoland-1/config.toml` gnoland1 config with `meter_name=gnoland-1`, peer/seeds reset
`misc/deployments/gnoland-1/govdao-scripts/*.sh` Same as gnoland1 scripts with `CHAIN_ID=gnoland-1`
`misc/deployments/gnoland-1/README.md` Upgrade workflow + blockers
`docs/resources/gnoland-networks.md` Table: `gnoland-1` as Betanet chain ID (post-fork state)

Related PRs

[bot] This PR description was updated by an AI agent.

@Gno2D2
Copy link
Copy Markdown
Collaborator

Gno2D2 commented Mar 27, 2026

🛠 PR Checks Summary

All Automated Checks passed. ✅

Manual Checks (for Reviewers):
  • IGNORE the bot requirements for this PR (force green CI check)
Read More

🤖 This bot helps streamline PR reviews by verifying automated checks and providing guidance for contributors and reviewers.

✅ Automated Checks (for Contributors):

No automated checks match this pull request.

☑️ Contributor Actions:
  1. Fix any issues flagged by automated checks.
  2. Follow the Contributor Checklist to ensure your PR is ready for review.
    • Add new tests, or document why they are unnecessary.
    • Provide clear examples/screenshots, if necessary.
    • Update documentation, if required.
    • Ensure no breaking changes, or include BREAKING CHANGE notes.
    • Link related issues/PRs, where applicable.
☑️ Reviewer Actions:
  1. Complete manual checks for the PR, including the guidelines and additional checks if applicable.
📚 Resources:
Debug
Manual Checks
**IGNORE** the bot requirements for this PR (force green CI check)

If

🟢 Condition met
└── 🟢 On every pull request

Can be checked by

  • Any user with comment edit permission

@moul moul marked this pull request as draft April 3, 2026 14:46
moul added a commit that referenced this pull request Apr 7, 2026
…es (#5334)

## Summary

Adds a halt height mechanism for coordinated chain upgrades. The node
stops after committing the specified block height.

### How to set it

```bash
gnoland config set halt_height 352922
```

Or edit `config.toml` directly:
```toml
halt_height = 352922
```

### How it works

1. After `finalizeCommit`, consensus checks if `height >= halt_height`
2. If so, calls `osm.Kill()` for a graceful shutdown
3. The check is at the consensus level (not ABCI), following the same
pattern as `WithEarlyStart`

### Scope and future direction

This is a **temporary coordination tool** for the current chain upgrade.
For the gnoland1 → gnoland-1 hard fork, validators set `halt_height` in
their config, all nodes stop at the same block, then validators swap
binary + config and restart.

After the upgrade, the proper mechanism will be **GovDAO-based halting**
(#5368), which adds:
- On-chain `halt_height` param set via governance proposal (no manual
config needed)
- `halt_min_version` — prevents old binaries from restarting after halt
- Version guard at startup so validators can't accidentally run the
wrong binary

Once #5368 is merged and active, `halt_height` in config becomes a
**node operator tool** (e.g., "stop my node at height X for
maintenance") rather than a coordination mechanism. Coordination should
happen through governance.

### No CLI flag — config only

Per @tbruyelle's suggestion, there's no `--halt-height` CLI flag. Config
file is the single source of truth. This avoids the risk of validators
missing the flag in duplicated command setups across their
infrastructure.

### Related

- #5368 — GovDAO-based halt height + version guard (Phase 2, replaces
this for coordination)
- #5376 — gnoland-1 chain config
- #5411 — chain upgrade genesis replay

<details>
<summary>Contributors' checklist</summary>

- [x] Added new tests, or not needed, or not feasible
- [x] Provided an example (e.g. screenshot) to aid review or the PR is
self-explanatory
- [x] Updated the official documentation or not needed
- [x] No breaking changes were made, or a `BREAKING CHANGE: xxx` message
was included in the description
- [x] Added `benchmarks` label to the PR or not needed
</details>
moul added a commit that referenced this pull request Apr 7, 2026
…es (#5334)

## Summary

Adds a halt height mechanism for coordinated chain upgrades. The node
stops after committing the specified block height.

### How to set it

```bash
gnoland config set halt_height 352922
```

Or edit `config.toml` directly:
```toml
halt_height = 352922
```

### How it works

1. After `finalizeCommit`, consensus checks if `height >= halt_height`
2. If so, calls `osm.Kill()` for a graceful shutdown
3. The check is at the consensus level (not ABCI), following the same
pattern as `WithEarlyStart`

### Scope and future direction

This is a **temporary coordination tool** for the current chain upgrade.
For the gnoland1 → gnoland-1 hard fork, validators set `halt_height` in
their config, all nodes stop at the same block, then validators swap
binary + config and restart.

After the upgrade, the proper mechanism will be **GovDAO-based halting**
(#5368), which adds:
- On-chain `halt_height` param set via governance proposal (no manual
config needed)
- `halt_min_version` — prevents old binaries from restarting after halt
- Version guard at startup so validators can't accidentally run the
wrong binary

Once #5368 is merged and active, `halt_height` in config becomes a
**node operator tool** (e.g., "stop my node at height X for
maintenance") rather than a coordination mechanism. Coordination should
happen through governance.

### No CLI flag — config only

Per @tbruyelle's suggestion, there's no `--halt-height` CLI flag. Config
file is the single source of truth. This avoids the risk of validators
missing the flag in duplicated command setups across their
infrastructure.

### Related

- #5368 — GovDAO-based halt height + version guard (Phase 2, replaces
this for coordination)
- #5376 — gnoland-1 chain config
- #5411 — chain upgrade genesis replay

<details>
<summary>Contributors' checklist</summary>

- [x] Added new tests, or not needed, or not feasible
- [x] Provided an example (e.g. screenshot) to aid review or the PR is
self-explanatory
- [x] Updated the official documentation or not needed
- [x] No breaking changes were made, or a `BREAKING CHANGE: xxx` message
was included in the description
- [x] Added `benchmarks` label to the PR or not needed
</details>
@moul moul changed the title feat(deployments): add gnoland-1 chain config and migration script stub feat(deployments): gnoland-1.x hardfork content Apr 8, 2026
@moul moul changed the base branch from master to chain/gnoland1 April 8, 2026 17:17
Prepares the repository for the gnoland1 → gnoland-1 hard fork:

- Add misc/deployments/gnoland-1/ with:
  - migrate-from-gnoland1.sh: placeholder with a detailed TODO covering
    halt verification, state export, migration transforms (r/sys/params,
    r/gnops/valopers, namereg, gas params), genesis assembly, verification,
    and restart coordination. Exits with an error until implemented.
  - config.toml: copy of gnoland1 config with meter_name=gnoland-1 and
    peer/seed addresses reset (to be filled post-fork).
  - govdao-scripts/: copies of gnoland1 scripts with CHAIN_ID=gnoland-1.
  - README.md: upgrade workflow, what changed, and ⚠️ migration TODO warning.

- Update docs:
  - docs/resources/gnoland-networks.md: Betanet chain ID gnoland1 → gnoland-1
  - docs/resources/gas-fees.md: update --chainid example
  - docs/users/explore-with-gnoweb.md: update Betanet chain ID reference

The migration script is the critical missing piece — the hard fork cannot
happen until it is written and dry-run on test12.

Generated with [Claude Code](https://claude.com/claude-code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
@moul moul force-pushed the feat/chain-id-gnoland-1 branch from cb42f2b to edfc584 Compare April 8, 2026 17:19
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 8, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

aeddi pushed a commit that referenced this pull request Apr 9, 2026
…es (#5334)

## Summary

Adds a halt height mechanism for coordinated chain upgrades. The node
stops after committing the specified block height.

### How to set it

```bash
gnoland config set halt_height 352922
```

Or edit `config.toml` directly:
```toml
halt_height = 352922
```

### How it works

1. After `finalizeCommit`, consensus checks if `height >= halt_height`
2. If so, calls `osm.Kill()` for a graceful shutdown
3. The check is at the consensus level (not ABCI), following the same
pattern as `WithEarlyStart`

### Scope and future direction

This is a **temporary coordination tool** for the current chain upgrade.
For the gnoland1 → gnoland-1 hard fork, validators set `halt_height` in
their config, all nodes stop at the same block, then validators swap
binary + config and restart.

After the upgrade, the proper mechanism will be **GovDAO-based halting**
(#5368), which adds:
- On-chain `halt_height` param set via governance proposal (no manual
config needed)
- `halt_min_version` — prevents old binaries from restarting after halt
- Version guard at startup so validators can't accidentally run the
wrong binary

Once #5368 is merged and active, `halt_height` in config becomes a
**node operator tool** (e.g., "stop my node at height X for
maintenance") rather than a coordination mechanism. Coordination should
happen through governance.

### No CLI flag — config only

Per @tbruyelle's suggestion, there's no `--halt-height` CLI flag. Config
file is the single source of truth. This avoids the risk of validators
missing the flag in duplicated command setups across their
infrastructure.

### Related

- #5368 — GovDAO-based halt height + version guard (Phase 2, replaces
this for coordination)
- #5376 — gnoland-1 chain config
- #5411 — chain upgrade genesis replay

<details>
<summary>Contributors' checklist</summary>

- [x] Added new tests, or not needed, or not feasible
- [x] Provided an example (e.g. screenshot) to aid review or the PR is
self-explanatory
- [x] Updated the official documentation or not needed
- [x] No breaking changes were made, or a `BREAKING CHANGE: xxx` message
was included in the description
- [x] Added `benchmarks` label to the PR or not needed
</details>
moul added 4 commits April 9, 2026 16:11
- Revert premature doc references to gnoland-1 chain ID in gas-fees.md
  and explore-with-gnoweb.md (hardfork hasn't happened yet)
- Remove premature "Note" callout from gnoland-networks.md
- Update migrate-from-gnoland1.sh: reflect Scenario A decision (genesis
  tx-replay with InitialHeight), document blockers (#5411, #5390,
  Jae's InitialHeight tm2 work), reference issue #5374 for tracking
- Update gnoland-1/README.md: reflect correct PR merge status, document
  Scenario A approach, list migration blockers explicitly
PR #5373 (valoper fee script) was closed without merging. The valoper
registration fee was already set to 0 via a GovDAO transaction on gnoland1,
so no code change is needed — the state is preserved in genesis replay.
- Fix comment headers: 'gnoland1' → 'gnoland-1' in add-validator.sh and rm-validator.sh
- Fix stale REMOTE default comment: 127.0.0.1:26657 → betanet endpoint
…m-valopers.sh

Comment said 10000000 but actual default was already 50000000.
@moul moul changed the title feat(deployments): gnoland-1.x hardfork content WIP feat(deployments): gnoland-1.x hardfork content Apr 9, 2026
@moul moul marked this pull request as ready for review April 9, 2026 15:31
@moul moul linked an issue Apr 9, 2026 that may be closed by this pull request
21 tasks
moul added a commit that referenced this pull request Apr 13, 2026
…5470)

Improves the network table in `docs/resources/gnoland-networks.md`:
- Wider column formatting for readability
- Labels Betanet as `(current)` to make it clear it is the live network

Part of the gnoland-1 hard fork prep work (#5376), extracted
so it can merge independently.
moul added a commit to moul/gno that referenced this pull request Apr 13, 2026
# Conflicts:
#	.github/workflows/examples.yml
#	docs/resources/gnoland-networks.md
#	misc/deployments/gnoland1/govdao-scripts/README.md
#	misc/deployments/gnoland1/govdao-scripts/unrestrict-account.sh
moul added a commit to moul/gno that referenced this pull request Apr 13, 2026
Adds misc/hf-glue/: a throwaway testbed that chains the tools from gnolang#5411
and gnolang#5376 to run a local, single-validator hardforked chain in docker,
with state persisted on disk.

Flow:
  make fetch   # hardfork genesis --source rpc.gno.land -> out/genesis.json
  make init    # gnoland secrets init + rewrite validator set to our key
  make up      # docker compose up: single-validator gnoland node, RPC :26657

This exists only to find gaps in gnolang#5411/gnolang#5376 end-to-end. Do NOT merge.
Fixes go back upstream.
moul added a commit to moul/gno that referenced this pull request Apr 16, 2026
Adds misc/hf-glue/: a throwaway testbed that chains the tools from gnolang#5411
and gnolang#5376 to run a local, single-validator hardforked chain in docker,
with state persisted on disk.

Flow:
  make fetch   # hardfork genesis --source rpc.gno.land -> out/genesis.json
  make init    # gnoland secrets init + rewrite validator set to our key
  make up      # docker compose up: single-validator gnoland node, RPC :26657

This exists only to find gaps in gnolang#5411/gnolang#5376 end-to-end. Do NOT merge.
Fixes go back upstream.
moul added a commit to moul/gno that referenced this pull request Apr 19, 2026
- docs/MANIFESTO.md: restore original jaekwon/ephesus URL (upstream is
  back online; wayback redirect no longer needed)
- misc/docs/tools/linter/urls.go: drop archive.org skip — it was a
  workaround for the MANIFESTO URL flake that is now resolved

Leaving gnoland-networks.md etc. untouched (those came in via the
gnolang#5376 / gnolang#5511 merges and are intentional).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📖 documentation Improvements or additions to documentation 🐳 devops

Projects

Status: 📥 Inbox
Status: No status

Development

Successfully merging this pull request may close these issues.

meta: chain hardfork

3 participants