From 340553a4ccd68e632bcf00cbc3ef75580d130643 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Mon, 5 Oct 2026 15:58:18 +0000 Subject: [PATCH] Testnet seeds: debian-13 images (the PC build's glibc 2.39), a glibc check before the upload, the final genesis in docs/testnet/README.md Co-Authored-By: Claude Fable 5.1 --- docs/testnet/README.md | 25 +++++++++++++------------ infra/seed-nodes/config.sh | 5 ++++- infra/seed-nodes/provision-seed.sh | 8 ++++++++ 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/docs/testnet/README.md b/docs/testnet/README.md index a2fd00d31..3b66f41a1 100644 --- a/docs/testnet/README.md +++ b/docs/testnet/README.md @@ -7,7 +7,7 @@ branch `testnet-params` (worktree `vendor/igneum-node-testnet`, forked from `fin merged on 5 October 2026 into the fork's `release-0.3.6` (worktree `vendor/igneum-node-036`), with one change the sign-off added: the devnet and the simnet keep the prototype fee set until a height switch (`fees_v1_activation_daa`) or a `fees` object in the override file moves them; the testnet and the mainnet carry -calibrated v1 from genesis (section 3). Nothing is deployed; the testnet has no seed nodes yet (section 5). +calibrated v1 from genesis (section 3). The three seed nodes went up on 5 October 2026 from the final genesis below (`docs/plans/testnet-go.md`); nothing mines until the owner's go. ## 1. Identity @@ -21,13 +21,14 @@ calibrated v1 from genesis (section 3). Nothing is deployed; the testnet has no | P2P port | 26611 | 26811 | `network.rs`, `default_p2p_port` (a later suffix takes the next port) | | wRPC Borsh, JSON | 27610, 28610 | 27810, 28810 | `network.rs` | | EVM JSON-RPC port | 26790 | 26890 | `igneum/exec/src/config.rs`, `default_evm_rpc_port` | -| DNS seeders | none | none (the list is filled when the seed nodes exist, `docs/plans/seed-nodes.md`) | `TESTNET_PARAMS.dns_seeders` | +| DNS seeders | none | `seed1.testnet.igneum.network`, `seed2.testnet.igneum.network`, `seed3.testnet.igneum.network` (A records on deSEC, `infra/seed-nodes/dns.sh`; Nuremberg, Ashburn, Singapore) | `TESTNET_PARAMS.dns_seeders` | | Override file (`--override-params-file`) | allowed | refused, as on mainnet | `kaspad/src/daemon.rs` | | `IGNEUM_POW_*` environment | ignored by the node from this branch (G12: the params' schedule is installed on every start) | ignored | `kaspad/src/daemon.rs` | -Start a node on it: `igneumd --testnet --netsuffix 1` (the flag `--testnet` is "Use the Igneum test network"; -`--netsuffix` defaults to 10 in `kaspad/src/args.rs` and must be set to 1 until the default is changed, which is -one line and waits for the sign-off). +Start a node on it: `igneumd --testnet` (the flag `--testnet` is "Use the Igneum test network"; `--netsuffix` +defaults to 1 in `kaspad/src/args.rs` since 5 October 2026, so `--netsuffix=1` is implied). The public JSON-RPC is +`https://rpc.testnet.igneum.network` (seed1, nginx with TLS and a rate limit, an allowlist of `eth_*` and `igneum_*` +read methods plus `eth_sendRawTransaction`; `infra/seed-nodes/rpc/`). ## 2. Genesis @@ -37,9 +38,9 @@ one line and waits for the sign-off). | Bits | `0x1d100000` (2^28 expected hashes per block) | the devnet's launch difficulty, sized for a few hundred MH/s; the DAA takes over after 150 samples (600 blocks); re-size to the announced launch fleet | | Nonce, DAA score | 0, 0 | | | UTXO commitment | empty | | -| Coinbase payload message | `igneum-testnet-1 \| 2026-10-05 \| proposed, not final \| coins here have no value \| resets are announced` | after the OP-FALSE script, as the devnet's `igneum-devnet`. The words "proposed, not final" are the proposal's and are part of the hashed genesis; the sign-off adopted the genesis as computed. Changing the message is one `print_genesis_hashes` run and a new hash, and must happen before the first public node starts, never after (`docs/plans/release-0.3.6.md`, section 6) | -| Hash | `52a3e6a9ddd79d603ff9e3a27487fb5d0ca5ca6f633fe20ca727e1faa355fc7e` | computed 4 October 2026 by `print_genesis_hashes` on the branch (pinned by `test_genesis_hashes`, re-run green on `release-0.3.6` on 5 October 2026); changes with any field above | -| Merkle root | `3060aab78494de3cbda68619c0132300aa486dc3153dbb78b50a430f053b3a84` | same | +| Coinbase payload message | `igneum-testnet-1 \| 2026-10-05 \| coins here have no value \| resets are announced` | after the OP-FALSE script, as the devnet's `igneum-devnet`. FINAL 5 October 2026 (fork branch `testnet-infra`, 1c19441d): the proposal's "proposed, not final" was dropped before the first public node started, as `docs/plans/release-0.3.6.md` section 6 required. The message never changes again on `igneum-testnet-1` | +| Hash | `87617621714af1bf33bd17f291f90a7e0bff760a669bba53083ea8c0f7cbd840` | computed 5 October 2026 by `print_genesis_hashes` (two runs: the merkle root first, then the header hash over it), pinned by `test_genesis_hashes` and `igneum_testnet_identity`; the three seeds started from it at height 0 the same day. The proposal's hash `52a3e6a9...` is void | +| Merkle root | `44acfc40b1c6647011510f3c39ddb7606f979df92ad26a2914de56e44610efad` | same | ## 3. Consensus parameters @@ -74,10 +75,10 @@ Everything else (mass limits, GHOSTDAG k, merge depth, pruning) is the devnet's | Item | State | |---|---| | Sign-off of every value above | done: adopted by the owner on 5 October 2026, as proposed | -| `--netsuffix` default 1 under `--testnet` | one line in `kaspad/src/args.rs`, still to do (not in the 0.3.6 merge; `--netsuffix 1` must be passed until then) | -| Seed nodes and the DNS seeder list | `docs/plans/seed-nodes.md`; the list in `TESTNET_PARAMS` is empty on purpose | -| The public RPC and explorer | `site/wallet.html` carries a placeholder RPC URL until they exist | +| `--netsuffix` default 1 under `--testnet` | done 5 October 2026 (fork `testnet-infra` 1c19441d) | +| Seed nodes and the DNS seeder list | done 5 October 2026: three Hetzner seeds (`infra/seed-nodes/seeds-testnet.tsv`), the three names in `TESTNET_PARAMS.dns_seeders`; `docs/plans/testnet-go.md` | +| The public RPC and explorer | the RPC is `https://rpc.testnet.igneum.network` (5 October 2026); the explorer is not built | | The prover's table mirror and fixtures | `docs/analysis/base-fee-floor.md` section 4 | -| The app's testnet build | the app's packaged config names the network; `igneum-testnet-1` needs the network and ports there (`app/igneum-app/src/config.rs`, `Runtime.network`) | +| The app's testnet build | branch `testnet-app` (5 October 2026): the packaged file's `network`, `peers`, `public_rpc`; the testnet's ports, seeds and node directory in `app/igneum-app/src/config.rs`; the release engineer cuts 0.4.0 from it at go | | The params digest in the handshake (X18) | separate work, before the testnet | | Terms on the download page | `site/index.html#testnet-terms`, on branch `testnet-prep` with this file | diff --git a/infra/seed-nodes/config.sh b/infra/seed-nodes/config.sh index e43afae10..c6774ad64 100755 --- a/infra/seed-nodes/config.sh +++ b/infra/seed-nodes/config.sh @@ -11,7 +11,10 @@ SEED_TYPE="${SEED_TYPE:-cx23}" # 2 shared Intel vCPU, 4 GB, 40 GB # node keeps up to four 256 MiB lottery caches (M15 cap) beside rocksdb, and the on-VM # build wants 4 GB plus swap. US seeds: cpx11 (2 GB) or cpx21; Singapore: cpx22 (30.99). SEED_LOCATION="${SEED_LOCATION:-fsn1}" # fsn1 Falkenstein, nbg1 Nuremberg, hel1, ash, hil, sin -IMAGE="${IMAGE:-debian-12}" +IMAGE="${IMAGE:-debian-13}" # debian-13 (glibc 2.41) since 5 October 2026: the PC build job's Linux binaries come from + # WSL2 Ubuntu 24.04 and want glibc 2.38/2.39, which debian-12 (2.36) refuses ("GLIBC_2.38 + # not found" on the first testnet provision). The devnet seed stays on debian-12 with the + # Mac's zig cross-build (glibc 2.36). Rebuild: hcloud server rebuild --image debian-13. DO_SIZE="${DO_SIZE:-s-2vcpu-4gb}" DO_REGION="${DO_REGION:-fra1}" DO_IMAGE="${DO_IMAGE:-debian-12-x64}" diff --git a/infra/seed-nodes/provision-seed.sh b/infra/seed-nodes/provision-seed.sh index 20b4f5917..fc3881268 100755 --- a/infra/seed-nodes/provision-seed.sh +++ b/infra/seed-nodes/provision-seed.sh @@ -20,6 +20,14 @@ if [ "$BUILD_WHERE" = bin ] || [ "$BUILD_WHERE" = cross ]; then bindir="$CD/build/bin"; [ "$BUILD_WHERE" = cross ] && bindir="$REPO/infra/cross/out"; bindir="${BIN_DIR:-$bindir}" [ -x "$bindir/igneumd" ] || die "no $bindir/igneumd (run ../cloud-devnet/provision.sh build, infra/cross/build-linux.sh or a Linux build job)" file "$bindir/igneumd" | grep -q "x86-64" || die "$bindir/igneumd is not an x86-64 binary" + # the glibc the binary wants against the one the seed has (the class of the 5 October 2026 failure: a PC-built binary + # on debian-12); both printed, the upload refused when the binary asks for more than the seed can give + want=$(strings -a "$bindir/igneumd" 2>/dev/null | grep -o 'GLIBC_2\.[0-9]*' | sort -t. -k2 -n | tail -1 | cut -d_ -f2) + have=$(sssh "$ip" 'ldd --version 2>/dev/null | head -1 | grep -o "[0-9]*\.[0-9]*$"' || echo 0) + log "glibc: binary wants ${want:-?}, $name has ${have:-?}" + if [ -n "$want" ] && [ -n "$have" ] && [ "$(printf '%s\n%s\n' "$want" "$have" | sort -t. -k2 -n | tail -1)" != "$have" ]; then + die "$bindir/igneumd needs glibc $want, $name has $have (rebuild the seed on debian-13, or cross-build with infra/cross/build-linux.sh)" + fi log "uploading prebuilt binaries from $bindir ($(sha256sum "$bindir/igneumd" 2>/dev/null || shasum -a 256 "$bindir/igneumd" | cut -c1-16))" sssh "$ip" 'mkdir -p /opt/igneum/bin' sscp "$bindir/igneumd" "$bindir/igneum-miner" "$SSH_USER@$ip:/opt/igneum/bin/"