INTRODUCCION VA AQUI
Importante abrir el puerto en TCP y UDP
Desafortunadamente no hay una distrubución de geth
lista para instalar desde los repositorios de software de la AMI, por lo que debemos instalar geth
desde el código fuente:
sudo yum update -y
sudo yum install golang -y
git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum/
sudo make all
Los binarios compilados se encuentran en la siguiente ruta: ~/go-ethereum/build/bin
por lo que podemos añadir esta ruta al Path para que podamos usarlo de una forma mas comoda.
export PATH=$PATH:/home/ec2-user/go-ethereum/build/bin
Ùna vez hecho esto podemos comprobar la instalación escribiendo:
$ geth version
Geth
Version: 1.6.7-unstable
Git Commit: 65f0e905ddda9be97368839b67be5754b33a0eea
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.7.5
Operating System: linux
GOPATH=
GOROOT=/usr/lib/golang
Para inicializar la red vamos a clonarnos este repositorio en la maquina donde acabamos de instalar geth
cd
git clone https://github.com/angelbarrera92/Ethereum-Private-Network.git
cd Ethereum-Private-Network
cd scripts
./init_the_genesis.sh
Debe de mostrar unas trazas similares a:
./init_the_genesis.sh
WARN [07-08|16:22:35] No etherbase set and no accounts found as default
INFO [07-08|16:22:35] Allocated cache and file handles database=/home/ec2-user/data/ethPrivate/geth/chaindata cache=16 handles=16
INFO [07-08|16:22:35] Writing custom genesis block
INFO [07-08|16:22:35] Successfully wrote genesis state database=chaindata hash=b38dfb…566e58
INFO [07-08|16:22:35] Allocated cache and file handles database=/home/ec2-user/data/ethPrivate/geth/lightchaindata cache=16 handles=16
INFO [07-08|16:22:35] Writing custom genesis block
INFO [07-08|16:22:35] Successfully wrote genesis state database=lightchaindata hash=b38dfb…566e58
Estando en el directorio de scripts de este repositorio podemos ejecutar:
./node_init.sh
WARN [07-08|16:32:25] No etherbase set and no accounts found as default
INFO [07-08|16:32:25] Starting peer-to-peer node instance=Geth/v1.6.7-unstable-65f0e905/linux-amd64/go1.7.5
INFO [07-08|16:32:25] Allocated cache and file handles database=/home/ec2-user/data/ethPrivate/geth/chaindata cache=128 handles=1024
WARN [07-08|16:32:25] Upgrading chain database to use sequential keys
INFO [07-08|16:32:25] Initialised chain configuration config="{ChainID: 154321 Homestead: 0 DAO: <nil> DAOSupport: false EIP150: <nil> EIP155: 0 EIP158: 0 Metropolis: <nil> Engine: unknown}"
INFO [07-08|16:32:25] Disk storage enabled for ethash caches dir=/home/ec2-user/data/ethPrivate/geth/ethash count=3
INFO [07-08|16:32:25] Disk storage enabled for ethash DAGs dir=/home/ec2-user/.ethash count=2
WARN [07-08|16:32:25] Upgrading db log bloom bins
INFO [07-08|16:32:25] Bloom-bin upgrade completed elapsed=82.023µs
INFO [07-08|16:32:25] Initialising Ethereum protocol versions="[63 62]" network=154321
INFO [07-08|16:32:25] Loaded most recent local header number=0 hash=b38dfb…566e58 td=200
INFO [07-08|16:32:25] Loaded most recent local full block number=0 hash=b38dfb…566e58 td=200
INFO [07-08|16:32:25] Loaded most recent local fast block number=0 hash=b38dfb…566e58 td=200
INFO [07-08|16:32:25] Starting P2P networking
INFO [07-08|16:32:25] Database conversion successful
INFO [07-08|16:32:27] UDP listener up self=enode://b0cb65c92e1e3e06001e6ca70acc73e09104bac5915541b980983ae46d96bfd24ef94ff61e54b8d3aa10781deff93de36a73b6b2c3d9a030ba3d8126cbec5014@[::]:30303
INFO [07-08|16:32:27] RLPx listener up self=enode://b0cb65c92e1e3e06001e6ca70acc73e09104bac5915541b980983ae46d96bfd24ef94ff61e54b8d3aa10781deff93de36a73b6b2c3d9a030ba3d8126cbec5014@[::]:30303
INFO [07-08|16:32:27] IPC endpoint opened: /home/ec2-user/data/ethPrivate/geth.ipc
Welcome to the Geth JavaScript console!
instance: Geth/v1.6.7-unstable-65f0e905/linux-amd64/go1.7.5
modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
>
Àhora estaremos dentro de la consola de este nodo de Ethereum.
Estando dentro de la consola, podemos ejecutar:
> personal.newAccount()
Passphrase:
Repeat passphrase:
"0x499689c2238cd94b7ce4b19c09d7e11071824795"
> INFO [07-08|16:35:08] New wallet appeared url=keystore:///home/ec2-user/data/… status=Locked
Ỳ ya tendremos nuestra cuenta creada. Esta la usaremos para configurarla como destino de los Ether minados en esta red privada (Se configura automagicamente). Para comprobar el id de la cuenta destino del minado:
eth.coinbase
Para poder crear un cluster, debemos conocer el identificador de nuestro nodo. Para ello, siguiente en la consola de Ethereum tenemos que escribir el siguiente comando:
> admin.nodeInfo
{
enode: "enode://b0cb65c92e1e3e06001e6ca70acc73e09104bac5915541b980983ae46d96bfd24ef94ff61e54b8d3aa10781deff93de36a73b6b2c3d9a030ba3d8126cbec5014@[::]:30303",
id: "b0cb65c92e1e3e06001e6ca70acc73e09104bac5915541b980983ae46d96bfd24ef94ff61e54b8d3aa10781deff93de36a73b6b2c3d9a030ba3d8126cbec5014",
ip: "::",
listenAddr: "[::]:30303",
name: "Geth/v1.6.7-unstable-65f0e905/linux-amd64/go1.7.5",
ports: {
discovery: 30303,
listener: 30303
},
protocols: {
eth: {
difficulty: 200,
genesis: "0xb38dfbafcacd3c8a6324969358b95d54cc36d7d87362045375b83d83d5566e58",
head: "0xb38dfbafcacd3c8a6324969358b95d54cc36d7d87362045375b83d83d5566e58",
network: 154321
}
}
}
Podemos observar varios datos:
- El identificador de
protocols.eth.genesis
es el mismo queprotocols.eth.head
esto es de bido a que nuestra cadena solo tiene un bloque, el bloque relativo a nuestra genesis. - El
protocols.eth.network
indica nuestro network id. - El puerto
ports.listener
es el que hemos abierto anteriormente en la sección de security groups.
El dato que estabamos buscando es el valor de enode
. A este valor se le debe sustituir [::]
por la ip de nuestra instancia.
Para descubir la ip publica de esta instancia (debemos abrir otra terminal para no cerrar geth)
curl http://169.254.169.254/latest/meta-data/public-ipv4 && echo
54.194.91.164
Entonces nuestro enode será: enode://b0cb65c92e1e3e06001e6ca70acc73e09104bac5915541b980983ae46d96bfd24ef94ff61e54b8d3aa10781deff93de36a73b6b2c3d9a030ba3d8126cbec5014@54.194.91.164:30303
Habiendo inicializado n nodos con el procedimiento descrito anteriormente, podemos escribir en la consola geth el siguiente comando:
admin.addPeer()
Una vez obtenido un enode, podemos ir a otro nodo y añadirlo:
> admin.addPeer("enode://b0cb65c92e1e3e06001e6ca70acc73e09104bac5915541b980983ae46d96bfd24ef94ff61e54b8d3aa10781deff93de36a73b6b2c3d9a030ba3d8126cbec5014@54.194.91.164:30303")
true
> admin.peers
[{
caps: ["eth/63"],
id: "b0cb65c92e1e3e06001e6ca70acc73e09104bac5915541b980983ae46d96bfd24ef94ff61e54b8d3aa10781deff93de36a73b6b2c3d9a030ba3d8126cbec5014",
name: "Geth/v1.6.7-unstable-65f0e905/linux-amd64/go1.7.5",
network: {
localAddress: "172.31.22.201:59654",
remoteAddress: "54.194.91.164:30303"
},
protocols: {
eth: {
difficulty: 200,
head: "0xb38dfbafcacd3c8a6324969358b95d54cc36d7d87362045375b83d83d5566e58",
version: 63
}
}
}]
>
Con ello ya tendremos una red de ethereum privada con dos nodos
Para inicializar el minado en cada uno de los nodos, debemos escribir el siguiente comando:
miner.start(1)
La primera vez que ejecutamos este comando tardara unos minutos en generar el DAG (TODO, completar documentacion).
Como hemos puesto en el bloque de genesis una dificultad bastante baja, el minado se realizará de una forma bastante rapida.
Teniendo un nodo minando y el otro pasivo, podemos ver en el nodo pasivo como el numero de bloques va incrementando ejecutando el comando: eth.blockNumber
dentro de la consola de geth.
Con este comando tambien podemos comprobar como los dos nodos, u n nodos, están sincronizados