La idea de este proyecto es construir una Blockchain e ir aprendiendo mediante vamos implementando funcionalidad. Intentaremos entender los pilares conceptuales de esta tecnología mientras, en el camino, vamos construyendo una blockchain similar a la de bitcoin u otras redes. Entender lo que es la descentralización y los beneficios que podemos obtener aplicando estos conceptos.
Inicializamos un proyecto con npm [https://www.npmjs.com/]
npm init
Instalamos dependencias de babel [https://babeljs.io/]
npm install @babel/core @babel/node @babel/preset-env --include=dev
Instalamos eslint para poder ser mas ordenados y tener algunos lineamientos cuando codificamos, agregamos la configuración de airbnb que es bastante buena y agregamos el plugin de import que nos va a ayudar bastante. [https://eslint.org/]
npm install eslint eslint-config-airbnb-base eslint-plugin-import --include=dev
Agregamos nodemon para tener la caracteristica de poner hacer cambios en el código sin tener que cortar la ejecución, con solo guardar los cambios nodemon actualiza la instancia en ejecución. [https://nodemon.io/]
npm install nodemon --include=dev
Instalación de jest para realizar nuestros test
npm install --save-dev babel-jest jest
Paquetes necesarios para poder agregar nuestros endpoints a la app.
npm install express body-parser
Instalamos las dependencias para trabajar con websockets
npm install ws
Instalamos modulos de node para trabajar con curvas elipticas de criptografía, es mas eficiente que RCA y las llaves que podremos generar serán mas cortas, seguras y mas rapidas.
npm install elliptic
Instalamos dependencias para agregar la funcionalidad de crear y utilizar uuid
npm install uuid
Creamos un fichero .babelrc y agregamos solo el preset que hemos instalado por el momento "presets": ["@babel/preset-env"]
Creamos un fichero .eslintrc y agregamos la extención de airbnb, configuramos jest y node y agregamos una regla para la cantidad de columnas (esto ultimo es cuestion personal, a mi me agrada agregarlo)
Agregamos el archivo index.js y le colocamos un console.log solo para saber que funcina nuestra inicialización.
Para comenzar con una nueva instancia de un nodo podemos ejecutar el siguiente script que tenemos configurado en el package.json
npm run start
Esto lo que realizaría es inicializar un nodo escuchando en los puertos por default que tiene que son 3000 y 5000
luego si queremos levantar una nueva instancia y que esta se sincronice con la anterior, es decir, cada noto tendra el 50% de la red de validadores de nuestra blockchain, ejecutamos el siguiente script que tambien tenemos ya configurado en el package.json
npm run start:2
Esto lo que realizaría es inicializar un nodo escuchando en los puertos por default que tiene que son 3001 y 5001, con el argumento tambien para indicarle con que otro nodo tiene que sincronizarse.
HTTP_PORT=3001 NETWORK_PORT=5001 NODES=ws:localhost:5000
teniendo los dos nodos corriendo podemos hacer pruebas a los endpoints de cada uno.
verificamos los blockes minados
GET http://localhost:3000/blocks
para poder minar un block
POST http://localhost:3000/mine HTTP/1.1
content-type: application/json
{
"data": "new block origin 3000"
}
verificamos las transacciones que tenemos en la memoryPool
GET http://localhost:3000/transactions
creamos una nueva transaccion y queda en la memoryPool hasta ser confirmada
POST http://localhost:3000/transaction HTTP/1.1
content-type: application/json
{
"recipient": "random-address",
"amount": 51
}
Cambiando el numero del puerto podemos realizar las operaciones entre los diferentes nodos que tengamos corriendo localmente.