Skip to content

build(core): point the prod build at audius-mainnet-beta — *DO NOT MERGE* - #553

Open
rickyrombo wants to merge 1 commit into
mainfrom
mjp-new-network-binary
Open

build(core): point the prod build at audius-mainnet-beta — *DO NOT MERGE*#553
rickyrombo wants to merge 1 commit into
mainfrom
mjp-new-network-binary

Conversation

@rickyrombo

Copy link
Copy Markdown
Contributor

⛔ DO NOT MERGE

Genesis is compiled into the binary (//go:embed prod.json). Merging this and shipping it as stable is the mass migration — every node that pulls it leaves the current chain. This branch exists for the image CI builds from it, which the bootstrap nodes run during Runbook steps 4–10.

*DO NOT MERGE* sits at the end of the title because pr-title-lint requires a conventional-commit prefix; it would reject the marker up front.

What changed

pkg/core/config/genesis/prod.json — the verified 2026-08-25 artifact:

chain_id      audius-mainnet-beta
validators    1 @ power 100
app_state     genesis_migration_end_height: 5839

ProdPersistentPeers — the bootstrap alone:

c24b483eff203cf384be9e9abe6efa6c78dd8777@audius.rickyrombo.com:26656

The node key is the comet key (p2p.NodeKey{PrivKey: envConfig.CometKey}, setup.go:105), so a node's P2P id is its validator address. The bootstrap's id is therefore its genesis validator address, lowercased — derivable without the node running.

Two consequences worth stating plainly:

  • The bootstrap must not inherit a node_key.json from the writer output. The one sitting in the artifact (56e4f272…) belongs to the verification node, which generated it on first start. Seeding it would give the bootstrap a P2P identity unrelated to its delegate key and unrelated to this entry. Delete it and let the node derive its own.
  • v.audius.rickyrombo.com is a TODO. It does not exist yet, so its id cannot be known. Until it does, the second node reaches the network by dialling the first, and PEX propagates from there. This must be filled in before the fleet rolls (step 15).

ProdStateSyncRpcs — both bootstrap hosts. CometBFT refuses to state sync from fewer than two servers, so both must be serving before any node tries to join.

The test changes are the interesting part

Two existing guards failed, correctly:

TestProdPersistentPeersBroadAndParseable   "1" is not greater than or equal to "20"
                                           prod should not bootstrap from a tiny hub-only peer set
TestModuloPersistentPeers                  every eth address selects the same peer

Both assert properties of a mature network — many peers, and a per-node selection that keeps gossip off a single hub. Neither can hold for a chain with one node in it, which is what a chain being born is.

Rather than weaken them, they now step aside only when the embedded genesis has a single validator, and stay in force otherwise. Verified by swapping the nine-validator genesis back in: both fail again exactly as before. So the guard still protects the established network, and re-tightens on its own once validators register and the list is repopulated.

Not included

ProdPersistentPeers deliberately does not carry the old-network hosts. That means a node on this build does not dial the old chain at all — see Reference §5 in the runbook, which used to say otherwise and was corrected in #550.

DO NOT MERGE. Genesis is compiled in, so merging this and shipping it as stable
IS the mass migration -- every node that pulls it leaves the current chain.
The point is the image CI builds from the branch, which the bootstrap nodes run
during Runbook steps 4-10.

prod.json is the verified 2026-08-25 artifact: chain audius-mainnet-beta, one
validator at power 100, migration end height 5839.

ProdPersistentPeers is the bootstrap alone. The node key is the comet key
(setup.go:105), so a node's P2P id is its validator address -- the bootstrap's
id is its genesis validator address, lowercased. That also means the bootstrap
must not inherit a node_key.json from the writer output, or its id will not
match; the one in the artifact belongs to the verification node.
v.audius.rickyrombo.com is a TODO: it does not exist yet, and until it does the
second node reaches the network by dialling the first.

ProdStateSyncRpcs names both bootstrap hosts. CometBFT refuses to state sync
from fewer than two, so both must serve before any node joins.

The two prod peer-list guards assert properties of a mature network -- twenty
peers, and a per-node selection that avoids a gossip hub. Neither can hold for a
chain with one node. They now step aside only when the embedded genesis has a
single validator, and were confirmed to still fail against the nine-validator
genesis.
rickyrombo added a commit that referenced this pull request Aug 28, 2026
Every step that cannot be executed without a code change now names it, so the
dependency is visible where the work happens rather than only in a list at the
top: #553 for the binary (step 3), api#1029 for play routing (5 and 13), #551
before the fleet state syncs (10), api#1018 before flushing (11), api#1028 for
the indexer bounds (12).

Also records two things found while deriving the bootstrap's identity for #553:
the node key is the comet key, so a node's P2P id is its validator address and
the bootstrap's is derivable before it runs; and the bootstrap must not inherit
node_key.json from the writer output, or its id will not match the peer list.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant