# bfanodo

## Un nodo transaccional para BFA.

### Caracteristicas

El **bfanodo** es un container/Docker se puede descargar y correr en tu
propia maquina, maquina virtual o datacenter. 

Se levanta como un nodo transaccional, **sin cuentas**, abierto a todo el mundo.
Si no deseas brindar este servicio a la red, se puede usar *ipfilter* o, 
directamente no publicar el puerto 8545 (anclado únicamente a 127.0.0.1, 
igual que puerto 8546). Para hacer eso, hay que cambiar los parametros
`-p` en `start.sh`.

Como se puede apreciar en el ejemplo aquí abajo, los puertos 30303/tcp y 8545/tcp estan abiertos al
mundo (0.0.0.0 = INADDR_ANY) y 8546/tcp esta abierto solamente para
conecciones de tu maquina.
```
$ docker container port bfanodo
30303/tcp -> 0.0.0.0:30303
8545/tcp -> 0.0.0.0:8545
8546/tcp -> 127.0.0.1:8546
```

Es importante entender que "tu maquina" incluye otros dockers en
la misma maquina, si las has conectado con el parametro  `--link`,
como se puede ver aqui: (NOTA DE FRANCA: ESTO NO LO ENTIENDO)
```
$ docker run --rm -it --link bfanodo alpine env | grep BFANODO_PORT | sort
BFANODO_PORT_30303_TCP_ADDR=172.17.0.2
BFANODO_PORT_30303_TCP_PORT=30303
BFANODO_PORT_30303_TCP_PROTO=tcp
BFANODO_PORT_30303_TCP=tcp://172.17.0.2:30303
BFANODO_PORT_30303_UDP_ADDR=172.17.0.2
BFANODO_PORT_30303_UDP_PORT=30303
BFANODO_PORT_30303_UDP_PROTO=udp
BFANODO_PORT_30303_UDP=udp://172.17.0.2:30303
BFANODO_PORT_8545_TCP_ADDR=172.17.0.2
BFANODO_PORT_8545_TCP_PORT=8545
BFANODO_PORT_8545_TCP_PROTO=tcp
BFANODO_PORT_8545_TCP=tcp://172.17.0.2:8545
BFANODO_PORT_8546_TCP_ADDR=172.17.0.2
BFANODO_PORT_8546_TCP_PORT=8546
BFANODO_PORT_8546_TCP_PROTO=tcp
BFANODO_PORT_8546_TCP=tcp://172.17.0.2:8546
BFANODO_PORT=tcp://172.17.0.2:8545
```
Los puertos de los otros dockers están disponibles, sin usar
`--link` . Pero no van a estar publicados en las variables del entorno.
```
$ docker run --rm alpine sh -c "date | nc 172.17.0.2 8545" ; echo
HTTP/1.1 400 Bad Request
Content-Type: text/plain; charset=utf-8
Connection: close

400 Bad Request
```
(puerto abierto)

### Cuentas

Una leccion aprendida durante el primer año de BFA es que el `geth`
normalmente no necesita una cuenta asociada (esto obviamente es distinto si
se utiliza como nodo sellador).

Las cuentas deben estar asociadas a las applicaciones que se conectan al
nodo. Esto hace que el sistema sea más seguro, y que  **cada applicacion necesite su
propia cuenta**.

Si no sos miembro del grupo `docker` (en `/etc/group` ) deberás hacer todo como `root`

Así, se creará un directorio en `~/dockers/volumes/bfanodo,home,bfa,bfa,network,node,geth` . Si tenés cuentas/llaves van allí. Toda la blockchain tambien se puede ver en ese mismo lugar, para que no hay que bajar toda la blockchain de vuelta al actualizar el nodo. (NOTA DE FRANCA: NO ENTIENDO ESTA ULTIMA PARTE)

### Instalando Docker

En [https://docs.docker.com/install/] hay instrucciones para instalar Docker para varios
sistemas (CentOS, Debian, Fedora, Ubuntu).

Una vez instalado, podés correr varios dockers a la vez. Si ves el aviso `WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.` la solucion posible está en https://docs.docker.com/install/linux/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities

Normalmente es suficiente (en Debian) con:
```
$ echo 'GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"' >> /etc/default/grub
$ update-grub
$ reboot
```

### Instalando bfanodo

```
$ wget https://gitlab.bfa.ar/docker/bfanodo/raw/master/start.sh
$ ./start.sh
```

### Registros / logs

Estos comandos pueden brindar mas informacion sobre tu bfanodo (y hasta darte un shell):
```
$ docker stats bfanodo
$ docker logs bfanodo
$ docker exec bfanodo bfalog.sh
$ docker exec bfanodo localstate.pl
$ docker exec -it bfanodo bash
```

### Crear

Para crear el docker se utilizó el script `build.sh`. Por favor, no lo uses si no sabés como funciona todo.