@solval/vid
v0.1.0
Published
Transfer staked Solana validator identity between two nodes safely.
Maintainers
Readme
Solana Validator Identity Transfer Tool
Безпечно переносить identity активного Solana-валідатора між двома вузлами, без даунтайму голосування.
Для англомовної версії див. README.md.
Чому це не тривіально
Identity валідатора — це лише keypair. Якщо одночасно дві машини голосують з одним і тим самим pubkey, протокол вас слешить. Канонічна процедура (mvines demo / Pumpkin's Pool runbook) дає чотири послідовні кроки, які гарантують, що staked identity у будь-який момент часу або голосує лише на одній машині, або не голосує ніде.
Цей тул автоматизує саме цю процедуру і додає preflight-чеки, audit log у форматі JSONL, та auto-rollback, якщо нова нода не встигає наздогнати кластер.
Установка
npm i -g @solval/vid
vid --helpАбо з клона:
git clone https://github.com/PavloDereniuk/Solana-Validator-Identity-Transfer-Tool.git
cd Solana-Validator-Identity-Transfer-Tool
npm i && npm run build
node dist/cli.js --helpПотрібен Node 20+.
Швидкий старт
vid init # інтерактивний майстер конфіга
vid preflight --config swap-config.json
vid swap --config swap-config.json [--dry-run] [--tui]
vid status -H host -k path/to/keyvid init проводить вас через обидві ноди, питає шляхи до keypair'ів та
(опційно) робить SSH-пробу обох сторін перед тим як записати
swap-config.json.
vid swap --dry-run друкує точні shell-команди, які був би виконав
справжній свап, з реальними шляхами і resolved staked pubkey. Жодного
state'у валідатора не змінює — це безпечно запускати на live-mainnet
ноді.
vid swap --tui запускає весь свап у вбудованому ink-дашборді: дві бічні
панелі для primary/secondary з опитуванням identity та slot кожні 5
секунд, прогрес кроків і live tail аудит-логу.
Що робить swap
Чотири кроки, у такому порядку:
wait-for-restart-windowна джерелі — чекаємо безпечне вікно (не leader, немає pending fork).set-identityна unstaked junk-ключ на джерелі. Тепер staked identity нікуди не голосує — це той єдиний неминучий розрив.- Передаємо
tower-1_9-{pubkey}.binз ledger джерела на ledger призначення (через base64 над exec-каналом). set-identity --require-tower {staked-keypair}на призначенні. Прапор--require-tower— це остання лінія оборони: він не дастьagave-validatorприйняти identity, якщо tower-файла там немає.
Деталі та обґрунтування рішень — у docs/safety.md.
Безпека
Перед першим запуском на mainnet:
vid preflight --config <шлях>має набрати 100. Будь-якийwarnабоfail— спочатку виправити.vid swap --dry-run— прочитати кожен рядок виводу, це саме ті команди, що виконаються.- Прогнати end-to-end на docker mock pair (див. нижче).
- Прогнати на testnet з не-staked identity.
- Тільки тоді — на mainnet, і ще краще зі другим оператором на дзвінку.
--require-tower за замовчуванням не вимикається, і не варто шукати
прапор, який це робить.
Локальна розробка
У docker/ живе mock-середовище з двох Ubuntu-контейнерів зі sshd
і bash-стабами для agave-validator, solana, solana-keygen. Цього
достатньо щоб прогнати весь swap-флоу end-to-end без піднімання
справжніх валідаторів.
bash docker/setup.sh # будує образи + генерує SSH ключі
bash docker/bootstrap.sh # створює keypair'и + initial tower
node dist/cli.js swap --config docker/swap-config.example.jsonЗупинити: docker compose -f docker/docker-compose.yml down -v.
Документація
- docs/safety.md — як саме preflight +
--require-tower- auto-rollback захищають від slashing'у, і чого вони НЕ покривають.
- docs/security.md — як
vidобходиться з ключами і SSH-кредами, що пишеться в audit log, threat model. - docs/architecture.md — як організований код, чому TS/Node, де додавати нові чеки чи новий validator client.
- docs/troubleshooting.md — типові помилки з testnet-прогонів і як їх виправляти.
Ліцензія
MIT, див. LICENSE.
