Я всего лишь несколько месяцев изучаю развитие блокчейна, и одной из его захватывающих тем являются токены. Я не собираюсь вдаваться в подробности того, как работают токены, их различные стандарты и т.д. Это можно оставить на усмотрение читателя, однако я рассмотрю, как создать токен стандарта ERC20 очень простым способом. Во-первых, если вы не хотите читать, я также оставляю видео со всем руководством.
Для этого проекта мы будем использовать OpenZepellin. OpenZepellin имеет ряд продуктов для создания и управления контрактами, но в данном конкретном случае мы будем использовать его библиотеку для простого и безопасного создания контрактов. Преимущество OpenZepellin в том, что в нем уже реализованы различные стандарты, такие как ERC20 (Fungible Tokens) и ERC721 (NFTs), что помогает нам сэкономить время разработки и обеспечивает безопасность нашего контракта.
Пререквизиты
И OpenZepellin, и фреймворк, который мы будем использовать для развертывания контракта (Truffle), построены на JavaScript, поэтому для этого проекта нам понадобится Node. После установки node откроем терминал и введем:
node --version
Если установка прошла успешно, команда запустит нашу версию node, теперь мы можем использовать npm (Node Package Manager) для установки необходимых пакетов.
Truffle – это фреймворк, который предоставляет нам несколько инструментов для управления нашими контрактами, в данном случае мы будем использовать его для развертывания нашего контракта в тестовой сети:
npm install truffle -g
Теперь мы создадим папку нашего проекта, вы можете назвать ее как угодно, например, создайте папку test.
mkdir test
Теперь, используя терминал, заходим в эту папку
cd test
и выполните команду
В случае ошибки мы можем попробовать запустить его командой npx truffle init
.
Эта команда создаст иерархию каталогов, необходимую для создания нашего токена.
Наконец, мы используем npm для установки OpenZepellin.
Теперь мы готовы приступить к созданию нашего токена.
Понимание OpenZepellin
OpenZeppelin предоставляет нам несколько уже реализованных контрактов, например, в контракте ERC20 уже реализован стандарт ERC20 для построения нашего контракта. В дополнение к этому у нас есть расширения для добавления новых функций в наш контракт.
ERC20Burnable
Позволяет добавить возможность сжигать токены как из своего кошелька, так и из кошелька других, это может сделать либо владелец токенов, либо те, кто имеет соответствующие разрешения, чаще всего такие разрешения имеет владелец контракта.
ERC20Capped
Позволяет добавить лимит к существующему количеству жетонов.
ERC20Pausable
Позволяет добавить возможность приостановки переводов, чеканки и обжига жетонов.
ERC20Snapshot
Позволяет реализовать механизмы привязки. При создании моментального снимка остатки и общий объем поставок сохраняются, чтобы к ним можно было получить доступ в будущем.
ERC20Permit
С помощью этого расширения мы можем реализовать права доступа для других учетных записей, например, создать несколько ролей и указать, к каким функциям эти роли имеют доступ.
Помимо вышеперечисленных расширений, существуют и другие расширения, которые на момент написания статьи все еще находятся в тестовых версиях.
Создание токена
Недавно OpenZepellin добавил в свой набор новый инструмент – Wizzard. Этот инструмент служит отправной точкой для создания более сложных токенов.
В моем случае контракт, который мы создадим для нашего токена, будет иметь возможность создавать новые токены (mintable), сжигать токены (burnable) и приостанавливать как переводы, так и создание и сжигание токенов (pausable). Не забудем также задать имя и символ нашего токена, а также сумму предварительного майнинга для развертывателя контракта. При всех этих настройках Wizzard сгенерирует код, подобный этому:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract Moonify is ERC20, ERC20Burnable, Pausable, Ownable {
constructor() ERC20("Moonify", "MFY") {
_mint(msg.sender, 1000 * 10 ** decimals());
}
function pause() public onlyOwner {
_pause();
}
function unpause() public onlyOwner {
_unpause();
}
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
function _beforeTokenTransfer(address from, address to, uint256 amount)
internal
whenNotPaused
override
{
super._beforeTokenTransfer(from, to, amount);
}
}
Скопируйте код Wizzard и создайте новый файл в папке contracts, которую создал truffle. В моем случае имя файла – Moonify.sol (расширение solidity), и внутри этого файла мы вставляем код нашего контракта.
Теперь наш контракт готов, на первый взгляд он выглядит как очень простой контракт. Но в действительности он содержит несколько функциональных возможностей, с помощью которых мы можем не только передать свой токен, но и создать больше токенов или сжечь токены.
Примечание: Если вы хотите узнать более подробно, что делает каждая строка контракта, я рекомендую вам посмотреть мой видеоурок.
Развертывание контракта
Теперь, когда наш контракт завершен, мы должны развернуть его, чтобы мы могли начать использовать наш токен. В этом случае мы развернем тестовую сеть, так как в этом типе сети нам не понадобится “настоящий” ETHER для оплаты расходов на газ, в этом случае мы будем использовать сеть Kovan.
Первое, что мы сделаем, это создадим учетную запись в infura. После создания учетной записи перейдите к созданию нового проекта, дайте ему любое имя и, главное, скопируйте конечную точку, которая начинается с https.
Следующим шагом будет создание кошелька в kovan с помощью metamask, создание кошелька в metamask очень простое, просто помните, что как только вы заведете свой кошелек как сеть Kovan.
ИЗОБРАЖЕНИЕ
Наконец, нам нужно получить ETHER, помня, что этот ETHER не имеет реальной ценности, поскольку мы находимся в тестовой сети. Для этого переходим на следующую страницу: https://faucet.kovan.network/ вставляем наши открытые ключи и ждем несколько минут, пока транзакция не будет проверена.
Настройка развертывания
Мы подошли к финальной части, теперь нам осталось настроить развертывание нашего контракта, для этого нам нужно установить дополнительную библиотеку с помощью npm, для этого в терминале пишем следующую команду:
npm i -g hdwallet-provider
Теперь, если мы откроем наш конфигурационный файл truffle-config.js с помощью предпочитаемого текстового редактора, мы создадим следующие переменные.
const HDWalletProvider = require("@truffle/hdwallet-provider");
const privateKey = "TU_LLAVES_PRIVADA";
const endpointUrl = "INFURA_ENDPOINT"
/**
* Use this file to configure your truffle project. It's seeded with some...
Теперь мы переходим к части сетей конфигурационного файла и определяем сеть Kovan.
kovan: {
provider: function() {
return new HDWalletProvider(
//private keys array
[privateKey],
//url to ethereum node
endpointUrl
)
},
gas: 8000000,
gasPrice: 25000000000,
network_id: 42
},
Теперь нам нужно установить, какую версию компилятора solidity мы хотим использовать.
// Configure your compilers
compilers: {
solc: {
version: "^0.8.1", // Fetch exact version from solc-bin (default: truffle's version)
// docker: true, // Use "0.5.1" you've installed locally with docker (default: false)
// settings: { // See the solidity docs for advice about optimization and evmVersion
// optimizer: {
// enabled: false,
// runs: 200
// },
// evmVersion: "byzantium"
// }
}
},
Теперь заходим в папку migrations и создаем файл с именем 2_deploy.js и вставляем следующий код.
const contrato = artifacts.require("Moonify"); //require(nombreContrato)
module.exports = async function (deployer) {
await deployer.deploy(contrato);
}
На этом мы закончили конфигурацию для развертывания контракта, я знаю, что это кажется утомительным, но это процесс, который вы будете повторять так часто, что он станет естественным.
Теперь мы готовы к развертыванию нашего контракта. Сначала давайте составим контракт:
truffle compile
Наконец, мы собираемся выполнить развертывание:
truffle migrate --network kovan
Если все прошло успешно, вы развернули свой токен ERC20 в сети Kovan. Поздравляю! Не забудьте скопировать адрес вашего маркера, чтобы добавить его в metamask.