Pionieri della blockchain
Accedi

Creazione di un Custom Testnet locale su EthereumTempo di lettura: 18 min.

menu categorie articoli

Esploriamo, in questo secondo articolo, come poter creare un nostro Custom Testnet, realizzando un nodo ethereum locale, sul quale sviluppare e testare la nostra dApp, facendo al tempo stesso mining PoW.

Nel precedente articolo abbiamo parlato e visto, come e con quali metodi possiamo creare un’ambiente di test, utilizzando delle infrastrutture già esistenti, create ad hoc per lo sviluppo ed il test. Abbiamo quindi parlato di “testnet” quali Rinkeby, Ropsten, Kovan, Goerli e allo stesso tempo abbiamo visto l’uso di software creati per lo stesso scopo come Ganache TestRPC & GETH; il tutto per arrivare al risultato finale di costruire un nostro ambiente di test che però, nei casi sopra indicati interagisce con l’esterno, ma mai con la Mainnet.

Di cosa abbiamo bisogno

Oggi faremo qualcosa di diverso ed in più, infatti nella creazione dell’ambiente, che sarà totalemente in locale, ci spingeremo fino al mining di ether e verificheremo la crescita del nostro ammontare di monete “virtuali” direttamente su Metamask. Questo metodo sarà molto utile, in particolare, nel momento in cui vorrai mettere in piedi un tuo ambiente di sviluppo per poter testare una dApp, ed essere così certo del funzionamento di ogni passaggio, prima di portare la tua applicazione verso il mondo esterno. Non ultimo il principio e concetto di “studio ed approfondimento” poichè è sicuramente più facile partire usando le reti già pronte ma, che al primo mal funzionamento non ci permettono un vero e completo debug al fine di capire cosa, e dove si sta inceppando la nostra dApp. Quindi sempre meglio essere in grado di sapere che cosa e come si muove ogni singolo ingranaggio del nostro progetto.

In questo tutorial avrai bisogno di alcuni dei software che abbiamo usato la volta scorsa, con l’aggiunta di alcune piccole novità, quindi se non hai potuto installare l’ambiente di sviluppo dal precedente articolo, ti consiglio di fermarti qui e di andare a leggere e seguire i passi per l’installazione dei pacchetti, come GETH, indicati nel primo articolo “Sviluppare applicazioni per Ethereum con GETH“.

Ora, se avevi già fatto i passaggi richiesti, o se hai appena colmato il divario, possiamo proseguire con l’esempio. Come appena ricordato, la volta scorsa hai potuto installare sulla tua macchina pacchetti come NodeJS, Ganache e GETH (il migliore client ethereum), bene all’interno del pacchetto geth esiste anche un’ulteriore software che si chiama Puppeth, da non confondersi con il famoso software per la Business Integration “Puppet”. Che cosa fa Puppeth, si occupa della creazione e gestione della reti ethereum customizzate. P.S.: per poter meglio comprendere ed amministrare un qualunque nodo ethereum, ti consiglio di approfondire lo studio di quello che è sicuramente lo strumento più importante, ossia il client GETH e di fare riferimento ai molti suggerimenti ed esempi sulla pagina github del progetto GETH-Github

[ Per coloro che devono comunque ancora installare GETH ma non hanno bisogno o non vogliono rifare in toto il tutorial di utilizzo delle testnet, ma sono interessati soltanto allo sviluppo in locale, come è il tema di questo articolo, potete trovare tutti i dettagli per l’installazione di GETH anche da questi ulteriori link:

(Geth Documentation | Go Ethereum) (Downloads | Go Ethereum) ].

Rendiamolo Operativo

Per iniziare con la parte operativa, devi creare una tua directory che, io, con molta fantasia, ho chiamato “tutorial” ed un nome rete che, altrettanto fantasiosamente, ho chiamato “nettest”; successivamente dovrai lanciare “puppeth”, il quale ti servirà proprio alla creazione, facilitata, di una rete da agganciare al nodo ethereum. Puppeth ti permette di collegare tra loro anche X reti ad altrettanti nodi ethereum, ma in questo esercizio attiveremo 1 solo nodo. Successivamenteti basterà seguire passo passo le domande che ti verranno fatte (vedi output qui sotto).

| $ mkdir tutorial && cd tutorial

lanciamo il tool “puppeth”

| $ puppeth

++ Welcome to puppeth, your Ethereum private network manager | | + This tool lets you create a new Ethereum network down to | | the genesis block, bootnodes, miners and ethstats servers | | without the hassle that it would normally entail. | | | | Puppeth uses SSH to dial in to remote servers, and builds | | its network components out of Docker containers using the | | docker-compose toolset. |

Please specify a network name to administer (no spaces, hyphens or capital letters please)

|> nettest # indichiamo il nome che vogliamo dare alla nostra rete

  1. Sweet, you can set this via –network=nettest next time!INFO [07-16|14:42:13.457] Administering Ethereum network name=nettest WARN [07-16|14:42:13.457] No previous configurations found path=/home/lorenzo/.puppeth/nettestWhat would you like to do? (default = stats)Show network stats
  2. Configure new genesis
  3. Track new remote server
  4. Deploy network components

|> 2 # scegliamo di configurare un nuovo nodo genesis

What would you like to do? (default = create)

  1. Create new genesis from scratch
  2. Import already existing genesis

|> 1 # indichiamo la volontà di voler creare il nodo

Which consensus engine to use? (default = clique)

  1. Ethash – proof-of-work
  2. Clique – proof-of-authority

|> 1 # scegliamo ethash poichè usaremo il metodo PoS x fare mining

Which accounts should be pre-funded? (advisable at least one)

|> 0x #(Premi INVIO)

//* qui ci viene chiesto quale found, quale account deve avere dei fondi xchè la rete mining parta, possiamo cliccare INVIO, lui sceglie comunque il PRIMO account che creeremo dopo *//

Should the precompile-addresses (0x1 .. 0xff) be pre-funded with 1 wei? (advisable yes)

|> (Premi INVIO)

Specify your chain/network ID if you want an explicit one (default = random)

|> 4242 # diamo un valore alla nostra testnet

//* qui alcuni valori sono “privati”, tipo ID 1=mainnet, ID 2=morden, ID 3=ropsten, ID 4=rinkeby, ID 42=kovan …. tutti gli altri numeri possono andare bene … useremo il 4242 *//

INFO [07-16|15:10:41.433] Configured new genesis block

# come si può leggere conferma di avere creato un nuovo genesis block #

@What would you like to do? (default = stats)

  1. Show network stats
  2. Manage existing genesis
  3. Track new remote server
  4. Deploy network components

|> 2 # scegliamo di gestire il blocco genesis creato poichè dobbiamo salvare i file di configurazione

  1. Modify existing configurations
  2. Export genesis configurations
  3. Remove genesis configuration

|> 2 #scegliamo di esportare la configurazione in formato json

Which folder to save the genesis specs into? (default = current) Will create nettest.json, nettest-aleth.json, nettest-harmony.json, nettest-parity.json

//* qui puppeth ci conferma che saranno esportati i seguenti file .json e chiede in quale DIR esportarli, diamo il nome della directory da noi creata *//

nettest INFO [07-16|15:27:38.638] Saved native genesis chain spec path=nettest/nettest.json INFO [07-16|15:27:38.646] Saved genesis chain spec client=aleth path=nettest/nettest-aleth.json INFO [07-16|15:27:38.655] Saved genesis chain spec client=parity path=nettest/nettest-parity.json INFO [07-16|15:27:38.663] Saved genesis chain spec client=harmony path=nettest/nettest-harmony.json

What would you like to do? (default = stats)

  1. Show network stats
  2. Manage existing genesis
  3. Track new remote server
  4. Deploy network components

|> a questo punto il genesis node è stato creato ed esportato, dunque possiamo chiudere puppeth con un CTRL + CTRL


[ Ethash = PoW simula il funzionamento della Mainnet, per scopo didattico useremo il PoW

Clique = PoA prevede che si crei una rete permissioned, che prevede a priori dei nodi che controllano le transazioni x certificare i blocchi ]

Inizializziamo il nodo alla rete

Per inizializzare il nostro nodo alla rete appena creata, useremo ancora il comando, geth, al quale daremo in pasto proprio il file “genesis” appena esportato.

$ geth --datadir . init nettest.json

INFO [07-16|15:48:57.816] Maximum peer count ETH=50 LES=0 total=50 INFO [07-16|15:48:58.151] Set global gas cap cap=25000000 INFO [07-16|15:48:58.151] Allocated cache and file handles database=/home/lorenzo/Public/tutorial/nettest/geth/chaindata cache=16.00MiB handles=16 INFO [07-16|15:48:58.168] Writing custom genesis block INFO [07-16|15:48:58.202] Persisted trie from memory database nodes=354 size=50.23KiB time=14.54458ms gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B INFO [07-16|15:48:58.203] Successfully wrote genesis state database=chaindata hash=”eef486…cbf795″ INFO [07-16|15:48:58.203] Allocated cache and file handles database=/home/lorenzo/Public/tutorial/nettest/geth/lightchaindata cache=16.00MiB handles=16 INFO [07-16|15:48:58.223] Writing custom genesis block INFO [07-16|15:48:58.261] Persisted trie from memory database nodes=354 size=50.23KiB time=12.786406ms gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B INFO [07-16|15:48:58.262] Successfully wrote genesis state database=lightchaindata hash=”eef486…cbf795″

A questo punto ciò che ci serve è creare un nuovo account:

$ geth --datadir . account new

INFO [07-16|15:51:25.366] Maximum peer count ETH=50 LES=0 total=50 Your new account is locked with a password. Please give a password. Do not forget this password. > Password: Repeat password: # vi verrà chiesto di indicare una password

< Your new key was generated # conferma l’avvenuta creazione

Public address of the key: 0x501BCa86e4cBb93817945Df9482713A49F178367 Path of the secret key file: keystore/UTC–2020-07-16T13-51-34.466269241Z–501bca86e4cbb93817945df9482713a49f178367

//* PS: quando scriverai la password sul terminale, ricordati che non tiverrà mostrata a video….. Non dimenticarla altrimenti non potrai più accedere a quell’utenza *//

Se adesso andiamo a vedere i file contenuti nella nostra directory, troveremo due nuove cartelle

$ ls -ltrA
total 108
-rw-r--r-- 1 lorenzo lorenzo 21293 Jul 16 15:27 nettest.json
-rw-r--r-- 1 lorenzo lorenzo 22738 Jul 16 15:27 nettest-aleth.json
-rw-r--r-- 1 lorenzo lorenzo 24791 Jul 16 15:27 nettest-parity.json
-rw-r--r-- 1 lorenzo lorenzo 21293 Jul 16 15:27 nettest-harmony.json
drwxr-xr-x 4 lorenzo lorenzo  4096 Jul 16 15:48 geth
drwx------ 2 lorenzo lorenzo  4096 Jul 16 15:51 keystore

nella directory keystore troviamo il file che contiene la Private-Key

$ ls -ltrA keystore/
total 4
-rw------- 1 lorenzo lorenzo 491 Jul 16 15:51 UTC--2020-07-16T13-51-34.466269241Z--501bca86e4cbb93817945df9482713a49f178367

Se volete aggiungere ulteriori account, il metodo da seguire è quello appena descritto.

Prepariamo lo script di avvio per il mining PoW

Lo script è molto veloce da preparare, scriviamolo e poi lo commentiamo:

$ vim startnode.sh (invio)
#!/bin/bash -x
geth --networkid 4444 --mine --minerthreads 2 --datadir . --nodiscover --rpc --rpcport 8545 --port 0 --rpcapi eth,web3,personal,net --allow-insecure-unlock --unlock 0 --password password.sec --ipcpath /home/lorenzo/.ethereum/geth.ipcgeth

Ti spiego ciò che abbiamo appena scritto:

[geth –networkid ​4242] # id creato con puppeth

[–mine –minerthreads 2] # il numero di threads del processore che potranno essere usati duranti il mining

[–nodiscover] # significa che nel creare questa rete assegno valore locale e nessun nodo esterno potrà collegarsi

[–rpc –rpcport “8545”] # la porta di utilizzo standard usata in localhost

[–port 0] # la porta IPC che viene inizializzata in modo randomico, quindi pissiamo non specificarla

[–rpcapi eth,web3,personal,net] # uso il modulo rpcpi con le librerie JS come web3 …etc….

[–allow-insecure-unlock –unlock 0] # assegno un parametro di unlock all-account 0 ovvero l-account creato durante la procedura con geth new account (coinbase)

[–password.sec] # questo sarà il file in cui andremo a scrivere la password dell’account che abbiamo precedentemente creato (creiamo il file con vim oppure touch)

Adesso assicurati che il file startnode.sh abbia i diritti di esecuzione

chmod 755 startnode.sh

Bene, se hai seguito in modo corretto tutti i passaggi, sei quasi pronto a lanciare il mining, come ultima cosa, verifica di non avere sulla macchina altri processi che sfruttino la stessa porta, la 8545, che è stata indicata per la connessione del nodo

$ sudo netstat -tnlp | grep :8545
oppure puoi usare anche il comando ss e rimanere più generico sulla porta
$ sudo ss -tunlp|grep 85
udp   UNCONN   0        0                  0.0.0.0:36785          0.0.0.0:*
udp   UNCONN   0        0                     [::]:33485             [::]:*      users:(("ipfs",pid=26425,fd=112))
tcp   LISTEN   0        128              127.0.0.1:9998           0.0.0.0:*      users:(("goxdcr",pid=4385,fd=9))
tcp   LISTEN   0        128                   [::]:46785             [::]:*      users:(("rpc.mountd",pid=1569,fd=19))
tcp   LISTEN   0        128                      *:443                  *:*      users:(("caddy",pid=1485,fd=5))

se il campo di risposta rimane vuoto, o comunque non riscontri connessioni dirette aperte sulla 8545, allora sei pronto, altrimenti cerca di capire quale processo la occupa e killalo.

Partiamo con il mining

Qui sotto, per ovvi motivi di spazio, inserirò soltanto le prime righe di output registrate a schermo, dopo che avrò fatto partire il mining; starà a te, sempre per studio, verificare, tramite la lettura delle suddette righe, di essere in grado, un pò alla volta, di capirne il significato. Partiamo:

tutorial/nettest$ sudo ./startnode.sh

<< leggi con attenzione l’output che ti verrà mostrato e cerca di trovare i passaggi importanti, così da imparare con il tempo a vedere subito gli eventuali problemi >>

  • geth –networkid 4444 –mine –minerthreads 2 –datadir . –nodiscover –rpc –rpcport 8545 –port 0 –rpcapi eth,web3,personal,net –allow-insecure-unlock –unlock 0 –password password.sec –ipcpath /home/lorenzo/.ethereum/geth.ipcgeth INFO [07-16|17:20:35.373] Maximum peer count ETH=50 LES=0 total=50 WARN [07-16|17:20:35.373] The flag –rpc is deprecated and will be removed in the future, please use –http WARN [07-16|17:20:35.373] The flag –rpcport is deprecated and will be removed in the future, please use –http.port WARN [07-16|17:20:35.373] The flag –rpcapi is deprecated and will be removed in the future, please use –http.api INFO [07-16|17:20:35.380] Set global gas cap cap=25000000 INFO [07-16|17:20:35.380] Starting peer-to-peer node instance=Geth/v1.9.16-stable-ea3b00ad/linux-amd64/go1.14.2 INFO [07-16|17:20:35.380] Allocated trie memory caches clean=256.00MiB dirty=256.00MiB INFO [07-16|17:20:35.380] Allocated cache and file handles database=/home/lorenzo/Public/tutorial/nettest/geth/chaindata cache=512.00MiB handles=524288 INFO [07-16|17:20:35.404] Opened ancient database database=/home/lorenzo/Public/tutorial/nettest/geth/chaindata/ancient INFO [07-16|17:20:35.405] Initialised chain configuration config=”{ChainID: 4242 Homestead: 0 DAO: DAOSupport: false EIP150: 0 EIP155: 0 EIP158: 0 Byzantium: 0 Constantinople: 0 Petersburg: 0 Istanbul: 0, Muir Glacier: , YOLO v1: , Engine: ethash}” INFO [07-16|17:20:35.405] Disk storage enabled for ethash caches dir=/home/lorenzo/Public/tutorial/nettest/geth/ethash count=3 INFO [07-16|17:20:35.405] Disk storage enabled for ethash DAGs dir=/home/lorenzo/.ethash count=2 INFO [07-16|17:20:35.406] Initialising Ethereum protocol versions=”[65 64 63]” network=4444 dbversion=7 INFO [07-16|17:20:35.407] Loaded most recent local header number=0 hash=”eef486…cbf795″ td=524288 age=2h37m21s INFO [07-16|17:20:35.408] Loaded most recent local full block number=0 hash=”eef486…cbf795″ td=524288 age=2h37m21s INFO [07-16|17:20:35.408] Loaded most recent local fast block number=0 hash=”eef486…cbf795″ td=524288 age=2h37m21s INFO [07-16|17:20:35.409] Loaded local transaction journal transactions=0 dropped=0 INFO [07-16|17:20:35.410] Regenerated local transaction journal transactions=0 accounts=0 INFO [07-16|17:20:35.430] Allocated fast sync bloom size=512.00MiB INFO [07-16|17:20:35.457] IPC endpoint opened url=/home/lorenzo/.ethereum/geth.ipcgeth INFO [07-16|17:20:35.457] HTTP endpoint opened url=http://127.0.0.1:8545/ cors= vhosts=localhost WARN [07-16|17:20:35.457] ——————————————————————- WARN [07-16|17:20:35.457] Referring to accounts by order in the keystore folder is dangerous! WARN [07-16|17:20:35.458] This functionality is deprecated and will be removed in the future! WARN [07-16|17:20:35.458] Please use explicit addresses! (can search via geth account list) WARN [07-16|17:20:35.458] ——————————————————————- INFO [07-16|17:20:35.481] New local node record seq=4 id=1e0363830d0211c4 ip=127.0.0.1 udp=0 tcp=36275 INFO [07-16|17:20:35.481] Started P2P networking self=”enode://7705…33b1bbf737@127.0.0.1:36275?discport=0″ INFO [07-16|17:20:36.028] Initialized fast sync bloom items=354 errorrate=0.000 elapsed=592.969ms INFO [07-16|17:20:37.565] Unlocked account address=0x501BCa86e4cBb93817945Df9482713A49F178367 INFO [07-16|17:20:37.566] Transaction pool price threshold updated price=1000000000 WARN [07-16|17:20:37.566] The flag –minerthreads is deprecated and will be removed in the future, please use –miner.threads INFO [07-16|17:20:37.566] Updated mining threads threads=2 INFO [07-16|17:20:37.566] Transaction pool price threshold updated price=1000000000 INFO [07-16|17:20:37.566] Etherbase automatically configured address=0x501BCa86e4cBb93817945Df9482713A49F178367 INFO [07-16|17:20:37.567] Commit new mining work number=1 sealhash=”3f16d1…dd354f” uncles=0 txs=0 gas=0 fees=0 elapsed=”360.835µs”INFO [07-16|17:21:03.710] Successfully sealed new block number=1 sealhash=”3f16d1…dd354f” hash=”afa832…0c4e01″ elapsed=26.143s INFO [07-16|17:21:03.729] 🔨 mined potential block number=1 hash=”afa832…0c4e01″ INFO [07-16|17:21:03.720] Commit new mining work number=2 sealhash=”8dd43c…b14a05″ uncles=0 txs=0 gas=0 fees=0 elapsed=4.127ms

in questo breve pezzo possiamo notare subito alcune righe che ti evidenzio qui sotto:

INFO [07-16|17:21:03.710] Successfully sealed new block number=1 sealhash=”3f16d1…dd354f” hash=”afa832…0c4e01″ elapsed=26.143s INFO [07-16|17:21:03.729] 🔨 mined potential block number=1 hash=”afa832…0c4e01″

Metodi di collegamento al wallet & Metamask

Mentre lasci andare tranquillamente il mining da solo, esiste un’altro metodo, tramite console javascript, per collegarci al nodo che abbiamo attivato:

$ sudo geth attach ipc://home/lorenzo/.ethereum/geth.ipcgeth
Welcome to the Geth JavaScript console!

instance: Geth/v1.9.16-stable-ea3b00ad/linux-amd64/go1.14.2
coinbase: 0x501BCa86e4cBb93817945Df9482713A49F1783670b18
at block: 11860 (Thu Jul 16 2020 17:33:17 GMT+0200 (CEST))
 datadir: /tutorial/nettest
 modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

Possiamo verificare l’account precedentemente creato

> eth.accounts
["0x501BCa86e4cBb93817945Df9482713A49F1783670b18"]
> eth.coinbase
"0x501BCa86e4cBb93817945Df9482713A49F1783670b18"
# nel caso avessimo più account quello che verrebbe mostrato 
sarebbe comunque il primo che è stato creato, nel nostro caso, primo e
unico

Con quest’ultimo comando che ti mostro, ti faccio vedere come poter interrogare da Console JS, per conoscere il quantitativo di ether fino ad ora minati e accreditati al nostro account:

> eth.getBalance(eth.coinbase)
2.3802e+22

Ora non ci rimane che come ultima cosa, collegare Metamask al nostro nodo locale, dunque colleghiamoci a Metamask, creiamo un nuovo utente/account, chiamalo come vuoi , e successivamente indicare la connessione di tipologia “Localhost 8545”

La cosa bella sarà rimanere a guardare su Metamask il conto degli ether che sale un tot. alla volta 🙂

 

Come possiamo vedere dalle foto affiancate, il mining in esecuzione sul nodo ti farà aumentare gli ether nel portafoglio. 🙂 Bello vero !!

Non perdere le ultime notizie

Se questo articolo ti è piaciuto e vuoi rimanere sempre aggiornato sul mondo cripto e blockchain iscriviti alla nostra Newsletter

Lorenzo Disilvestro

Lorenzo Disilvestro

Appassionato di nuove tecnologie e sempre alla scoperta delle migliori soluzioni per aumentare l'efficienza aziendale, come per esempio, la resilienza e tutto ciò che ha a che fare con la sicurezza dei dati. Il mondo dell'IT e quello delle criptovalute sono per me un tutt'uno, dal mining, agli smart contract.
Lorenzo Disilvestro

Lorenzo Disilvestro

Appassionato di nuove tecnologie e sempre alla scoperta delle migliori soluzioni per aumentare l'efficienza aziendale, come per esempio, la resilienza e tutto ciò che ha a che fare con la sicurezza dei dati. Il mondo dell'IT e quello delle criptovalute sono per me un tutt'uno, dal mining, agli smart contract.

Commenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *