Читать книгу Криптовалюта с нуля: От идеи до запуска вашего блокчейн проекта. Часть 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 токен. Несмотря на простоту, этот код лежит в основе тысяч реальных криптопроектов.

Криптовалюта с нуля: От идеи до запуска вашего блокчейн проекта. Часть 2

Подняться наверх