Отказ от ответственности. Эта статья не содержит рекомендаций по финансам или инвестициям. Это техническая статья о разработке смарт-контрактов на Ethereum.

Что такое токен ERC20 (взаимозаменяемый)?

ERC20 — это стандарт смарт-контрактов Ethereum для взаимозаменяемых токенов. Смарт-контракт ERC20 поддерживает согласованные операции, такие как transfer, transferFrom, balanceOf и так далее. Если ваш смарт-контракт соответствует стандарту ERC20, вы сможете торговать своими токенами через любого поставщика кошелька Ethereum, такого как MetaMask.

Зачем это делать?

Помимо изучения нового технического навыка, токены ERC20 можно использовать для представления практически чего угодно.

  • Вы можете обмениваться жетонами с друзьями всякий раз, когда выигрываете игру друг против друга, сохраняя текущий подсчет победителей.
  • Вы можете обменивать жетоны всякий раз, когда платите за кофе или еду другу, ведя текущую бухгалтерскую книгу о том, сколько денег вы кому-то должны.
  • Вы можете оставить свой токен на память и обменяться им с друзьями на память. Операции в блокчейне Ethereum являются постоянными. Как только вы отчеканите и обменяете свой токен, он навсегда останется в блокчейне Ethereum. Возможности того, что вы хотите, чтобы токен представлял, безграничны.

Обмен токенов на Ethereum стоит газа, который деноминирован в ETH, и требует времени. Вам нужно будет помнить о времени транзакций и ценах на газ для вашего варианта использования.

Как создать токен ERC20 Ethereum

Разработка Ethereum с Solidity аналогична разработке JavaScript. Вы обнаружите много общего, которое покажется вам очень знакомым, если вы имеете опыт работы с JavaScript.

Предпосылки

  1. Установите node/npm. Эти инструкции зависят от вашей системы.

2. Создайте проект узла. Это делается с помощью npm init -y. Никаких специальных настроек npm package.json нам не понадобится.

3. Установите truffle. Truffle — популярный пакет разработки Solidity. Он устанавливается с помощью npm install truffle.

4. Инициализируйте свой проект truffle. Вы можете сделать это с помощью truffle init. Выполнение этой команды создаст в вашем проекте три каталога: contracts, migrations и test.

Эта команда также создает файл truffle-config.js. Как следует из названия, этот файл содержит параметры конфигурации Truffle.

5. Установите ganache-cli с помощью npm i -D ganache-cli. ganache-cli — это тестовый блокчейн Ethereum, который работает на вашем локальном компьютере.

6. Установите openzeppelin. Openzeppelin — это организация, которая предоставляет многоразовые библиотеки смарт-контрактов, проверенные на безопасность. Чтобы создать токен ERC20, мы создадим смарт-контракт, который наследуется от контракта Openzeppelin ERC20. Вы можете установить openzeppelin с помощью следующей команды:

npm install @openzeppelin/contracts

7. Установите @truffle/hdwallet-provider. Мы будем использовать эту библиотеку для взаимодействия с нашим кошельком Ethereum. Вы можете установить его с помощью этой команды:

npm install --save-dev @truffle/hdwallet-provider

Разработка

Создание нашего первого смарт-контракта

Теперь пришло время создать наш первый смарт-контракт. Я назову токен mytoken, но вы можете называть его как хотите. Просто убедитесь, что заменили все экземпляры mytoken своим именем токена.

Мы собираемся использовать truffle для создания начального смарт-контракта. Выполните следующую команду:

npx truffle create mytoken

Поздравляем, вы создали свой первый смарт-контракт! Вот содержимое contracts/mytoken.sol:

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

contract mytoken {
  constructor() public {
  }
}

Прежде чем мы продолжим разработку, давайте скомпилируем наш смарт-контракт, чтобы убедиться, что все работает правильно. Мы можем скомпилировать наш смарт-контракт, используя

npx truffle compile

Если вы видите сообщение об успешном завершении, похожее на это, до этого момента все работает:

> Artifacts written to ./build/contracts
> Compiled successfully using:
    - solc: 0.8.17+commit.8df45f5f.Emscripten.clang

Создание нашего токена ERC20

Если бы мы собирались создать токен ERC20 с нуля, нам пришлось бы реализовать всю функциональность самостоятельно. Вы можете сделать это для обучения, хотя есть вероятность, что вы будете делать ошибки. Ошибки смарт-контрактов не только трудно исправить, но и, когда на карту поставлены реальные деньги, они могут привести к потере средств.

Вот где на помощь приходит OpenZeppelin. OpenZeppelin предоставляет проверенные на безопасность реализации стандартов токенов Ethereum. Используя их реализацию токена, мы можем не только сэкономить часы разработки, но также можем быть уверены, что наш код безопасен.

Чтобы использовать реализацию OpenZeppelin ERC20, мы можем изменить наш смарт-контракт, чтобы он выглядел следующим образом:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract mytoken is ERC20 {
    constructor() ERC20("mytoken", "MTK") {}
}

«is» — это ключевое слово Solidity для наследования контрактов. Нам необходимо создать наш токен с именем и символом токена. Здесь мы используем «mytoken» и «MTK».

Не имеет значения, существует ли уже токен с таким же именем или символом. Токены Ethereum привязаны к адресу смарт-контракта, а не к символу токена, поэтому может существовать бесконечно много токенов с одним и тем же именем и символом.

Большой! Это все, что нам нужно сделать, чтобы создать смарт-контракт, совместимый с ERC20!

В OpenZeppelin есть онлайн-мастер контрактов ERC20, который позволяет вам играть с параметрами конфигурации ERC20 и настраивать свой токен. Мастер контрактов находится здесь. Поэкспериментируйте с вариантами и узнайте о возможностях общих токенов ERC20.

Используя мастер контрактов, я собираюсь создать токен с предварительно отчеканенным общим объемом 10 000 и передать их создателю токена. Мастер контрактов дает нам следующий смарт-контракт:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract mytoken is ERC20 {
    constructor() ERC20("mytoken", "MTK") {
        _mint(msg.sender, 10000 * 10 ** decimals());
    }
}

Поздравляем! Вы только что запрограммировали свой первый токен ERC20. Теперь нам нужно развернуть наш токен в блокчейне.

Развертывание нашего токена в тестовом блокчейне

Мы собираемся развернуть наш токен на двух тестовых цепочках блоков: цепочке, работающей на нашем локальном компьютере, и общедоступной тестовой цепочке.

Именно здесь появляется каталог migrations. В этом каталоге вы храните свои миграции смарт-контрактов. Миграция смарт-контрактов похожа на миграцию базы данных, если вы работаете с базами данных или серверами. Как и миграция базы данных, в этой папке миграции вы храните сценарии, которые развертывают новые смарт-контракты и обновляют уже существующие смарт-контракты.

Давайте создадим нашу первую миграцию смарт-контракта. Создайте файл с именем migrations/2_deploy.js. Префикс номера определяет порядок переноса, если в этой папке имеется несколько переносов.

Давайте добавим следующий код в нашу миграцию:

// migrations/2_deploy.js
const mytoken = artifacts.require('mytoken');
module.exports = async function (deployer) {
  await deployer.deploy(mytoken);
};

Миграция трюфелей — это функция, которая принимает один аргумент — средство развертывания миграции. В этом сценарии миграции все, что мы делаем, — это вызываем средство развертывания на нашем токене. Это развертывает его в текущей подключенной цепочке блоков.

Теперь, когда мы написали нашу миграцию, нам нужно запустить ее в блокчейне. Давайте сначала воспользуемся нашим локальным блокчейном.

Мы можем запустить наш локальный блокчейн с помощью следующей команды:

npx ganache-cli

Если эта команда выполнена успешно, значит, вы только что начали разработку блокчейна Ethereum на своем локальном компьютере.

Теперь, когда наша локальная цепочка блоков запущена, давайте развернем наш токен ERC20. Для этого нам нужно войти в truffle-config.js и рассказать трюфелю о нашем тестовом блокчейне.

Раскомментируйте следующие строки:

networks: {
  development: {
    host: "127.0.0.1",     // Localhost (default: none)
    port: 8545,            // Standard Ethereum port (default: none)
    network_id: "*",       // Any network (default: none)
  },
}

Этот блок уже содержит необходимую конфигурацию ганаша. Теперь все, что нам нужно сделать, это запустить npx truffle migrate. Truffle использует сеть development по умолчанию. Вот результаты:

$ npx truffle migrate
Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.

Starting migrations...
======================
> Network name:    'development'
> Network id:      1672641649621
> Block gas limit: 30000000 (0x1c9c380)

2_deploy.js
===========
   Deploying 'mytoken'
   ---------------------
   > transaction hash:    0xbc1cf5cb0888b8df450a590ddd6b04b280feae03943e30e58c2269e83d5471a9
   > Blocks: 0            Seconds: 0
   > contract address:    0xA3c2E627223577C1F43B5137A8BD93f13c682185
   > block number:        1
   > block timestamp:     1672641673
   > account:             0x54B718C486485b619224F3e5627C6c6c98ea1CD6
   > balance:             999.996024628
   > gas used:            1177888 (0x11f920)
   > gas price:           3.375 gwei
   > value sent:          0 ETH
   > total cost:          0.003975372 ETH
   > Saving artifacts
   -------------------------------------
   > Total cost:         0.003975372 ETH
Summary
=======
> Total deployments:   1
> Final cost:          0.003975372 ETH

Развертывание нашего токена в общедоступной тестовой цепочке блоков

Наконец, мы собираемся развернуть наш токен в реальной общедоступной тестовой цепочке блоков под названием Goerli.

  1. Мы собираемся использовать платформу Alchemy для выполнения операций в сети Goerli. Alchemy — это платформа разработки Ethereum, которая помогает разработчикам создавать и развертывать свои приложения Ethereum. Перейдите на https://dashboard.alchemy.com/ и создайте учетную запись. Запишите этот ключ API.
  2. Для развертывания нашего смарт-контракта потребуется кошелек, чтобы предоставить газ для развертывания и сбросить созданный запас. Если вы еще этого не сделали, установите расширение Metamask для Chrome. Следуйте инструкциям по установке, затем создайте кошелек для нашего проекта.

Для подписи транзакций нам нужен закрытый ключ нашего кошелька. Имейте в виду, что любой, у кого есть закрытый ключ кошелька, может авторизовать транзакции в этом кошельке. Поскольку мы копируем этот ключ и храним его в виде открытого текста на нашем компьютере, разумно не добавлять реальные средства в этот кошелек. Копируя закрытый ключ, мы раскрываем ключ потенциально небезопасному программному обеспечению, которое имеет доступ к буферу обмена или файлам нашего компьютера.

Чтобы получить закрытый ключ нашего кошелька, нажмите «Сведения об учетной записи» -> «Экспортировать закрытый ключ».

Затем добавьте следующее в начало truffle-config.js, чтобы импортировать библиотеку hdwallet-provider:

const HDWalletProvider = require('@truffle/hdwallet-provider');

Добавьте это в раздел конфигурации:

networks: {
  goerli: {
    provider: () => new HDWalletProvider(
      YOUR_PRIVATE_KEY, `https://eth-goerli.alchemyapi.io/v2/YOUR_ALCHEMY_APIKEY`,
    ),
    network_id: 5,
    confirmations: 2,
    timeoutBlocks: 200,
    skipDryRun: true
  },
}

Лучше всего хранить закрытый ключ как переменную среды и использовать process.env для его загрузки. Но мы используем тестовую цепочку и никогда не собираемся размещать в этом кошельке реальные средства, поэтому пока примем эту дыру в безопасности.

Добавление средств в наш тестовый кошелек

Теперь, когда у нас есть тестовый кошелек и тестовая конфигурация, нам нужно добавить средства в наш кошелек. Не волнуйтесь, тестовые сети разработаны так, чтобы быть полностью бесплатными.

Чтобы получить средства на наш кошелек, перейдите на https://goerlifaucet.com/. Перейдите в Metamask, скопируйте публичный адрес вашего кошелька и введите его здесь. Нажмите отправить мне ETH.

Теперь давайте подтвердим, что наши средства поступили в наш кошелек Metamask.

Metamask по умолчанию не показывает тестовые сети. Давайте настроим Metamask для отображения сети Goerli.

  • В Metamask перейдите в «Настройки» -> «Дополнительные настройки» -> затем включите переключатель «Показать тестовые сети».
  • Теперь на главной странице кошелька щелкните раскрывающийся список «Сети» вверху и выберите «Тестовая сеть Goerli». После того, как ваша транзакция будет принята сетью Goerli, ваши средства появятся здесь.

Поздравляю! Напомним, вы только что сделали следующее:

  • Пополнил кошелек Metamask с помощью GoerliETH
  • Связал свой кошелек Metamask с приложением Truffle

Теперь Truffle готов начать авторизацию транзакций.

Чтобы убедиться, что все подключено правильно, мы можем сделать следующее:

  • Запустите эту команду: $ npx truffle console --network goerli
  • Это запустит интерактивную командную строку Truffle с сетью Goerli, что позволит вам взаимодействовать с сетью Goerli.
  • Запустите эту трюфельную команду:
truffle(goerli)> accounts
[ '0x393Ec8199dE1dA01470Dcd28fc14191e21034f4C' ]

Этот адрес кошелька должен совпадать с публичным адресом вашего кошелька в Metamask. Если это так, то поздравляю! Вы готовы развернуть свой токен в сети Goerli!

Разверните наш токен в цепочке Goerli Test

Прежде чем развертывать наш токен, давайте проведем пробный запуск, чтобы увидеть примерную стоимость газа. Для этого запустим npx truffle migrate --network goerli --dry-run. Вы увидите вывод, аналогичный тому, что мы видели для цепочки разработки:

Migrations dry-run (simulation)
===============================
> Network name:    'goerli-fork'
> Network id:      5
> Block gas limit: 30000000 (0x1c9c380)

2_deploy.js
===========
   Replacing 'mytoken'
   ---------------------
   > block number:        8246272
   > block timestamp:     1672694372
   > account:             0x393Ec8199dE1dA01470Dcd28fc14191e21034f4C
   > balance:             0.677639235933063438
   > gas used:            1177888 (0x11f920)
   > gas price:           2.500000015 gwei
   > value sent:          0 ETH
   > total cost:          0.00294472001766832 ETH
   -------------------------------------
   > Total cost:     0.00294472001766832 ETH
Summary
=======
> Total deployments:   1
> Final cost:          0.00294472001766832 ETH

Поскольку мы используем сеть Goerli, нам не нужно беспокоиться о ценах на газ. Однако в основной сети Ethereum вы будете использовать эту информацию и соответствующим образом корректировать свой план развертывания.

Теперь мы можем запустить полное развертывание с помощью npx truffle migrate --network goerli.

Чтобы убедиться, что наше развертывание работает, скопируйте адрес контракта и найдите адрес контракта на https://goerli.etherscan.io/. Если все работает правильно, вы увидите транзакцию, создающую контракт. Если вы нажмете на отслеживание токенов, вы увидите, что общий запас токена составляет 10 000, 1 держатель и 1 передача.

Последний шаг — импортировать наш токен ERC20 в Metamask, чтобы мы могли обмениваться им с нашими друзьями. Сделать это:

  • Откройте Metamask и нажмите «Импортировать токен».
  • Скопируйте и вставьте адрес контракта. Остальные данные заполнятся автоматически. Если это не так, добавьте «MTK» для символа и «18» для десятичной точки.

Нажмите Enter, и токен должен появиться в вашем кошельке Metamask.

Поздравляем! Вы только что создали токен ERC20 с общим запасом 10 000. Мы не создавали mintable токен, поэтому невозможно увеличить общее количество без обновления контракта.

Теперь мы можем обменять этот токен с нашими друзьями, используя Metamask или любого поставщика кошелька Ethereum.

Резюме и следующие шаги

Подводя итог, мы только что сделали следующее:

  • Создан проверенный на безопасность токен ERC20 Ethereum с использованием языка программирования Solidity и набора инструментов Truffle Ethereum.
  • Мы также создали смарт-контракт в Solidity
  • Развернул наш токен ERC20 в тестовой сети Goerli Ethereum.

Похлопайте себя по спине! Теперь вы можете сказать, что создали крипто-токен!

Вот несколько следующих шагов, если вы хотите продолжить разработку:

  • Разверните свой токен в основной сети Ethereum. Убедитесь в том, чтобы оценить и понять цены на газ. Если вы не оцените стоимость газа перед развертыванием, вы можете потратить больше ETH, чем вам удобно.
  • Настройте свой токен ERC20 с дополнительными функциями.
  • Добавьте логотип на свой токен с помощью Etherscan.
  • Дайте вашему токену годовой уровень инфляции 1%.
  • Создайте приложение web3 для взаимодействия с вашими токенами. Вы можете показать адреса кошельков для всех держателей токенов и создать веб-интерфейс для торговли этим токеном.
  • Создайте игру, в которой игроки ставят жетоны для игры. Проигравшие отдают поставленные токены победителям.

Спасибо за чтение, и, пожалуйста, оставьте комментарий, если что-то было неясно или если у вас возникли трудности с какой-либо из инструкций!

Ссылки и ссылки

Новичок в трейдинге? Попробуйте криптотрейдинговые боты или копи-трейдинг на лучших криптобиржах