MacOS
Bitcoin Core
Dependencias
Instalar dependencias Python 3.12.3
, Homebrew
y Xcode
.
Las versiones superiores de Python no me funcionaron. Me causaron errores mas adelante con Lightning Network.
Otras dependencias:
brew install autoconf automake libtool gnu-sed gettext libsodium protobuf
export PATH="/usr/local/opt:$PATH"
Dependiencias de Python:
pip install --upgrade pip
pip install poetry
pip install --user pyln-client websockets
Si no tenemos SQLite hay que instalarlo:
brew install sqlite
export LDFLAGS="-L/usr/local/opt/sqlite/lib"
export CPPFLAGS="-I/usr/local/opt/sqlite/include"
Para las Macs con Apple Silicon
hay que asegurarse de que los paths de las librerías son correctos tratándose de Homebrew:
export CPATH=/opt/homebrew/include
export LIBRARY_PATH=/opt/homebrew/lib
Instalación de Bitcoin Core
La manera más sencilla es descargarnos Bitcoin Core de bitcoincore.org, lo descomprimimos y lo arrastramos a nuestra carpeta de aplicaciones.
También existe la opción de compilar Bitcoin Core desde el código fuente.
Para poder correrlo, ademas de abrirlo desde aplicaciones hay a que otorgarle permisos en System Settings
> Privacy & Security
. Nos movemos hasta abajo y hay que darle al botón Open Anyway
.
En la configuración inicial elegimos el directorio por defecto junto con la opcion de 1 GB
.
Bitcoin Core va syncronizar y a descargar toda la blockchain, y eso va a tardar muchas horas dependiendo de tu equipo y tu conexión a internet.
Sincronizar el todo el blockchain podria tardar muchas horas o incluso días.
En esta guía no vamos a sincronizar todo el blockchain, vamos a usar un Prune Node
, o nodo podado y vamos a utilizar la red regtest
.
Abrimos la app de Bitcoin Core y nos vamos a las preferencias de la aplicación. En la prestaña de main
vamos a abrir el archivo de configuración de bitcoin core en el boton que dice Open Configuration File
y agregamos lo siguiente:
regtest=1
[main]
prune=550
[regtest]
rcpport=18443
rpcuser=foo
rpcpassword=bar
Reiniciamos la aplicación de Bitcoin Core y esperamos a que se sincronice.
Esto va a reducir significativamente el tiempo de sincronización asi como el espacio en disco que necesitamos.
Despues de sincronizar la blockchain, cerramos la aplicación gráfica de Bitcoin Core, necesitamos correr bitcoin core en la terminal, para ello tenemos que instalarlo desde homebrew:
brew install bitcoin
Hombrew nos va a instalar bitcoind
y bitcoin-cli
.
Ejecución de Bitcoin para Desarrollo
Vamos a abrir dos ventanas o pestañas de terminal:
- En la primera terminal ejecutamos
bitcoind
el cual va a correr el nodo de bitcoin y va sincronizar el blockchain (si no sincronizamos antes).
bitcoind
- En la segunda terminal ejecutamos
bitcoin-cli
donde nos va a mostrar la info del nodo.
bitcoin-cli getblockchaininfo
Si todo sale bien deberiamos ver algo como esto:
{
"chain": "main",
"blocks": 1,
"headers": 1,
"bestblockhash": "0000000000000000000000000000000000000000000000000000000000000000",
"difficulty": 1,
"mediantime": 0,
"verificationprogress": 1,
"initialblockdownload": true,
"chainwork": "0000000000000000000000000000000000000000000000000000000000000000",
"size_on_disk": 0,
"pruned": true,
"pruneheight": 0,
"automatic_pruning": true,
"prune_target_size": 0,
"softforks": [],
"warnings": ""
}
Toda petición realizada con bitcoin-cli
nos responderá en formato JSON.
Si en tu caso la aplicación que quieres desarrollar es solamente para Bitcoin, sin tocar la Lightning Network, puedes saltarte el resto de la guía. Y tus siguientes pasos seran terminar de sincronizar la blockchain con bitcoind
y luego seguir usando bitcoin-cli
.
Instalación de Lightning
Vamos a descargar el repositorio:
git clone https://github.com/ElementsProject/lightning.git
cd lightning
Compilamos e instalamos lightning:
poetry install
./configure
poetry run make
En mi caso como uso un version manager ASDF tengo que especificar el path de poetry en mi archivo .zhrc.
Necesitamos correr bitcoind
, lightningd
y lightning-cli
en segundo plano con la flag --regtest
:
bitcoind &
./lightningd/lightningd --regtest &
./cli/lightning-cli --regtest help
Corremos la testnet de lighning (en realidad regtest, pero eso lo explicaré en otra guía):
. contrib/startup_regtest.sh
El comando anterior es un script que va a correr bitcoind
, bitcion-cli
, lightningd
y lightning-cli
. Y nos va a dar la siguiente salida con unos comandos básicos.
Useful commands:
start_ln 3: start three nodes, l1, l2, l3
connect 1 2: connect l1 and l2
fund_nodes: connect all nodes with channels, in a row
stop_ln: shutdown
destroy_ln: remove ln directories
El comando start_ln
creará un par de nodos en la red lightning (l1 y l2).
start_ln
Tambien nos dará una lista de comandos para interactuar con cada nodo:
Bitcoin Core starting
awaiting bitcoind...
Loading "default" bitcoind wallet.
[1] 10459
[2] 10463
Commands:
l1-cli, l1-log,
l2-cli, l2-log,
bt-cli, stop_ln, fund_nodes
timed out parsing log /tmp/l1/log
Vamos a obtener la información de uno de los nodos (l1).
l1-cli getinfo
Toda petición realizada en lightning nos responderá en formato JSON.
{
"id": "02d44e9a844e84ab76d412601c8e648ce039b8266874ddfe5b854fb6723096ea06",
"alias": "SLICKERROUTE-v24.11-91-g9e29bde",
"color": "02d44e",
"num_peers": 0,
"num_pending_channels": 0,
"num_active_channels": 0,
"num_inactive_channels": 0,
"address": [],
"binding": [
{
"type": "ipv4",
"address": "127.0.0.1",
"port": 7171
}
],
"version": "v24.11-91-g9e29bde",
"blockheight": 109,
"network": "regtest",
"fees_collected_msat": 0,
"lightning-dir": "/tmp/l1/regtest",
"our_features": {
"init": "8008a0882a8a59a1",
"node": "8088a0882a8a59a1",
"channel": "",
"invoice": "02000002024100"
}
}
Ahora vamos a agregarle fondos (unos cuantos satoshis) a los nodos:
fund_nodes
Genial!!
Obtenemos la información de los fondos del nodo l1
:
l1-cli listfunds
La propiedad amount_msat
es el monto en satoshis.
{
"outputs": [
{
"txid": "3383b42043c96d072f1a22f11ea1e4039bb93176f13d397178a6eb13cb7113e2",
"output": 1,
"amount_msat": 98999834000,
"scriptpubkey": "51200e98fba542bc6fda8cb83ae930cebd6f6957f3cb5d2eb49e47a6d0f612473efa",
"address": "bcrt1pp6v0hf2zh3ha4r9c8t5npn4ada540u7tt5htf8j85mg0vyj88maq9zy237",
"status": "confirmed",
"blockheight": 111,
"reserved": false
}
],
"channels": [
{
"peer_id": "02fed4dea6a6bc7dcc8d7bb4c88aa452fc4cd3878949851b4c0c23e71eebfc751f",
"connected": true,
"state": "CHANNELD_NORMAL",
"channel_id": "8274abbaeb547055d57f07337965eadea778c7e0344dd6d1b55257746cd85288",
"short_channel_id": "111x1x0",
"our_amount_msat": 1000000000,
"amount_msat": 1100000000,
"funding_txid": "3383b42043c96d072f1a22f11ea1e4039bb93176f13d397178a6eb13cb7113e2",
"funding_output": 0
}
]
}
¡Felicidades!! Ahora podemos construir aplicaciones sobre Bitcoin y Lightning Network. ...bueno, mas o menos. Por lo menos podemos comenzar a experimentar con ello.