ИТ
December 1, 2024

Создайте свой собственный криптотокен

Полное руководство по написанию и публикации контракта BEP-20 в тестовой сети Binance Smart Chain, добавлению ликвидности и обеспечению торговли

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

Создано в ChatGPT 4o

В этом первом посте я проведу вас через создание собственного базового криптотокена — с нуля. Мы рассмотрим все: написание простого контракта токена (не волнуйтесь, знания программирования полезны, но не обязательны!), развертывание его в тестовой сети Binance Smart Chain (BSC) и, наконец, сделать ваш токен торгуемым путем листинга на PancakeSwap. Кроме того, я поделюсь ценными мыслями о том, как работает экономика токенов и как различные факторы могут повлиять на цену вашего токена.

Мы начнем с тестовой сети BSC, безопасной среды, идеально подходящей для обучения и экспериментов. Вам не нужно будет беспокоиться о расходах или ошибках. Далее в этой серии статей мы перейдем к созданию реального криптотокена с реальной ценностью. Мы также погрузимся в захватывающие побочные темы, такие как обеспечение токенов, разработка инфляционных или дефляционных механик и создание геймифицированных токенов. Я надеюсь, что вы задержитесь на все это, а пока давайте перейдем к этому посту и создадим ваш первый токен!

Хотите поддержать нас?

Просто подпишитесь на наш канал ТГ и получайте эксклюзивную информацию о нодах, ИТ решениях в криптомире и технологиях web3 и не только, раньше всех! Вокруг Крипты и Youtube👍

Введение и обзор

Мы сказали, что создадим новый криптотокен. Но что это означает на самом деле? А в чем разница с криптомонетой? Что ж, фундаментальное различие между этими двумя терминами заключается в том, что криптомонета реализует новый блокчейн, в то время как криптотокен «просто» добавляет новую полезность к существующему блокчейну — новый токен.

Некоторые известные примеры криптомонет и блокчейнов включают в себя «OG» пространства: Bitcoin (BTC) и Ethereum (ETH). Токены, с другой стороны, — это цифровые активы, которые функционируют на существующих блокчейнах. Например, Chainlink (LINK) работает на блокчейне Ethereum, в то время как Tether (USDT) изначально был запущен в сети Bitcoin с использованием протокола Omni Layer. Binance Coin (BNB), который мы будем использовать в этом уроке, является интересным кейсом. Он начинался как токен на блокчейне Ethereum, а затем стал нативной монетой, когда Binance запустила собственную блокчейн-экосистему BNB Smart Chain.

Блокчейн

Давайте кратко определимся, что такое блокчейн на самом деле: блокчейн — это распределенный реестр, который записывает транзакции в сети компьютеров таким образом, чтобы обеспечить безопасность, прозрачность и неизменность. В отличие от традиционных баз данных, блокчейны децентрализованы, что означает, что данные не контролируются одним субъектом. Вместо этого участники сети поддерживают и проверяют реестр, что делает практически невозможным изменение прошлых записей без консенсуса большинства. Эта технология лежит в основе криптовалют и обеспечивает безопасную, не требующую доверия передачу ценностей и данных, формируя основу децентрализованных финансов (DeFi), смарт-контрактов и бесчисленных инновационных приложений в криптопространстве.

Обзор

В заключение этого раздела мы дадим обзор того, что нас ждет в этом посте:

  • Мы объясним, как написать контракт токена с помощью Remix / Solidity. Это составляет исходный код, программное определение того, чем является наш токен и что он делает. Затем мы компилируем токен, то есть преобразуем исходный код в машиночитаемый код.
  • В следующем разделе мы сосредоточимся на развертывании токена в тестовой сети BSC. Для этого нам понадобится криптокошелек. Поэтому мы объясним, как настроить Metamask, открыть аккаунт и подключить его к тестовой сети BSC. Затем мы приобретем tBNB, валюту тестовой сети, и развернем наш контракт. Как только это будет сделано, ваш токен будет активен, и каждый сможет его видеть и взаимодействовать с ним. Чтобы обеспечить доверие, мы далее показываем, как проверить договор.
  • Наконец, мы рассмотрим, как другие пользователи могут взаимодействовать с токеном — в частности, мы настраиваем наш токен для торговли: это включает в себя отправку и получение токенов, а также листинг нашего токена на платформе криптобиржи. Это позволяет другим свободно торговать нашим токеном и требует создания пула ликвидности, который мы также покрываем.
  • Кроме того, мы делимся подробностями о том, как работает экономика токенов, в частности, о том, как определяется цена нашего токена: мы объясним, как на это влияет первоначальное предложение и как будущие сделки на покупку и продажу влияют на цену.

Создание контракта токена BEP-20 с помощью Remix и Solidity

В этом разделе мы создадим наш смарт-контракт с использованием Remix и Solidity. Solidity — это высокоуровневый язык программирования со статической типизацией, разработанный специально для написания смарт-контрактов, которые работают на виртуальной машине Ethereum (EVM).

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

Но, возвращаясь к EVM: его можно представить как программное обеспечение, работающее на блокчейне ETH, в частности выполняющее смарт-контракты. Почему именно ETH и EVM, спросите вы, ведь цель этого поста — создание токена BSC? На самом деле, блокчейн BSC и ETH очень похожи — и многие контракты могут быть исполнены на обоих. И поскольку комбинация Remix и Solidity настолько популярна и проверена в боях, мы используем его (который также является стандартным для большинства уроков по созданию токенов, таких как официальный от Binance).

Наконец, Remix — это онлайн-среда разработки, позволяющая писать, компилировать и развертывать контракты Solidity.

С учетом сказанного, давайте разработаем наш самый первый контракт токена. Мы разработаем токен по стандарту BEP-20 — то есть токен BSC, тесно связанный со стандартом ERC-20 от Ethereum. Сначала я покажу полный код, а затем объясню его подробно. Итак, перейдите в раздел «Ремикс», щелкните правой кнопкой мыши по папке «контракты» и выберите «Новый файл». В него введите следующий код (также доступен на Github):

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

contract BasicToken { string public name = "BasicToken"; string public symbol = "BSTK"; uint8 public decimals = 18; uint256 public totalSupply;

mapping(address => uint256) public balanceOf;

mapping(address => mapping(address => uint256)) public allowance;

event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value);

constructor(uint256 initialSupply) { totalSupply = initialSupply * (10 ** uint256(decimals)); balanceOf[msg.sender] = totalSupply; }

function transfer(address to, uint256 amount) public returns (bool) { require(to != address(0), "Invalid address"); require(balanceOf[msg.sender] >= amount, "Insufficient balance");

balanceOf[msg.sender] -= amount; balanceOf[to] += amount; emit Transfer(msg.sender, to, amount); return true; }

function transferFrom(address from, address to, uint256 amount) public returns (bool) { require(from != address(0), "Invalid from address"); require(to != address(0), "Invalid to address"); require(balanceOf[from] >= amount, "Insufficient balance"); require(allowance[from][msg.sender] >= amount, "Allowance exceeded");

balanceOf[from] -= amount; balanceOf[to] += amount; allowance[from][msg.sender] -= amount; emit Transfer(from, to, amount); return true; }

// Allow an address to spend a certain amount of tokens on behalf of the sender function approve(address spender, uint256 amount) public returns (bool) { require(spender != address(0), "Invalid address"); allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } }

// SPDX-License-Identifier: MITpragma solidity ^0.8.0;contract BasicToken {    string public name = "BasicToken";    string public symbol = "BSTK";    uint8 public decimals = 18;    uint256 public totalSupply;    mapping(address => uint256) public balanceOf;    mapping(address => mapping(address => uint256)) public allowance;    event Transfer(address indexed from, address indexed to, uint256 value);    event Approval(address indexed owner, address indexed spender, uint256 value);    constructor(uint256 initialSupply) {        totalSupply = initialSupply * (10 ** uint256(decimals));         balanceOf[msg.sender] = totalSupply;    }    function transfer(address to, uint256 amount) public returns (bool) {        require(to != address(0), "Invalid address");        require(balanceOf[msg.sender] >= amount, "Insufficient balance");        balanceOf[msg.sender] -= amount;        balanceOf[to] += amount;        emit Transfer(msg.sender, to, amount);        return true;    }    function transferFrom(address from, address to, uint256 amount) public returns (bool) {        require(from != address(0), "Invalid from address");        require(to != address(0), "Invalid to address");        require(balanceOf[from] >= amount, "Insufficient balance");        require(allowance[from][msg.sender] >= amount, "Allowance exceeded");        balanceOf[from] -= amount;        balanceOf[to] += amount;        allowance[from][msg.sender] -= amount;        emit Transfer(from, to, amount);        return true;    }    // Allow an address to spend a certain amount of tokens on behalf of the sender    function approve(address spender, uint256 amount) public returns (bool) {        require(spender != address(0), "Invalid address");        allowance[msg.sender][spender] = amount;        emit Approval(msg.sender, spender, amount);        return true;    }}

Не так уж и плохо/долго, не так ли? Давайте пройдемся по нему.

Первые несколько строк определяют новый контракт (наш токен) и устанавливают его имя, символ, а также количество знаков после запятой, которыми этот токен может торговаться. Также заявлена переменная, запоминающая общее предложение:

contract BasicToken {    string public name = "BasicToken";    string public symbol = "BSTK";    uint8 public decimals = 18;    uint256 public totalSupply;

Следующие важные строки определяют события, которые запускаются функциями, введенными позже:

event Transfer(address indexed from, address indexed to, uint256 value);event Approval(address indexed owner, address indexed spender, uint256 value);

Затем мы вводим четыре функции, необходимые для любого токена, начиная с конструктора:

constructor(uint256 initialSupply) {        totalSupply = initialSupply * (10 ** uint256(decimals));         balanceOf[msg.sender] = totalSupply;    }

Конструктор вызывается с аргументом , который мы передаем при развертывании нашего токена: это начальное количество токенов, доступных изначально. Затем этот расход отправляется в . — переменная, автоматически устанавливаемая при вызове контракта. В данном случае это будет кошелек разработчика — кошелек, который инициирует развертывание контракта. Он изначально будет «владеть» контрактом и всеми созданными токенами, а также выполнять административные обязанности. Со временем обычно право собственности переходит к контракту на управление или аналогичному, чтобы дать сообществу больше контроля.initialSupplymsg.sendermsg

Однако, прежде чем увеличивать баланс кошелька разработчика, мы видим, что умножается на . Это гарантирует, что мы можем использовать целые числа для представления минимально возможного значения токена. Причина этого кроется в ранее представленной EVM: она может обрабатывать только целые числа по причинам эффективности, плюс это смягчает проблемы округления и точности, которые в противном случае могли бы возникнуть при операциях с плавающей запятой.initialSupply10**decimals

Далее у нас есть две функции, отвечающие за отправку и получение токенов:

function transfer(address to, uint256 amount) public returns (bool) {    require(to != address(0), "Invalid address");    require(balanceOf[msg.sender] >= amount, "Insufficient balance");    balanceOf[msg.sender] -= amount;    balanceOf[to] += amount;    emit Transfer(msg.sender, to, amount);    return true;}function transferFrom(address from, address to, uint256 amount) public returns (bool) {    require(from != address(0), "Invalid from address");    require(to != address(0), "Invalid to address");    require(balanceOf[from] >= amount, "Insufficient balance");    require(allowance[from][msg.sender] >= amount, "Allowance exceeded");    balanceOf[from] -= amount;    balanceOf[to] += amount;    allowance[from][msg.sender] -= amount;    emit Transfer(from, to, amount);    return true;}

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

С помощью последней функции мы позволяем тратящему тратить определенное количество токенов от имени отправителя/звонящего. Хотя это может показаться более продвинутой функцией, которую мы могли бы выдать в нашем самом первом контракте, на самом деле это требуется на более позднем этапе, а именно на разрешении торговать нашим токеном на PancakeSwap. PancakeSwap здесь играет роль , так как он может распределять токены от нашего имени:spender

// Allow an address to spend a certain amount of tokens on behalf of the senderfunction approve(address spender, uint256 amount) public returns (bool) {    require(spender != address(0), "Invalid address");    allowance[msg.sender][spender] = amount;    emit Approval(msg.sender, spender, amount);    return true;}

Составление договора

По умолчанию Remix автоматически компилирует ваш контракт. Компиляция обозначает этап преобразования написанного нами кода в машиночитаемый код, который может быть понят EVM. Чтобы проверить это, запустите его вручную или измените версию компилятора, выбрав в строке меню пункт "Компилятор Solidity":

Изображение автора

Развертывание контракта

Следующий шаг — развертывание нашего смарт-контракта. Для этого нам понадобится существующий криптокошелек — так как он будет служить кошельком разработчика, представленным выше. Если у вас уже есть это, и вы хотите использовать свой — смело пропускайте дальше. В следующем разделе я объясню, как использовать Metamask для этого, и, в частности, проведу вас через все шаги, включая создание первоначального аккаунта.

Инициализация Metamask и подключение к тестовой сети BSC

Я использую Metamask в качестве расширения в своем браузере, поэтому перейдите туда и установите соответствующее расширение. Запустите расширение и добавьте новую учетную запись.

Далее нам нужно добавить тестовую сеть BSC, так как мы будем работать с этим блокчейном. Для этого выберите опцию «Блокчейны» с помощью символа в левом верхнем углу, затем нажмите «Добавить сеть» и введите следующие данные:

После этого обзор вашей сети должен выглядеть примерно так:

Изображение автора

ПРИМЕЧАНИЕ: Важно, чтобы "BNB Testnet" находился "выше" "BNB Chain". На следующем шаге мы подключим Remix к Metamask — и я не нашел способа задать нужную сеть в Remix, кроме как убедиться, что нужная сеть (тестовая сеть BSC) — это та, которая сейчас выбрана в Metamask. Впрочем, для меня даже с этим набором Remix изначально всегда шел на «стандартный» BNB Chain — и только после его удаления я получал нужную тестовую сеть. Таким образом, если вы также испытываете трудности с этим: удалите все другие сети или, по крайней мере, сеть BNB Chain.

Пополнение счета

Теперь мы инициализировали Metamask и подключили его к тестовой сети, мы также хотим поиграть с некоторыми средствами. К счастью, это именно то, что предлагает тестовая сеть, и мы можем запросить много tBNB по небольшой цене (0,002 BNB). Для этого перейдите в https://www.bnbchain.org/en/testnet-faucet, где вы можете запросить, например, 0,3 tBNB за вышеуказанную плату при подключении Metamask.

Естественно, эта комиссия должна быть доступна в вашем аккаунте Metamask, а это означает, что вам уже понадобится иметь немного криптовалюты. Как это получить, не является частью этого урока, и я хотел бы отослать вас к любому другому отличному уроку. Просто следуйте им, например, откройте аккаунт на Binance, оплатите фиатными деньгами и получите 0,002 BNB (или чуть больше, счет для комиссии за перевод), а затем отправьте их на свой аккаунт в Metamask.

Развертывание контракта

Теперь мы настроили криптокошелек, включили тестовую сеть BSC и добавили в нее немного тестовых средств, мы готовы развернуть наш контракт с использованием этого кошелька.

Для этого выберите «Deploy & run transactions» на левой боковой панели Remix и выберите «Injected Provider — Metamask» для подключения вашего кошелька:

Изображение автора

Затем остаются только ввести начальное предложение (10000 в этом примере) и фактически развернуть контракт с помощью кнопки «Deploy».

Поздравляем — ваш первый смарт-контракт теперь в сети и работает на цепочке BSC (test)!

Проверка контракта

Далее мы можем проверить контракт. Это важный шаг при создании криптотокенов, так как он значительно повышает доверие в сообществе (а также требуется некоторыми предстоящими шагами). Частью процесса проверки является загрузка и публикация исходного кода и таким образом доказательство того, что этот контракт не имеет злых намерений. Если бы мы этого не сделали, кто знает, что бы с ним сделал смарт-контракт, в который мы вложили свои деньги.

Чтобы подтвердить свой контракт, перейдите по ссылке: https://testnet.bscscan.com/verifyContract. На этой странице введите адрес кошелька, на котором находится контракт (ваш кошелек, также отображается в Remix в разделе «Развертывание» / «Развернутые контракты»), используемую версию компилятора (также видимую через Remix — см. выше), а также соответствующую лицензию (в нашем случае лицензии нет).

На следующей странице мы копируем и вставляем наш исходный код в соответствующее поле и выбираем, какая оптимизация была сделана при компиляции. ПРИМЕЧАНИЕ: все эти поля являются обязательными, выбор, например, неправильного компилятора или неправильного уровня оптимизации приведет к неудаче.

При успешном выполнении вы должны увидеть экран, подобный этому:

Изображение автора

Теперь ваш токен проверен, и каждый, кто ищет ваш контракт на BSCScan, может увидеть соответствующую информацию! Тестовый контракт, который мы разрабатываем вместе в этом посте, можно найти в разделе https://testnet.bscscan.com/address/0x600FFbe01a6a28E95Ef5870C74F248B805c87E90#code.

Торговля нашим токеном

Мы выполнили все (большинство) самого необходимого, выполнили домашнюю работу и завершили техническую часть генерации нового криптотокена. Теперь пришло время привлечь внимание к токену, разрешить публичные торги — и, надеюсь, увидеть, как проект станет успешным, а цена токена вырастет.

Импорт нашего токена в Metamask

Итак, когда наш контракт уже заключен и работает, давайте начнем его использовать. Во-первых, мы хотим импортировать его в Metamask — т.е. мы можем, например, видеть наш баланс и отправлять и получать токены. Для этого нажмите «Импортировать токены» в нижней части окна Metamask и вставьте мой (или ваш) адрес контракта в соответствующее поле — когда адрес будет валидным, остальные поля (например, символ токена) будут заполнены автоматически:

Изображение автора

После этого сводка вашего аккаунта должна выглядеть примерно так:

Изображение автора

Как вы можете видеть, я владею примерно 0,22 TBNB, оставшимися от моего первоначального приобретения, а также 9500 BSTK: я являюсь кошельком разработчика, поэтому все 10 000 созданных токенов поступили на мой счет — и я уже перевел 500 токенов на PancakeSwap, как мы увидим позже.

Перевод токенов

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

Торговля через криптобиржу

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

Для этого нам нужно зарегистрировать наш токен на криптобирже. В этом посте мы будем использовать PancakeSwap. Для того, чтобы пользователи могли торговать токеном и чтобы обеспечить достаточное количество токенов и других валют для этого, нам нужно добавить пул ликвидности: это пул токенов, в простейшем случае ваш токен и другой, скажем, BNB, которые можно обменивать друг на друга. То, сколько соответствующих токенов мы изначально вносим в пул ликвидности, влияет на начальную цену. Когда пользователи покупают наш токен, они платят в BNB и получают наш токен. И наоборот, при продаже токена он добавляется в пул, в то время как BNB выводится. Эти движения, естественно, также влияют на цену — подробнее об этом чуть позже, а еще больше в следующем посте.

Во-первых, давайте посмотрим, как создать этот пул: перейдите в https://pancakeswap.finance/liquidity?chain=bscTestnet. Там выберите "V2 Liqudity", и вы увидите окно, похожее на это:

Изображение автора

Нам предлагается ввести пару токенов: слева мы выбираем tBNB — валюту, против которой мы хотим сбалансировать наш токен. Справа выбираем наш токен. Для этого нажмите на соответствующее поле, а затем на «Mange Tokens» добавить его (введите адрес контракта).

Я добавлю 0,05 tBNB, и 500 BSTK. После этого мой обзор ликвидности выглядит следующим образом:

Изображение автора

Расчет цены

Что это значит? Как уже упоминалось, одним из важных последствий этого является начальная цена: поскольку я внес 0,05 tBNB и 500 BSTK, то 1 BSTK теперь стоит 0,0001 tBNB! Если бы это был «настоящий» BNB, то по сегодняшней цене (на момент написания статьи) это было бы 5 евроцентов.

Как изменится цена, когда другие люди купят и продадут криптовалюту? Это определяется по следующей формуле:

x — это количество tBNB в пуле, количество наших токенов и константа, которую мы устанавливаем с начальной ликвидностью. Для нас это:yk

Теперь предположим, что кто-то покупает 10 BTSK, что приводит к снижению на 10 токенов BTSK в пуле ликвидности. Для того, чтобы (1) оставался постоянным, пул должен иметь 25 / 490 = 0,051020408 tBNB — это означает, что нам нужно добавить ~0,001 tBNB в пул — это цена, запрашиваемая покупателем. После этой сделки наш токен стоит 0,000104123 tBNB — рост на 4%.

Покупка токена

После этих теоретических расчетов давайте посмотрим, как на самом деле можно было бы купить и продать токен. Для этого перейдите на главный экран Pancakeswap, просто нажмите «Торговать» и выберите наш токен:

Изображение автора

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

Добавление логотипа

Одна вещь, которую вам может не хватать, — это крутой логотип для нашего токена. Я проверил, и кажется, PancakeSwap не поддерживает это для тестовой цепочки — извините! Давайте разберемся в этом при создании «настоящего» токена.

Заключение

Поздравляем с созданием собственного токена BEP-20! В этом руководстве мы начали с нуля, изучив основные шаги, необходимые для воплощения вашей идеи в жизнь в тестовой сети Binance Smart Chain. Мы начали с написания и понимания базового контракта Solidity с помощью Remix, затем рассмотрели настройку криптокошелька с помощью MetaMask, подключение к тестовой сети BSC и развертывание токена. После этого мы обсудили важнейший процесс проверки вашего контракта для укрепления доверия и обеспечения прозрачности. Наконец, мы рассмотрели, как добавить ликвидность и включить торговлю на PancakeSwap, а также получили представление о том, как работает экономика токенов и динамика цен.

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

Спасибо, что читаете и находите время, чтобы учиться вместе с нами. Оставайтесь с нами, чтобы не пропустить следующий пост в этой серии, в котором мы перейдем на новый уровень — выйдем за рамки основ и углубимся в такие темы, как безопасность токенов, создание инфляционных или дефляционных механик и даже геймификация ваших токенов. Увидимся в следующий раз, и удачного кодирования!

Вы можете присоединиться к нам и принять участие в обсуждении → Telegram: Contact @razgules