Laborator 9

Tematica laboratorului: ERC-20 Tokens si prezentari articole

Implementarea unui token in Ethereum poate fi utila in diverse scopuri cum ar fi: definirea unei noi unitati de currency, reprezentarea unor actiuni (in sensul de actionariat al unei companii), reprezentarea unor voturi, etc. Mai multe detalii relativ la tokens au fost prezentate in cadrul cursului.
Exista mai multe standarde pentru implementarea de tokens, ce definesc practic interfete si precizeaza anumite detalii recomandate in implementare. Unul din cele mai populare astfel de standarde este ERC-20, a carui specificatie poate fi consultata la aceasta adresa.
O implementare de token ce respecta aceasta interfata ar trebui sa ofere cel putin urmatoarele functii si evenimente:

  • totalSupply - returneaza numarul total de unitati existente definite pentru token
  • balanceOf - returneaza balanta in unitati de token de la o anumita adresa
  • transfer - transfera o anumita cantitate de unitati de token de la apelant la o adresa data
  • approve - autorizeaza o anume adresa sa poata transfera pana la o anume limita de unitati de token din balanta apelantului
  • transferFrom - transfera o anumita cantitate de unitati de token de la o adresa data catre alta adresa, pe baza unei aprobari date folosind functia anterioara
  • allowance - returneaza suma ramasa permisa pentru a fi transferata de catre o adresa autorizata de la o alta adresa ce a autorizat o limita de transfer
  • Transfer - eveniment lansat la un transfer efectuat cu succes
  • Approval - eveniment lansat la o autorizarea efectuata cu succes

Signaturile complete ale functiilor si evenimentelor de mai sus ar fi urmatoarele:

   function totalSupply() constant returns (uint theTotalSupply);
   function balanceOf(address _owner) constant returns (uint balance);
   function transfer(address _to, uint _value) returns (bool success);
   function transferFrom(address _from, address _to, uint _value) returns (bool success);
   function approve(address _spender, uint _value) returns (bool success);
   function allowance(address _owner, address _spender) constant returns (uint remaining);
   event Transfer(address indexed _from, address indexed _to, uint _value);
   event Approval(address indexed _owner, address indexed _spender, uint _value);

In plus, standardul defineste si trei functii optionale: name, symbol si decimals ce ar trebui sa returneze un nume al tokenului, un acronim (simbol) pentru token si respectiv un numar de zecimale reprezentand gradul de divizibilitate a tokenului.

De regula implementarile ERC-20 definesc doi membri de tip mapping, unul pentru retinerea balantelor asociate cu tokenul respectiv si unul pentru retinerea permisiunilor de transfer. Ca o analogie un contract ce implementeaza un token poate fi asemanat cu o banca/institutie financiara ce emite o moneda proprie si detine in permanenta o centralizare a conturilor tuturor entitatilor ce detin moneda respectiva si a permisiunilor acestora de limite de plati din propriul cont.

Balantele asociate in tokenul respectiv pentru adresele ce il folosesc e definit de regula printr-un simplu mapping de forma:

mapping(address => uint256) public balances;

Permisiunile de transfer se pastreaza de regula intr-un mapping bi-dimensional, unde prima cheie este adresa proprietarului balantei, a doua cheie adresa autorizata pentru a realiza transferul din balanta proprietarului si valoarea finala reprezentand suma ramasa permisa pentru a fi transferata:

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

Doua implementari publice ale tokenului ERC-20 (ce pot fi utilizate de exemplu pentru a defini un token propriu ERC-20 prin mostenire) sunt cele oferite de ConsenSys si OpenZepellin. Ca nota, se poate observa ca si contractele respective extind alte contracte, o parte din elementele necesare in token fiind definite in aceste contracte/interfete de baza (de exemplu totalSupply in cazul implementarii ConsenSys, care este de altfel definit ca o variabila membru si nu ca functie). De asemenea implementarile pot include si metode aditionale, cum ar fi increaseApproval sau decreaseApproval dedicate cresterii sau scaderii unei autorizari de transfer in cadrul implementarii OpenZepellin.

© 2023 Emanuel Onica. Parts of design by W3Layouts