Przejdź do zawartości

ERC-20

Z Wikipedii, wolnej encyklopedii

ERC-20(Ethereum Request for Comments 20[1]) – to standard tokenów w sieciEthereum,używany jest winteligentnych 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|edytuj kod]

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 doEthereum Improvement Proposal(inne języki)(EIP)[6].W EIPdeveloperzyopisują 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 konceptuRequest for comment(RFC) zaproponowanego przezInternet Engineering Task Force(IETF)[8],miał on na celu przekazanie deweloperom i użytkownikom instrukcji oraz wymagań technicznych.

Popularność ERC-20

[edytuj|edytuj kod]

ERC-20 jest dominującą ścieżką tworzenia nowych wymienialnych tokenów[2].Standard ten zyskał duża popularność wśród firmcrowdfundingowychdziękiInitial 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 toEOS(inne języki),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)

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|edytuj kod]
Przykłady tokenów ERC-20
Przykłady tokenów ERC-20

Implementacja ERC-20

[edytuj|edytuj kod]

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

  • 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
functionname()publicviewreturns(string)
functionsymbol()publicviewreturns(string)
functiondecimals()publicviewreturns(uint8)
functiontotalSupply()publicviewreturns(uint256)
functionbalanceOf(address_owner)publicviewreturns(uint256balance)
functiontransfer(address_to,uint256_value)publicreturns(boolsuccess)
functiontransferFrom(address_from,address_to,uint256_value)publicreturns(boolsuccess)
functionapprove(address_spender,uint256_value)publicreturns(boolsuccess)
functionallowance(address_owner,address_spender)publicviewreturns(uint256remaining)
eventTransfer(addressindexed_from,addressindexed_to,uint256_value)
eventApproval(addressindexed_owner,addressindexed_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 funkcjitransferbeztransferFromw 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-contractnależy wykonać dwie funkcje,approveoraztransferFrom.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 jakethfiddleczyremix.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ęzykuSolidity(inne języki),który odpowiada za tworzenie tokenu[3].

pragma solidity^0.6.0;

interfaceIERC20{

functiontotalSupply()externalviewreturns(uint256);
functionbalanceOf(addressaccount)externalviewreturns(uint256);
functionallowance(addressowner,addressspender)externalviewreturns(uint256);

functiontransfer(addressrecipient,uint256amount)externalreturns(bool);
functionapprove(addressspender,uint256amount)externalreturns(bool);
functiontransferFrom(addresssender,addressrecipient,uint256amount)externalreturns(bool);

eventTransfer(addressindexedfrom,addressindexedto,uint256value);
eventApproval(addressindexedowner,addressindexedspender,uint256value);
}

contractERC20BasicisIERC20{

stringpublicconstantname="ERC20Basic";
stringpublicconstantsymbol="ERC";
uint8publicconstantdecimals=18;

eventApproval(addressindexedtokenOwner,addressindexedspender,uinttokens);
eventTransfer(addressindexedfrom,addressindexedto,uinttokens);

mapping(address=>uint256)balances;

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

uint256totalSupply_;

usingSafeMathforuint256;

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

functiontotalSupply()publicoverrideviewreturns(uint256){
returntotalSupply_;
}

functionbalanceOf(addresstokenOwner)publicoverrideviewreturns(uint256){
returnbalances[tokenOwner];
}

functiontransfer(addressreceiver,uint256numTokens)publicoverridereturns(bool){
require(numTokens<=balances[msg.sender]);
balances[msg.sender]=balances[msg.sender].sub(numTokens);
balances[receiver]=balances[receiver].add(numTokens);
emitTransfer(msg.sender,receiver,numTokens);
returntrue;
}

functionapprove(addressdelegate,uint256numTokens)publicoverridereturns(bool){
allowed[msg.sender][delegate]=numTokens;
emitApproval(msg.sender,delegate,numTokens);
returntrue;
}

functionallowance(addressowner,addressdelegate)publicoverrideviewreturns(uint){
returnallowed[owner][delegate];
}

functiontransferFrom(addressowner,addressbuyer,uint256numTokens)publicoverridereturns(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);
emitTransfer(owner,buyer,numTokens);
returntrue;
}
}

librarySafeMath{
functionsub(uint256a,uint256b)internalpurereturns(uint256){
assert(b<=a);
returna-b;
}

functionadd(uint256a,uint256b)internalpurereturns(uint256){
uint256c=a+b;
assert(c>=a);
returnc;
}
}

Przypisy

[edytuj|edytuj kod]
  1. EIP-20: Token Standard[online], Ethereum Improvement Proposals[dostęp 2022-02-25](ang.).
  2. abcStandard tokena ERC-20[online], ethereum.org[dostęp 2023-01-29](pol.).
  3. abStandard 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. MichalAdrian,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. abWhat Crypto Users Need to Know: The ERC20 Standard[online], Investopedia[dostęp 2022-02-26](ang.).
  12. abBitpanda,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. abERC-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.).