Utwórz token ERC-20

To jest nasz drugi samouczek dotyczący Solidity, jeśli go przegapiłeś, zapoznaj się z naszym Wprowadzenie do Solidity, w którym przeprowadzimy Cię przez kilka podstaw tego języka programowania dla łańcucha blokowego Ethereum.

Wyjaśnimy trochę, jak działa Solidity, jaka jest jego struktura i zaczniemy od prostego kodu do napisania inteligentnej umowy „Hello World”.

W tym samouczku zagłębimy się w szczegóły i nauczymy Cię kodu do wdrożenia własnego tokena Ethereum ERC-20. (Oto nasz Blockonomi Token ).

Ethereum & ICO Boom

ICO oznacza Initial Coin Offering i jest to rodzaj finansowania z wykorzystaniem kryptowalut. W ICO pewna ilość kryptowaluty jest sprzedawana w postaci „tokenów” („monet”) spekulantom lub inwestorom w zamian za prawny środek płatniczy lub inne kryptowaluty, takie jak Bitcoin lub Ethereum.

Sprzedawane tokeny są promowane jako przyszłe funkcjonalne jednostki waluty, jeśli lub kiedy cel finansowania ICO zostanie osiągnięty i projekt zostanie uruchomiony.

Rozmawialiśmy już o tym, jak inteligentne kontrakty otworzyły zupełnie nowy świat dla programistów do tworzenia i wprowadzania innowacji. Jednak ci deweloperzy potrzebowali sposobu na sfinansowanie swoich projektów.

Rozwiązaniem było ICO.

W 2017 ICO kwitły – każdego dnia pojawiały się niezliczone projekty z dzikimi obietnicami tego, co chcieli osiągnąć, a inwestorzy ich docierali.

Od tego czasu sytuacja się uspokoiła, ponieważ przestrzeń dojrzała, a inwestorzy zniknęli, wiele ICO nie spełniło obietnic, ale to już historia na inny post – jesteśmy tutaj, aby omówić stronę techniczną.

Co to jest token?

Tokeny są zasadniczo inteligentnymi kontraktami, które działają na Ethereum Blockchain, mogą mieć różne zastosowania i cele.

Token nie jest ograniczony do jednej określonej roli. Może pełnić wiele ról w swoim rodzimym ekosystemie. Oto lista niektórych ról, które mogą pełnić tokeny.

  • Myto: Token może działać jako brama do Dapp. Zasadniczo, aby uzyskać dostęp do Dapp, musisz trzymać tokeny.
  • Prawa wyborcze: Tokeny mogą również kwalifikować posiadaczy do posiadania określonych praw głosu. Pomyśl o EOS, posiadanie tokenów EOS pozwoli ci głosować na producentów bloków. EOS Blockchain ma stać się zdecentralizowanym systemem operacyjnym, który może obsługiwać zdecentralizowane aplikacje na skalę przemysłową.
  • Wymiana wartości: Jest to jedna z bardziej powszechnych ról tokenów w ekosystemie. Tokeny mogą pomóc w stworzeniu wewnętrznego systemu gospodarczego w aplikacji.
  • Poprawa wrażeń użytkownika: Token może również umożliwić posiadaczom wzbogacenie doświadczenia użytkownika w ramach określonego środowiska. Na przykład. W Brave (przeglądarce internetowej) posiadacze BAT (tokenów używanych w Brave) uzyskają prawa do wzbogacania doświadczeń klientów poprzez używanie ich tokenów do dodawania reklam lub innych usług opartych na uwadze na platformie Brave.
  • Waluta: Może służyć jako magazyn wartości, który można wykorzystać do przeprowadzania transakcji zarówno wewnątrz, jak i na zewnątrz danego ekosystemu.

Czym jest ERC-20?

ERC-20 to standard techniczny stosowany w inteligentnych kontraktach w łańcuchu blokowym Ethereum do wdrażania tokenów. Większość tokenów wydanych w łańcuchu blokowym Ethereum jest zgodna z ERC-20.

ERC-20 to standard protokołu, który definiuje pewne zasady i standardy wydawania tokenów w sieci Ethereum. W „ERC-20” ERC oznacza Ethereum Request For Comments, a 20 oznacza unikalny numer identyfikacyjny w celu odróżnienia tego standardu od innych.

Aby to uprościć, ERC-20 jest przewodnikiem po zasadach i przepisach, które pomogą stworzyć plan inteligentnych kontraktów opartych na Ethereum do tworzenia ich tokenów.

Token w Ethereum to po prostu inteligentny kontrakt, który podlega pewnym powszechnym regułom – a mianowicie implementuje standardowy zestaw funkcji, które współdzielą wszystkie inne kontrakty tokenów, takie jak transferFrom (address _from, address _to, uint256 _tokenId) i balanceOf (address _owner).

Zasadniczo token to po prostu umowa, która śledzi, kto jest właścicielem, ile tego tokena, i niektóre funkcje, dzięki czemu użytkownicy mogą przenosić swoje tokeny na inne adresy.

Dlaczego standard ERC-20 jest tak ważny?

Ponieważ wszystkie tokeny ERC-20 mają ten sam zestaw funkcji o tych samych nazwach, ze wszystkimi można wchodzić w interakcje w ten sam sposób.

Oznacza to, że jeśli utworzysz aplikację, która może współdziałać z jednym tokenem ERC-20, będzie ona również zdolna do interakcji z dowolnym tokenem ERC-20. W ten sposób w przyszłości można łatwo dodać więcej tokenów do swojej aplikacji bez konieczności kodowania niestandardowego. Możesz po prostu podłączyć nowy adres umowy tokena i boom, Twoja aplikacja ma inny token, którego może użyć.

Jednym z przykładów może być wymiana. Kiedy giełda dodaje nowy token ERC-20, tak naprawdę wystarczy dodać kolejny inteligentny kontrakt, z którym rozmawia. Użytkownicy mogą powiedzieć tej umowie, aby wysłała tokeny na adres portfela giełdy, a giełda może nakazać umowie wysłanie tokenów z powrotem do użytkowników, gdy zażądają wypłaty.

Giełda musi tylko raz zaimplementować tę logikę transferu, a następnie, gdy chce dodać nowy token ERC-20, wystarczy po prostu dodać nowy adres umowy do swojej bazy danych.

Zacznijmy tworzyć token

Użyjemy Remix IDE do opracowania Smart Contract dla naszego tokena ERC-20.

Remix to narzędzie online, które pozwala napisać inteligentny kontrakt Solidity, a następnie wdrożyć go i uruchomić.

Po prostu idź do https://remix.ethereum.org z Twojej przeglądarki i możemy zacząć kodować.

Kliknij przycisk Solidity, a następnie przycisk Plus w lewym górnym rogu.

Nazwę go „BlockonomiToken”, możesz wybrać dowolną nazwę dla swojej własnej kryptowaluty.

Świetnie, wszystko jest już gotowe.

Zasady dotyczące tokenów ERC-20

Tokeny ERC-20 podlegają liście reguł, dzięki czemu można je udostępniać, wymieniać na inne tokeny lub przenosić do portfela kryptowalutowego.

Standard ERC20 składa się z 3 opcjonalnych zasad i 6 obowiązkowych zasad.

Mówiąc prościej, jeśli uwzględniasz określone funkcje w inteligentnej umowie tokena, jesteś zgodny z ERC20. Jeśli nie uwzględnisz obowiązkowych funkcji, nie jesteś ERC20.

Obowiązkowe zasady są następujące:

  1. totalSupply
  2. balanceOf
  3. transfer
  4. przenieść z
  5. zatwierdzać
  6. dodatek

Z drugiej strony opcjonalne zasady to:

  1. Nazwa tokena
  2. Symbol
  3. Dziesiętny (do 18)

Definiowanie tych reguł w interfejsie jest powszechną praktyką. W Solidity nie ma czegoś takiego jak interfejs, to tylko kolejny inteligentny kontrakt. Na szczęście w języku programowania Solidity można dziedziczyć Smart Contracts.

Dziedziczenie w Solidity

W Solidity dziedziczenie jest bardzo podobne do klasycznych języków programowania obiektowego. Najpierw napiszesz swoją podstawową umowę i powiesz, że nowa umowa odziedziczy po podstawowej.

kontrakt IBank {

// podstawowy kod kontraktu…

}

Bank umowy to IBank {

// odziedziczony kod kontraktu…

}

Musisz również wiedzieć, że Solidity obsługuje wielokrotne dziedziczenie, kopiując kod, w tym polimorfizm.

Wszystkie wywołania funkcji są wirtualne, co oznacza, że ​​wywoływana jest funkcja najbardziej pochodna, z wyjątkiem sytuacji, gdy nazwa kontraktu jest jawnie podana.

Kiedy kontrakt dziedziczy z wielu kontraktów, w łańcuchu bloków tworzony jest tylko jeden kontrakt, a kod ze wszystkich kontraktów bazowych jest kopiowany do utworzonego kontraktu.

Wróćmy do naszego tokena ERC-20. Mamy obowiązkowe zasady, aby stworzyć token ERC-20.

Zdefiniujemy je jako 6 funkcji i zapiszemy w interfejsie. Wtedy umowa naszego faktycznego tokena odziedziczy ten interfejs wywołania.

Twój kod będzie musiał wyglądać tak.

kontrakt ERC20Interface {

function totalSupply ()

publiczny

widok

zwraca (uint);

function balanceOf (adres tokenOwner)

publiczny

widok

zwroty (saldo uint);

dodatek funkcyjny

(właściciel tokena adresowego, wydający adres)

publiczny

widok

zwraca (pozostało uint);

transfer funkcji (adres do, tokeny uint) publiczne

zwraca (sukces bool);

funkcja zatwierdź publicznie (wydawca adresu, tokeny uint)

zwraca (sukces bool);

transfer funkcji od

(adres od, adres do, tokeny uint) publiczne

zwraca (sukces bool);

transfer zdarzeń (adres indeksowany od, adres indeksowany do, tokeny uint);

Zatwierdzenie zdarzenia (tokenOwner z indeksowaniem adresu, wydawca z indeksowaniem adresu, tokeny uint);

}

Umowa żetonowa

Stwórzmy nasz kontrakt na token. Rodzaj kontrakt {}

Teraz przejdziemy przez 3 opcjonalne zasady.

Mimo że nie jest konieczne nadawanie nazw swoim tokenom, nadal ważne jest, aby nadać im tożsamość.

Dalej mamy symbole. Po prostu nie możemy lekceważyć ich znaczenia. Chwytliwy symbol pomaga w lepszym brandingu.

Wreszcie mamy podzielność, która pomoże nam określić najniższą możliwą wartość tokena. Podzielność równa 0 będzie oznaczać, że najniższa wartość tokena to 1. Z drugiej strony podzielność 2 oznacza, że ​​jego najniższa wartość wyniesie 0,01. Maksymalna dozwolona liczba miejsc po przecinku to 18. 18 miejsc po przecinku to zdecydowanie zalecana wartość domyślna, unikaj jej zmiany

Zdefiniujmy je i zainicjujmy w konstruktorze.

kontrakt BlockonomiToken to ERC20Interface {

publiczna nazwa ciągu;

publiczny symbol ciągu;

uint8 publiczne liczby dziesiętne;

constructor () public {

nazwa = "BlockonomiToken";

symbol = "BKM";

dziesiętne = 18;

}

}

Nasz token musi również mieć początkową dostawę i jakiś zapis wszystkich sald. Możemy przechowywać te informacje w tablicy.

W konstruktorze zainicjujemy nasz kontrakt z początkowymi tokenami dostaw do twórcy kontraktu (czyli msg.sender). Dodaj te linie do naszego kodu, a omówimy cel wszystkich z nich.

kontrakt BlockonomiToken to ERC20Interface {

publiczna nazwa ciągu;

publiczny symbol ciągu;

uint8 publiczne liczby dziesiętne;

uint256 public _totalSupply;

mapowanie (adres => uint) salda;

mapowanie (adres => mapowanie (adres => uint)) dozwolone;

constructor () public {

nazwa = "BlockonomiToken";

symbol = "BKM";

dziesiętne = 18;

_totalSupply = 100000000000000000000000000;

salances [msg.sender] = _totalSupply;

emituj Transfer (address (0), msg.sender, _totalSupply);

}

}

Typy danych solidności

Jak widać, _totalSupply ma rozszerzenie uint256 typ danych i dziesiętne uint8.

Solidność jest językiem typowanym statycznie, co oznacza, że ​​typ każdej zmiennej (stanowej i lokalnej) musi zostać określony w czasie kompilacji. Solidity zapewnia kilka podstawowych typów, które można łączyć w złożone typy.

Porozmawiajmy na razie o typach liczb całkowitych.

Liczby całkowite mogą być int lub uint: Liczby całkowite ze znakiem i bez znaku o różnych rozmiarach. Jeśli znasz teorię informatyki lub znasz różnicę między liczbami całkowitymi ze znakiem i bez znaku w języku C, w Solidity wszystko jest absolutnie takie samo.

Jeśli nie, możemy to po prostu powiedzieć bez znaku to liczba całkowita, która nigdy nie może być ujemna! Z drugiej strony podpisany może być zarówno negatywny, jak i pozytywny, ale w naszej umowie będziemy używać tylko jednostek.

Słowa kluczowe od uint8 do uint256 w krokach po 8 (bez znaku od 8 do 256 bitów) i od int8 do int256. uint i int to odpowiednio aliasy dla uint256 i int256.

Rozmawialiśmy, że będziemy przechowywać salda w jakiejś tablicy. Cóż, lepszym rozwiązaniem jest użycie tablic mieszających lub mapowań Solidity.

Zasadniczo mapujemy adres (to też jest typ danych) do uint.

msg.sender (address): nadawca wiadomości (bieżące połączenie)

msg.sender będzie osobą, która aktualnie łączy się z umową.

Później prawdopodobnie zajmiesz się umowami związanymi z umowami. W takim przypadku kontrakt, który tworzy wywołanie, będzie msg.sender.

Mapowania

Typy mapowania są deklarowane jako mapowanie (_Typ klucza => _Typ wartości). Tutaj _KeyType może być prawie dowolnym typem z wyjątkiem mapowania, tablicy o dynamicznym rozmiarze, kontraktu, wyliczenia i struktury. _ValueType może być w rzeczywistości dowolnym typem, w tym mapowaniami.

Mapowania można postrzegać jako tabele skrótów, które są wirtualnie inicjowane w taki sposób, że każdy możliwy klucz istnieje i jest odwzorowywany na wartość, której reprezentacją bajtową są same zera: wartość domyślna typu. Jednak podobieństwo kończy się tutaj: kluczowe dane nie są w rzeczywistości przechowywane w mapowaniu, tylko ich hash keccak256 służy do wyszukiwania wartości.

Z tego powodu mapowania nie mają długości ani koncepcji „ustawiania” klucza lub wartości.

Mapowania są dozwolone tylko dla zmiennych stanu (lub jako typy odwołań do pamięci w funkcjach wewnętrznych).

Możliwe jest publiczne oznaczenie mapowań i utworzenie gettera przez Solidity. _KeyType stanie się wymaganym parametrem dla metody pobierającej i zwróci _ValueType.

_ValueType może być również mapowaniem. Metoda pobierająca będzie miała jeden parametr dla każdego typu _KeyType, rekurencyjnie.

Wydarzenia

Blockchain to lista bloków, które zasadniczo są listami transakcji. Do każdej transakcji dołączone jest potwierdzenie zawierające zero lub więcej wpisów w dzienniku. Wpisy w dzienniku reprezentują wynik zdarzeń wywołanych przez inteligentny kontrakt.

W kodzie źródłowym Solidity, aby zdefiniować zdarzenie, zaznacz je w ten sposób, poprzedzając je rozszerzeniem zdarzenie słowo kluczowe (podobne w użyciu do słowa kluczowego funkcji). Y

Następnie wywołujesz lub uruchamiasz zdarzenie w ciele dowolnej funkcji, którą chcesz spowodować, aby wygenerowało zdarzenie. (Wątpię, czy jest na to standardowe sformułowanie). Możesz wyzwalać zdarzenia z dowolnej funkcji za pomocą rozszerzenia wydzielać słowo kluczowe.

Interfejs ERC-20

Zaimplementujmy teraz interfejs ERC-20. Aby to zrobić, musimy napisać kod dla wszystkich naszych sześciu obowiązkowych funkcji.

1. totalSupply

Określa całkowitą liczbę utworzonych tokenów ERC-20. Celem tej metody jest określenie całkowitej liczby tokenów pływających po ekosystemie.

function totalSupply ()

publiczny

widok

zwraca (uint)

{

return _totalSupply – saldo [adres (0)];

}

2. balanceOf 

Zwraca liczbę tokenów, które podany adres, w tym przypadku właściciel umowy, ma na swoim koncie.

function balanceOf (adres tokenOwner)

publiczny

widok

zwroty (saldo uint)

{

salda zwrotne [tokenOwner];

}

3. zasiłek

Aby przeprowadzić transakcję, jedną z najważniejszych danych, które powinien znać kontrakt, jest saldo użytkownika. W końcu użytkownik powinien mieć minimalną ilość tokenów potrzebną do wykonania transakcji.

Dlatego umowa ERC-20 zawiera również funkcję dodatku (). Jeśli użytkownik nie ma minimalnej wymaganej liczby tokenów, funkcja anuluje transakcję.

dodatek funkcyjny

(właściciel tokena adresowego, wydający adres)

publiczny

widok

zwraca (pozostało uint)

{

return allowed [tokenOwner] [spender];

}

4. zatwierdzić

Po sprawdzeniu salda właściciel umowy może udzielić użytkownikowi zgody na pobranie wymaganej liczby tokenów z adresu umowy.

Funkcja zatwierdzania sprawdza również transakcję pod kątem całkowitej podaży tokenów, aby upewnić się, że nie brakuje ani nie ma dodatkowych.

Innymi słowy, zapewnia, że ​​fałszowanie jest niemożliwe.

funkcja zatwierdź publicznie (wydawca adresu, tokeny uint)

zwroty

(bool sukces)

{

dozwolone [msg.sender] [spender] = tokeny;

emitować Approval (msg.sender, spender, tokens);

return true;}

Bezpieczna biblioteka matematyczna

Do poprawnej implementacji dwóch pozostałych funkcji potrzebujemy Safe Math Library.

Bezpieczna biblioteka matematyczna otacza operacje arytmetyczne Solidity z dodatkowymi kontrolami przepełnienia.

Operacje arytmetyczne w zawijaniu Solidity na przepełnieniu. Może to łatwo powodować błędy, ponieważ programiści zwykle zakładają, że przepełnienie powoduje błąd, co jest standardowym zachowaniem w językach programowania wysokiego poziomu.

Safe Math przywraca tę intuicję, cofając transakcję w przypadku przepełnienia operacji.

Używanie tej biblioteki zamiast niezaznaczonych operacji eliminuje całą klasę błędów, dlatego zaleca się używanie jej zawsze.

Wszystko, co musimy teraz zrobić, to skopiować ten kod nad naszą umową, a następnie odziedziczyć.

kontrakt SafeMath {

function safeAdd (uint a, uint b) public pure return (uint c) {

c = a + b;

wymagają (c >= a);

}

function safeSub (uint a, uint b) public pure return (uint c) {

wymagają (b <= a); c = a – b; } function safeMul (uint a, uint b) public pure zwraca (uint c) {c = a * b; wymagają (a == 0 || c / a == b); } function safeDiv (uint a, uint b) public pure return (uint c) {require (b > 0);

c = a / b;

}

}

Nie zapomnij go odziedziczyć.

kontrakt BlockonomiToken to ERC20Interface, SafeMath

5. transfer

Więc teraz, gdy wszystkie sprawdzenia zostały zakończone i umowa wie, że użytkownik ma wymaganą ilość tokenów potrzebnych do realizacji transakcji, właściciel umowy może wysłać mu tokeny za pomocą funkcji transfer ().

Ta funkcja umożliwia właścicielowi kontraktu przesłanie określonej ilości tokena na inny adres, tak jak w przypadku konwencjonalnej transakcji kryptowalutowej., Pozwala na przeniesienie określonej liczby tokenów z całkowitej dostawy na konto użytkownika.

transfer funkcji (adres do, tokeny uint)

publiczny

zwraca (sukces bool)

{

salances [msg.sender] = safeSub (salances [msg.sender], tokens);

salances [to] = safeAdd (salances [to], tokens);

emitować Transfer (msg.sender, to, tokens);

powrót prawda;

}

6. transfer z

Omówiliśmy już funkcję transferu, dlaczego mamy inną?

Cóż, weźmy przykład, aby zobaczyć, dlaczego transferFrom jest tak genialnym dodatkiem do kontraktu ERC20.

Wszyscy musimy co miesiąc płacić jakąś sumę pieniędzy jak w zegarku. Może to być Twój czynsz, rachunki itp. Tak naprawdę nie musisz samodzielnie płacić tych wszystkich kwot. Zawsze możesz skonfigurować automatyczny system płatności w swoich bankach, aby zająć się tymi płatnościami.

To właśnie umożliwia transferFrom (). Pomaga zautomatyzować przelewy na określone konto.

transfer funkcji od

(adres od, adres do, tokeny uint)

publiczny

zwraca (sukces bool)

{

salances [from] = safeSub (salances [from], tokens);

allowed [from] [msg.sender] = safeSub (allowed [from] [msg.sender], tokens);

salances [to] = safeAdd (salances [to], tokens);

emitować Transfer (od, do, tokeny);

powrót prawda;

}

Pełny kod

Oto pełny kod naszego tokena Blockonomi.

solidność pragma ^ 0,5,0;

// —————————————————————————-

// Standardowy interfejs tokenu ERC nr 20

//

// —————————————————————————-

kontrakt ERC20Interface {

funkcja totalSupply () zwraca widok publiczny (uint);

function balanceOf (address tokenOwner) publiczny widok zwraca (saldo uint);

dodatek funkcji (adres tokenOwner, wydawca adresu) zwraca widok publiczny (pozostało uint);

transfer funkcji (adres do, tokeny uint) publiczne zwroty (powodzenie bool);

funkcja zatwierdzania (wydatki na adres, tokeny uint) publiczne zwroty (sukces bool);

funkcja transferFrom (adres od, adres do, tokeny uint) public return (bool success);

transfer zdarzeń (adres indeksowany od, adres indeksowany do, tokeny uint);

Zatwierdzenie zdarzenia (tokenOwner z indeksowaniem adresu, wydawca z indeksowaniem adresu, tokeny uint);

}

// —————————————————————————-

// Bezpieczna biblioteka matematyczna

// —————————————————————————-

kontrakt SafeMath {

function safeAdd (uint a, uint b) public pure return (uint c) {

c = a + b;

wymagają (c >= a);

}

function safeSub (uint a, uint b) public pure return (uint c) {

wymagają (b <= a); c = a – b; } function safeMul (uint a, uint b) public pure zwraca (uint c) {c = a * b; wymagają (a == 0 || c / a == b); } function safeDiv (uint a, uint b) public pure return (uint c) {require (b > 0);

c = a / b;

}

}

kontrakt BlockonomiToken to ERC20Interface, SafeMath {

publiczna nazwa ciągu;

publiczny symbol ciągu;

uint8 publiczne liczby dziesiętne; // 18 miejsc po przecinku to zdecydowanie zalecana wartość domyślna, nie zmieniaj jej

uint256 public _totalSupply;

mapowanie (adres => uint) salda;

mapowanie (adres => mapowanie (adres => uint)) dozwolone;

/ **

* Funkcja Constrctor

*

* Inicjuje kontrakt za pomocą początkowych tokenów dostaw do twórcy kontraktu

* /

constructor () public {

nazwa = "BlockonomiToken";

symbol = "BKM";

dziesiętne = 18;

_totalSupply = 100000000000000000000000000;

salances [msg.sender] = _totalSupply;

emituj Transfer (address (0), msg.sender, _totalSupply);

}

function totalSupply () public view zwraca (uint) {

return _totalSupply – saldo [adres (0)];

}

function balanceOf (address tokenOwner) publiczny widok zwraca (uint balance) {

salda zwrotne [tokenOwner];

}

dodatek funkcji (address tokenOwner, address spender) public view zwraca (pozostało uint) {

return allowed [tokenOwner] [spender];

}

function zatwierdzić (wydatki na adres, tokeny uint) publiczne zwroty (sukces bool) {

dozwolone [msg.sender] [spender] = tokeny;

emitować Approval (msg.sender, spender, tokens);

powrót prawda;

}

function transfer (address to, uint tokens) public return (bool success) {

salances [msg.sender] = safeSub (salances [msg.sender], tokens);

salances [to] = safeAdd (salances [to], tokens);

emitować Transfer (msg.sender, to, tokens);

powrót prawda;

}

function transferFrom (address from, address to, uint tokens) public return (bool success) {

salances [from] = safeSub (salances [from], tokens);

allowed [from] [msg.sender] = safeSub (allowed [from] [msg.sender], tokens);

salances [to] = safeAdd (salances [to], tokens);

emitować Transfer (od, do, tokeny);

powrót prawda;

}

}

Gratulacje! Udało Ci się stworzyć własny token Ethereum.

Ostatnim krokiem jest wdrożenie w rzeczywistej sieci.

Wdrażanie tokena

Aby to zrobić, będziemy potrzebować portfela Metamask.

Metamask to rozszerzenie, które umożliwia uruchamianie Ethereum dApps bezpośrednio w przeglądarce bez uruchamiania pełnego węzła Ethereum.

Iść do https://metamask.io/ z przeglądarki (Chrome, Firefox lub Opera) i dodaj ją.

Utwórz nowy portfel w MetaMask

Po zainstalowaniu rozszerzenia kliknij ikonę w prawym górnym rogu przeglądarki, aby rozpocząć tworzenie portfela.

Przeczytaj i zaakceptuj warunki, a następnie wprowadź silne hasło i kliknij „Utwórz”.

Zobaczysz frazę początkową zawierającą 12 słów. Zapisz słowa wyjściowe jako plik lub skopiuj je w bezpieczne miejsce i kliknij „Skopiowałem to w bezpieczne miejsce”.

Utworzyłeś już konto w MetaMask z nowym adresem portfela!

Zauważysz, że obecnie masz w portfelu 0 ETH. Aby wdrożyć kontrakt w sieci Ethereum, potrzebna jest pewna ilość Ether. Nie będziemy wdrażać naszej umowy w głównej sieci, ponieważ jest to tylko wersja demonstracyjna.

Opublikujemy tę umowę w sieci testowej. W rzeczywistości istnieje kilka sieci testowych blockchain Ethereum – Ropsten, Rinkeby, Kovan…

W tym przykładzie użyjmy Ropstena.

Najpierw potrzebujesz eteru, prawda? W sieci testowej pracujemy z fałszywymi darmowymi eterami. Wystarczy odebrać niektóre z nich z Faucet.

Iść do: https://faucet.ropsten.be/ , wklej adres swojego portfela i kliknij „Wyślij mi testowy ether”.

Po kilku sekundach w portfelu zobaczysz trochę ETH.

Wprowadzenie na żywo

Nadszedł czas, aby wszystko było żywe!

Przejdź do Remix IDE i skompiluj kontrakt. Jeśli nie ma błędów, jesteśmy gotowi do wdrożenia.

Dla środowiska wybierz Injected Web3. Automatycznie wykryje twój portfel metamask.

Kliknij przycisk Wdróż.

Metamask poprosi Cię teraz o wypłatę środków z portfela w celu zakupu tej transakcji.

Potwierdź, że. Następnie wróć do Remix IDE i zwróć uwagę na Terminal. Widzimy, że transakcja zakończyła się sukcesem.

W rezultacie otrzymaliśmy hash transakcji. Kliknij uri w terminalu, który wygląda następująco: ropsten.etherscan.io/

Poprowadzi nas do etherscan.io – to jest eksplorator Ethereum Blockchain i tutaj możesz śledzić wszystko, co dzieje się w sieciach głównych i testowych, ponieważ wszystko jest oczywiście publiczne na blockchainie.

Kiedy przejdziemy do tego URI, zobaczymy szczegóły dotyczące naszej transakcji. Kliknij skrót kontraktu, aby dowiedzieć się więcej.

Wszystko jest publiczne w łańcuchu bloków, nawet nasz kod. Programiści Solidity nie mają miejsca na błędy!

Kliknij na karta umowy a zobaczysz nasz skompilowany kod bajtowy

Teraz możesz przejść do Token Tracer, aby zobaczyć szczegóły naszego Blockonomi Token. Możesz zobaczyć 3 opcjonalne reguły, które zdefiniowaliśmy wcześniej.

Teraz sprawdź swój portfel. Zobaczysz, że Ether, który zapłaciliśmy za wdrożenie inteligentnego kontraktu na Ropsten, został usunięty.

Wniosek

Na tym kończy się nasz samouczek, wykonując następujące kroki i nasze przykłady kodu, powinieneś być w stanie wdrożyć własny token Ethereum ERC-20.

baw się dobrze!