
En este articulo quiero dar una pequeña introducción al desarrollo de aplicaciones del mundo bitcoin, vamos a desarrollar una pequeña billetera con una interfaz amigable.
¿Que es bitcoinj?
bitcoinj es una biblioteca para trabajar con el protocolo de Bitcoin. Se puede mantener una cartera, enviar / recibir transacciones sin necesidad de una copia local de Bitcoin Core y tiene muchas otras características avanzadas. Está implementado en Java, pero se puede utilizar desde cualquier lenguaje compatible JVM: ejemplos en Python y JavaScript están incluidos.
¿Quienes usan esta bibloteca?
bitcoinj es un proyecto Open Source con bajo la licencia «Apache licensed» para más información esta es la pagina oficial https://bitcoinj.github.io/
Quiero mostrar el ejemplo que viene dentro de la librería de bitcoinj, esta tiene su documentación oficial pero en ingles por eso lo he querido mostrar en español.
¿Que necesitamos?
- Sistema Operativo: Linux Debian 7 o superior, si no tienes dinero para comprar una MacBook y usar OS X. Si usas Windows te recomiendo que uses Linux es libre y gratuito!
- Java 8: Yo estoy usando JDK8u65, descargue la versión tar.gz de aquí.
- Java FX: Yo estoy usando la versión 2.0, descargue la versión tar.gz de aquí.
- Intellij IDEA community: Vamos a usar este IDE, puedes descargarlo de aquí.
- bitcoinj: Lo puedes descargar desde github dentro de sus fuentes esta el ejemplo.
No voy a explicar la instalación estas versiones se descomprimen y están lista para usarse.
Ahora si comenzamos!
bitcoinj viene trae en su código fuente una aplicación básica GUI de cartera bitcoin. Está destinado a ser copiado y usado como base para cualquier aplicación que desea enviar y recibir dinero. Por ejemplo, si usted quiere hacer un juego de cartas que te permiten jugar con bitcoins reales, este sería un buen lugar para empezar. En mí caso voy a comenzar el desarrollo de un core basado en un API Restful para mi aplicación de predimaniabits, la cual estaré documentado en mi blog y publicando en github.
Vamos importar el ejemplo:
Es muy sencillo seguimos los pasos que te muestro a continuación:
Paso 1: Al abrir el IDE por primera vez seleccionamos «Import Project», si no es la primera vez que abres el IDE enhorabuena por usar Intellij IDEA antes 😀
Paso 2: Buscamos los fuentes que nos descargamos anteriormente la carpeta llamada wallettemplate

Paso 4: Marcamos donde dice import project maven automatically

Paso 5: Seleccionamos el profile

Paso 6: Aquí damos siguiente, este es el proyecto que seleccionamos

Paso 7: Seleccionamos el sdk 1.8

Paso 8: Por ahora vamos a dejar el proyecto con su nombre inicial.
Ahora vamos a renombrar el proyecto:
Hacemos clic derecho en el modulo de nuestro proyecto y seleccionamos refactor->rename o ejecutamos el atajo de teclado Mayuscula+F6.
Lo cambiamos el nombre a simplewallet
Archivo Main.java
Vamos a editar el archivo Main.java
Linea 31: Cambiamos el nombre de nuestra aplicación:
public static String APP_NAME = "WalletTemplate";
por
public static String APP_NAME = "SimpleWallet";
Linea 33: Muy importante cambiar al ambiente de prueba!
public static NetworkParameters params = MainNetParams.get();
por
public static NetworkParameters params = TestNet3Params.get();
Ahora vamos a crear un ListView para que podamos ver mejor las transacciones de nuestro monedero. Para esto necesitamos abrir el main.fxml, si te da el siguiente error solo debes configurar el path del JavaFx que descargamos.
Archivo main.fxml
Eliminamos el Label que viene predeterimando
Seleccionamos en Controls el elemento ListView y lo movemos hasta el StackPane
Modificamos el nombre del ListView, en Code: ListView donde dice fx:id a transactionsList
Modificamos la opacidad a 0.65 para que se siga viendo el fondo de la aplicación.
Archivo BitcoinUIModel.java
En la linea 24 añadimmos lo siguiente:
private ObservableList<Transaction> transactions = FXCollections.observableArrayList();
Ahora en la linea 44 dentro del metodo update agregamos al final lo siguiente:
private void update(Wallet wallet) {
balance.set(wallet.getBalance());
address.set(wallet.currentReceiveAddress());
transactions.setAll(wallet.getTransactionsByTime());
}
Luego al final creamos el metodo getter
public ObservableList<Transaction> getTransactions() {
return transactions;
}
Archivo MainController.java
Nos vamos a la linea 37 y agregamos lo siguiente:
public ListView<Transaction> transactionsList;
Agregamos al final del metodo onBitcoinSetup()
Bindings.bindContent(transactionsList.getItems(), model.getTransactions());
transactionsList.setCellFactory(new Callback<ListView<Transaction>, ListCell<Transaction>>() {
@Override
public ListCell<Transaction> call(ListView<Transaction> param) {
return new TextFieldListCell<Transaction>(new StringConverter<Transaction>() {
@Override
public String toString(Transaction tx) {
Coin value = tx.getValue(Main.bitcoin.wallet());
if(value.isPositive()) {
return "Incoming payment of "+MonetaryFormat.BTC.format(value);
}
else if (value.isNegative()) {
Address address = tx.getOutput(0).getAddressFromP2PKHScript(Main.params);
return "Outbound payment to "+address;
}
return "Payment with id "+tx.getHash();
}
@Override
public Transaction fromString(String string) {
return null;
}
});
}
});
Modificamos el metodo setWallet
public void setWallet(Wallet wallet) {
wallet.addEventListener(new AbstractWalletEventListener() {
@Override
public void onWalletChanged(Wallet wallet) {
super.onWalletChanged(wallet);
update(wallet);
}
}, Platform::runLater);
update(wallet);
}
Eliminamos donde desde la coma hasta el runLater «, Platform::runLater»
public void setWallet(Wallet wallet) {
wallet.addEventListener(new AbstractWalletEventListener() {
@Override
public void onWalletChanged(Wallet wallet) {
super.onWalletChanged(wallet);
update(wallet);
}
});
update(wallet);
}
Ahora ejecutamos la aplicación Run -> Run Main
Al terminar de ejecutar nos mostrara nuestra dirección de prueba con la cual podemos ir a un grifo de testnet y sacar unos bitcoins para tener en nuestro monedero de prueba algo de saldo :D. (Cuando terminemos nuestras pruebas lo recomendado es devolver los bitcoins para que otras personas puedan usarlos)
Nos vamos a setting donde podremos ver el Mnemonic de nuestra billetera.
Primer vamos a asignar una contraseña para proteger nuestros bitcoin.
Ahora nos pedirá esta contraseña cuando queramos retirar.
Ahora voy a sacar unos satoshis de los grifos y voy a ver como llegan a mi billetera 😀
Haskon Faucet: nos dirigimos al siguiente URL http://faucet.xeno-genesis.com/ para entrar al grifo.
Este me dio 10000 satoshis, ahora voy a otro grifo que es mas bondadoso CoinFaucet en el siguiente enlace https://testnet.coinfaucet.eu/en/ 😀
Como podemos ver este me ha dado una modesta cantidad de 2.56BTC
Ahora si podemos devolver los bits seleccionando la dirección de donación de los grifos.
Este ejemplo no debe usarse para guardar tus bits ya que no esta completamente desarrollado, lo vamos a usar como caso de estudio para desarrollar cosas mas complejas.


















Un saludo cordial. Amigo José Luis, esperando que todo lo tuyo se encuentre bien. Estaré pendiente de la información que pública en este Blog. Información de gran intéres. saludo
Sr Milano como esta! gracias por comentar en mi blog 😀 me encuentro bien como ve en lo mio que es la programación jejeje…. muchos saludos amigo
Hi Amigo,
Within three days your faucet have worked exactly at the point to point in seconds, but now it still came back in the past!
Your yeyo faucet behind from the time approximately 9 hours!
Contact with your admin and fix it!
Thanks.
Hello,
Thank you for reporting the problem let me review it, we are using api FaucetBox and this is the time limiting input
Hi amigo,
So that, if you’re using the API FaucetBox? FauketBoks operating normally. I’m talking about your website, Senior developer!
What means the time limiting input? Why only at you these errors occur?
Between 12 and 24 hours, a great difference!
720 minutes it’s not 1440 minutes.
Fix it.
Buenas noches Jose luis necesito una gran ayuda de usted si esta de su parte claro.
Estoy en proceso para crear un blog. Pero necesito una ayuda en algo especifico, espero que me pueda ayudar
Cesar te recomiendo que uses blogger que es fácil de usar y no tienes que saber programación.
Saludos