¡No te pierdas ninguna publicación! Suscríbete a The Softtek Blog
En este post explicaremos cómo con JavaScript es posible consultar un wallet y comprobar que una cierta cantidad de Bitcoins ha llegado a él.
El enfoque que utilizaremos será el de conectarnos a un “wallet local” que tendremos instalado previamente en nuestro PC en modo “autopilot”.
Para ello usaremos Bitcoin Core, el monedero “Full Client” oficial para PC creado inicialmente por Satoshi Nakamoto, que convirtie tu ordenador en un nodo más de la red Bitcoin. Bitcoin Core lleva incluida la librería Bitcoind con una interfaz gráfica, pudiéndose ejecutar desde una línea de comandos o a través de un escritorio. Además puede ser controlado de forma remota usando el protocolo JSON-RPC.
Para que el programa que vamos a realizar funcione, necesitaremos recibir dinero en una dirección de Bitcoin de nuestro wallet.
Pasos a seguir:
Para instalarla:
npm install bitcoin
Descargar “Bitcoin Core” de https://bitcoin.org/en/download
Arrancar “Bitcoin Core” en modo servidor. Este programa abrirá un socket el cual utilizaremos para conectarnos desde nuestro programa JavaScript.
En una consola de comandos situarnos en el directorio C:\Program Files (x86)\Bitcoin
Y ejecutamos: bitcoin-qt.exe –server
La primera vez que arranca “Bitcoin Core” en modo servidor te preguntará si quieres crear el fichero: “bitcoin.conf”, en el cual podremos añadir un usuario y contraseña.
var bitcoin = require("bitcoin");
var client = new bitcoin.Client({
host: 'localhost',
port: 8332,
user: 'myUsername',
pass: 'myPassword'
});
var previousBalance = 0;
function mainLoop() {
client.getBalance('*', 0, function (err, balance) {
if (err) {
console.log(err);
} else if (balance > previousBalance) {
console.log("Hello Money! New balance: " + balance);
previousBalance = balance;
} else {
console.log("Nothing's changed.");
}
});
}
setInterval(mainLoop(), 5000);
En la primera línea indicamos que estamos usando la librería “node-bitcoin”:
var bitcoin = require("bitcoin");
A continuación establecemos una conexión al monedero de “Bitcoin Core”.
Si estamos ejecutando nuestra aplicación en el mismo pc que “Bitcoin Core” nuestro host sería “localhost” (por defecto el nodo de Bitcoin correrá en el puerto 8332).
Utilizaremos el mismo usuario y contraseña que establecimos en el fichero “bitcoin.conf”. (C:\Users\<username>\AppData\Roaming\Bitcoin\bitcoin.conf.
var client = new bitcoin.Client({
host: 'localhost',
port: 8332,
user: 'myUsername',
pass: 'myPassword'
});
Definimos variable para guardar el importe previo de nuestro balance (var previousBalance).
var previousBalance = 0;
Ahora definimos un bucle que va a chequear el balance en nuestro monedero y nos informará cuando dicho balance haya sido modificado.
function mainLoop() {
client.getBalance('*', 0, function (err, balance) {
if (err) {
console.log(err);
} else if (balance > previousBalance) {
console.log("Hello Money! New balance: " + balance);
previousBalance = balance;
} else {
console.log("Nothing's changed.");
}
});
}
setInterval(mainLoop(), 5000);
Para probar nuestro programa, ejecutamos el comando siguiente en una consola situandonos en el directorio que contiene holaDinero.js:
Lo siguiente es enviar una cantidad de bitcoins a nuestro monedero administrado por “Bitcoin Core” desde otro monedero. Para ello, debes utilizar una dirección de bitcoin que puedes encontrar haciendo clic en el botón "Recibir" en Bitcoin Core.
La función “mainLoop” manda mensajes a “Bitcoin Core”. JSON-RPC permite enviar mensajes entre dos programas de una forma fácil.
El único comando que comunica con “Bitcoin Core” es “client.getBalance”, pero existen muchos más que permiten manipular direcciones de Bitcoin, modificar monederos, analizar transacciones y otras operaciones que queramos hacer en Bitcoin wallet.
Limitaciones de escribir programas usando JSON-RPC
El principal inconveniente de realizar un programa que utilice un wallet de Bitcoin para controlar dicho monedero, es que a veces suele ser ineficiente. Usando JSON-RPC podemos escribir un programa en JavaScript rápidamente, pero pueden existir problemas utilizando esta API.
Polling Vs Pushing
Un problema es que este programa usa “polling” para detectar cuando el dinero llega. “Polling” constantemente chequea el estado de “Bitcoin Core” preguntando a este software cada 5 segundos. Si necesitamos hacer una aplicación con alto rendimiento sería mejor usar “pushing”. “Pushing” implica que nuestra aplicación estaría esperando y sería notificada cuando el dinero llegue. Sin embargo, habilitar “pushing” es bastante difícil en “Bitcoin Core”.
Forks
Otro problema con nuestro programa es que la cadena de bloques de Bitcoin ya que a veces puede tener una bifurcación (forks), y pueden existir transacciones que dejen de estar confirmadas y, por lo tanto, obtendremos un balance erróneo. Este escenario es raro que ocurra, pero si estamos creando una aplicación que maneja cantidades elevadas de dinero este tipo de comportamientos hay que tenerlos en cuenta.
La solución sería usar client.listTransactions (en vez de client.getBalance), revisando todas las transacciones para determinar si implican envío de dinero a nuestro monedero en los últimos 5 segundos.
Capacidad de cómputo
Por último, “Bitcoin Core” necesita para funcionar la cadena de bloques entera y gran capacidad de cómputo, y nuestro programa no necesitaría esta alta capacidad de procesamiento.
Para evitar todo esto la solución es escribir programas que se ejecuten directamente sobre la red de Bitcoin. Avanzaremos más en estos problemas en próximos posts.