ERC-20
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 (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 ,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].
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]- VeChain
- Tron
- Binance Coin
- DigixDAO
- ICON
- RChain
- EOS
- Loopring
- IOStoken
- Basic Attention TokenBasic 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
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)
Wydarzenia[17]
[edytuj|edytuj kod]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 ,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]- ↑EIP-20: Token Standard[online], Ethereum Improvement Proposals[dostęp 2022-02-25](ang.).
- ↑abcStandard tokena ERC-20[online], ethereum.org[dostęp 2023-01-29](pol.).
- ↑abStandard tokena ERC-20[online], ethereum.org[dostęp 2022-02-26](pol.).
- ↑Fabian Vogelsteller – LUKSO | LinkedIn[online], linkedin.com[dostęp 2024-04-23](niem.).
- ↑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.).
- ↑Home[online], Ethereum Improvement Proposals[dostęp 2022-02-26](ang.).
- ↑EIP-20: Token Standard[online], Ethereum Improvement Proposals[dostęp 2022-02-26](ang.).
- ↑Home[online], IETF[dostęp 2022-02-26](ang.).
- ↑ERC-721 Non-Fungible Token Standard[online], ethereum.org[dostęp 2022-02-26](ang.).
- ↑ERC20 Token Standard[online], IndexUniverse Crypto[dostęp 2022-02-26](ang.).
- ↑abWhat Crypto Users Need to Know: The ERC20 Standard[online], Investopedia[dostęp 2022-02-26](ang.).
- ↑abBitpanda,What is the difference between Utility Tokens and Security Tokens?[online], www.bitpanda.com[dostęp 2022-02-26](ang.).
- ↑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.).
- ↑o,Token Tracker | Etherscan[online], Ethereum (ETH) Blockchain Explorer[dostęp 2022-02-26](ang.).
- ↑https://www.researchgate.net/publication/343093095_A_Decentralized_Voting_Mechanism_Engaging_ERC-20_token_holders_in_decision-making.
- ↑o,Token Tracker | Etherscan[online], Ethereum (ETH) Blockchain Explorer[dostęp 2022-02-25](ang.).
- ↑abERC-20 Token Standard[online], ethereum.org[dostęp 2022-02-26](ang.).
- ↑ERC[online], Ethereum Improvement Proposals[dostęp 2022-02-25](ang.).
- ↑Dexaran,Dexaran/ERC223-token-standard[online], 25 lutego 2022[dostęp 2022-02-26].
- ↑Gaz i opłaty[online], ethereum.org[dostęp 2022-02-26](pol.).
- ↑Ethereum Virtual Machine (EVM)[online], ethereum.org[dostęp 2022-02-26](ang.).
- ↑ERC 20 – OpenZeppelin Docs[online], docs.openzeppelin.com[dostęp 2022-02-25](ang.).