Configuració de dos nodes d’un Ethereum privat a AWS amb desplegament de contracte (primera part)

De tant en tant penso emular un entorn Ethereum. La idea darrere és observar com funcionen els nodes Ethereum entre ells i com interactuen els diferents comptes en la implementació de transaccions i contractes. Per a proves, la majoria d’exemples de desplegament de contractes actualment es basen principalment en testrpc o testnet, però el funcionament del contracte entre nodes encara és nou per a mi.

Desplego aquesta configuració de dos nodes a AWS. Com que no faig servir cap funció especial a AWS, hauria de ser aplicable a un altre entorn de núvol.

La meva configuració està inspirada en el treball de JJ’s World (enllaç), i després de provar-ho diverses vegades amb modificacions, documento tot el procés que he fet i comparteixo aquí una mica d’experiència sobre tot el procés.

També faig servir el contracte de votació desenvolupat per Mahesh Murthy (enllaç). Es tracta d’un contracte senzill que il·lustra millor el funcionament d’un contracte a la cadena.

Aquesta no és en cap cas una guia detallada pas a pas. Omet certs passos i faig referència a alguns treballs realitzats per altres. Per exemple, el funcionament detallat d’AWS EC2, inclòs el llançament d’una nova instància amb una configuració com ara clau d’accés, grup de seguretat, etc., es pot trobar aquí (enllaç).

Llegiu la segona part aquí

Hi ha dues parts en aquesta configuració.

Part 1: Creeu una xarxa ethereum de 2 nodes amb cadena de blocs privada i els comptes dels dos nodes es poden enviar èter entre si.

Part 2: Desplegueu un contracte des d’un node i tots dos comptes poden accedir i executar funcions d’aquest contracte.

Pas 1: inicieu dues instàncies EC2.

Utilitzeu t2.medium (2 vCPU, 4 GB RAM) amb SSD 8G per defecte. Trieu Ubuntu OS. Assegureu-vos que els dos nodes tinguin el mateix grup de seguretat, cosa que permet TCP 30303 (o 30000-30999, ja que puc utilitzar més ports en aquest interval). El port 30303 per defecte és per a la visualització entre nodes.

Compartir experiència

  • Primer vaig provar t2.micro, ja que és l’oferta de nivells gratuïts. Tot i això, la mineria no va tenir èxit (bucle “DAG” sense recompensa d’èter). Després vaig provar t2.small i la mineria va funcionar. No obstant això, quan vaig desplegar un contracte (vegeu la part 2), el rpc era inestable. Finalment, he trobat t2.medium prou bo per a la meva configuració.
  • Normalment PARO la instància després de provar-la (per estalviar diners). Tingueu en compte que l’adreça IP pública de la instància EC2 es canviarà després de tornar-la a iniciar. Això no té cap impacte en la nostra configuració aquí, ja que estic fent servir l’adreça IP privada d’aquestes instàncies per fer intercanvis. L’adreça IP privada es manté fins i tot després d’aturar / INICI la instància. En qualsevol cas, si cal una adreça IP pública, l’intercanvi continua funcionant, però és possible que hagueu de canviar l’adreça d’intercanvi cada vegada.

Pas 2: instal·leu el client geth al node 1

Accés al node 1 amb ssh i clau adequada. Seguiu el procés recomanat (enllaç) per a la instal·lació de geth. La instal·lació des de PPA és prou bona.

Node 1

$ sudo apt-get install software-properties-common

$ sudo add-apt-repository -y ppa: ethereum / ethereum

$ sudo apt-get update

$ sudo apt-get install ethereum

i verifiqueu-ho amb $ which geth i veureu que geth està instal·lat correctament.

Pas 3: prepareu el Genesis.json

Aquest mateix Genesis.json s’aplica als dos nodes, ja que garanteix que tots dos nodes tinguin el mateix bloc de gènesi. Aquí teniu el Genesis.json que he utilitzat, que s’adopta a partir d’aquí (enllaç). Tiro l’assignació inicial, ja que no necessito modificar l’adreça d’aquest fitxer en cada configuració nova. Cada compte guanyarà alguns èters un cop comenci a explotar.

Genesis.json

{

"config": {

"chainId": 15,

"homesteadBlock": 0,

"eip155Block": 0,

"eip158Block": 0

},

"nonce": "0x0000000000000042",

"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",

"dificultat": "0x200",

"assign": {},

"base de moneda": "0x000000000000000000000000000000000000000000",

"marca de temps": "0x00",

"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",

"gasLimit": "0xffffffff",

"assign": {

}

}

Conserveu aquest fitxer en algun lloc i, posteriorment, scp als nodes, o simplement copieu-lo i enganxeu-lo amb un editor als dos nodes.

Pas 4: inicieu el geth amb Genesis.json

Node 1

$ geth init Genesis.json

Pas 5: inicieu geth ara

És una bona pràctica tenir dues pantalles en paral·lel (o un terminal dividit). Una pantalla és la consola i una altra mostra el registre. Obriu un terminal nou i ssh al node 1 i continueu llegint el registre.

Node 1 $ geth –nodiscover console 2>> eth.log

un altre terminal $ tail -F eth.log

Configuració de dos nodes d’un Ethereum privat a AWS amb desplegament de contracte

Compartir experiència

  • En molts exemples, es recomana utilitzar –datadir per especificar el directori per a la cadena de blocs privada de ethereum. Aquesta és una bona pràctica quan interactueu amb diferents cadenes. El meu exemple és un entorn aïllat. Per tant, ometo aquesta opció i la meva cadena privada s’emmagatzema al directori ~ / .ethereum /.

Pas 6: creeu un compte al node 1

Node 1 geth

> personal.newAccount ()

> eth.getBalance (eth.accounts [0]) O > web3.fromWei (eth.getBalance (eth.accounts [0]), “ether”)

Ara tenim un compte en aquest node (comproveu-ho sempre amb > eth.accounts [0] o > eth.coinbase). I actualment, no hi ha èter en el saldo del compte, ja que no n’hem assignat cap a Genesis.json.

Pas 7: Comenceu la mineria

Podem començar el procés de mineria.

  1. Des del terminal de registre, veurem “Generant DAG en curs” i, després d’una època, s’està extraient un bloc.
  2. Un cop s’ha extret un bloc, s’afegeixen 5 èters al saldo del compte. Aquest és un bon indicador de si la mineria té èxit o no.
  3. Si continuem minant, l’import del saldo del compte continua augmentant a mesura que s’exploten més blocs nous.

Node 1 geth

> miner.start ()

> eth.getBalance (eth.accounts [0])

No dubteu a continuar minant, o bé podem desactivar-la > miner.stop ().

Ara el node 1 està a punt. Treballem al node 2.

Pas 8: repetiu el pas 2-6 al node 2

Assegureu-vos que s’utilitza el mateix Genesis.json quan s’inicia la cadena de blocs al node 2.

No comenceu a minar, ja que volem que el node 2 sigui el mateix blockchain que el node 1 (mitjançant Peering).

Pas 9: Mirar

Ara comencem a mirar els dos nodes. Hi ha diverses maneres d’aparellar. Aquí estic fent servir “administrador addPeer” per fer el peering: al Node 2, afegiu la informació del node Node 1 per a la peering.

En primer lloc, comproveu els dos nodes que no hi hagi parelles.

Node 1 > admin.peers

Node 2 > admin.peers

Obteniu informació del node del node 1

Node 1 > admin.nodeInfo.enode

Obtenirem alguna cosa així:

"enode: // c667fdf1f6846af74ed14070ef9ffeee33e98ff8ab0dd43f67415868974d8205e0fb7f55f6f37e9e1ebb112adfc0b88755714c7bc83a7ac47d30f8eb53118687 @ [?]:?"

Afegiu aquesta informació al node 2. Canvieu el [::] amb l’adreça privada del node 1.

Node 2

> admin.addPeer ("enode: //c667fdf1f6846af74ed14070ef9ffeee33e98ff8ab0dd43f67415868974d8205e[email protected]172?")

Després d’aquesta comprovació, tots dos nodes i ells s’estan mirant entre ells.

Node 1 > admin.peers

Node 2 > admin.peers

El costat esquerre és el node 1 i el costat dret és el node 2. Tingueu en compte que després > addPeer () al node 2, es comparen dos nodes. No cal que fem el mateix al node 1.

A més, des del registre, veiem que, després de fer una peering, veiem “Sincronització de blocs iniciada” i “Importat segment de cadena nova” al registre del node 2 (terminal inferior dret).

Compartir experiència

  • Assegureu-vos d’utilitzar el mateix Genesis.json per iniciar el blockchain. En un assaig, em vaig oblidar d’iniciar el pas i la interacció no va tenir èxit.
  • La instància AWS EC2 inclou una adreça IP privada i una adreça IP pública. Tots dos funcionen bé en afegir parells, però utilitzar l’adreça IP privada és més convenient, ja que no es canvia després de la instància STOP / START.

Pas 10: envieu èters entre comptes

Com que els dos nodes es troben a la mateixa cadena de blocs d’etereu, enviarem alguns èters entre els comptes. En aquest exemple, s’envien 10 èters des del compte del node 1 al compte del node 2. Aquesta és una de les millors maneres de verificar si la configuració és correcta.

Node 1

> web3.fromWei (eth.getBalance (eth.coinbase), “èter”)

> personal.unlockAccount (eth.coinbase)

> eth.sendTransaction ({from: eth.coinbase, to: "0xabc65de992289401dcff3a70d4fcfe643f7d2271", valor: web3.toWei (10, “èter”)})

> miner.start ()

Node 2 > web3.fromWei (eth.getBalance (eth.coinbase), “èter”)

Configuració de dos nodes d’un Ethereum privat a AWS amb desplegament de contracte

Tingueu en compte que veiem “transacció pendent”, ja que aquesta transacció encara no s’ha extret. Un cop comencem a minar al node 1, la transacció es realitza i el saldo del compte al node 2 és ara de 10 èters.

I veiem 45 èters al node 1 (no els 20-10 esperats = 10 èters). Es deu al fet que el node 1 continua rebent recompenses mineres (5 èters per bloc). El saldo continuarà augmentant fins que deixem de minar.

Tancament

Ara completem la primera part: construïm una cadena de blocs privada de dos nodes a AWS. Podeu anar directament a la part següent per desplegar el contracte, r aturar el procés i la instància EC2 per a un ús futur. En cas que es canviï l’intercanvi per qualsevol motiu, podeu tornar a intercanviar els nodes amb el pas 9 anterior.

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me
Like this post? Please share to your friends:
map