Ovaj članak je dio serijala o razvoju decentraliziranih aplikacija i vlastitih kripto tokena i kriptovaluta. U ovom ćemo dijelu pokriti kako početi sa vlastitom privatnom mrežom (privatnim blockchainom), pokrenuti komande na svom blockchainu i rudariti.

U ovom članku još neće biti programiranja, već se radi samo o podešavanju infrastrukture.

Kako biste lakše pratili sadržaj članka, preporučljivo je (ali ne obavezno) proučiti sljedeće:

U članku će biti potrebno izvršiti neke komande iz terminala – posebnog programa svakog operativnog sustava koji omogućava izvršavanje komandi bez grafičkog sučelja.

Na OS X i Linux sustavima to je aplikacija Terminal, a na Windows operativnom sustavu to je CMD (command prompt) ili Shell terminal (ako imate Windows stariji od Windows 10, preporučamo preuzeti Git Tools koji dolaze s vrlo korisnim alatom Git Bash iskoristivim za ovu svrhu). Svaki od tih alata lako se pokreće upisom njegovog naziva u pretraživač operativnog sustava koji koristite. Novije verzije Windowsa imaju i mogućnost pokretanja cijelog Linuxa kao podsustava u Windowsima.

Kad god u daljnjem tekstu kažemo “pokrenite komandu…”, to podrazumijeva pokretanje iz terminal aplikacije.


Uvod

Kada se kreće u razvoj projekta na Ethereum blockchainu, potrebno je imati testno okruženje na kojem se besplatno može podići decentraliziranu aplikaciju, token, ili drugi pametni ugovor. Osim testnih mreža za koje je potrebno nabaviti lažni Ether i biti spojen na internet, moguće je pokrenuti i vlastitu simulaciju blockchaina na vlastitom računalu pomoću alata kao što je testrpc, ili čak pravi privatni blockchain.

U ovom ćemo članku napraviti vlastiti blockchain.

testrpc, kao većina NodeJS softverskih paketa, ima neke greške koje trenutno nisu rješive, pa će biti pokriven u odvojenom članku čim projekt sazrije.

Preduvjeti

Za početak, potrebno je:

  • odvojiti nešto diskovnog prostora. Ovisno o tome koliko dugo mislite održavati svoj privatni blockchain, može vam trebati i nekoliko GB. Preporučljivo je odvojiti prostor na nekom vanjskom, portabilnom USB disku za takve operacije jer tako nešto olakšava portabilnost i dijeljenje s drugim članovima tima a vaš glavni disk drži čistim.
  • preuzeti i instalirati geth s ove poveznice.
  • preuzeti i instalirati Mist s ove poveznice. Odaberite datoteku “Mist” a ne “Ethereum-Wallet-installer” i to onu koja završava s dmg ako ste na OS X sustavu, exe ako ste na Windows sustavu, deb ako ste na Linux sustavu.

Ako niste upoznati s Gethom i Mistom, predlažemo da pročitate ovaj uvod.

Napomena: ako koristite eksterni disk a na OS X sustavu ste, disk ne smije biti MS-DOS formata. Formatirajte ga na OS X Extended Journaled!

Genesis

Svaki blockchain ima početak (genesis). Da biste napravili svoj blockchain, kreirajte datoteku genesis.json u mapi koju ste odredili za držanje podataka svog privatnog blockchaina – može biti na eksternom USB disku. Npr. u našem slučaju to će biti /Users/swader/blockchain/tutorial.

U tu datoteku potrebno je staviti sljedeći sadržaj:

{
    "config": {
        "chainId": 987,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
    "difficulty": "0x400",
    "gasLimit": "0x8000000",
    "alloc": {}
}

Ova datoteka definira neke atribute našeg blockchaina kao što su:

  • chainid: identifikator mreže. Može biti proizvoljan broj. Služi za identifikaciju lanca na mreži na kojoj se naš node nalazi. Na jednoj mreži može biti više lanaca i ovim se brojem razlikuju.
  • homesteadBlock: potrebno ako se uskače u postojeći block Homestead verzije Ethereuma. U ovom slučaju 0 je OK.
  • EIP blokovi: potrebno definirati ako se lanac planira priključiti nekoj određenoj verziji Ethereum lanca (EIP su prijedlozi za poboljšanje Ethereum protokola – Ethereum Improvement Proposal – kojima se unaprijeđuju verzije Ethereuma). Nepotrebno u ovom slučaju.
  • difficulty: težina rudarenja definirana heksadecimalno. Bitno da je niska kako bi bilo čim lakše doći do još Ethera za lokalno testiranje.
  • gasLimit: gas limit je objašnjen u ovom članku. Ukratko, ova opcija diže limit gasa po bloku kako bi se moglo eksperimentirati s jako skupim ugovorima.
  • alloc: skraćeno od allocate, definira popis adresa i količinu Ethera koji da im se dodijeli u samom startu. Nepotrebno, izrudariti ćemo vlastiti.

Da bi geth uzeo genesis u obzir i iz njega kreirao početak novog lanca, potrebno je pokrenuti komandu:

geth --datadir /Users/swader/blockchain/tutorial init /Users/swader/blockchain/tutorial/genesis.json

init znači “inicijaliziraj” dok datadir govori gethu kamo da sprema blokove. Blockchain je sada spreman za aktivaciju. Pokrenimo sljedeću komadu:

geth --datadir /Users/swader/blockchain/tutorial --networkid 987 --rpc --rpccorsdomain "*" --rpcapi "db,eth,net,web3,personal"

Ovom smo naredbom pokrenuli vlastiti geth node (čvor) na prije spomenutoj mapi u koju treba spremati blockchain podatke. Također smo geth uperili prema pravilnom lancu (identifikacija mreže networkid 987), rekli smo mu da dopušta spajanje na RPC protokol s bilo koje domene pomoću rpccorsdomain opcije (to nam je potrebno za spajanje vanjskih aplikacija poput Mist ili Metamask na naš node), i aktivirali smo sljedeća programska sučelja za spajanje: db, eth, net, web3, personal. Svaka od tih ima svoj kontekst – primjerice, Personal nam omogućuje da upravljamo računima kroz vanjske aplikacije koje se spajaju na naš geth node pomoću RPC protokola. Drugim riječima, to dopušta Mist aplikaciji da šalje transakcije za nas.

Na ekranu terminal aplikacije trebalo bi biti vidljivo nešto slično sljedećim podacima:

Brunos-MBP:tutorial swader$ geth --datadir . --networkid 987 --rpc --rpccorsdomain "*" --rpcapi "db,eth,net,web3,personal"
INFO [01-23|21:46:22] Starting peer-to-peer node               instance=Geth/v1.7.3-stable/darwin-amd64/go1.9.2
INFO [01-23|21:46:22] Allocated cache and file handles         database=/Users/swader/blockchain/tutorial/geth/chaindata cache=128 handles=1024
INFO [01-23|21:46:22] Initialised chain configuration          config="{ChainID: 987 Homestead: 0 DAO:  DAOSupport: false EIP150:  EIP155: 0 EIP158: 0 Byzantium:  Engine: unknown}"
INFO [01-23|21:46:22] Disk storage enabled for ethash caches   dir=/Users/swader/blockchain/tutorial/geth/ethash count=3
INFO [01-23|21:46:22] Disk storage enabled for ethash DAGs     dir=/Users/swader/.ethash                                 count=2
INFO [01-23|21:46:22] Initialising Ethereum protocol           versions="[63 62]" network=987
INFO [01-23|21:46:22] Starting P2P networking
INFO [01-23|21:46:24] UDP listener up                          self=enode://be8572fae08d5a3bf01e065891f4fa3ddea4951afdd1535bae55c8e2367acbf8722accf140dd73f93238265efbccd2b26bf9b8b651c27e85783ffb6a5503e017@[::]:30303
INFO [01-23|21:46:24] RLPx listener up                         self=enode://be8572fae08d5a3bf01e065891f4fa3ddea4951afdd1535bae55c8e2367acbf8722accf140dd73f93238265efbccd2b26bf9b8b651c27e85783ffb6a5503e017@[::]:30303
INFO [01-23|21:46:24] IPC endpoint opened: /Users/swader/blockchain/tutorial/geth.ipc
INFO [01-23|21:46:24] HTTP endpoint opened: http://127.0.0.1:8545

Geth Konzola

Vrijeme je da se spojimo na taj sada aktivni geth node. Otvorite novi terminal prozor (dosadašnji sada vrti Geth node, i treba ostati na životu) te pokrenite naredbu:

geth attach /Users/swader/blockchain/tutorial/geth.ipc

Putanja do geth.ipc datoteke može varirati ovisno o mapi u koju spremate blockchain podatke. Prava putanja biti će ispisana na ekranu kada pokrenete node u koraku prije, na samom kraju prije HTTP endpoint opened.

Sada se nalazimo u izvršnom okruženju geth čvora odakle možemo izvršavati Ethereum naredbe.

Svako geth okruženje automatski uključuje Web3 sučelje koje omogućuje laku i ljudima čitljivu komunikaciju s Ethereum protokolom.

Web3 je skup softverskih naredbi koji omogućuje da obična web stranica komunicira s Ethereum blockchainom. U kontekstu Getha, Web3 omogućuje lako izvršavanje naredbi koje bi inače bile prekomplicirane za izvesti.

Primjerice, ako ukucamo naredbu eth, dobiti ćemo ispis mogućih podnaredbi i vrijednosti globalne eth varijable koju nam pruža web3 (ako ne znate što ovo znači, nije previše bitno u ovom članku).

geth konzola ispisuje komande

Coinbase

Da bi node bio funkcionalan, treba mu se podesiti coinbase adresa. Ta adresa je adresa na koju dolazi Ether koji nastaje rudarenjem na tom node-u i nema veze s Coinbase burzom. Kod podešavanja novog node-a, coinbase adresa je prazna, što možete vidjeti ako ukucate komandu eth.coinbase u konzolu. Da biste napravili novu adresu, pokrenite komandu:

personal.newAccount("password")

password zamijenite nekom lozinkom koju nećete zaboraviti – zaboravite li je, sav izrudareni Ether biti će zaključan

Ako nakon toga ponovno probate pokrenuti eth.coinbase komandu, dobiti ćete drukčiji rezultat:

coinbase je vidljiv

Rudarenje

Provjera stanja neke adrese na našem blockchainu može se obaviti naredbom eth.getBalance koja kao parametar prima adresu koja se provjerava. Provjerimo stanje coinbase računa:

Coinbase ima 0 Ethera

Kad god je potrebno poslati neku transakciju na našem blockchainu radi slanja Ethera, pokretanja neke decentralizirane aplikacije ili kreiranja kripto tokena, potrebno je izrudariti blok koji sadrži tu transakciju. Ujedno je potrebno rudariti da bi se coinbase račun napunilo Etherom. Pokrenuti privatno rudarenje je jednostavno. U konzoli upišemo miner.start(1), pustimo da traje neko vrijeme, te zatim pokrećemo naredbu miner.stop(). Za vrijeme kad miner.start traje, naš glavni prijašnji terminal ekran koji vrti geth node pokazivati će znakove rudarenja:

Rudarenje

Nakon što je rudarenje neko vrijeme trajalo, stanje coinbase računa biti će mnogo drukčije:

Stanje coinbase računa je bogatije

Stanje se prikazuje u wei – najmanjoj mogućoj jedinici Ethereum blockchaina. Da bi se dobilo pravo stanje u Etheru (u ovom slučaju 225) potrebno je odvojiti 18 znamenki kao decimale ili pokrenuti naredbu web3.fromWei s argumentom eth.getBalance(eth.coinbase), ovako:

stanje računa u Etheru

Napomena: miner.start može kao argument primiti cijeli broj. Taj broj odgovara broju jezgri vašeg procesora koje želite posvetiti rudarenju. Više jezgri je zahtjevnije za računalo ali brže rudari.

Kod prvog rudarenja, geth treba odvojiti malo vremena da izgradi DAG – otprilike 60ak sekundi. Pustite ga da odradi svoje i sve će nastaviti po planu. DAG je set podataka koji je potreban algoritmu za rudarenje Ethera, detaljnije objašnjen u ovom tehničkom papiru.

Zaključak

Pokretanje vlastitog privatnog blockchaina za svrhu razvoja, eksperimentiranja, i učenja vrlo je jednostavno. Ether je u privatnom okruženju lako izrudariti te je ovakav pristup prikladan ne samo za programiranje bez straha od grešaka, već i za mjerenje gas potrošnje pametnih ugovora koje planirate napisati i pokrenuti na glavnoj Ethereum mreži.

U sljedećem ćemo članku pokriti kako dodati nove node-ove na istu mrežu kako bi se stvorio kompletni privatni blockchain s više rudara, te kako spojiti MyEtherWallet, Mist i MetaMask na ovaj privatni blockchain.

To i mnogo više pokriti ćemo i na Blocksplit konferenciji.

BlockSplit


Ako vam je ovaj članak koristio, razmislite o tome da nas podržite u daljnjem radu donacijom.

3 COMMENTS

  1. Uspio sam napraviti privatni blockchain po ovim uputama. Zapelo je kod pokretanja geth attach..

    Kod mog pokušaja, geth.ipc se spremao ovako:
    IPC endpoint opened url=\\\\.\\pipe\\geth.ipc

    Ne znam kakav je to direktorij, no po uputama sam uspio pokrenuti geth.ipc sa naredbom:
    geth attach ipc:\\.\pipe\geth.ipc

    • Specify a different IPC path for nodes on Windows. This is a Windows problem unfortunately and it’s trying to make the IPC endpoint file in the same location for both nodes IIRC.

LEAVE A REPLY

Please enter your comment!
Please enter your name here