Zróbmy sobie łańcuch bloków

  • November 21st, 2019
  • Test&train
  • 0 Comments
  • Robert Pardela

This page is available in English

Zapytacie po co męczyć się z instalacją swojego łańcucha bloków, jeśli gotowe rozwiązania są dostępne jednym kliknięciem na popularnych platformach chmurowych?

Osobiście uważam, że zanim zacznie się stosować gotowce warto poznać od podstaw jak działa łańcuch bloków. Potem w pełni świadomie możemy korzystać z gotowych rozwiązań.

Proces instalacji łańcucha bloków pokażę na przykładzie platformy Ethereum. Ta instalacja ta będzie wykorzystywana w kolejnych wpisach na przykład dotyczących tworzenie inteligentnego kontraktu.

Żeby było trudniej pokażę jak zainstalować Ethereum ze źródeł Go, a dla mniej dociekliwych zaprezentuję instalację z wersji binarnych.

Instalacja na Mac OS jest banalnie prosta, na Windows nie instalowałem, a w tym wpisie zrobimy to na Linuxie.

Instalacja odbędzie się na maszynie wirtualnej zbudowanej z obrazu minimal ISO Centos7.

Nie wykonuj instalacji na użytkowniku root, jeśli jakiś krok instalacji będzie wymagał wyższych uprawnień to obsłużymy to przez sudo.

 

Instalacja Ethereum w wersji GO (geth) z budowaniem geth ze źródeł.

  • sprawdź wersję pakietu GO na stronie https://golang.org/dl/

  • na centosie przejdź do katalogu /tmp:

    cd /tmp

  • ściągnij najnowszą wersję (w moim przypadku 1.11.5) pakietu GO:

    curl -LO https://storage.googleapis.com/golang/go1.11.5.linux-amd64.tar.gz

  • wypakuj pakiet do katalogu na centosie /usr/local :

    sudo tar -C /usr/local/ -xvf ./go1.11.5.linux-amd64.tar.gz

  • wyeksportuj zmienną GOROOT:

    export GOROOT=/usr/local/go

  • dodaj do ścieżki PATH zmienną GOROOT:

    export PATH=$GOPATH/bin:$GOROOT/bin:$PATH

  • utwórz plik go.sh:

    sudo touch /etc/profile.d/go.sh

  • wyedytuj plik /etc/profile.d/go.sh

  • wpisz do niego:

    export GOPATH=/usr/local/go

    export GOROOT=/usr/local/go

    export PATH=$GOPATH/bin:$GOROOT/bin:$PATH

  • zainstaluj gita:

    sudo yum install git

  • na centosie przejdź do katalogu /opt:

    cd /opt

  • skopiuj do katalogu /opt repozytorium geth:

git clone https://github.com/ethereum/go-ethereum

  • wejdź do katalogu /opt/go-ethereum:

    cd go-ethereum

  • zbuduj geth:

    make geth

jeśli w powyższym kroku wystąpiły błędy, zainstaluj narzędzia developerskie i powtórz budowanie geth:

sudo yum install gcc gcc-c++

Jeśli wszystko poszło ok to w katalogu: /opt/go-ethereum/build/bin masz plik binarny geth. To jest właśnie oprogramowanie węzła.

Teraz czas na pokazanie prostszej i szybszej procedury instalacji.

 

Instalacja Ethereum w wersji GO (geth) z pobraniem skompilowanej wersji.

  • na centosie przejdź do katalogu /tmp:

    cd /tmp

  • ściągnij najnowszą wersję (w tym przypadku 1.8.23) pakietu geth:

    curl -LO https://gethstore.blob.core.windows.net/builds/geth-linux-amd64–1.8.23-c9427004.tar.gz

  • wypakuj pakiet do katalogu /opt/go-ethereum/build/bin:

    sudo tar -C /usr/local/ -xvf ./geth-linux-amd64–1.8.23-c9427004.tar.gz

Wybrałem ten sam katolog co w kroku 1A, ponieważ dalsza część będzie wspólna dla obu wersji instalacji

Możesz też pobrać komplet najnowszych narzędzi Ethereum:

curl -LO https://gethstore.blob.core.windows.net/builds/geth-alltools-linux-amd64–1.8.23-c9427004.tar.gz

 

Po za geth znajdziesz tam też inne narzędzia, które będę omawiał w kolejnych wpisach, na przykład swarm rozproszony system plików.

Mamy zainstalowane wymagane oprogramowanie, więc teraz możemy przejść do uruchomienia naszego testowego łańcucha bloków.

 

Uruchamianie prywatnej testowej sieci:

  • na centosie w katalogu domowym twojego użytkownika utwórz katalog eth-node:

    cd /home/yourusername

    mkdir eth-node

  • przejdź do katalogu eth-node:

    cd eth-node

  • w katalogu eth-node utwórz plik localGenesis.json:

    sudo touch etc-node/localGenesis.json

  • wyedytuj plik localGenesis.json

  • wpisz do niego poniższą treść:

    {

    “config”: {

    “chainId”: 1000,

    “homesteadBlock”: 0,

    “eip155Block”: 0,

    “eip158Block”: 0,

    “byzantiumBlock”: 0

    },

    “difficulty”: “10”,

    “gasLimit”: “2000000”

    }

 

Powyższy przykładowy plik localGenesis.json zawiera zawartość pierwszego inicjalnego bloku w naszym łańcuchu bloków. Wszystkie kolejne węzły będą musiały mieć ten sam blok inicjalny w innym przypadku nie będą mogły podłączyć się do naszego łańcucha. Plik inicjujący prywatny łańcuch może zawierać wiele innych parametrów. Poniżej opiszę tylko niektóre z nich:

chainId – to jest identyfikator łańcucha. Identyfikatory od 1 do 61 są zarezerwowane dla sieci Ethereum np. 1 to główna sieć Ethereum.

difficulty – poziom trudności przy wydobywaniu bloków, czym większa wartość tym bardziej energochłonne jest wydobycie

gasLimit – limit jednostki Gas dla każdego bloku (na razie czarna magia :))

 

  • zainicjuj pierwszy węzeł naszego łańcucha bloków:

    sudo /opt/go-ethereum/build/bin/geth –datadir ./eth-node init ./localGenesis.json

  • uruchom lokalny węzeł ethereum:

    sudo /opt/go-ethereum/build/bin/geth –identity “Main” –datadir ./eth-node –networkid 1114 -verbosity 4 –port 30303 –nodiscover console 2>>./eth.log

Jeśli wszystko poszło ok to właśnie zobaczyłeś konsolę geth.

Kilka parametrów wywołania węzła wymaga opisania:

identity – nazwa węzła (parametr opcjonalny). Każdy węzeł powinien mieć inną nazwę. Nazwa ta pojawia się np. w logach. Może być przydatna do analizy problemów z łańcuchem.

datadir – katalog naszego węzła. Został utworzony podczas inicjalizacji węzła.

networkid – identyfikator naszej sieci węzłów. Kolejne węzły będą łączyły się z tym węzłem o ile będą miały taki sam networkid.

verbosity – poziom logowania zdarzeń (czym wyższy tym więcej zapisów w logu)

port – port po którym będziemy łączyli się do tego węzła

nodiscover – inne węzły nie będą mogły odnaleźć automatycznie tego węzła. Jest to zabezpieczenie, jeśli nie chcemy aby ktoś niechciany podpiął się do naszego węzła z zewnątrz.

 

Sprawdzenie naszego łańcucha bloków

Komendy wykonywane w konsoli geth.

Zakładanie nowego konta w ethereum:

  • w konsoli geth załóż nowe konto:

    personal.newAccount(“tu wpisz i zapamiętaj hasło”)

    • zobaczysz adres nowego konta. Zapmiętaj je razem z powyższym hasłem

Ustawianie domyślnego konta:

  • sprawdź dostępne konta:

    eth.coinbase

    • jeśli adres jest ten sam co w poprzedmin kroku to nic nie rób
    • jeśli adres jest inny to sprawdź które konto jest twoje:

      eth.accounts, otrzymasz coś w stylu [“0x2b1b054979ba9aff03b02a1c8a1d1d6122f17da6”, “0x5b8e0cbc7ae34d214884349460e557945546cee8”, “0xd6271f8c29d5d563b4a7efe9fa56f2f395caabae”]

      • licząc od zera ustaw swoje konto jako właściwe np.:

        miner.setEtherbase(eth.accounts[2])

Uruchamianie kopalni:

  • sprawdź aktualny stan swojego konta:

    eth.getBalance(eth.coinbase)

    • za pierwszym razem powinno być 0
  • uruchom kopanie:

    miner.start()

    • w logu powinien pokazywać się status przetworzonych bloków
  • po pewnym czasie (~30 sekund) ponownie sprawdź stan konta:

    eth.getBalance(eth.coinbase)

    • teraz wartość powinna być > 0
  • zatrzymaj kopanie:

    miner.stop()

 

Posumowanie

Gratulacje właśnie zainstalowałeś, skonfigurowałeś i uruchomiłeś pierwszy węzeł prywatnego łańcucha bloków. Wykopałeś nawet sobie trochę krypto-waluty 🙂 Zła wiadomość jest taka, że to waluta dostępna wyłącznie w twoim lokalnym łańcuchu bloków.

Teraz zachęcam cię do eksperymentowania z parametrami inicjalizacji łańcucha bloków i parametrami wywołania.

W kolejnych wpisach zainstalujemy kolejny węzeł i stworzymy małą sieć blockchain.

 

Standardowo, jeśli masz jakieś pytania zachęcam do kontaktu.

Robert Pardela

Leave a Comment

Your email address will not be published. Required fields are marked *

seventeen − 13 =