Lab: Emiterea unei monede criptografice

In primul rand as vrea sa lamuresc diferenta dintre token (jeton) si coin (moneda). Acesti termeni se folosesc de multe ori cu acelasi sens, chiar daca nu sunt sinonimi.

O moneda (coin) este un mijloc de schimb, are o valoare si se foloseste pentru a cumpara bunuri si servicii. O moneda criptografica are propriul blockchain, iar doar cateva example ar fi Bitcoint (BTC), Litecoin (LTC), Ripple (XRP) sau Monero (XMR).

Un jeton (token) are de asemenea o valoarea, doar ca de cele mai multe ori se foloseste de un alt blockchain cum ar fi Ethereum sau Waves. In plus un token are o utilitate in cadrul unei platforme (ex: BAT in ecosistemul format in jurul browserului Brave).

Pentru a ramane cat mai corecti, in acest post voi prezenta crearea unui token bazat pe platforma Ethereum si standardul ERC20.

Acest articol este recomandat celor care deja au cunostinte de baza despre Blockchain, Ethereum si Solidity. Nu este pentru incepatori.

ERC20 defineste o serie de reguli pe care "Ethereum based tokens" trebuie sa le urmeze si anume functiile si evenimentele care trebuie implementate intr-un contract.

ERC20 reprezinta o interfata standard pe care aplicatiile (MEW, Mist, DEX etc) o folosesc pentru a interactiona cu tokens.

Exemple de ERC20 Tokens: https://etherscan.io/tokens

Exista 6 functii si 2 evenimente obligatorii care trebuie implementate:

https://theethereum.wiki/w/index.php/ERC20_Token_Standard

 

Si acum haideti sa vedem pas cu pas cum emitem propria moneda criptografica sau mai corect propriul token.

Un token ERC20 bazat pe Ethereum este un smart contract.

 

1. Smart contract source code.

In Google Chrome, in Remix Solidity Browser  scriem codul smart contractului.

Voi folosi comentarii pentru explicatii suplimentare.

pragma solidity ^0.4.22;//versiunea compilatorului solidity folosit

//interfata pe care trebuie sa o implementeze smart contractul nostru
//aceasta este obligatoriu sa fie implementata
interface ERC20{
    function balanceOf(address) view external returns(uint);
    function totalSupply() view external returns(uint);
    function transfer(address to, uint value) external returns(bool);
    event Transfer(address indexed to, uint tokens);
}


contract Zeus is ERC20{
    //numele tokenului si simbolul
    string public name = "Zeus";
    string public symbol = "ZS";
    //nr. de zecimale
    uint public decimals = 0;
    //nr. total de tokenuri
    uint supply = 1000000;
    
    //structura de tip mapping care contine ca cheie adresa posesorului, iar ca valoare nr. de tokens
    mapping (address => uint) balances;
    //ownerul este cel care face deployment la contract, cel care creaza tokenul
    address public owner;
    
    //constructorul contractului, se executa o singura data la deployment
    function Zeus() public{
        //ownerul este cel care face deployment, variabila globala mst.sender
        owner = msg.sender;
        //ownerul detine pt. inceput toate tokenurile
        balances[msg.sender] = supply;
    }
    
    //functie de tip getter, returneaza balance unei adrese
    function balanceOf(address addr) view external returns(uint){
        return balances[addr];
    }
    
    //returneaza nr. total de tokens
    function totalSupply() view external returns(uint){
        return supply;
    }
    
    //functie apelata automat de aplicatia folosita pentru transferul tokenurilor (Mew, MetaMask, Mist etc)
    function transfer(address to, uint tokens) external returns(bool){
        //verificam ca cel care doreste sa transfere are cel putin cati tokeni vrea sa transfere
        require(balances[msg.sender] >= tokens); 
        
        //scadem nr. de tokeni transferati din balanta senderului
        balances[msg.sender] -= tokens;
        
        //adaugam nr. de token la balanta destinatorului
        balances[to] += tokens;
        
        //emitem evenimentul, logul tranzactiei
        emit Transfer(to, tokens);
        return true;
    }
    
}

2. Smart Contract deployment.

Avand metamask instalat ca extensie pentru Chrome Browser, un cont deblocat care detine Ether, vom face deployment pe Ethereum testnet Rinkeby.

Rinkeby este un blockchain de test pe care putem executa smart contracts fara a plati bani reali. Obtinerea de Ether pentru Rinkeby este gratuita si se realizeaza la adresa: https://faucet.rinkeby.io/

Daca dorim sa emitem token-ul pe main net, din Metamask vom alege main net, dar vom plati minarea tranzactiei cu Ether care costa bani adevarati.

In Remix, in tabul Run, se environment se alege Injected Web3 (Rinkeby) si se apasa Create

Apare fereastra Metamask pentru confirmarea tranzactiei. Odata confirmata tranzactia trebuie asteptat sa fie minata.

In partea de jos a Remix cu mesaje de consola, apare linkul catre Etherscan cu hash-ul tranzactiei. In aproximativ 15 secunde tranzactia este minata.

Pentru exemplul de mai sus avem: https://rinkeby.etherscan.io/tx/0x3af3cff02dc26abaeb80e256b5fab22cb9662bf19c0dd34d0aab0c2c24ca5194

Din acel moment tokenul nostru, Zeus, exista si poate fi tranferat intre posesorii de adrese Ethereum.

Voila ! Acum avem propria moneda criptografica  care beneficiaza de toate avantajele blockchain: nu poate fi oprita, stearsa, exista pentru totdeauna, posesia ei este garantata criptografic etc.

Fiind un token compatibil ERC20 se poate folosi orice aplicatie pentru a transfera tokenul sau pentru a vedea soldul: MyEtherWallet, Metamask sau Mist.

Trebuie avut insa grija ca aceste aplicatii sa foloseasca test net Rinkeby si nu Ethereum main net. 

In exemplul de mai sus toti cei 1.000.000 de tokens sunt in posesia contului care a facut deployment la smart contract.

Acesta poate trimite tokens si altor adrese.

Pentru a putea fi afisat soldul, tokenul trebuie adaugat in wallet (add token in Mew de exemplu).

 

Acest exemplu nu implementeaza complet standardul ERC20, este minimal pentru a exista tokenul si a putea fi transferat.

Intr-un articol viitor voi prezenta modul prin care se creaza smart contractul pentru un ICO (Initial Coin Offering).

Pana atunci spor la invatat !