Taproot upgrade changed Bitcoin’s script capabilities but, critics say, it failed to deliver the promised privacy and simple multisig benefits; instead it expanded the social attack surface that enabled Ordinals and Runes to drive high-fee onchain activity and network debate.
Taproot expanded Bitcoin scripting, enabling Ordinals and Runes to embed large nonfinancial data.
Critics argue Taproot increased spam and complexity, while proponents point to fee revenue supporting miner incentives.
Ordinals-related fees contributed over $500 million cumulatively; daily inscription fees ranged from ~$3k to ~$537k in 2025.
Taproot upgrade debate is heating up: Jimmy Song says Taproot fell short on privacy and security—read the implications and what Bitcoiners propose next. Read now.
Bitcoin Core developer Jimmy Song says the Taproot upgrade has not matched expectations, arguing it did not deliver the privacy and security gains proponents promised and instead widened Bitcoin’s social attack surface.
‘,
‘
🚀 Advanced Trading Tools Await You!
Maximize your potential. Join now and start trading!
‘,
‘
📈 Professional Trading Platform
Leverage advanced tools and a wide range of coins to boost your investments. Sign up now!
‘
];
var adplace = document.getElementById(“ads-bitget”);
if (adplace) {
var sessperindex = parseInt(sessionStorage.getItem(“adsindexBitget”));
var adsindex = isNaN(sessperindex) ? Math.floor(Math.random() * adscodesBitget.length) : sessperindex;
adplace.innerHTML = adscodesBitget[adsindex];
sessperindex = adsindex === adscodesBitget.length – 1 ? 0 : adsindex + 1;
sessionStorage.setItem(“adsindexBitget”, sessperindex);
}
})();
What is the Taproot upgrade and why does it matter?
Taproot upgrade is a Bitcoin protocol change that introduced Schnorr signatures and Script Path Spend, designed to improve privacy and efficiency for complex scripts. In practice, Taproot altered how onchain data can be encoded and validated, enabling new use cases such as Ordinals and Runes that have shifted fee dynamics and network debate.
How did Taproot enable Ordinals and Runes to flourish?
Taproot relaxed script expressiveness and combined with changes like the OP_RETURN adjustment, it allowed inscriptions—images, audio and documents—to be embedded more easily onchain. That technical capability, paired with developer and community adoption, produced a surge of nonfinancial transactions that increased average daily fees and sparked ideological disagreements over onchain content.
Key context: developers activated Taproot in November 2021; later policy shifts and developer votes changed how much arbitrary data could be stored onchain, creating practical pathways for Ordinals and Runes.
Why do some Bitcoin developers say Taproot “failed”?
Critics such as Bitcoin Core developer Jimmy Song argue Taproot has not delivered promised user-facing benefits because:
‘,
‘
🔒 Secure and Fast Transactions
Diversify your investments with a wide range of coins. Join now!
‘,
‘
💎 The Easiest Way to Invest in Crypto
Dont wait to get started. Click now and discover the advantages!
‘
];
var adplace = document.getElementById(“ads-binance”);
if (adplace) {
var sessperindex = parseInt(sessionStorage.getItem(“adsindexBinance”));
var adsindex = isNaN(sessperindex) ? Math.floor(Math.random() * adscodesBinance.length) : sessperindex;
adplace.innerHTML = adscodesBinance[adsindex];
sessperindex = adsindex === adscodesBinance.length – 1 ? 0 : adsindex + 1;
sessionStorage.setItem(“adsindexBinance”, sessperindex);
}
})();
Reaction intensified after an 80-byte OP_RETURN limit change in June, which removed constraints on onchain data sizes. Concern over potential policy reversals and censorship led some participants to shift from Bitcoin Core to Bitcoin Knots. Bitcoin Knots node count rose from 67 in March 2024 to over 7,112 by mid-2025, approaching ~28% of the network’s visible nodes.
‘
];
var adplace = document.getElementById(“ads-htx”);
if (adplace) {
var sessperindex = parseInt(sessionStorage.getItem(“adsindexHtx”));
var adsindex = isNaN(sessperindex) ? Math.floor(Math.random() * adscodesHtx.length) : sessperindex;
adplace.innerHTML = adscodesHtx[adsindex];
sessperindex = adsindex === adscodesHtx.length – 1 ? 0 : adsindex + 1;
sessionStorage.setItem(“adsindexHtx”, sessperindex);
}
})();