# Blockchain Federal Argentina
## Sitio web: https://www.bfa.ar/
## Repositorio: https://gitlab.bfa.ar/blockchain/nucleo.git
Este repositorio contiene lo nececario para instalar un "nodo BFA" (nodo sellador, nodo gateway, nodo transaccional "etc", son casi iguales).
Esta guía debería funcionar en Debian o sus derivados. Testeado en *Debian* y *Ubuntu server* sin la GUI instalada en ninguno de ellos.
([Capturas de pantallas instalando un Ubuntu 18.04](https://gitlab.bfa.ar/blockchain/nucleo/wikis/Instalando-Ubuntu-Server-18.04))
([Capturas de pantallas instalando un Debian 9.5](https://gitlab.bfa.ar/blockchain/nucleo/wikis/Instalando-debian-9.5))
1. Instalá `git`
- como root: `apt install git`
2. Cloná el repositorio oficial BFA
- `git clone https://gitlab.bfa.ar/blockchain/nucleo.git bfa`
3. Ejecutá el script de instalación. Esto cambiará algunas configuraciones en tu sistema. Si te preocupa (¿debería?), podés ejecutar este escript paso a paso manualmente.
- como root: `bfa/bin/installbfa.sh`
- te va a preguntar si queres conectarte a la red de `produccion` o de `prueba (test2)`
Van a aparecer varios **warnings** mientras se instala web3. Esto parece ser "normal". Ignorarlo no parece causar problemas.
4. Cambiá al usuario `bfa`
- como root: `su - bfa`
5. Crea una cuenta // solamente los 20-30 nodos selladores necesitan una cuenta en el nodo
- como bfa: `admin.sh account`
6. Comenzá la sincronización. **Esto puede llevar un rato largo** (este script se ejecuta automáticamente cuando se reinicia el sistema).
- como bfa: `start.sh`
7. `localstate.pl` muestra el estado actual del nodo.
8. Monitoreá los logs con `bfalog.sh`. Apretá CTRL-C en cualquier momento para detener el `tail -f`.
9. Cambiá la configuración de tu nodo usando `admin.sh syncmode`
- Hacé esto antes de haber sincronizado mucho en el paso anterior, ya que esto podría remover todos los datos de la cadena que hayas bajado y reiniciar la sincronización de la cadena.
10. Esperá a aque termine de sincronizar
11. Herramientas simples super básicas (más bien pruebas de concepto, para inspirar a los programadores):
- `explorer.sh` : Sigue el bloque más nuevo "*lastest*" por default, pero podés especificar un número de bloque cualquiera como argumento, por ejemplo `explorer.sh 0` permite ver el génesis (bloque 0).
- `walker.pl` : También toma un número de bloque para iniciar. Sigue esperando nuevos bloques.
- `sealerwatch.pl` : Mira cuando los selladores firman.
Hay otros programas "interesantes" en los directorios `bin/` y `src/`,
pero para los desarrolladores, el branch `dev` es más intersante y tambien el
([repositorio contrib](https://gitlab.bfa.ar/blockchain/contrib)).
**Puede tardarse alrededor de una hora conectarse la primera vez. En el log no se ve nada. Hay que tener paciencia.**
### network_id
Se puede consultar el ID de la red con el comando RPC `net.getVersion` o/y `net.version`.
Red de producción (nombre: network):
47525974938 (0xb10c4d39a)
Red de pruebas (nombre: test2network):
55555000000 (0xcef5606c0)
### chainId
Normalmente chainId es el mismo numero que network_id, pero no es necesario. En BFA son distintos.
Se puede consultar el chainId con el comando RPC `eth.chainId`.
Red de producción (network):
200941592 (0xbfa2018)
Red de pruebas (test2network):
99118822 (0x5e86ee6)
## start.sh
Inicia un nodo para vos en la red BFA Ethereum.
## attach.sh
Te conecta a la línea de comandos (CLI) del `geth` que está corriendo en tu máquina local (falla si no hay un `geth` corriendo).
## explorer.sh
Scritp simple para mirar bloques
## walker.pl
Muestra una línea por bloque que se va sellando en la red, luego espera hasta el siguiente bloque.
## sealerwatch.pl
Muestra cuando los selladores sellan bloques. Tiene amarillo y colorado para mostrar cuando algo no es optimo.
## rewind.sh
Si tu nodo local parece clavado y sigue conectado, podés probar esta
herramienta que va a regroceder algunos bloques en la cadena y tratar
de retomar desde allí. Realmente no debería pasar, pero hemos visto
algunas veces, mientras había pocos selladores, que algunos nodos se
trababan en un *side fork*.
## log.sh
Toma `stdin` y lo rota sobre una cantidad limitada de archivos de log.
Mandamos la salida de `geth` a través de un *pipe* a `log.sh` para poder
leer el log.
## sendether.sh
Script para mandar Ether a alguien.
## MasterDistiller.js
Administra un *smart contract* de la Destilería ya desplegado. Va a mostrar
las cuentas registradas y la cantidad de Ether configurada ("*allowance*") de
cada una de ellas.
## unlock.js
Debloqua las cuentas del sistema (vease tambien `monitor.js`). Si una cuenta
tiene clave, se puede poner la clave con este script.
## monitor.js
Esto se corre desde `cron.sh`. Cada minuto actualizará el archivo
`network/status` que muestra información del estado del nodo muy básica.
Tambien habilita sellar/minar si la cuenta (eth.accounts[0]) esta permitido
segun la red. Desbloqua cuentas si no tienen passwords.
## compile.and.deploy.contract
Compila y despliega un *smart contract* a la blockchain. Debe haber una cuenta (*account*) local que tenga suficiente Ether para pagar por la transacción.
Argumento 1 es el nombre de archivo del *smart contract* a compilar.
Ejemplo: `compile.and.deploy.contract src/TimestampAuthority.sol`
## localstate.pl
Muestra varias detalles del entorno local.