Reentrancy розшифровано — ця помилка смартконтракту все ще виводить мільйони в 2026 році, і шаблон Checks-Effects-Interactions, який її зупиняє в коді
Reentrancy — це не магія. Це помилка порядку: ваш контракт оновлює свій стан ПІСЛЯ того, як здійснює зовнішній виклик, а не до нього, і атакуючий знову викликає його під час цієї прогалини. Виправте порядок — і помилка зникне.
DAO втратив близько 3,6 млн ETH (приблизно $60 млн, близько 5% усіх ETH, що тоді існували) через саме цю помилку 17 червня 2016 року. Наслідки призвели до розколу Ethereum на ETH і ETC.
Десять років потому вона все ще виводить кошти. Solv Protocol втратив $2,73 млн через reentrancy 5 березня 2026 року, а в травні 2026 року було вкрадено близько $52 млн у різних onchain-протоколах (DeFiLlama через CryptoTimes, 31 травня 2026 року).
Вразливий шаблон: прочитати баланс, надіслати ETH за допомогою низькорівневого виклику, а потім встановити баланс на нуль. Функція receive() атакуючого повторно входить у withdraw(), перш ніж нуль буде застосовано, і цикл продовжується, поки контракт не спорожніє.
Два виправлення, які використовуються разом:
Checks-Effects-Interactions. Спочатку перевірте, потім оновіть ВСІ стани, а потім здійсніть зовнішній виклик останнім. Перемістіть balances[msg.sender] = 0 вище виклику — тоді повторний виклик прочитає нуль і скасується.
Захист nonReentrant від OpenZeppelin. Мутекс у сховищі (NOT_ENTERED до ENTERED), який скасовує повторний вхід. Використовуйте його РАЗОМ із CEI, а не окремо.
Дві речі, які більшість розробників все ще неправильно роблять.
1. .transfer() більше не є захистом: ліміт газу 2300 перестав бути безпечним припущенням після того, як EIP-1884 підвищив вартість SLOAD у 2019 році. Використовуйте .call{value:}("") разом із CEI.
2. Тільки для читання reentrancy обходить стандартний захист, оскільки функція view, що читає під час оновлення, повертає пошкоджені дані і може отруїти оракул цін (dForce, $3,64 млн).
Тільки для освітніх цілей. Не фінансова порада.
Підпишіться на щоденні інсайти — де блокчейн зустрічається з ІШ, один задовольняючий свайп за раз.
#Solidity #SmartContractSecurity #Web3Security #Ethereum #DeFi #SmartContracts #BlockchainDeveloper #SolidityDev #EVM #OpenZeppelin #Reentrancy #Web3Dev #BlockchainSecurity #DeFiSecurity #SmartContractAudit #CodeSecurity #OnChain #BlockchainEducation