From 85f335dd416b3f3cd4723346c3f4becb7a770933 Mon Sep 17 00:00:00 2001 From: POPPIN-FUMI Date: Sat, 6 Jun 2026 19:51:14 +0900 Subject: [PATCH 1/2] fix(rpc): gate testnet-rpc expected-bank-hash; template hardcoded shred-version testnet-rpc/start-validator.sh.j2 emitted `--expected-bank-hash ` and a hardcoded `--expected-shred-version 57087` unconditionally. The bank hash is a coordinated-cluster-restart parameter; carrying a stale value into a normal restart can hang the node or fail with a bank-hash mismatch (same class of bug already fixed for the testnet *validator* templates in #402). Now: - expected-shred-version is templated with a default (overridable per host) - expected-bank-hash is gated behind `is defined` (emitted only when set) Also template the hardcoded `--expected-shred-version 50093` in the mainnet-rpc (index/grpc/tx/main + start-validator) and mainnet-validator start scripts so the shred version is overridable; the default preserves current behavior. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../jinja/mainnet-rpc/start-mainnet-rpc-grpc.sh.j2 | 2 +- .../jinja/mainnet-rpc/start-mainnet-rpc-index.sh.j2 | 2 +- .../jinja/mainnet-rpc/start-mainnet-rpc-tx.sh.j2 | 2 +- .../2026.6.6.1502/jinja/mainnet-rpc/start-mainnet-rpc.sh.j2 | 2 +- .../2026.6.6.1502/jinja/mainnet-rpc/start-validator.sh.j2 | 2 +- .../jinja/mainnet-validator/start-validator.sh.j2 | 2 +- .../2026.6.6.1502/jinja/testnet-rpc/start-validator.sh.j2 | 6 ++++-- 7 files changed, 10 insertions(+), 8 deletions(-) diff --git a/template/2026.6.6.1502/jinja/mainnet-rpc/start-mainnet-rpc-grpc.sh.j2 b/template/2026.6.6.1502/jinja/mainnet-rpc/start-mainnet-rpc-grpc.sh.j2 index 35a21c07..162b9893 100644 --- a/template/2026.6.6.1502/jinja/mainnet-rpc/start-mainnet-rpc-grpc.sh.j2 +++ b/template/2026.6.6.1502/jinja/mainnet-rpc/start-mainnet-rpc-grpc.sh.j2 @@ -15,7 +15,7 @@ exec agave-validator \ --known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \ --known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \ --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \ ---expected-shred-version 50093 \ +--expected-shred-version {{ expected_shred_version | default("50093") }} \ --only-known-rpc \ --no-voting \ --private-rpc \ diff --git a/template/2026.6.6.1502/jinja/mainnet-rpc/start-mainnet-rpc-index.sh.j2 b/template/2026.6.6.1502/jinja/mainnet-rpc/start-mainnet-rpc-index.sh.j2 index 90357725..a15176e9 100644 --- a/template/2026.6.6.1502/jinja/mainnet-rpc/start-mainnet-rpc-index.sh.j2 +++ b/template/2026.6.6.1502/jinja/mainnet-rpc/start-mainnet-rpc-index.sh.j2 @@ -15,7 +15,7 @@ exec agave-validator \ --known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \ --known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \ --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \ ---expected-shred-version 50093 \ +--expected-shred-version {{ expected_shred_version | default("50093") }} \ --only-known-rpc \ --full-rpc-api \ --no-voting \ diff --git a/template/2026.6.6.1502/jinja/mainnet-rpc/start-mainnet-rpc-tx.sh.j2 b/template/2026.6.6.1502/jinja/mainnet-rpc/start-mainnet-rpc-tx.sh.j2 index 54a53fb2..73eaba25 100644 --- a/template/2026.6.6.1502/jinja/mainnet-rpc/start-mainnet-rpc-tx.sh.j2 +++ b/template/2026.6.6.1502/jinja/mainnet-rpc/start-mainnet-rpc-tx.sh.j2 @@ -15,7 +15,7 @@ exec agave-validator \ --known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \ --known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \ --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \ ---expected-shred-version 50093 \ +--expected-shred-version {{ expected_shred_version | default("50093") }} \ --only-known-rpc \ --full-rpc-api \ --no-voting \ diff --git a/template/2026.6.6.1502/jinja/mainnet-rpc/start-mainnet-rpc.sh.j2 b/template/2026.6.6.1502/jinja/mainnet-rpc/start-mainnet-rpc.sh.j2 index 63f4c8f1..33780d8c 100644 --- a/template/2026.6.6.1502/jinja/mainnet-rpc/start-mainnet-rpc.sh.j2 +++ b/template/2026.6.6.1502/jinja/mainnet-rpc/start-mainnet-rpc.sh.j2 @@ -15,7 +15,7 @@ exec agave-validator \ --known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \ --known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \ --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \ ---expected-shred-version 50093 \ +--expected-shred-version {{ expected_shred_version | default("50093") }} \ --only-known-rpc \ --full-rpc-api \ --no-voting \ diff --git a/template/2026.6.6.1502/jinja/mainnet-rpc/start-validator.sh.j2 b/template/2026.6.6.1502/jinja/mainnet-rpc/start-validator.sh.j2 index c3361df3..dc58e224 100644 --- a/template/2026.6.6.1502/jinja/mainnet-rpc/start-validator.sh.j2 +++ b/template/2026.6.6.1502/jinja/mainnet-rpc/start-validator.sh.j2 @@ -16,7 +16,7 @@ exec agave-validator \ --known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \ --only-known-rpc \ --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \ ---expected-shred-version 50093 \ +--expected-shred-version {{ expected_shred_version | default("50093") }} \ --dynamic-port-range {{ dynamic_port_range | default("8900-8930") }} \ --no-voting \ --rpc-port {{ port_rpc | default(8899, true) }} \ diff --git a/template/2026.6.6.1502/jinja/mainnet-validator/start-validator.sh.j2 b/template/2026.6.6.1502/jinja/mainnet-validator/start-validator.sh.j2 index 3c04e007..fb4e319c 100644 --- a/template/2026.6.6.1502/jinja/mainnet-validator/start-validator.sh.j2 +++ b/template/2026.6.6.1502/jinja/mainnet-validator/start-validator.sh.j2 @@ -17,7 +17,7 @@ exec agave-validator \ --known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \ --only-known-rpc \ --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \ ---expected-shred-version 50093 \ +--expected-shred-version {{ expected_shred_version | default("50093") }} \ --dynamic-port-range {{ dynamic_port_range | default("8000-8030") }} \ --rpc-port {{ port_rpc | default(8899, true) }} \ --wal-recovery-mode skip_any_corrupted_record \ diff --git a/template/2026.6.6.1502/jinja/testnet-rpc/start-validator.sh.j2 b/template/2026.6.6.1502/jinja/testnet-rpc/start-validator.sh.j2 index e02691e2..0679c9c9 100644 --- a/template/2026.6.6.1502/jinja/testnet-rpc/start-validator.sh.j2 +++ b/template/2026.6.6.1502/jinja/testnet-rpc/start-validator.sh.j2 @@ -20,8 +20,10 @@ exec agave-validator \ --full-rpc-api \ --rpc-port {{ port_rpc | default(8899, true) }} \ --wal-recovery-mode skip_any_corrupted_record \ ---expected-shred-version 57087 \ ---expected-bank-hash YFxSkDcvSPiA7EQpSTbCsWbJvNYMAsWXGvwGc3bXHEA \ +--expected-shred-version {{ expected_shred_version | default("57087") }} \ +{% if expected_bank_hash is defined %} +--expected-bank-hash {{ expected_bank_hash }} \ +{% endif %} {% if rpc_type == 'Geyser gRPC' -%} --limit-ledger-size 50000000 \ --no-snapshot-fetch \ From 9d0f860198db6711dd18b212d9321098912aec12 Mon Sep 17 00:00:00 2001 From: POPPIN-FUMI Date: Sat, 6 Jun 2026 19:55:14 +0900 Subject: [PATCH 2/2] harden(rpc/validator): gate restart params on truthiness, not just is defined Review follow-up: `{% if x is defined %}` is true for a declared-but-empty var, and the example inventories document `expected_bank_hash: ""` / `wait_for_supermajority: ""` as the commented "unset" form. Uncommenting that would render `--expected-bank-hash ` (empty) and break the launch. Gate on `is defined and x` so empty-string/null also suppresses the flag. Applied to the new testnet-rpc gate and the existing testnet-validator gates. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../2026.6.6.1502/jinja/testnet-rpc/start-validator.sh.j2 | 2 +- .../jinja/testnet-validator/start-validator-agave.sh.j2 | 4 ++-- .../jinja/testnet-validator/start-validator-jito.sh.j2 | 4 ++-- .../jinja/testnet-validator/start-validator.sh.j2 | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/template/2026.6.6.1502/jinja/testnet-rpc/start-validator.sh.j2 b/template/2026.6.6.1502/jinja/testnet-rpc/start-validator.sh.j2 index 0679c9c9..5bb83e49 100644 --- a/template/2026.6.6.1502/jinja/testnet-rpc/start-validator.sh.j2 +++ b/template/2026.6.6.1502/jinja/testnet-rpc/start-validator.sh.j2 @@ -21,7 +21,7 @@ exec agave-validator \ --rpc-port {{ port_rpc | default(8899, true) }} \ --wal-recovery-mode skip_any_corrupted_record \ --expected-shred-version {{ expected_shred_version | default("57087") }} \ -{% if expected_bank_hash is defined %} +{% if expected_bank_hash is defined and expected_bank_hash %} --expected-bank-hash {{ expected_bank_hash }} \ {% endif %} {% if rpc_type == 'Geyser gRPC' -%} diff --git a/template/2026.6.6.1502/jinja/testnet-validator/start-validator-agave.sh.j2 b/template/2026.6.6.1502/jinja/testnet-validator/start-validator-agave.sh.j2 index f4cae196..de634f0e 100644 --- a/template/2026.6.6.1502/jinja/testnet-validator/start-validator-agave.sh.j2 +++ b/template/2026.6.6.1502/jinja/testnet-validator/start-validator-agave.sh.j2 @@ -14,11 +14,11 @@ exec agave-validator \ --dynamic-port-range {{ dynamic_port_range | default("8000-8030") }} \ --rpc-port {{ port_rpc | default(8899, true) }} \ --wal-recovery-mode skip_any_corrupted_record \ -{% if wait_for_supermajority is defined %} +{% if wait_for_supermajority is defined and wait_for_supermajority %} --wait-for-supermajority {{ wait_for_supermajority }} \ {% endif %} --expected-shred-version {{ expected_shred_version | default("57087") }} \ -{% if expected_bank_hash is defined %} +{% if expected_bank_hash is defined and expected_bank_hash %} --expected-bank-hash {{ expected_bank_hash }} \ {% endif %} --limit-ledger-size {{ limit_ledger_size | default(200000000) }} \ diff --git a/template/2026.6.6.1502/jinja/testnet-validator/start-validator-jito.sh.j2 b/template/2026.6.6.1502/jinja/testnet-validator/start-validator-jito.sh.j2 index 0ff3aa21..0b786266 100644 --- a/template/2026.6.6.1502/jinja/testnet-validator/start-validator-jito.sh.j2 +++ b/template/2026.6.6.1502/jinja/testnet-validator/start-validator-jito.sh.j2 @@ -14,11 +14,11 @@ exec agave-validator \ --dynamic-port-range {{ dynamic_port_range | default("8000-8030") }} \ --rpc-port {{ port_rpc | default(8899, true) }} \ --wal-recovery-mode skip_any_corrupted_record \ -{% if wait_for_supermajority is defined %} +{% if wait_for_supermajority is defined and wait_for_supermajority %} --wait-for-supermajority {{ wait_for_supermajority }} \ {% endif %} --expected-shred-version {{ expected_shred_version | default("57087") }} \ -{% if expected_bank_hash is defined %} +{% if expected_bank_hash is defined and expected_bank_hash %} --expected-bank-hash {{ expected_bank_hash }} \ {% endif %} --limit-ledger-size {{ limit_ledger_size | default(200000000) }} \ diff --git a/template/2026.6.6.1502/jinja/testnet-validator/start-validator.sh.j2 b/template/2026.6.6.1502/jinja/testnet-validator/start-validator.sh.j2 index 3a900c91..1fd10e6b 100644 --- a/template/2026.6.6.1502/jinja/testnet-validator/start-validator.sh.j2 +++ b/template/2026.6.6.1502/jinja/testnet-validator/start-validator.sh.j2 @@ -12,11 +12,11 @@ exec agave-validator \ --dynamic-port-range {{ dynamic_port_range | default("8000-8030") }} \ --rpc-port {{ port_rpc | default(8899, true) }} \ --wal-recovery-mode skip_any_corrupted_record \ -{% if wait_for_supermajority is defined %} +{% if wait_for_supermajority is defined and wait_for_supermajority %} --wait-for-supermajority {{ wait_for_supermajority }} \ {% endif %} --expected-shred-version {{ expected_shred_version | default(57087) }} \ -{% if expected_bank_hash is defined %} +{% if expected_bank_hash is defined and expected_bank_hash %} --expected-bank-hash {{ expected_bank_hash }} \ {% endif %} --limit-ledger-size {{ limit_ledger_size | default(200000000) }} \