Верифікація смарт-контрактів на блок-експлорерах
Задеплоєний контракт без верифікації — це чорний ящик. Користувачі бачать байткод, але не вихідники. Etherscan показує «Contract» замість імен функцій. Ніхто не може перевірити, що контракт робить те, що написано у документації. Для будь-якого публічного протоколу це репутаційна проблема і бар'єр для інтеграцій — інші протоколи не будуть викликати контракт, який нельзя перевірити.
Як працює верифікація
Блок-експлорер приймає вихідники і параметри компілятора, компілює локально і порівнює bytecode з тим, що у чейні. Матч — контракт вважається верифікованим, вихідники публікуються.
Головна проблема: детермінованість компіляції. Solidity-компілятор при одних і тих же вхідних даних і одних і тих же налаштуваннях повинен дати однаковий байткод. Розходження у версії компілятора (0.8.19 vs 0.8.20), флагах оптимізації (runs: 200 vs runs: 999), порядку файлів або метаданих — і верифікація не проходить.
Інструменти для верифікації
Hardhat + hardhat-verify (бувший hardhat-etherscan). Після деплоя:
npx hardhat verify --network mainnet 0xCONTRACT_ADDRESS "arg1" "arg2"
Плагін автоматично визначає версію компілятора з hardhat.config.ts, збирає Standard JSON Input і надсилає на Etherscan API. Працює для Ethereum, Polygon, BSC, Arbitrum, Optimism і десятків інших мереж — через конфігурацію etherscan.apiUrl.
Foundry forge verify-contract — працює аналогічно, але через Standard JSON Input прямо:
forge verify-contract 0xCONTRACT_ADDRESS src/MyContract.sol:MyContract \
--chain-id 1 \
--etherscan-api-key $ETHERSCAN_KEY \
--constructor-args $(cast abi-encode "constructor(address)" 0xADDR)
Sourcify — децентралізована альтернатива. Зберігає верифіковані вихідники на IPFS, підтримується більшістю сучасних експлорерів. Foundry підтримує деплой з одночасною верифікацією через Sourcify:
forge script Script --broadcast --verify --verifier sourcify
Часті причини провалу верифікації
- Несумісність версії компілятора: у коді
pragma solidity ^0.8.0, задеплоєно компілятором 0.8.21, на експлорері вказали 0.8.0 - Налаштування оптимізації не збігаються з тими, що були при деплої
- Контракт використовує бібліотеки — вони повинні бути або вбудовані (inline), або задеплоєні і адреси вказані при верифікації
- Proxy-паттерн: верифікується імплементація, але експлорер бачить proxy — потрібна додаткова верифікація proxy через «Is this a proxy?» на Etherscan
Для proxy-контрактів (Transparent, UUPS) Etherscan підтримує верифікацію через ABI proxy detection — натисніть кнопку «Verify as proxy» після верифікації обох частин (proxy + implementation).
Терміни: 2-3 години на верифікацію стандартного контракту, включаючи діагностику причин провалу і повторні спроби.







