A backward-compatible rule change. Nodes that haven't upgraded still accept blocks produced under the new rules, they just don't enforce them. The network doesn't split as long as a majority of miners adopt the new rules.
Each Bitcoin block contains a version field in its header. Under BIP9 and BIP8, individual bits are assigned to specific upgrades. When miners set a bit to 1 they're signalling readiness. Every 2,016 blocks the network counts how many blocks signalled. If the threshold is met, the upgrade locks in.
A simple majority isn't enough. If 49% of miners haven't upgraded they could produce blocks valid under old rules but invalid under new ones, causing orphaned blocks. The 90% threshold gives strong confidence that non-signalling blocks become economically irrelevant.
Two separate events. Lock-in happens when the threshold is crossed and the upgrade is committed regardless of what miners do next. Activation happens later when the new rules actually come into effect. For Taproot this was a 6-month gap.
Taproot replaces ECDSA with Schnorr signatures, a mathematically simpler scheme. Schnorr signatures are smaller, support key aggregation so multiple parties can produce a single signature indistinguishable from a regular one, and allow batch verification making node validation faster.
A new output type called P2TR (Pay to Taproot). Every output commits to both a key path for simple cooperative spending and a script path containing a Merkle tree of alternative conditions. If all parties cooperate the spend looks identical to any simple payment, revealing nothing about the contract behind it.
Before Taproot, complex contracts required revealing all spending conditions on-chain when spending. With MAST, conditions are arranged in a Merkle tree. Only the branch actually used is revealed. The rest stays private, reducing transaction size and improving privacy significantly.
A revised scripting language used within Taproot script paths. It makes adding new opcodes easier in future upgrades, fixes long-standing limitations of the original Script language, and introduces per-input signature hashing that prevents transaction malleability. Designed so future soft forks can build on it cleanly.