Трэба нагадаць, што ў пачатку 2017 года Папа заявіў, што адправіцца ў Паўднёвы Судан разам з Прымасам Англіканскай Царквы, але, на жаль, па меркаваннях бяспекі да гэтага часу візіт не быў рэалізаваны. Introduction Трэба звярнуць увагу на тое, што для свідравін выкарыстоўваюць больш магутныя – свідравіны помпы, а для калодзежаў – погружные. а для калодзежаў – погружные. Механізм дзеркала Варта адзначыць, што для ажыццяўлення работ па стварэнні Нацыянальнага інвентара нематэрыяльнай культурнай спадчыны наша краіна летась атрымала грант з адпаведнага фонду UNESCO. Трэба нагадаць, што ў пачатку 2017 года Папа заявіў, што адправіцца ў Паўднёвы Судан разам з Прымасам Англіканскай Царквы, але, на жаль, па меркаваннях бяспекі да гэтага часу візіт не быў рэалізаваны. І калі твая першая кніга добра прадавалася, не факт, што так жа будзе прадавацца другая. «Чорны ящик» In theory, "byte-perfect" matching sounds easy. In practice, it is where the nightmare begins. A developer can have a perfectly functioning dApp, passing 100% of local tests, yet find themselves stuck in verification limbo. Why? Because the Solidity compiler is a Deterministic Black Box. As shown in Figure 2, the output bytecode is not determined by source code alone. It is the product of dozens of invisible variables: compiler versions, optimization runs, metadata hashes, and even the specific EVM version. Невялікая розніца ў вашым мясцовым hardhat.config.ts у параўнанні з тым, што Etherscan прыпускае, напрыклад, іншае параўнанне viaIR або непаўторная канфігурацыя проксі, прывядзе да цалкам іншага хаша байтэкода (Bytecode B), выклікаючы страшную "Bytecode Mismatch" няправільнасць. Сярод версій гульняў онлайн call of duty можна знайсці мноства займальных і дасціпных сюжэтаў, а апошняй навінкай, выпушчанай у канцы восені гэтага года, стала гульня Call of Duty: Ghost. The CLI Approach – Precision & Automation У папярэднім раздзеле, мы візуалізавалі працэс пераўтварэння як "Зоркавы механізм" (Факультацыя 1). Мета - забяспечыць, што ваша локальная кампазіцыя адпавядае далёкаму асяроддзі ідэальна. робіць гэта ручна праз вэб-UI з'яўляецца няправільным; адзін няправільны клік на спалучэнне версіі кампазітара можа разбураць хаш. Акрамя таго, для некаторых элементаў у экспазіцыі вядома нават імя майстра, які іх вырабіў, — гэта знакаміты нямецкі даспешнік Кольман Хельмшміт, які выконваў заказы для каралеўскіх дамоў і найбуйнейшых магнатаў Еўропы. Варыянт праверкі Для большасці распрацоўшчыкаў, плагін hardhat-verify з'яўляецца першай лініяй абароны. Ён аўтаматызуе вывучэнне будынак артэфактаў і камунікацыі прама з Etherscan API. Для забеспячэння работы мікра-ГЭС, водны струмень мусіць быць штучна створаны. // hardhat.config.ts import "@nomicfoundation/hardhat-verify"; module.exports = { solidity: { version: "0.8.20", settings: { optimizer: { enabled: true, // Critical: Must match deployment! runs: 200, }, viaIR: true, // Often overlooked, causes huge bytecode diffs }, }, etherscan: { apiKey: { // Use different keys for different chains to avoid rate limits mainnet: "YOUR_ETHERSCAN_API_KEY", sepolia: "YOUR_ETHERSCAN_API_KEY", }, }, }; The Command: Once configured, the verification command is straightforward. It recompiles the contract locally to generate the artifacts and then submits the source code to Etherscan. Mastermind Tip: Always run npx hardhat clean before verifying. Stale artifacts (cached bytecode from a previous compile with different settings) are a silent killer of verification attempts. npx hardhat verify --network sepolia <DEPLOYED_CONTRACT_ADDRESS> <CONSTRUCTOR_ARGS> The Pitfall of Constructor Arguments Размова сапраўды вельмі важная — мы ж усе цудоўна разумеем, што любы, самы лепшы дэкрэт можна звесці на нішто практыкай прымянення. Калі вы размясцілі з выкарыстаннем скрипта, вы павінны стварыць асобны файл аргументаў (напрыклад, arguments.ts), каб падтрымаць «Адзіны крыніца праўды». // arguments.ts module.exports = [ "0x123...TokenAddress", // _token "My DAO Name", // _name 1000000n // _initialSupply (Use BigInt for uint256) ]; Чым гэта важна: Частая няправільнасць праходзіць 1000000 (номер) замест "1000000" (струнак) або 1000000n (BigInt). інструменты CLI кодыруюць гэта інакш у ABI Hex. Калі кодыроўка ABI адрозніваецца нават на адзін біт, атрыманая падпіска байтэкода змяняецца, і крок "Параўнанне" на малюнку 1 будзе выклікаць нясумяшчэнне. Фундаментная праверка For those using the Foundry toolchain, verification is blazing fast and built natively into forge. Unlike Hardhat, which requires a plugin, Foundry handles this out of the box. forge verify-contract \ --chain-id 11155111 \ --num-of-optimizations 200 \ --watch \ <CONTRACT_ADDRESS> \ src/MyContract.sol:MyContract \ <ETHERSCAN_API_KEY> The Power of --watch: Foundry's --watch флаг дзейнічае як "вербозны рэжым", апытаючы Etherscan для статусу. Гэта дае вам неадкладнае адвакаванне на тое, ці пастаўка была прынята або калі яна не выйшла з-за "Bytecode Mismatch", захаваючы вас ад асвежвання браўзэра. Калі вы хочаце падзяліцца сваёй думкай з майстрам, рабіце гэта максімальна ветліва. Chained Imports: Your contract imports 50+ files, and Etherscan's API times out processing the massive JSON payload. Буквары існуюць з даўніх часоў, і першыя азбукі былі не такімі, якімі мы іх прывыклі бачыць цяпер. In these "Code Red" scenarios, the CLI hits its limit. We must abandon the automated scripts and operate manually on the source code itself. This leads us to the ultimate verification technique: Standard JSON Input. Standard JSON Input Калі hardhat-verify выкідае непаўторны AggregateError або часы выключэння з-за спазненнага сеткавага злучэння, большасць распрацоўшчыкаў панікуюць. Фактычна, прысвечаныя такому спорту як бокс, онлайн гульні заўсёды прызнаваліся нашмат больш цікавымі чым звычайныя аднакарыстальніцкія цацкі. The correct, professional fallback is the Standard JSON Input. Мы думаем пра Solidity Compiler (solc) як пра машыну. Ён не цікавіцца вашым VS Code ўстаноўкі, вашы node_modules папкі, або вашы перакладкі. Ён цікавіцца толькі адно: спецыяльны аб'ект JSON, які змяшчае крынічны код і канфігурацыю. Стандартны JSON з'яўляецца lingua franca (загаловая мова) праверкі. Гэта адзін JSON-файл, які ўпрыгожвае: Вынікі пошуку - “Solidity” Настаўнікі: Optimizer runs, EVM version, viaIR, remappings. Крыніцы: Слоўнік кожнага выкарыстанага файла (уключаючы OpenZeppelin-залежності), з іх утрымліваннем у складзе струн. When you use Standard JSON, you are removing the file system from the equation. You are handing Etherscan the exact raw data payload that the compiler needs. Extracting the "Golden Ticket" from Hardhat You don't need to write this JSON manually. Hardhat generates it every time you compile, but it hides it deep in the artifacts folder. If your CLI verification fails, follow this "Break Glass in Emergency" procedure: Run npx hardhat compile. Navigate to artifacts/build-info/. You will find a JSON file with a hash name (e.g., a1b2c3...json). Open it. Inside, look for the top-level input object. Copy the entire input object and save it as verify.json. Mastermind Tip: This verify.json is the "Source of Truth." It contains the literal text of your contracts and the exact settings used to compile them. If this file allows you to reproduce the bytecode locally, it must work on Etherscan. Калі вы не можаце знайсці інфармацыю аб будынку або працуеце ў нестандартнай асяроддзі, вам не трэба панікаваць. Гэты падыход дае вам абсалютны кантроль над тым, што адпраўляецца ў Etherscan, дазваляючы вам экспрэсіўна кіраваць імпартам і перапрацаваннем. // scripts/generate-verify-json.ts import * as fs from 'fs'; import * as path from 'path'; // 1. Define the Standard JSON Interface for type safety interface StandardJsonInput { language: string; sources: { [key: string]: { content: string } }; settings: { optimizer: { enabled: boolean; runs: number; }; evmVersion: string; viaIR?: boolean; // Optional but crucial if used outputSelection: { [file: string]: { [contract: string]: string[]; }; }; }; } // 2. Define your strict configuration const config: StandardJsonInput = { language: "Solidity", sources: {}, settings: { optimizer: { enabled: true, runs: 200, }, evmVersion: "paris", // ⚠️ Critical: Must match deployment! viaIR: true, // Don't forget this if you used it! outputSelection: { "*": { "*": ["abi", "evm.bytecode", "evm.deployedBytecode", "metadata"], }, }, }, }; // 3. Load your contract and its dependencies manually // Note: You must map the import path (key) to the file content (value) exactly. const files: string[] = [ "contracts/MyToken.sol", "node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol", "node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol", // ... list all dependencies here ]; files.forEach((filePath) => { // Logic to clean up import paths (e.g., removing 'node_modules/') // Etherscan expects the key to match the 'import' statement in Solidity const importPath = filePath.includes("node_modules/") ? filePath.replace("node_modules/", "") : filePath; if (fs.existsSync(filePath)) { config.sources[importPath] = { content: fs.readFileSync(filePath, "utf8"), }; } else { console.error(`❌ File not found: ${filePath}`); process.exit(1); } }); // 4. Write the Golden Ticket const outputPath = path.resolve(__dirname, "../verify.json"); fs.writeFileSync(outputPath, JSON.stringify(config, null, 2)); console.log(`✅ Standard JSON generated at: ${outputPath}`); Чаму гэта працуе заўсёды Выкарыстанне стандартнага JSON выдатна, бо гэта захавае метаданныя хаш. Калі вы плаціце файл, вы тэхнічна змяняеце крынічны код (вылучэнне імпортаў, перараспрацоўка ліній). Гэта можа часта змяняць метаданныя атрыманага байт-кода, што прыводзіць да нясумяшчальнасці адпісаў пальцаў. Стандартны JSON захавае структуру шматфайл так, як складальнік бачыў яго падчас размяшчэння. Калі стандартная праверка JSON не спрацуе, праблема з'яўляецца 100% ў вашых параметрах (Фікура 2), а не ў вашым крынічным кодзе. The viaIR Trade-off У сучасным развіцці Solidity (асабліва v0.8.20+), дазваляючы viaIR стала стандартам для дасягнення мінімальных коштаў на газ, але гэта прыходзіць з высокай коштам за складанасць верифікацыі. Змяненне трубкі Why does a simple true/false flag cause such chaos? Because it fundamentally changes the compilation path. Адным словам, усім тым, што патрабуецца для максімальна камфортнага і ўтульнага адпачынку. IR Pipeline: Перш за ўсё перакладае Solidity ў Yul (Intermediate Representation).Аптымізатар затым агресіўна перапісвае гэты Yul-код — укладка функцый і перакладка стак-аперацый — перш чым генеруе байт-код У абменным пункце No5 "Белпрамбудбанка" каля рынку райспажыўтаварыства ўчора, 14 верасня, вывесілі новы курс валюты. Газавая эфектыўнасць vs. праверка «Аналіз паказаў, што выдатак кармавых адзінак на 1 кг прыбаўлення на старых комплексах значна перавышае гэтае значэнне на новых. У спалучэнні з тым фактам, што яго бацька таксама быў футбалістам, яго цікавасць у спорце быў упэўнены.У гэтым выпадку, калі яго цікавасць у спорце быў упэўнены, яго цікавасць у спорце быў упэўнены. Арганізатар спеўных варштатаў у межах праекта «CHOICE-Беларусь: спадчына i сучаснасць» разважае, як можна пракласці мост паміж музеем і людзьмі. Але серыя онлайн цацак Assassins creed 3 і Assassins creed 4, а таксама астатнія часткі забавы таксама заслугоўваюць увагі і вывучэння. У групе 2 былі сабраны менавіта тыя добраахвотнікі, якія запаміналі змест свайго сну слабей — 2 разы ў месяц і радзей. The "Butterfly Effect": In the IR pipeline, a tiny change in global configuration (e.g., changing runs from 200 to 201) propagates through the entire Yul optimization tree. It doesn't just change a few bytes; it can reshape the entire contract's fingerprint. Therefore, enabling viaIR is a transfer of burden. We are voluntarily increasing the burden on the developer (longer compilation times, fragile verification, strict config management) to decrease the burden on the user (lower gas fees). As a Mastermind engineer, you accept this trade-off, but you must respect the fragility it introduces to the verification process. Conclusion У цёмным лесе DeFi, код - гэта закон, але праверкаваны код - гэта ідэнтыфікацыя. We started by visualizing the verification process not as a magic button, but as a "Mirror Mechanism" (Figure 1). We dissected the "Deterministic Black Box" (Figure 2) and confronted the Optimization Paradox. As we push for maximum gas efficiency using viaIR and aggressive optimizer runs, we widen the gap between source code and bytecode. We accept the burden of higher verification complexity to deliver a cheaper, better experience for our users. Акрамя таго, для некаторых элементаў у экспазіцыі вядома нават імя майстра, які іх вырабіў – гэта знакаміты нямецкі даспешнік Кольман Хельмшміт, які выконваў заказы для каралеўскіх дамоў і найбуйнейшых магнатаў Еўропы. Для Брытаніі зараз гэта вельмі важнае слова, прабачым The Guardian лакалізацыю гэтага спісу і іх "завязанасць" на сваім рэгіёне. Фактычна, прысвечаныя такому спорту як бокс, онлайн гульні заўсёды прызнаваліся нашмат больш цікавымі чым звычайныя аднакарыстальніцкія цацкі. "Стандартны JSON" Fallback: Калі аўтаматычныя плагіны трапілі ў сцяну (timeouts або AggregateError), не аплачвайце свае кантракты. Вытрымаць Стандартны JSON Input ( "Залаты білет") і выканаць хірургічную ручную загрузку. Verification is not an afterthought to be handled five minutes after deployment. It is the final seal of quality engineering, proving that the code running on the blockchain is exactly the code you wrote.