Читать книгу Криптовалюта с нуля: От идеи до запуска вашего блокчейн проекта. Часть 2 - Иван Алексеевич Евдокимов - Страница 6
Часть 2: Техническая реализация (Практическое руководство)
Глава 5: Создание токена на Ethereum (стандарт ERC-20)
5.5 Верификация контракта на Etherscan.
ОглавлениеВерификация контракта – это процесс публикации исходного кода вашего смарт-контракта в блок-эксплорере (Etherscan). Это критически важный шаг для построения доверия к вашему проекту.
Зачем верифицировать контракт?
1. Прозрачность: Пользователи могут убедиться, что код соответствует заявленной функциональности
2. Доверие: Верифицированные контракты вызывают больше доверия у инвесторов
3. Взаимодействие: Позволяет напрямую вызывать функции контракта через Etherscan
4. Отслеживание: Пользователи могут отслеживать транзакции и балансы
Без верификации:
Contract Source Code Not Verified
Click to Verify and Publish
После верификации:
Contract Source Code Verified
Read Contract | Write Contract
Способ 1: Автоматическая верификация с помощью Truffle Plugin
Шаг 1: Установка плагина
bash
npm install -D truffle-plugin-verify
Шаг 2: Настройка truffle-config.js
Добавьте в truffle-config.js:
javascript
module.exports = {
// … остальная конфигурация
plugins: ['truffle-plugin-verify'],
api_keys: {
etherscan: process.env.ETHERSCAN_API_KEY
}
};
Шаг 3: Получение API-ключа Etherscan
1. Зарегистрируйтесь на etherscan.io
2. Перейдите в API Keys
3. Создайте новый API Key
4. Добавьте в .env файл:
env
ETHERSCAN_API_KEY=YourApiKeyToken
Шаг 4: Верификация контракта
bash
truffle run verify BookCoin –network sepolia
Ожидаемый результат:
Verifying BookCoin
Pass – Verified: https://sepolia.etherscan.io/address/0x1234…5678#code
Successfully verified 1 contract(s).
Способ 2: Ручная верификация через веб-интерфейс
Шаг 1: Найдите ваш контракт в Etherscan
Перейдите по адресу:
https://sepolia.etherscan.io/address/ВАШ_АДРЕС_КОНТРАКТА
Нажмите "Verify and Publish"
Шаг 2: Заполните форму верификации
Contract Address: 0xYourContractAddress
Compiler Type: Solidity (Single file)
Compiler Version: v0.8.19+commit.7dd6d404
Open Source License Type: MIT License
Шаг 3: Вставьте код контракта
Скопируйте содержимое вашего BookCoin.sol:
solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract BookCoin is ERC20 {
constructor(uint256 initialSupply) ERC20("BookCoin", "BOOK") {
_mint(msg.sender, initialSupply * 10 ** decimals());
}
}
Шаг 4: Настройка конструктора
В разделе "Constructor Arguments" введите ABI-encoded параметры:
00000000000000000000000000000000000000000000000000000000000f4240
Это hex-представление 1000000 (1 миллион токенов).
Способ 3: Верификация с помощью Hardhat
Если вы используете Hardhat вместо Truffle:
Установка плагина:
bash
npm install –save-dev @nomiclabs/hardhat-etherscan
Добавьте в hardhat.config.js:
javascript
require("@nomiclabs/hardhat-etherscan");
module.exports = {
etherscan: {
apiKey: process.env.ETHERSCAN_API_KEY
}
};
Верификация:
bash
npx hardhat verify –network sepolia DEPLOYED_CONTRACT_ADDRESS "1000000"
Решение распространенных проблем:
Проблема 1: "Already Verified"
Contract source code already verified
Решение: Контракт уже верифицирован – это успех!
Проблема 2: "Bytecode doesn't match"
Sorry! The compiled result does not match the deployed bytecode
Решение:
· Убедитесь, что версия компилятора совпадает
· Проверьте настройки оптимизатора
· Убедитесь, что вы верифицируете правильный контракт
Проблема 3: "Unable to detect constructor arguments"
Failed to detect constructor arguments
Решение: Вручную укажите ABI-encoded параметры конструктора
Как получить ABI-encoded параметры конструктора
Способ 1: Использование Truffle
javascript
// В консоли Truffle
const contract = await BookCoin.deployed();
const transaction = await web3.eth.getTransaction(contract.transactionHash);
console.log(transaction.input);
Способ 2: Онлайн-энкодер
Используйтеabi.hashex.org для кодирования параметров.
Способ 3: Использование ethers.js
javascript
const { ethers } = require("ethers");
const coder = new ethers.utils.AbiCoder();
const encoded = coder.encode(["uint256"], [1000000]);
console.log(encoded);
Что вы получите после верификации
Read Contract Tab – просмотр состояния контракта
· totalSupply()
· balanceOf()
· allowance()
Write Contract Tab – взаимодействие с контрактом
· transfer()
· approve()
· transferFrom()
Источник транзакций – отслеживание всех операций
Аналитика – графики и статистика
Комментарии – обратная связь от сообщества
Пример успешной верификации
После успешной верификации ваш контракт будет выглядеть так:
Contract Source Code Verified (Exact Match)
Contract Name: BookCoin
Compiler Version: v0.8.19+commit.7dd6d404
Optimization Enabled: Yes with 200 runs
Other Settings: default evmVersion, MIT license
Read Contract | Write Contract
+ [X] Contract created with 0x123… at block 4000001
+ [X] Verified 2 days ago
+ [X] 15 transactions
Дополнительные возможности
Верификация через flattening:
bash
npx truffle-flattener contracts/BookCoin.sol > flattened.sol
Затем загрузите flattened.sol в Etherscan.
Верификация прокси-контрактов:
Для контрактов, использующих паттерн прокси, требуется дополнительная настройка.
Верификация библиотек:
Если ваш контракт использует внешние библиотеки, их нужно верифицировать отдельно.
Проверка результатов
1. Перейдите на страницу контракта в Etherscan
2. Убедитесь, что появились вкладки "Read Contract" и "Write Contract"
3. Проверьте, что код отображается корректно
4. Протестируйте функции через веб-интерфейс
javascript
// Пример чтения через Etherscan
totalSupply() → 1000000000000000000000000
balanceOf(0xYourAddress) → 1000000000000000000000000
name() → "BookCoin"
symbol() → "BOOK"
decimals() → 18
Поздравляю! Ваш контракт теперь полностью прозрачен и доступен для проверки всем желающим. Это важный шаг на пути к созданию доверия к вашему проекту в криптосообществе.
В следующем разделе мы создадим практическое упражнение по развертыванию и верификации вашего собственного токена.