ERC-20

Z Wikipedii, wolnej encyklopedii
Przejdź do nawigacji Przejdź do wyszukiwania

ERC-20 (Etherum 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ć. Dzięki niemu deweloperzy mają możliwość łatwiejszego oraz zestandaryzowanego tworzenia tokenów działających w sieci Ethereum. ERC-20 zostało zaproponowane przez Fabiana Vogelstellera[2] w listopadzie 2015 r.[3]

Historia[edytuj | edytuj kod]

Standard ERC-20 został zaproponowany oraz tworzony przez Fabiana Vogelstellera wraz z innymi deweloperami w listopadzie 2015r, oficjalnie został rozpoznawalny we wrześniu 2017 r.[4] Aby stworzyć ten standard, deweloper musiał wprowadzić koncept do Ethereum Improvement Proposal (EIP)[5]. W EIP deweloperzy opisują nowe funkcjonalności 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[6].

Request for comment[edytuj | edytuj kod]

ERC-20 (Ethereum request for comment) jest podobny do konceptu Request for comment (RFC) zaproponowanego przez Internet Engineering Task Force (IETF)[7], miał on na celu przekazanie deweloperom i użytkownikom instrukcji oraz wymagań technicznych.

Popularność ERC[edytuj | edytuj kod]

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

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

Rodzaje tokenów[edytuj | edytuj kod]

Utility Tokens[edytuj | edytuj kod]

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
Utility Tokens

Przykłady Utility Tokens[14][edytuj | edytuj kod]

  • Basic Attention Token (BAT)
  • 0x (ZRX)
  • Filecoin (FIL)
  • Golem (GNT)
  • Binance Coin (BNB)
  • Aurora (AOA)

Security Token[edytuj | edytuj kod]

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. Security Token jest oparty na technologii blockchain (tak jak wszystkie tokeny ERC-20) dzięki czemu oferuje transparentność.

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 | edytuj kod]

Przykłady tokenów ERC-20
Przykłady tokenów ERC-20
  • VeChain
  • Tron
  • Binance Coin
  • DigixDAO
  • ICON
  • RChain
  • EOS
  • Loopring
  • IOStoken
  • Basic Attention Token
  • Golem
  • 0x
  • OmiseGO
  • Tether
  • Chainlink
  • Wrapped Bitcoin
  • Augur

Implementacja ERC-20[edytuj | edytuj kod]

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

Metody[17][edytuj | edytuj kod]

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 | edytuj kod]

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

Inne standardy[edytuj | edytuj kod]

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 | edytuj kod]

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, 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 | edytuj kod]

  1. EIP-20: Token Standard, Ethereum Improvement Proposals [dostęp 2022-02-25] (ang.).
  2. https://de.linkedin.com/in/fabian-vogelsteller-46365042.
  3. a b Standard tokena ERC-20, ethereum.org [dostęp 2022-02-26] (pol.).
  4. Michal <michal popiel@ulam io>Adrian <adrian@ulam.io>, What is ERC-20 Token Standard & Why You Shouldn’t Use It: A Guide By Ulam Labs, Ulam Labs [dostęp 2022-02-26] (ang.).
  5. Home, Ethereum Improvement Proposals [dostęp 2022-02-26] (ang.).
  6. EIP-20: Token Standard, Ethereum Improvement Proposals [dostęp 2022-02-26] (ang.).
  7. Home, IETF [dostęp 2022-02-26] (ang.).
  8. What Is ERC-20 and What Does It Mean for Ethereum?, Investopedia [dostęp 2022-02-26] (ang.).
  9. ERC-721 Non-Fungible Token Standard, ethereum.org [dostęp 2022-02-26] (ang.).
  10. ERC20 Token Standard, IndexUniverse Crypto [dostęp 2022-02-26] (ang.).
  11. a b What Crypto Users Need to Know: The ERC20 Standard, Investopedia [dostęp 2022-02-26] (ang.).
  12. a b Bitpanda, What is the difference between Utility Tokens and Security Tokens?, www.bitpanda.com [dostęp 2022-02-26] (ang.).
  13. Co wpływa na cenę kryptowalut? 5 głównych czynników | Tokeneo, Wiadomości Tokeneo, 7 grudnia 2019 [dostęp 2022-02-26] (pol.).
  14. o, Token Tracker | Etherscan, 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, Ethereum (ETH) Blockchain Explorer [dostęp 2022-02-25] (ang.).
  17. a b ERC-20 Token Standard, ethereum.org [dostęp 2022-02-26] (ang.).
  18. ERC, Ethereum Improvement Proposals [dostęp 2022-02-25] (ang.).
  19. Dexaran, Dexaran/ERC223-token-standard, 25 lutego 2022 [dostęp 2022-02-26].
  20. Gaz i opłaty, ethereum.org [dostęp 2022-02-26] (pol.).
  21. Ethereum Virtual Machine (EVM), ethereum.org [dostęp 2022-02-26] (ang.).
  22. ERC 20 – OpenZeppelin Docs, docs.openzeppelin.com [dostęp 2022-02-25] (ang.).