Durant el meu període inicial de recerca a la UAB, vaig començar a desenvolupar una rèplica de la xarxa principal de Bitcoin real. Tot i que això pot semblar inusual, sobretot tenint en compte l’existència de xarxes testnet i regtest, hi ha una raó clara que ho explica.

Aquesta iniciativa va sorgir de la necessitat de l’equip d’identificar les empremtes digitals de transacció úniques deixades per diversos programaris de cartera i d’agrupar adreces basades en les eines utilitzades per generar-les. Com que moltes carteres ofereixen suport limitat o nul per a entorns de testnet o regtest, aquesta situació ens va portar a crear un entorn complet, semblant a una mainnet.

La xarxa principal implementada es construeix directament a partir del codi font original de Bitcoin Core, però funciona completament aïllada de la xarxa real de Bitcoin.

  • Quins son els avantatges?
    • Control total sobre la cadena
      • Permet operacions en un entorn de “naturalesa distribuïda” sense els reptes de ser realment distribuït.
      • Admet proves de transaccions a gran escala
    • Fàcil de desplegar, ja que cada node s’executa dins d’un contenidor Docker
    • Proves de programari i maquinari compatibles només amb la xarxa principal
    • Transaccions a cost zero
  • Quins són els requisits?
    • Segwit i Taproot s’han d’habilitar des del bloc de gènesi, ja que les seves altures d’activació afecten la validació de les transaccions. Si una adreça Segwit o Taproot apareix abans de la seva alçada esperada, el node la consideraria no vàlida.
    • La xarxa ha d’estar completament aïllada d’Internet per evitar la sincronització amb la cadena de blocs de Bitcoin original.
  • Ariquitectura
    • Podem definir tres tipus de nodes crítics:
      • Node complet: Assegura el consens a la cadena.
      • Node encaminador: Gestiona les connexions entre peers.
      • Node miner: Mina un bloc quan s’envia una transacció a la xarxa.
  • Cada node està contingut en una imatge Docker personalitzada basada en Ubuntu amb Bitcoin Core 24.0.1 a l’interior. La imatge té una mida aproximada de 5,11 GB. Aquests contenidors Docker es generen mitjançant un fitxer Dockerfile, que descarrega els requisits mínims per executar Bitcoin Core. En termes generals, el fitxer Dockerfile clona el codi font de Bitcoin, modifica un parell de fitxers i el compila. A continuació, copia el fitxer bitcoin.conf i els scripts de mineria, i finalment exposa el port 8333 per al protocol Bitcoin.
  • Els dos fitxers modificats són: – chainparams.cpp: Modificat per impormentar SegWit i Taproot des del block gènesi. – mining.cpp: Modificat per eliminar el el block de validació inicial, permetent que la plantilla de mineria es rebi fins i tot quan no està completament sincronitzada.
  • Es crea un punt d’entrada per garantir que el servei s’executi només amb els permisos mínims i permet que Docker s’iniciï només si el servei bitcoin està actiu.
  • Configurant bitcoin.conf
    • bitcoin.conf és el fitxer de configuració que utilitza el daemon Bitcoin Core per executar el node amb paràmetres específics.
    • Aleshores, com hem de configurar el nostre fitxer bitcoin.conf per aconseguir aquesta prova de configuració? De fet, és força senzill: només cal assegurar-se de la configuració següent:
      • rpcallowip: Limitar l’accés a la xarxa Docker (o, si voleu connectar-vos amb una IP externa, podeu especificar aquesta IP).
      • paytxfee: Since the blockchain doesn’t contain any data, the fee estimation algorithm may fail. We must set the fee manually, e.g., 0.0001 BTC.
      • minimumchainwork: Estableix-ho a 0, ja que aquesta nova xarxa principal encara no tindrà cap funció.
      • txindex: Establiu-ho a 1 per habilitar la indexació de cerques de transaccions (útil per a proves però no obligatori).
  • Pots jugar a generar el teu propi fitxer bitcoin.conf aquí 🙂
  • Xarxa
    • Cada contenidor de Docker es genera dins d’una xarxa Docker, cosa que limita les seves connexions i impedeix que es connecti a qualsevol cosa fora de la xarxa.. La connexió entre nodes s’estableix mitjançant la configuració addnode, que connecta cada node al node encaminador.
  • A més, hi ha diverses maneres d’interactuar amb aquesta xarxa, però sempre ha d’estar desconnectada dels companys de la Mainnet real. A la nostra configuració, hem definit un node aïllat en una xarxa separada i hem configurat els paràmetres per permetre connexions només entre el meu host i l’altre node de la xarxa externa.
  • Per descomptat, podeu connectar diversos moneders de programari a la cadena de blocs mitjançant crides RPC. Tanmateix, totes les connexions han de provenir d’un punt final on el nostre node permeti les crides RPC.
  • Minar
    • Pots minar de diverses maneres. Com que la dificultat està establerta a 1, no hauria de ser gaire difícil trobar un bloc amb un script de mineria decent. Pots trobar un exemple de script a GitHub, tot i que no recomanem utilitzar-lo, ja que no és gaire competitiu. Per això vam canviar a utilitzar un miner ASIC.
  • Complements
    • Igual que a la xarxa real de Bitcoin, sempre pots afegir serveis al teu node. En el nostre cas, necessitàvem una aixeta per obtenir bitcoins lliurement quan fos necessari i un explorador de blocs per fer un seguiment de les transaccions.v
    • Faucet
      • Per crear el faucet, vam implementar un servidor Node.js senzill que envia i rep informació d’un node.
      • Tot i que la imatge següent mostra dos nodes separats per gestionar monedes (un per a la mineria i un altre per al faucet), els podríem combinar perquè el faucet sempre tingués prou saldo per distribuir. Tot es va contenidoritzar a Docker per facilitar el desplegament.
  • Explorador de blocs
    • Si ho desitgeu, també podeu implementar un explorador de blocs. Hem implementat una versió Dockeritzada de Mempool Space localment per millorar la nostra capacitat d’explorar blocs i transaccions.
  • Com construir-ho
    • D’acord, la veritable diversió comença ara, com ho construïm i ho fem servir realment? Teniu una guia detallada al README de GitHub, però deixeu-me que us l’expliqui aquí 🙂
    • Requisits previs
      • Docker (v20.10 o major)
    • Instal·lació
      • Mètode 1: Baixeu la imatge del registre de contenidors de GitHub
        • Podeu obtenir directament la imatge de Docker precompilada i executar l’script de configuració sense crear la imatge des del codi font seguint aquests passos:
          • # Obtingueu la imatge del registre de contenidors de GitHub docker pull ghcr.io/niktowcode/mainnet_testbed:1.0 # Cloneu el repositori git clone https://github.com/NiktowCode/BTC-Labnet.git cd BTC-Labnet # Executeu l'script per configurar els contenidors de Docker (comentant el pas de compilació): ./start.sh
      • Mètode 2: Compilar des del codi font
        • Segueix aquests passos per crear la imatge des de l’origen:
          • Cloneu el repositori: git clone https://github.com/NiktowCode/BTC-Labnet.git cd BTC-Labnet # Executeu l'script per configurar els contenidors de Docker: ./start.sh
          • Després de l’execució, es crearan tres nodes Bitcoin interconnectats (bc-node1, bc-node2 i bc-node3).
    • Procés de configuració
      • Creació d’una imatge de Docker personalitzada per a Bitcoin-Core
        • Modifica Bitcoin-Core: ajusta el codi Bitcoin-Core per habilitar SegWit i Taproot.
        • Crea un Dockerfile: utilitza el teu propi Dockerfile per crear la teva imatge Bitcoin-Core personalitzada.
        • Crea la imatge de Docker: Executeu l’ordre següent: docker build -t bitcoin .
      • Configuració de la xarxa Docker
        • Crea una xarxa de ponts Docker docker network create -d bridge bitcoin_network
      • Execució de nodes Bitcoin
        • Inicieu el vostre node Bitcoin: docker run -it -d –network bitcoin_network –name bc-node1 -p 8333:8333 -p 8332:8332 bitcoin -printtoconsole -txindex=1 -reindex
  • Com podeu veure, instal·lar-lo no és massa complicat. Tot i que la compilació compila Bitcoin Core, per la qual cosa pot trigar uns minuts, un cop fet… tindreu tot el poder per fer el que vulgueu amb el vostre clon de la cadena de blocs de Bitcoin.

Deixa un comentari