It seems Orphaned blocks do not indicate any issues with the pool, if you’re checking orphaned blocks on https://pooltool.io/ for example then you’ll often see that another pool’s block was accepted by the chain, this is often referred to as a ‘slot battle‘. Slot battles used to have a lot do with geography and trying to spread the block your pool produced faster than another pool, however that lead to some unfortunate centralization issues on the cardano network and has since been done away with. The winner of a slot battle (the pool who’s block is accepted by the chain) is now determined randomly using a pool’s VRF, which cannot be gamed by pool operators. When nodes receive two valid blocks for a single slot, the block with the lower VRF Proof value is chosen as the latest block and is propagated throughout the network. The other block becomes orphaned and unused. Slot Battles are unavoidable in Ouroboros Praos and the result of them is a matter of luck. However, Stake Pools with less active stake have an edge in winning slot battles because they are more likely to generate lower values of VRF_Proof over a larger competing pool. so whats VRF exactly?
Staking pool operators need to generate a few key pairs:
- An operational cold key pair. The key grants the right to sign blocks to the KES key.
- Key Evolving Signature (KES) key pair. The key is used for signing a new block. The key expires periodically and a new one is computed. (every 90 days)
- Verifiable Random Function (VRF) key pair. The key is used to find out whether a node is a slot leader in an ongoing slot. The node does it every second.
So logfile output from our ‘stolen’ block said the following
STOLEN: Leader for slot ‘30620534’ but “stolen” by another pool due to bad luck (lower VRF output) 🙁