Понимание стандартов токенов в Ethereum (ERC20)

Понимание стандартов токенов в Ethereum (ERC20)

1 марта 2023 г.

Создавать и размещать собственные токены в Интернете слишком просто. Блокчейн и смарт-контракты сделали это возможным. Да, вы не ослышались. Вы можете разместить свои собственные токены в Интернете. И это тоже без создания совершенно новой цепочки блоков, такой как Биткойн или Эфириум.

Эти токены — это просто фрагмент кода, работающий поверх блокчейна.

Вот краткое руководство по блокчейну.

<цитата>

Почему я пишу это? В рамках своего обучения я начал изучать стандарты токенов, и проблема, с которой я столкнулся, заключалась в нехватке ресурсов, где можно найти все о стандарте токенов. Ни один ресурс не содержал всего о стандарте токенов. ERC20 был простым, поэтому это не заняло много времени. Но ERC721 и ERC1155 заняли слишком много времени, чтобы собрать информацию и собрать их вместе. Да, было легко импортировать контракты Openzeppelin и создавать токены, но вы изучите концепции, только если будете практиковать все самостоятельно. Итак, просто прочитайте эти сообщения и приступайте к разработке и развертыванию своих токенов.

Начнем с токенов.

Необходимые условия

<цитата>

знание языка Solidity и принципов его работы (развертывание и взаимодействие).

Знания об интерфейсах. (Вот полезный ресурс)

По сути, токены — это тип криптовалюты, которая работает поверх блокчейна с некоторыми особыми вариантами использования, например, вы можете создавать токены для финансирования своих проектов, которые называются ICO (первичное размещение монет), аналогично рынку акций, или вы можете также используйте токены для присвоения определенного цифрового актива, который имеет определенную ценность, кроме того, токены могут использоваться для представления права собственности на некоторые данные. Они также используются в управлении, как? Лицо, владеющее определенным количеством токенов компании, получает право голосовать за решения компании. И еще много вариантов использования. Единственное, что вам нужно, — это смарт-контракт, развернутый на блокчейне.

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

Чтобы решить эту проблему, у нас есть стандарты токенов ERC.

Запрос Эфириума на комментарии

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

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

Различные стандарты ERC

Существует множество различных стандартов токенов ERC, но мы поговорим о некоторых наиболее популярных и часто используемых. Это ERC-20, ERC-721 и ERC-1155. Есть еще много стандартов, которые предлагаются для улучшения старых с обратной совместимостью, мы поговорим о них на ходу.

<цитата>

ERC-20 — взаимозаменяемый

Токены ERC-721 — не взаимозаменяемые

TokensERC-1155 — Взаимозаменяемые и невзаимозаменяемые токены (также полувзаимозаменяемые)

Не знаете разницы между взаимозаменяемыми и не взаимозаменяемыми? Давайте учиться.

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

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

Первый стандарт, предложенный в сети Ethereum, который является самым известным и основным, который приходит на ум всем, когда мы говорим о стандарте токенов, — это стандарт токенов ERC-20.

ERC-20

Стандарт токенов ERC-20 был предложен в 2015 году для взаимозаменяемых токенов. Взаимозаменяемость означает взаимозаменяемость, то есть каждый токен такой же, как другой токен. Этот стандарт имеет девять функций и два события, которые необходимо реализовать при создании токена ERC-20.

ERC-20 имеет следующие функции:

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

Давайте посмотрим на интерфейс ERC-20.

Интерфейс ERC20

pragma solidity 
^0.8.0;
  interface IERC20 { 
      event Transfer(address indexed from, address indexed to, uint256 value); 
      event Approval(address indexed owner, address indexed spender, uint256 value); 
      function totalSupply() external view returns (uint256); 
      function balanceOf(address account) external view returns (uint256); 
      function transfer(address to, uint256 amount) external returns (bool); 
      function allowance(address owner, address spender) external view returns (uint256);
      function approve(address spender, uint256 amount) external returns (bool);
      function transferFrom(address from, address to, uint256 amount) external returns (bool);
  }

Сначала мы увидим функции.

Первые три функции, а именно name(), symbol() и decimal(), считаются необязательными и не включены в интерфейс контракта ERC20. Но они действительно важны, и мы не можем их игнорировать.

n 1. Функция name() должна возвращать имя токена, которое хранится в переменной состояния.

имя функции()общего представления возвращает (строка);

2. Функция symbol() должна возвращать аббревиатуру токена, которая также сохраняется в переменной состояния.

функция symbol()public view возвращает (строка);

<сильный>3. decimals() важно отметить, потому что Solidity не поддерживает плавающие числа, и для выполнения транзакций со значениями, такими как 1,5, 2,4 и т. д., мы должны разбить число на меньшие номиналы. Помните, как токен эфира можно разбить на более низкие номиналы, такие как Gwei, Finney и Wei. Обычно мы присваиваем 18 знаков после запятой, и это также рекомендуется.

функция decimals() возвращает общедоступное представление (uint8);

<сильный>4. totalSupply() Эта функция должна возвращать общее количество токенов на рынке. Общее предложение токена должно зависеть только от двух функций: чеканки или сжигания. Чеканка означает поставку вновь созданных токенов, а сжигание означает уничтожение токенов. Мы поговорим об обоих позже.

функция totalSupply() возвращает публичное представление (uint256);

<сильный>5. balanceOf() принимает адрес в качестве аргумента и возвращает баланс токена. Как он узнает о моем балансе? Мы определяем сопоставление внутри нашего контракта, которое отслеживает наш баланс, каждый раз, когда происходит транзакция токенов, это сопоставление должно обновляться, поскольку это будет единственный источник баланса. выглядит так:

сопоставление(адрес => uint ) внутреннего баланса;

Эта функция balanceOf просто возвращает значение из сопоставления.

функция balanceOf(address _owner)public viewreturns (баланс uint256);

<сильный>6. Transfer() — это функция, используемая для отправки токенов с одного адреса на другой. Принимает в качестве аргументов адрес, на который должны быть отправлены токены, и uint, представляющий собой количество отправляемых токенов. И он должен вычесть токены из msg.sender и добавить сумму получателю. Как работают вычитание и сложение? Как я уже говорил ранее о сопоставлении balance. Мы просто уменьшаем и увеличиваем количество токенов в отображении.

передача функции(адрес _to, uint256 _value)publicreturns (логический успех);

<сильный>7. TransferFrom() делает то же самое, что и функция transfer, но есть разница. Эта функция используется для отправки токенов с одного адреса на другой адрес по третьему адресу. Как кто-то может потратить мои токены? Это безопасно? Да, потому что любой адрес может потратить ваш токен только в том случае, если вы разрешили это сделать. Как мы делаем это? Вот о чем следующая функция.

функция transferFrom(address _from, address _to, uint256 _value)public возвращает (логический успех);

8. approve() используется для одобрения любой учетной записи на использование токенов из учетной записи, которая ее одобряет. Он принимает два аргумента: первый — это адрес транжиры, а второй — стоимость токенов, которые транжирщику разрешено тратить. Затем мы обновляем вложенное отображение с помощью этого ввода. Какое сопоставление? Сопоставление для утверждения записывается следующим образом: сопоставление (адрес=>сопоставление (адрес=>сумма)) внутреннее разрешено;

функция одобряет(адрес _spender, uint256 _value)public возвращает (логический успех);

9. allowance() используется для проверки оставшихся токенов для утвержденного адреса для расходования. Он просто возвращает чтение данных из сопоставления allowed.

функция разрешения (адрес _owner, адрес _spender) возвращает общедоступное представление (осталось uint256);

Это были функции, которые должны были быть определены при создании токена ERC20. Помимо этого, у нас есть два события, которые должны запускаться в нужное время. Они:

  1. Перенос: каждый раз, когда происходит перенос токенов с одной учетной записи на другую, должно инициироваться это событие. Совершенно очевидно, что это должно генерироваться внутри функций transfer и transferFrom. Но есть еще две функции во время реализации, где генерируется это событие. Функции Mint и burn. Мы поговорим об этом через некоторое время. А пока просто помните, что при генерации этого события в функции mint адрес отправителя должен быть нулевым, а в функции burn получатель должен иметь нулевой адрес. Нулевой адрес выглядит так: 0x000000000000000000000000000000000000000000В солидности address(0) означает этот нулевой адрес.

Передача события (адрес проиндексирован _from, адрес проиндексирован _to, uint256 _value);

  1. Утверждение. Это событие должно запускаться внутри функции approve каждый раз, когда кто-то утверждает какой-либо адрес.

Подтверждение события (адрес с индексом _owner, индекс с адресом _spender, uint256 _value);

Каждый токен ERC20 должен реализовывать эти функции в контракте.

Посмотрите на этот простой реализованный смарт-контракт.

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface ERC20Interface {

function allowance(address tokenOwner, address spender) public virtual view returns (uint remaining);
function balanceOf(address tokenOwner) public virtual view returns (uint balance);
function totalSupply() public view virtual returns  (uint);
function transferFrom(address from, address to, uint tokens) public virtual returns (bool success);
function transfer(address to, uint tokens) public virtual returns (bool success);
function approve(address spender, uint tokens) public virtual returns (bool success);

event Transfer(address indexed from, address indexed to, uint tokens);  
event Approval(address indexed tokenOwner, address indexed spender, uint tokens);  
event Supply(address indexed to, uint indexed amount, uint remainingSupply);  

}

contract Token is ERC20Interface  {
string public name;
string public symbol;
uint8 public decimals;
uint256 public _totalSupply;
uint public maximumSupply;
address public owner;

mapping(address => uint) private balances;  
mapping(address => mapping(address => uint)) private  allowed;  

constructor()  {  
    name = "MyFirstToken";  
    symbol = "MFT";  
    decimals = 18;  
    _totalSupply =  5000000 * 10**18;  
    maximumSupply = 10000000 * 10**18;  
    owner= msg.sender;  

    balances[msg.sender] = _totalSupply;  
    emit Transfer(address(0), msg.sender, _totalSupply);  
}  

function  remainingToken() public view returns (uint remainingSupply) {  

    return ( maximumSupply - _totalSupply);  
}  


modifier ownable ()  {  
    require (msg.sender== owner," only owner can perform this");  
    _;  
}  

function totalSupply() public override view returns (uint) {  
    return _totalSupply ;  
}  

function balanceOf(address tokenOwner) public override view returns (uint balance) {  
    return balances[tokenOwner];  
}  

function allowance(address tokenOwner, address spender) public override view returns (uint remaining) {  
    return allowed[tokenOwner][spender];  
}  

function approve(address spender, uint tokens) public override returns (bool success)  {  
    allowed[msg.sender][spender] = tokens;  
    emit Approval(msg.sender, spender, tokens);  
    return true;  
}  

function transfer(address to, uint tokens) public override returns (bool success) {  
    balances[msg.sender] = (balances[msg.sender] -= tokens);  
    balances[to] = (balances[to] += tokens);  
    emit Transfer(msg.sender, to, tokens);  
    return true;  
}  

function transferFrom(address from, address to, uint tokens) public override returns (bool success) {  
    require(balances[from] >=tokens, "You don't have enough tokens");  
    require(allowed[from][msg.sender] >=tokens, "You are not allowed to send tokens");  
    balances[from] = (balances[from] -= tokens);  
    allowed[from][msg.sender] = (allowed[from][msg.sender] -= tokens);  
    balances[to] = (balances[to]+= tokens);  
    emit Transfer(from, to, tokens);  
    return true;  
}  

function mint (address to ,uint amount) public ownable {  
   require(_totalSupply + amount <= maximumSupply,"You are exceeding the maximum supply");  
   balances[to] += amount;  
   _totalSupply += amount;  
   emit Supply(to,amount,remainingToken());  
}  

function burn (uint amount) public {  
    require(balances[msg.sender] >= amount, "not enough balance to burn");  
    balances[msg.sender] -= amount;  
    emit Supply(msg.sender, amount, remainingToken());  
}         

Это действительно простая реализация, в которой вы можете видеть, что токен контракта наследуется от интерфейса и реализует каждую функцию, определенную внутри интерфейса. Обратите внимание, что есть две дополнительные функции mint и burn.

МИНТ

Функция mint предназначена для чеканки новых токенов. Когда вы увидите код внутри него, вы заметите, что он увеличивает баланс любого адреса. Это означает, что в этом кошельке чеканятся новые токены. Но почему мы генерируем здесь событие перехода? Это связано с тем, что чеканка рассматривается как передача токенов с нулевого адреса на заданный адрес.

СЖИГАТЬ

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

Это почти все о стандарте токенов ERC20. Это очень просто и легко.

Но это только для взаимозаменяемых токенов, а как насчет невзаимозаменяемых токенов NFT? ERC-721 является стандартом для NFT. Давайте поговорим об этом в следующем посте.


:::информация Также опубликовано здесь.

:::


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE