
リエントランシーを解明する – 2026年もスマートコントラクトのバグが数百万ドルを継続して吸い取っている理由、そしてそれをコードで防ぐ「チェック・エフェクト・インタラクション」パターン リエントランシーは魔法ではない。これは順序のバグである:あなたのコントラクトが外部呼び出しを行った後に自身の状態を更新し、その隙間に攻撃者が再呼び出しを行う。順序を正せば、バグは消える。 2016年6月17日、The DAOはこの正確なミスにより約360万ETH(当時約6,000万ドル、存在していたETH全体の約5%)を失った。この影響でイーサリアムはETHとETCに分岐した。 10年経った今でも、資金は引き続き奪われている。2026年3月5日、Solv Protocolはリエントランシー攻撃により273万ドルを失い、2026年5月にはオンチェーンプロトコル全体で約5,200万ドルが盗まれた(DeFiLlama、CryptoTimes、2026年5月31日)。 脆弱なパターン:残高を読み取り、低レベルの呼び出しでETHを送信し、その後で残高をゼロに設定する。攻撃者のreceive()関数は、そのゼロが適用される前にwithdraw()を再入力し、コントラクトが空になるまでループする。 二つの対策(併用すること): チェック・エフェクト・インタラクション。検証を行い、すべての状態を更新した後、外部呼び出しを最後に行う。balances[msg.sender] = 0を呼び出しの上に移動させると、再入力された呼び出しはゼロを読み取り、リバートする。 OpenZeppelinのnonReentrantガード。ストレージ上のミューテックス(NOT_ENTEREDからENTEREDへ)が再入力を検知してリバートする。一方だけではなく、両方を使用すること。 開発者が今も間違えがちな二つの点: 1. .transfer()はもはや盾ではない:2019年のEIP-1884でSLOADのガスが引き上げられたことで、2,300ガスの補助金が安全な前提ではなくなった。CEIとともに.call{value:}("")を使用すること。 2. 読み取り専用のリエントランシーは標準的なガードを回避する。更新中のview関数の読み取りは破損した状態を返し、価格オラクルを汚染する可能性がある(dForce、364万ドル)。 教育目的のみ。金融アドバイスではありません。 日々のインサイトをお見逃しなく – ブロックチェーンとAIが出会う場所、一つの満足感あるスワイプずつ。 #Solidity #SmartContractSecurity #Web3Security #Ethereum #DeFi #SmartContracts #BlockchainDeveloper #SolidityDev #EVM #OpenZeppelin #Reentrancy #Web3Dev #BlockchainSecurity #DeFiSecurity #SmartContractAudit #CodeSecurity #OnChain #BlockchainEducation


