Читать книгу Криптовалюта с нуля: От идеи до запуска вашего блокчейн проекта. Часть 2 - Иван Алексеевич Евдокимов - Страница 4
Часть 2: Техническая реализация (Практическое руководство)
Глава 5: Создание токена на Ethereum (стандарт ERC-20)
5.3 Пример простейшего контракта ERC-20.
ОглавлениеЗдесь я покажу минимальную, но полнофункциональную реализацию токена ERC-20. Этот пример идеально подходит для понимания основ и быстрого старта.
Минимальная версия (8-строк кода)
solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract SimpleToken is ERC20 {
constructor(uint256 initialSupply) ERC20("Simple Token", "SIM") {
_mint(msg.sender, initialSupply * 10 ** decimals());
}
}
Что делает этот код:
1. Устанавливает лицензию и версию компилятора
2. Импортирует стандарт ERC-20 из OpenZeppelin
3. Создает контракт с именем "Simple Token" и символом "SIM"
4. При деплое создает указанное количество токенов и отправляет их создателю контракта
Более практичная версия с комментариями
solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
/**
* @title BookCoin
* @dev Простой пример токена ERC-20 для книги
*/
contract BookCoin is ERC20 {
/**
* @dev Конструктор создает все токены и отправляет создателю
* @param totalSupply Общее количество токенов (в целых единицах)
*
* Пример: если передать 1000000, будет создано 1 000 000 * 10^18 токенов
* Это стандартная практика – использовать 18 десятичных знаков
*/
constructor(uint256 totalSupply) ERC20("BookCoin", "BOOK") {
_mint(msg.sender, totalSupply * 10 ** decimals());
}
}
Как использовать этот контракт
После деплоя вы можете взаимодействовать с токеном через следующие функции:
Базовые операции:
javascript
// Проверить общее предложение
const totalSupply = await token.totalSupply();
// Проверить баланс аккаунта
const balance = await token.balanceOf("0x123…");
// Перевести токены
await token.transfer("0x456…", 1000000000000000000); // 1.0 токен
Пример в тестовой сети:
javascript
// Предположим, мы деплоили с initialSupply = 1000000
// Создатель получит: 1,000,000 * 10^18 = 1,000,000,000,000,000,000,000,000 токенов
// Перевод 1 токена (с учетом decimals)
await token.transfer("0x742d35Cc6634C0532925a3b8D…", "1000000000000000000");
Полная версия с дополнительными возможностями
Для реального проекта рекомендуется использовать расширенную версию:
solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract AdvancedToken is ERC20, Ownable {
uint8 private _customDecimals;
constructor(
uint256 initialSupply,
string memory name,
string memory symbol,
uint8 decimalUnits
) ERC20(name, symbol) {
_customDecimals = decimalUnits;
_mint(msg.sender, initialSupply * 10 ** decimalUnits);
_transferOwnership(msg.sender);
}
// Переопределяем decimals для кастомного значения
function decimals() public view virtual override returns (uint8) {
return _customDecimals;
}
// Функция для создания дополнительных токенов (только владельцем)
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
// Функция для сжигания токенов
function burn(uint256 amount) public {
_burn(msg.sender, amount);
}
// Функция для сжигания токенов с другого адреса (с разрешения)
function burnFrom(address account, uint256 amount) public {
_spendAllowance(account, msg.sender, amount);
_burn(account, amount);
}
}
Особенности расширенной версии:
· Кастомное количество decimals (можно установить 6, как в USDC)
· Контроль владельца через модификатор onlyOwner
· Функция mint для дополнительной эмиссии
· Функции burn для сжигания токенов
· Безопасное управление разрешениями
Пример деплоя с разными параметрами
javascript
// Деплой простого токена (18 decimals)
const SimpleToken = await ethers.getContractFactory("SimpleToken");
const simpleToken = await SimpleToken.deploy("1000000"); // 1 млн токенов
// Деплой продвинутого токена (6 decimals)
const AdvancedToken = await ethers.getContractFactory("AdvancedToken");
const advancedToken = await AdvancedToken.deploy(
"1000000", // 1 млн токенов
"USD Coin", // имя
"USDC", // символ
6 // 6 decimal places
);
Важные замечания для новичков
1. Всегда используйте OpenZeppelin – не пишите стандартные функции самостоятельно
2. Тестируйте в testnet перед запуском в mainnet
3. Проводите аудит для любого контракта с реальными средствами
4. Используйте последние версии Solidity (≥ 0.8.0)
5. Никогда не делитесь приватными ключами или мнемонической фразой
Что дальше?
Этот простой контракт уже полностью функционален и готов к использованию. В следующих разделах мы:
1. Скомпилируем и проверим контракт
2. Развернем в тестовой сети
3. Протестируем основные функции
4. Верифицируем код в блок-эксплорере
Поздравляю! Вы только что создали свой первый ERC-20 токен. Несмотря на простоту, этот код лежит в основе тысяч реальных криптопроектов.