ERC-20

rodzaj inteligentnego kontraktu, który jest tokenem na Ethereum

ERC-20 (Ethereum Request for Comments 20[1]) – to standard tokenów w sieci Ethereum, używany jest w inteligentnych kontraktach. Standard ten dyktuje listę zasad i kroków, które inteligentny kontrakt musi przestrzegać aby móc go zaimplementować[2]. Dzięki niemu deweloperzy mają możliwość łatwiejszego oraz zestandaryzowanego tworzenia tokenów działających w sieci Ethereum[3].

Historia edytuj

Standard ERC-20 został zaproponowany przez Fabiana Vogelstellera[4] w listopadzie 2015[2] a oficjalnie został rozpoznawany we wrześniu 2017[5]. Stworzenie tego standardu poprzedził koncept do Ethereum Improvement Proposal(inne języki) (EIP)[6]. W EIP developerzy opisują nowe funkcje z protokołami i standardami, następnie komitet dokonuje analizy i zatwierdza dane EIP. Końcowa wersja została zatwierdzona w EIP-20, nazwa została przyjęta od tej wersji[7]. Sam ERC (Ethereum request for comment) jest podobny do konceptu Request for comment (RFC) zaproponowanego przez Internet Engineering Task Force (IETF)[8], miał on na celu przekazanie deweloperom i użytkownikom instrukcji oraz wymagań technicznych.

Popularność ERC-20 edytuj

ERC-20 jest dominującą ścieżką tworzenia nowych wymienialnych tokenów[2]. Standard ten zyskał duża popularność wśród firm crowdfundingowych dzięki Initial Coin Offering (ICO), dzięki któremu firmy wprowadzające np. nową kryptowalutę lub zdecentralizowaną aplikację mogą pozyskać fundusze od inwestorów. Popularny jest także ERC-721 do tworzenia niewymienialnych tokenów (NFT)[9].

Wiele nowo powstałych projektów kryptowalut, po wprowadzeniu standardu zyskało miliony środków na rozwój właśnie dzięki ICO[10], najpopularniejszy z nich to EOS(inne języki), który zebrał ponad 185 milionów dolarów[11].

Rodzaje tokenów edytuj

Utility Tokens edytuj

Utility tokens (pl. Tokeny użytkowe) to tokeny dzięki którym uzyskujemy dostęp do danej usługi lub produktu oferowanego przez konkretną firmę[12]. Bardzo często można je kupić przez Initial Coin Offering (ICO) w celu wsparcia projektu, a następnie korzystania z jego usług. Cena tokena uzależniona jest w głównej mierze od powodzenia danego projektu[13].

 
Utility Tokens

Przykłady Utility Tokens[14] edytuj

  • Basic Attention Token (BAT)

Security Token edytuj

Posiadanie takiego tokenu odzwierciedla posiadanie akcji, udziałów, obligacji, własności danego aktywa[12]. Tokeny te można traktować jako papiery wartościowe, są w pełni regulowane przez prawo. Zastosowanie tokenu w celu nabycia akcji wśród inwestorów można zaprojektować tak aby zapewniał prawo do głosu i dywidendy[15].

Przykłady tokenów ERC-20[16] edytuj

 
Przykłady tokenów ERC-20

Implementacja ERC-20 edytuj

Aby token był w standardzie ERC-20, jego inteligenty kontrakt musi zawierać poniższe metody i wydarzenia.

Metody[17] edytuj

  • Name – Nazwa tokenu
  • Symbol – Symbol/Skrót tokenu
  • Decimals – Punkty dziesiętne tokenu
  • TotalSupply – Całkowita podaż tokenów
  • BalanceOf – Informuje o stanie konta użytkownika
  • Transfer – Przelewa tokeny na określony adres
  • TransferFrom – Przelewa tokeny z określonego adresu
  • Approve – Zezwala na wypłatę tokenów z konta
  • Allowance – Zwraca tokeny do właściciela konta
function name() public view returns (string)
function symbol() public view returns (string)
function decimals() public view returns (uint8)
function totalSupply() public view returns (uint256)
function balanceOf(address _owner) public view returns (uint256 balance)
function transfer(address _to, uint256 _value) public returns (bool success)
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
function approve(address _spender, uint256 _value) public returns (bool success)
function allowance(address _owner, address _spender) public view returns (uint256 remaining)

Wydarzenia[17] edytuj

event Transfer(address indexed _from, address indexed _to, uint256 _value)
event Approval(address indexed _owner, address indexed _spender, uint256 _value)

Inne standardy edytuj

Pomimo szerokiego wsparcia dla standardu ERC-20 oraz powstawania nowych tokenów, niektórzy tworzą nowe standardy[18] z racji na myśl o ograniczeniach ERC-20.

Przykładowe standardy oparte na ERC-20[11]:

  • ERC-621
  • ERC-827
  • ERC-223

Dla przykładu, standard ERC223 rozwiązuje problemy takie jak[19]:

  • Przypadkowe wysłanie tokenów – Przypadkowe wywołanie funkcji transfer bez transferFrom w ERC-20 spowoduje utratę tokenów w kontrakcie odbiorcy
  • Brak obsługi przychodzących transakcji – ERC-20 nie informuje odbiorcy o transakcji która się odbyła. Brak obsługi przychodzących transakcji tokenów oraz zablokowania niewspieranych tokenów
  • Optymalizacja komunikacji – W ERC-20 aby wykonać transakcję address-to-contract należy wykonać dwie funkcje, approve oraz transferFrom. W ERC-223 jest to pojedyncza transakcja, która zużywa 2 razy mniej gasu[20]
  • Różnica w zachowaniu – Upodobnienie funkcjonowania do transakcji Ethereum, dzięki temu unikamy błędów podczas przesyłania tokenów oraz ułatwiamy pracę deweloperom kontraktów.

Przykładowa implementacja tokena ERC-20 edytuj

Każdy może stworzyć swojego tokena w prosty sposób za pomocą platform internetowych z wirtualna maszyną Ethereum[21] (EVM – Ethereum Virtual Machine) takich jak ethfiddle czy remix.ethereum.

Istnieją również biblioteki do bezpiecznej implementacji smart kontraktów takie jak OpenZeppelin[22].

Do implementacji na powyższych stronach potrzebny jest poniższy kod w języku Solidity(inne języki), który odpowiada za tworzenie tokenu[3].

pragma solidity ^0.6.0;

interface IERC20 {

    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

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

contract ERC20Basic is IERC20 {

    string public constant name = "ERC20Basic";
    string public constant symbol = "ERC";
    uint8 public constant decimals = 18;

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

    mapping(address => uint256) balances;

    mapping(address => mapping (address => uint256)) allowed;

    uint256 totalSupply_;

    using SafeMath for uint256;

   constructor(uint256 total) public {
    totalSupply_ = total;
    balances[msg.sender] = totalSupply_;
    }

    function totalSupply() public override view returns (uint256) {
    return totalSupply_;
    }

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

    function transfer(address receiver, uint256 numTokens) public override returns (bool) {
        require(numTokens <= balances[msg.sender]);
        balances[msg.sender] = balances[msg.sender].sub(numTokens);
        balances[receiver] = balances[receiver].add(numTokens);
        emit Transfer(msg.sender, receiver, numTokens);
        return true;
    }

    function approve(address delegate, uint256 numTokens) public override returns (bool) {
        allowed[msg.sender][delegate] = numTokens;
        emit Approval(msg.sender, delegate, numTokens);
        return true;
    }

    function allowance(address owner, address delegate) public override view returns (uint) {
        return allowed[owner][delegate];
    }

    function transferFrom(address owner, address buyer, uint256 numTokens) public override returns (bool) {
        require(numTokens <= balances[owner]);
        require(numTokens <= allowed[owner][msg.sender]);

        balances[owner] = balances[owner].sub(numTokens);
        allowed[owner][msg.sender] = allowed[owner][msg.sender].sub(numTokens);
        balances[buyer] = balances[buyer].add(numTokens);
        emit Transfer(owner, buyer, numTokens);
        return true;
    }
}

library SafeMath {
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
      assert(b <= a);
      return a - b;
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
      uint256 c = a + b;
      assert(c >= a);
      return c;
    }
}

Przypisy edytuj

  1. EIP-20: Token Standard [online], Ethereum Improvement Proposals [dostęp 2022-02-25] (ang.).
  2. a b c Standard tokena ERC-20 [online], ethereum.org [dostęp 2023-01-29] (pol.).
  3. a b Standard tokena ERC-20 [online], ethereum.org [dostęp 2022-02-26] (pol.).
  4. Fabian Vogelsteller – LUKSO | LinkedIn [online], linkedin.com [dostęp 2024-04-23] (niem.).
  5. Michal Adrian, What is ERC-20 Token Standard & Why You Shouldn’t Use It: A Guide By Ulam Labs [online], Ulam Labs [dostęp 2022-02-26] (ang.).
  6. Home [online], Ethereum Improvement Proposals [dostęp 2022-02-26] (ang.).
  7. EIP-20: Token Standard [online], Ethereum Improvement Proposals [dostęp 2022-02-26] (ang.).
  8. Home [online], IETF [dostęp 2022-02-26] (ang.).
  9. ERC-721 Non-Fungible Token Standard [online], ethereum.org [dostęp 2022-02-26] (ang.).
  10. ERC20 Token Standard [online], IndexUniverse Crypto [dostęp 2022-02-26] (ang.).
  11. a b What Crypto Users Need to Know: The ERC20 Standard [online], Investopedia [dostęp 2022-02-26] (ang.).
  12. a b Bitpanda, What is the difference between Utility Tokens and Security Tokens? [online], www.bitpanda.com [dostęp 2022-02-26] (ang.).
  13. Co wpływa na cenę kryptowalut? 5 głównych czynników | Tokeneo [online], Wiadomości Tokeneo, 7 grudnia 2019 [dostęp 2022-02-26] (pol.).
  14. o, Token Tracker | Etherscan [online], Ethereum (ETH) Blockchain Explorer [dostęp 2022-02-26] (ang.).
  15. https://www.researchgate.net/publication/343093095_A_Decentralized_Voting_Mechanism_Engaging_ERC-20_token_holders_in_decision-making.
  16. o, Token Tracker | Etherscan [online], Ethereum (ETH) Blockchain Explorer [dostęp 2022-02-25] (ang.).
  17. a b ERC-20 Token Standard [online], ethereum.org [dostęp 2022-02-26] (ang.).
  18. ERC [online], Ethereum Improvement Proposals [dostęp 2022-02-25] (ang.).
  19. Dexaran, Dexaran/ERC223-token-standard [online], 25 lutego 2022 [dostęp 2022-02-26].
  20. Gaz i opłaty [online], ethereum.org [dostęp 2022-02-26] (pol.).
  21. Ethereum Virtual Machine (EVM) [online], ethereum.org [dostęp 2022-02-26] (ang.).
  22. ERC 20 – OpenZeppelin Docs [online], docs.openzeppelin.com [dostęp 2022-02-25] (ang.).