Cilj ovog članka je pokazati kako stvoriti ERC20 token u što kraćem vremenu.
Počnimo s osnovama: Što je to ERC20 token?
Posljednjih godina specifikacija tokena ERC20 postala je defacto standardom za Ethereum tokene. Drugim riječima, većina današnjih ugovora Ethereuma usklađena je s ERC20. Ovaj će članak detaljno objasniti kako možete stvoriti vlastiti Ethereum token, no prije nego što započnemo, pogledajmo bliže standard ERC20.
Što ERC20 tokene čini tako atraktivnim i uspješnim? U igri je nekoliko čimbenika:
Baš kao i drugi Ethereum tokeni, ERC20 tokeni implementirani su kao pametni ugovori i izvršavaju se na Ethereum Virtual Machine (EVM) na decentraliziran način.
Pametni ugovori Ethereuma napisani su u Solidity. Iako postoje alternativni jezici, rijetko ih tko koristi u tu svrhu. Solidnost je slična JavaScriptu, pa ako imate neko znanje o JavaScriptu, ili čak o Javi i drugim jezicima sličnim C-u, ne biste trebali imati problema shvatiti da komad koda u Solidity-u to čini, čak i prije nego što zapravo svladate Solidity dovoljno za upotrebu to.
Tu zabava započinje, jer biste za tren trebali započeti stvaranje jednostavnog ugovora ERC20. Ovo je jednostavan zadatak, dovoljno jednostavan da će ovaj članak pokazati kako možete napisati i primijeniti ERC20 token za manje od sat vremena.
Token koji ćemo stvoriti u ovoj demonstraciji bit će gola kost implementacije ERC20, bez previše zvona i zvižduka. Međutim, vidio sam mnogo sličnih jednostavnih tokena u stvarnom svijetu, i oni obično idu prilično dobro.
Jednostavno rečeno, standard ERC20 definira skup funkcija koje trebaju implementirati svi tokeni ERC20 kako bi se omogućila integracija s drugim ugovorima, novčanicima ili tržištima. Ovaj je skup funkcija prilično kratak i osnovni.
function totalSupply() public view returns (uint256); function balanceOf(address tokenOwner) public view returns (uint); function allowance(address tokenOwner, address spender) public view returns (uint); function transfer(address to, uint tokens) public returns (bool); function approve(address spender, uint tokens) public returns (bool); function transferFrom(address from, address to, uint tokens) public returns (bool);
Funkcije ERC20 omogućuju vanjskom korisniku, recimo aplikaciji za kripto-novčanik, da utvrdi korisničko stanje i prebaci sredstva s jednog korisnika na drugog uz odgovarajuću autorizaciju.
prepreke za ukrštanje kulturne komunikacije
Pametni ugovor definira dva posebno definirana događaja:
event Approval(address indexed tokenOwner, address indexed spender, uint tokens); event Transfer(address indexed from, address indexed to, uint tokens);
Ti će se događaji pozivati ili emitiran kada se korisniku odobre prava za povlačenje žetona s računa i nakon što su tokeni stvarno preneseni.
Uz standardne funkcije ERC20, mnogi tokeni ERC20 imaju i dodatna polja, a neki su postali faktički dio standarda ERC20, ako ne u pisanom obliku, onda u praksi. Evo nekoliko primjera takvih polja.
string public constant name; string public constant symbol; uint8 public constant decimals;
Evo nekoliko točaka u vezi s ERC20 i nomenklaturom Solidity:
public
Funkciji se može pristupiti izvan samog ugovoraview
u osnovi znači konstantno, tj. funkcija neće promijeniti unutarnje stanje ugovoraevent
je Solidityjev način dopuštanja klijentima na pr. sučelje vaše prijave da biste bili obaviješteni o određenim događajima u ugovoruVećina konstrukcija jezika Solidity trebala bi biti jasna ako već posjedujete osnovne Java / JavaScript vještine.
Sad kad smo iznijeli osnove i objasnili što je potrebno za stvaranje ERC20 tokena, vrijeme je da započnemo s pisanjem neke logike.
Prvo, moramo definirati dva objekta za mapiranje. Ovo je pojam Solidity za asocijativni niz ili ključ / vrijednost:
mapping(address => uint256) balances; mapping(address => mapping (address => uint256)) allowed;
Izraz mapping(address => uint256)
definira asocijativni niz čiji su ključevi tipa address
- broj koji se koristi za označavanje adresa računa, a čije su vrijednosti tipa uint256
- 256-bitni cijeli broj koji se obično koristi za spremanje stanja žetona.
Prvi objekt mapiranja, balances
, sadržavat će token stanje svakog računa vlasnika.
Drugi objekt mapiranja, allowed
, uključivat će sve račune odobrene za povlačenje s određenog računa, zajedno sa zbrojem povlačenja dozvoljenim za svaki.
Kao što vidite, polje vrijednosti dopuštenog mapiranja samo je po sebi karta računanja adrese računa na odobreni zbroj povlačenja.
Ta će se preslikavanja, zajedno sa svim ostalim ugovornim poljima, pohraniti u blockchain i bit će miniran što rezultira širenjem promjena na sve mrežne korisničke čvorove.
Blockchain pohrana je skupa i korisnici vašeg ugovora morat će platiti, na ovaj ili onaj način. Stoga biste uvijek trebali pokušati smanjiti veličinu pohrane i upisivati u blockchain.
Sad kad imamo potrebne podatkovne strukture, možemo početi unositi logiku ERC20 u odgovarajuće funkcije.
Kako postavljamo broj ICO tokena? Pa, postoji nekoliko načina postavljanja maksimalnog broja ICO tokena i ovo bi pitanje samo o sebi moglo vrijediti duge rasprave.
Za potrebe našeg ECR20 vodiča koristit ćemo najjednostavniji pristup: postavite ukupan iznos tokena u vrijeme stvaranja ugovora i u početku ih sve dodijelite 'vlasniku ugovora', tj. Računu koji je primijenio pametni ugovor:
uint256 totalSupply_; constructor(uint256 total) public { totalSupply_ = total; balances[msg.sender] = _totalSupply; }
Konstruktor je posebna funkcija koju Ethereum automatski poziva odmah nakon primjene ugovora. Obično se koristi za inicijalizaciju stanja tokena pomoću parametara koje prosljeđuje račun za implementaciju ugovora.
msg
je globalna varijabla koju deklarira i naseljava sam Ethereum. Sadrži važne podatke za izvršenje ugovora. Polje koje ovdje koristimo: msg.sender
sadrži račun Ethereuma koji izvršava trenutnu funkciju ugovora.
koristeći angularjs s čvorom js
Samo račun za postavljanje može ući u konstruktor ugovora. Kada je ugovor pokrenut, ova funkcija dodjeljuje dostupne tokene na račun ‘vlasnika ugovora’.
function totalSupply() public view returns (uint256) { return totalSupply_; }
Ova će funkcija vratiti broj svih tokena dodijeljenih ovim ugovorom, bez obzira na vlasnika.
function balanceOf(address tokenOwner) public view returns (uint) { return balances[tokenOwner]; }
balanceOf
vratit će trenutno stanje tokena na računu, identificirano adresom vlasnika.
function transfer(address receiver, uint numTokens) public returns (bool) { require(numTokens <= balances[msg.sender]); balances[msg.sender] = balances[msg.sender] — numTokens; balances[receiver] = balances[receiver] + numTokens; emit Transfer(msg.sender, receiver, numTokens); return true; }
Kao što mu samo ime govori, transfer
funkcija se koristi za pomicanje numTokens
iznos žetona s stanja vlasnika na saldo drugog korisnika ili receiver
. Vlasnik koji prenosi je msg.sender
tj. onaj koji izvršava funkciju, što podrazumijeva da ih samo vlasnik tokena može prenijeti drugima.
Solidity-ov način utvrđivanja predikata je require
. U ovom slučaju račun za prijenos ima dovoljan saldo za izvršenje prijenosa. Ako je a require
Izjava ne uspije, transakcija se odmah vraća prema nazad, bez promjena zapisanih u blockchain.
Neposredno prije izlaska, funkcija aktivira ERC20 događaj Transfer
omogućujući registriranim slušateljima da reagiraju na njegovo dovršavanje.
Ova se funkcija najčešće koristi u scenariju tržišta tokena.
function approve(address delegate, uint numTokens) public returns (bool) { allowed[msg.sender][delegate] = numTokens; emit Approval(msg.sender, delegate, numTokens); return true; }
Što approve
čini dopuštanje vlasniku tj. msg.sender
da odobri delegatski račun - moguće i samo tržište - da povuče tokene sa svog računa i prenese ih na druge račune.
kako napisati provjerljivi kod
Kao što vidite, ova se funkcija koristi za scenarije u kojima vlasnici nude tokene na tržištu. Omogućuje tržištu da finalizira transakciju bez čekanja na prethodno odobrenje.
Na kraju izvršenja, ova funkcija aktivira Approval
događaj.
function allowance(address owner, address delegate) public view returns (uint) { return allowed[owner][delegate]; }
Ova funkcija vraća trenutni odobreni broj tokena od strane vlasnika određenom delegatu, kako je postavljeno u approve
funkcija.
The transferFrom
funkcija je ravnoteža approve
funkcija, o kojoj smo prethodno razgovarali. Omogućuje delegatu odobrenom za povlačenje da prenosi vlasnička sredstva na račun treće strane.
function transferFrom(address owner, address buyer, uint numTokens) public returns (bool) { require(numTokens <= balances[owner]); require(numTokens <= allowed[owner][msg.sender]); balances[owner] = balances[owner] — numTokens; allowed[owner][msg.sender] = allowed[from][msg.sender] — numTokens; balances[buyer] = balances[buyer] + numTokens; Transfer(owner, buyer, numTokens); return true; }
Dvoje require
izjave pri pokretanju funkcije trebaju potvrditi da je transakcija legitimna, tj. da vlasnik ima dovoljno tokena za prijenos i da delegat ima odobrenje za (barem) numTokens
povući.
Pored prijenosa numTokens
iznos od vlasnika do kupca, ova funkcija također oduzima numTokens
od dodatka delegata. To u osnovi omogućuje delegatu s danom dozvolom da ga podijeli na nekoliko zasebnih povlačenja, što je tipično ponašanje na tržištu.
Mogli bismo se ovdje zaustaviti i imati valjanu implementaciju ERC20. Međutim, želimo ići korak dalje, jer želimo znak industrijske snage. To zahtijeva da svoj kod učinimo malo sigurnijim, iako ćemo i dalje moći zadržati token relativno jednostavnim, ako ne i osnovnim.
SafeMath je knjižnica Solidity čiji je cilj suočavanje s jednim načinom na koji hakeri raskidaju ugovore: napadom preko cijelog broja. U takvom napadu, haker prisiljava ugovor da koristi netočne numeričke vrijednosti prolazeći parametre koji će uzeti odgovarajuće cijele brojeve prošlost njihove maksimalne vrijednosti.
SafeMath štiti od toga testiranjem na prelijevanje prije izvođenja aritmetičke radnje, uklanjajući tako opasnost od prelijevanja. Knjižnica je toliko mala da je utjecaj na veličinu ugovora minimalan, ne iziskuje performanse i ima malo troškova za pohranu.
Dodajmo SafeMath na naš kod:
library SafeMath { // Only relevant functions 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; } }
SafeMath koristi assert
izjave za provjeru ispravnosti proslijeđenih parametara. Trebalo bi assert
ako ne uspije, izvršavanje funkcije bit će odmah zaustavljeno i sve promjene blockchaina vratit će se natrag.
Dalje, dodajmo sljedeću izjavu kojom uvodimo knjižnicu u kompajler Solidity:
using SafeMath for uint256;
Zatim naivnu aritmetiku koju smo koristili zamjenjujemo funkcijama SafeMath:
balances[msg.sender] = balances[msg.sender].sub(numTokens); balances[receiver] = balances[receiver].add(numTokens); balances[buyer] = balances[buyer].add(numTokens); balances[owner] = balances[owner].sub(numTokens);
U Solidity-u su funkcije i događaji pametnog ugovora umotani u entitet nazvan a ugovor koje možete tiho prevesti u 'blockchain klasu'. Ispod je ugovor kompatibilan s ERC20 koji smo stvorili, uključujući i sadržaj našeg koda. Polja imena i simbola mogu se mijenjati po želji. Većina tokena drži decimalnu vrijednost na 18, pa ćemo i mi učiniti isto.
Došlo je vrijeme rasporediti naš ugovor na blockchain . Nakon implementacije, naš će se ugovor prenijeti na sve čvorove koji sudjeluju u mreži. Sve promjene u ugovoru bit će prenesene na sve čvorove koji sudjeluju.
Programeri Ethereuma obično koriste alate za implementaciju poput Tartuf . Čak je i Tartuf pretjeran za ograničene potrebe ovog članka, a zove se i jednostavni internetski alat Remix bit će dovoljno.
kako hakirati brojeve kreditnih kartica 2016
Da biste ga koristili, morat ćete instalirati Dodatak MetaMask u vašem pregledniku i Rinkeby (Ethereum test network) račun s barem malo Rinkeby Etera u njemu. To su relativno jednostavni koraci, pa nećemo ulaziti u detalje.
U slučaju da nemate nijedno, prijeđite na MetaMask i Rinkeby za veze za preuzimanje i za dobivanje jasnih uputa za instalaciju i upotrebu.
Sad kad imamo sve gradivne blokove na mjestu, krenut ćemo do Remix i zalijepite gornji kod, uključujući pragma redak i knjižnicu SafeMath, u mrežni uređivač.
Zatim ćemo preskočiti na drugu karticu s desne strane nazvanu „ Trčanje 'I kliknite' Rasporediti . ' Pojavit će se skočni prozor MetaMask koji traži da potvrdimo transakciju. Naravno, odobrit ćemo to.
Suština : https://gist.github.com/giladHaimov/8e81dbde10c9aeff69a1d683ed6870be#file-basicerc20-sol
Čestitamo! Upravo ste postavili svoj prvi ERC20 token, poput istine Profesionalni Ethereum . Kao što je i obećano, token je jednostavan i lagan, ali u potpunosti funkcionalan, u skladu sa standardom ERC20 i zaštićen MathSafeom. Spreman je za kupnju, plaćanje i prijenos preko cijelog Blockchaina.
Ne, ni izbliza, jer naša kratka demonstracija jedva grebe površinu i bavi se samo jednim aspektom razvoja pametnih ugovora.
Pametni ugovori mogu biti puno složeniji, ovisno o vašoj poslovnoj logici, vašem modeliranju korisničke interakcije, dopuštate li kovanje i sagorijevanje tokena, promjene životnog ciklusa koje uvodite u ugovor, potrebu za mogućnostima na razini administratora koja obično dolazi s skup funkcija koje je odobrio administrator itd. Shvatili ste sliku.
Ipak, ako možete ponoviti ono što smo ovdje radili, to je čvrst temelj za proširenje vašeg znanja i prema potrebi prelazak na složenije ugovore.
Pametni ugovor je dio koda izveden na virtualnom stroju Ethereum. Pametni ugovor Ethereuma nepromjenjiv je i može slati ili primati eter i podatke.
Pojednostavljeno, ERC20 tokeni su ugovori koji implementiraju ERC20 standard. Operacije kojima se upravljaju ovi ugovori uključuju dobivanje ukupne ponude i bilance tokena i metode korištene za njihov prijenos.
Razvoj Ethereuma trenutno se provodi u Solidity, programskom jeziku orijentiranom na ugovor nadahnutom JavaScriptom, Pythonom i C ++.
ERC je kratica za Ethereum Request for Comment. Ovom je zahtjevu dodijeljen broj 20, odatle i sufiks.