Ostatnio dość głośną technologią stał się blockchain. Jednym z łatwiejszych sposobów na rozpoczęcie z nią przygody, jest tworzenie inteligentnych kontraktów na platformie Ethereum (ang. Smart Contracts). Jako dobry przykład takiego kontraktu, może posłużyć token personalny ERC-20.
Jak więc, zrobić swój token personalny? – Zacznijmy od przygotowania środowiska!
Przygotowanie środowiska
Posłużę się przykładem realizacji projektu na komputerze z systemem Windows 10. Jeżeli masz inny system, to nie jestem wstanie Ci pomóc w realizacji tego kroku, ale prawdopodobnie też dasz sobie radę i pójdzie ci to o wiele łatwiej i szybciej niż posiadaczom Windows.
Na początek dla ułatwienia sobie życia, polecam zainstalować na swoim komputerze Chocolatey. To system zarządzania oprogramowaniem na twoim komputerze. Pozwala w prosty sposób instalować, aktualizować i usuwać oprogramowanie z twojego komputera.
W tym celu uruchom PowerShell z uprawnieniami Administratora, wklej poniższą komendę i wykonaj.
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
Więcej informacji o chocolatey znajdziesz na https://chocolatey.org/about
Teraz gdy zainstalowaliśmy Chocolatey, instalacja pozostałych narzędzi będzie już dziecinnie łatwa. Pozostając w PowerShell i korzystając z poniższych komend, zainstaluj pozostałe narzędzia.
Node.js
choco install nodejs.install -y
Visual Studio Code
choco install vscode -y
Git
choco install git -y
Pomocna będzie również wtyczka, dla składni języka solidity. Aby ją zainstalować, uruchom Visual Studio Code. Przejdź do wtyczek. Wyszukaj wtyczkę solidity i zainstaluj ją.
Po instalacji kliknij Reload, aby aktywować wtyczkę.
Uruchom wiersz poleceń (cmd) z uprawnieniami Administratora. Posłuży nam do instalacji kolejnych narzędzi.
Framework truffle – to narzędzie, które zapewnia ramy dla szybkiego wytwarzania, testowania i wdrażania smart contract’ów. Więcej o tym narzędziu na https://truffleframework.com
npm install -g truffle
ganache-cli – lokalna sieć testowa ethereum
npm install -g ganache-cli
Python i MSBuild, wymagane do instalacji kolejnych zależności.
choco install python2 -y
choco install vcbuildtools -y
npm config set msvs_version 2015 --global
refreshenv
Załóż konto na https://infura.io/, wspomoże to deploy kontraktów na publiczne sieci ethereum.
Potrzebny będzie również portfel ethereum, więc jeżeli go jeszcze nie posiadasz, załóż go teraz z pomocą MetaMask.
Zakładając, że przeglądarkę chrome już masz, zainstaluj do niej rozszerzenie MetaMask, możesz je pobrać ze strony https://metamask.io/.
Po zainstalowaniu uruchom MetaMask, włącz w trybie najnowszej wersji i utwórz konto.
Przygotowanie projektu
Przejdź do swojego katalogu roboczego np. C:/Projects i stwórz katalog dla swojego projektu.
cd C:/Projects
mkdir YourToken
cd YourToken
Inicjuj swój projekt z truffle framework
truffle initnp
A teraz projekt Node.js – Będzie wymagany do pobrania dodatkowych zależności.
npm init
Wypełnij według uznania, parametry projektu
name – nazwa projektu (tylko małe litery)
version – wersja
description – opis projektu
main – pozostaw domyślną wartość (truffle-config.js)
author – autor projektu
license – typ licencji np. MIT
Zainstaluj w projekcie zależności, wykonując poniższe komendy.
npm install --dev-save chai
npm install --dev-save chai-bignumber
npm install --dev-save dotenv
npm install --dev-save solium
npm install --dev-save truffle
npm install --dev-save truffle-hdwallet-provider
npm install --dev-save web3-utils
npm install --dev-save openzeppelin-solidity@2.0.0-rc.1
Implementacja
Uruchom Visual Studio Code z uprawnieniami Administratora, a następnie otwórz w nim folder ze swoim projektem.
W katalogu contracts stwórz plik swojego kontraktu np. YourToken.sol.
Wersja kompilacji
pragma solidity ^0.4.24;
Zaimportuj wymienione pliki z biblioteki openzeppelin-solidity, to gotowe rozwiązania powszechnych funkcjonalności personalnych tokenów ERC-20, takich jak własność, transfer tokenów, bilans, symbol, nazwa.
import "openzeppelin-solidity/contracts/ownership/Ownable.sol";
import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
import "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";
Dodaj Ciało kontraktu.
contract YourToken is ERC20, ERC20Detailed, Ownable {
//
}
Wewnątrz ciała kontraktu dodaj konstruktor.
constructor(string name, string symbol,uint8 decimals, uint256 totalSupply) public
ERC20()
ERC20Detailed(name, symbol, decimals)
Ownable() {
_mint(msg.sender, totalSupply * (10**uint256(decimals)));
}
Jeżeli, chcesz stworzyć swoje autorskie rozwiązania, polecam poczytać dokumentacje do solidity – https://solidity.readthedocs.io/en/v0.4.25/
Kompilacja
Otwórz Terminal, klikając skrót klawiszowy Ctrl +` lub z menu wybierając View->Terminal.
Następnie wpisz tam poniższą komendę, aby skompilować projekt.
truffle compile
Po kompilacji w katalogu build/contracts powinny pojawić się skompilowane kontrakty w postaci plików *.json.
Testy
W katalogu test utwórz plik np. YourToken.test.js
Na początku testu wczytaj swój token.
const YourToken = artifacts.require('YourToken');
Dodaj jeszcze zależności Web3 i BigNumber.
const Web3 = require('web3');
const BigNumber = web3.BigNumber;
Poniższy kawałek kodu pozwoli porównywać w testach wartości typu BigNumber.
require('chai')
.use(require('chai-bignumber')(BigNumber))
.should();
Dodajmy główną strukturę testu. Powinna ona się odnosić do kontraktu, jaki testujemy. Jako argumenty funkcji dostępne są konta z sieci na testowej.
contract('YourToken', function ([contract, creator, usualAccount]) {
//
});
Teraz w wewnątrz tej struktury dodajmy funkcję, która będzie uruchamiana dla każdego testu. To tu z każdym testem będzie na nowo tworzony Token o zadanych parametrach. Parametry oczywiście wg twojego uznania.
beforeEach(async function () {
var name='YourToken';
var symbol='YT';
var decimals=18;
var totalSupply=21000000;
token=await YourToken.new(name, symbol, decimals, totalSupply, { from:creator });
owner=creator;
});
Poniżej dodajemy blok opisowy. To element, który można wykorzystać do opisania jakiejś grupy testów.
describe('YourToken.test.js', function () {
//
});
Wewnątrz bloku opisowego dodajemy blok testowy.
it('After transfer tokens by contract owner to usual account, the usual account balance is increased by the amount of tranfered tokens', async function () {
//GIVEN
var amount=99999999;
var balance= (await token.balanceOf(usualAccount, { from:owner }));
//WHEN
await token.transfer(usualAccount, amount, { from:owner });
//THEN
(await token.balanceOf(usualAccount, { from: owner })).should.be.bignumber.equal(balance.add(amount));
});
Otwórz Terminal i uruchom lokalną sieć testową.
ganache-cli
Otwórz jeszcze jeden dodatkowy terminal (Możesz to zrobić kilając na ikonkę +) i uruchom testy wpisując tam poniższą komendę.
truffle test
W przypadku gdy masz więcej plików z testami, a chcesz uruchomić tylko jeden z nich, możesz to zrobić w ten sposób.
truffle test ./test/YourToken.test.js
Uwaga!
Jeżeli masz problem z uruchomieniem testów i widzisz taki błąd, to usuń ze zmiennej środowiskowej PATHEXT frazę .JS;
Możesz to zrobić z poziomu wiersza poleceń w ten sposób.
Publikacja
Przełącz MetaMask na sieć Ropsten.
Doładuj swoje konto etherami przy użyciu „kranika” dla sieci ropsten. Uruchom tę stronę https://faucet.ropsten.be/ i wpisz adres swojego konta.
Po dłuższym czasie (do kilku godzin) na twoim koncie w MetaMask powinno pojawić się trochę etheru na swoim koncie.
Stwórz w projekcie plik o nazwie .env i dodaj w nim poniższe wpisy.
MNEMONIC=// Tu wpisz mnemonik dla konta utworzonego w MetaMask
INFURA_API_KEY=// Tu wpisz klucz api z infura
Skopiuj mnemonik dla swojego konta. W tym celu kliknij ikonkę swojego konta, kliknij Settings, a następnie REVEAL SEED WORDS
Wpisz hasło nadawane podczas tworzenia konta.
Skopiuj mnemonik do schowka.
Wklej mnemonik do pliku .env
Stwórz nowy projekt na swoim koncie Infura i skopiuj swój API KEY wklej go w odpowiednie miejsce w pliku .env
Zastąp poniższym kodem zawartość pliku 1_initial_migration.js – ten kawałek kodu decyduje, z jakimi parametrami twój token będzie wdrożony na sieć publiczną.
var YourToken = artifacts.require("./YourToken.sol");
module.exports = function(deployer) {
var name='YourToken';
var symbol='YT';
var decimals=18;
var totalSupply=21000000;
deployer.deploy(YourToken,name, symbol, decimals, totalSupply);
};
Dodaj konfigurację podczytującą dane z pliku .env
require('dotenv').config();
Zaimportuj klasę pośrednika portfela ethereum – to z jego pomocą odbywa się deploy na sieć publiczną.
const HDWalletProvider = require('truffle-hdwallet-provider');
Dodaj konfigurację sieci ropsten
module.exports = {
networks: {
ropsten: {
provider: new HDWalletProvider( process.env.MNEMONIC, 'https://ropsten.infura.io/' + process.env.INFURA_API_KEY),
network_id:3,
gasPrice: 0x01
},
},
};
Zrób deploy na sieć testową ropsten. Wpisz w terminalu poniższą komendę.
truffle deploy --network ropsten --reset
Po wykonaniu komendy powinieneś znaleźć informację o adresie opublikowania kontraktu. Skopiuj ją.
Wykorzystując wcześniej skopiowany adres dodaj swój token do MetaMask.
Wklej skopiowaną wcześniej wartość w pole Token Address. I kliknij Next.
Deploy na sieć główną robisz w podobny sposób. Tylko ether musisz zdobyć w inny sposób. Możesz go kupić na giełdzie kryptowalut np. BitBay
Dodaj główną sieć do konfiguracji.
mainnet: {
provider: new HDWalletProvider(process.env.MNEMONIC,'https://mainnet.infura.io/' + process.env.INFURA_API_KEY),
network_id: 1,
gasPrice: 0x01
},
Aby zrobić deploy na sieć główną uruchom w terminalu poniższą komendę.
truffle deploy --network mainnet --reset
Teraz możesz rozdać, rozrzucić, sprzedać swoje tokeny.
Możesz nawet trochę mi wysłać na adres poniżej. Kto wie może, będą kiedyś coś warte 🙂
0xd1f83793dfa92e18e70039b6abc8812da8f4cb8e