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:
- Što je blockchain?
- Što je Ethereum i kako se razlikuje od Bitcoina?
- Moja prva Ethereum adresa
- Što su to nodeovi?
- Ethereum Terminologija: Što je Mist a što Geth?
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 geth
u 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).
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:
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:
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:
Nakon što je rudarenje neko vrijeme trajalo, stanje coinbase
računa biti će mnogo drukčije:
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:
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.
Ako vam je ovaj članak koristio, razmislite o tome da nas podržite u daljnjem radu donacijom.
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
I have same issue as @Danko What can I do to fix it??
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.