WIP: Ledger security release docs (2026.1)#329
Conversation
Greptile SummaryThis PR adds the 2026.1 security release documentation: consensus key rotation (staking and PoA), post-quantum ML-DSA keys, and remote signing via Cosmos-KMS. The content is thorough and most guides are end-to-end verified against local chains.
Confidence Score: 4/5Safe to merge after reconciling the algorithm/backend matrix between configuration-reference.mdx and configure-backend.mdx; all other content is well-verified. The two KMS pages disagree about which algorithms each backend supports: the reference says mldsa65 is file-only while the configure-backend page and the work log confirm it works on all three backends; the configure-backend page says AWS KMS supports secp256k1eth while the reference (backed by source traces in the work log) says secp256k1eth is file-only. An operator configuring a production mldsa65 setup against AWS KMS would get the wrong answer from whichever page they consult. Everything else in the PR is consistent and well-grounded. sdk/next/kms/configuration-reference.mdx and sdk/next/kms/configure-backend.mdx need to be reconciled on the per-backend algorithm support matrix before this ships. Important Files Changed
|
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Workflows to automatically generate PRs for you. |
docs(sdk): kms rotation guide, release-impact fixes, prerequisites pass Add rotate-key-remote-signer: rotate a consensus key held in Cosmos-KMS (second signer process, shadow node, pubkey from /status). Test-verified e2e on a localnet; includes the show-validator stray-key trap as a Danger. Release-impact fixes to existing pages: - run-production: replace the deprecated TMKMS walkthrough with Cosmos-KMS links and a deprecation note - keyring: correct key algorithms to secp256k1 + ml_dsa_65 via --key-type (was ed25519 via --algo), link the new keys pages, fix a broken in-page anchor - run-node: next-step links to key rotation and remote signing; jq links moved to jqlang.org Guide improvements: - complete, linked prerequisites on every keys/ and kms/ guide - migrate-validator-ml-dsa: step 2 split into labeled staking / PoA / remote signer paths with the exact deltas (PoA passes ml_dsa_65) - state-sync pointers on both shadow-node rotation pages - post-quantum-keys: EIP-7702/8051/8141 linked and corrected - Cosmos-KMS naming in prose, bare "kms" replaced with "the signer" - remote-signing next steps completed (resolves placeholder TODO)
|
@greptileai plz rereview |
…o security-release
| 2. A validator can rotate once per unbonding period. Until the unbonding period ends, the previous key remains accountable, so the chain rejects a second rotation inside the window. | ||
| 3. A rotation cannot be undone. No cancel message exists, and the once-per-unbonding-period limit blocks an immediate rotation back, so an applied rotation stands until the window expires. | ||
|
|
||
| Slashing follows a validator's history, not the key. The chain keeps a mapping from each historical consensus address to its validator for the length of the unbonding period, so evidence of a double sign under the old key still slashes the validator after rotation. Rotating away from a key does not allow a validator to escape slashing. |
There was a problem hiding this comment.
The chain keeps a mapping from each historical consensus address to its validator for the length of the unbonding period
This has changed slightly and is no longer correct. When the rotation message lands on chain, we take a snapshot of the consensus params and specifically the evidence MaxAgeNumBlocks and MaxAgeDuration that dictate how long evidence is valid for after it is observed. After both MaxAgeNumBlocks and MaxAgeDuration have elapsed, we stop tracking this historical consensus address. This may be months depending on what the chain has these values configured as.
This has an interesting trade off however that is very important to document (we may want like a things to know section or security implications or something like that). This snapshot of the values is never modified from the values that it computes at rotation time. So for example: If a rotation is submitted and based on MaxAgeNumBlocks and MaxAgeDuration, the rotation history will be kept for 500 blocks. That 500 blocks value will never change, even if MaxAgeNumBlocks or MaxAgeDuration are extended by a gov prop. So if the computed value would have now been 600 blocks, we do not make any updates to the rotation in state to reflect this, and at 500 blocks past the rotation, the history of the rotation will go away and there will be a period where evidence can be submitted against a validators previous consensus address and it is not able to be slashed, effectively evading double slashing. This is an accepted risk and chains should not extend these values while rotations are in flight without understanding these consequences.
There was a problem hiding this comment.
added here:
docs/sdk/next/keys/key-rotation.mdx
Lines 25 to 53 in aa7b31a
* update Cometbft and SDK docs for v0.55 and v0.40 release * Update block-sync.mdx * Update configuration.mdx
…o security-release
WIP: Ledger security release docs (2026.1)
Documentation for the 2026.1 security release: post-quantum keys (ML-DSA),
zero-downtime consensus key rotation, and remote signing via Cosmos-KMS.
Every technical claim is code- or test-verified before its page merges.
Nav: three groups under Run a Node (SDK next): Key Rotation, Post-quantum Keys,
Remote Signing: Cosmos-KMS.
Key Rotation
Post-quantum Keys
Remote Signing: Cosmos-KMS
Module references and release-impact fixes
Upgrading
Verification
Five flows run end to end against local chains, commands exactly as published:
governance param change, staking rotation, ML-DSA account, kms file-backend
tutorial, and kms rotation. Each tested page carries a hidden verification
comment with environment and commits.
npx mint broken-linkscleanReview
project, FOU-739 to FOU-755): rotation set → Matt, ML-DSA + kms sets → Eric,
release notes → Alex. Open eng questions are tracked there, and as TODO(ERIC)/
TODO(MATT) comments in the pages.