BBetterSignΒ· Rotatable identity for blockchain validators
1 / 5
A validator's identity is its public key β consensus and its peer-to-peer transport both key off it
π‘οΈ
validator node
peerID = 0xPUBKEY
frozen to one key + algorithm
βββΆ consensus Β· libp2p
π
every other peer
knows the node only by that key
Rotating a validator key means re-coordinating every peer and the chain at once β so painful it is basically never done. The key, and the algorithm behind it, are frozen for the life of the node.
The bootstrap validators each create a VLAD in BetterSign β a durable identity keys hang beneath
The VLAD is the identity; the consensus signing key and the libp2p comms key live under it as current state β either can change later without changing who the validator is.
The active set runs BFT consensus and votes the configuration onto the chain
β on-chain validator set Β· committed by BFT vote of the active set
β VLAD_A β sign: ml-dsa-65 Β· comms: /libp2p key Β· algo set
β VLAD_B β sign: ed25519 Β· comms: /libp2p key Β· algo set genesis / bootstrap config also committed on chain β the newcomer recipe
Every validator's VLAD, current public keys, and algorithms are written on chain by vote β shared, public, and tightly controlled by the active set. It ends up on chain anyway, so BetterSign just makes the transitions verifiable.
Keys rotate independently β announced to peers via BetterSign, accepted by BFT vote
π‘ rotate comms key
peer-to-peer Β· e.g. libp2p
β new key β signed plog entry β‘ announced to peers via BetterSign β’ chain accepts after BFT vote
β» on its own cadence
βοΈ rotate / upgrade signing key
consensus Β· pluggable algorithm
β new key β or new algorithm (PQ) β‘ signed plog entry β peers β’ chain records the change
β» on its own cadence
The VLAD never changes, so rotation is finally painless. Crypto is pluggable β a validator can move to a stronger or post-quantum algorithm without a new identity.
A new validator joins with a single config-pull β config from chain, trust from the active validator it followed
π
joining validator
has nothing yet
config-pull βββΆ
π‘οΈ
any active validator
followed & trusted
reads βββΆ
β
on-chain config
voted by the active set
bs config pull <ACTIVE_VALIDATOR_VLAD>
β config read from the on-chain set (voted by the active set)
β follow + trust the active validator you pulled from
β verify plog, sync state, request admission β voted in by the active set β now part of the active set
The config comes from the chain; trust flows from the active validator it followed. Once the set votes it in, the newcomer becomes part of the active set.