Last active
December 16, 2021 18:02
-
-
Save 2624789/621eaaa3adafab60e6704f105800b787 to your computer and use it in GitHub Desktop.
Bitcoin test example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
¿Qué es Bitcoin? | |
---------------- | |
Bitcoin es una modena digital experimental que permite hacer pagos instantáneos | |
a cualquier persona, en cualquier parte del mundo. Bitcoin utiliza tecnología | |
p2p para operar sin una autoridad central: el procesamiento de transacciones y | |
la emisión de dinero se llevan a cabo en la red de forma colectiva. Bitcoin Core | |
es el nombre del software público que permite el uso de esta moneda. | |
Para más información lea el documento original de Bitcoin https://bitcoinwhitepaper.co/. | |
Proceso de Desarrollo | |
--------------------- | |
La rama master no garantiza completa estabilidad. | |
Se usan tags para indicar versiones publicadas oficiales y estables. | |
Compilar Bitcoin Core | |
--------------------- | |
OS: Ubuntu 20.04.3 LTS | |
Actualizar equipo y clonar repositorio | |
$ sudo apt update | |
$ git clone [email protected]:2624789/bitcoin.git | |
$ cd bitcoin | |
Ubicarse en la versión estable más reciente | |
$ git fetch --all --tags --prune | |
$ git checkout tags/v22.0 -b branch-v22.0 | |
Instalar dependencias | |
$ sudo apt install libevent-dev libboost-dev libboost-system-dev libboost-filesystem-dev libboost-test-dev | |
$ ./contrib/install_db4.sh `pwd` | |
Compilar | |
$ ./autogen.sh | |
$ export BDB_PREFIX='/home/user/bitcoin/db4' | |
$ ./configure BDB_LIBS="-L${BDB_PREFIX}/lib -ldb_cxx-4.8" BDB_CFLAGS="-I${BDB_PREFIX}/include" | |
$ sudo make install | |
Correr tests | |
------------ | |
Correr tests unitarios | |
$ make check | |
Correr tests funcionales | |
$ test/functional/test_runner.py --extended | |
Correr test funcional de ejemplo | |
$ test/functional/example_test.py | |
Actualizar test funcional de ejemplo para verificar que el nodo 1 mine otro bloque y | |
se lo envíe al nodo 2. | |
example_test.py | |
--------------- | |
Clases importantes: | |
* **BaseNode**: Contiene callbacks que se ejecutan cuando se recibe un | |
mensaje P2P. Almacena un diccionario con todos los bloques recibidos. | |
* **BitcoinTestFramework**: Clase base para los tests. La configuración de un | |
test se puede modificar usando los métodos `add_options()`, `setup_chain()`, | |
`setup_network()` y `setup_nodes()`. Permite conectar nodos con | |
`connect_nodes`. | |
Configuración del Test: | |
Inicia la cadena desde el bloque génesis, y tiene 3 nodos. | |
self.setup_clean_chain = True | |
self.num_nodes = 3 | |
Requiere una billetera para poder ejecutarse | |
self.skip_if_no_wallet() | |
Aunque hay 3 nodos, inicialmente solo están conectados entre sí los nodos 0 y | |
1, y solo estos dos nodos se sincronizan. | |
self.connect_nodes(0, 1) | |
self.sync_all(self.nodes[0:2]) | |
Test | |
Se inicia estableciendo una conexión P2P con el nodo 0 | |
peer_messaging = self.nodes[0].add_p2p_connection(BaseNode()) | |
Luego se genera un bloque en el nodo 0 para iniciar el proceso de descarga | |
inicial de la cadena, donde se sincronizan los nodos 0 y 1. | |
blocks = [int(self.nodes[0].generate(nblocks=1)[0], 16)] | |
self.sync_all(self.nodes[0:2]) | |
En la variable `blocks` se almacena los hashes de los bloques creados durante | |
el test. | |
Luego se crean otros 10 bloques y se envían a la red usando el nodo 0 | |
for _ in range(10): | |
block = create_block(self.tip, create_coinbase(height+1), self.block_time) | |
... | |
peer_messaging.send_message(block_message) | |
Después se espera a que el nodo 1 se haya sincronizado con los nuevos bloques. | |
Una vez sincronizado el nodo 1, se conecta con el nodo 2, que estaba aislado | |
hasta este momento. Luego de conectarse se sincronizan todos los nodos. | |
self.nodes[1].waitforblockheight(11) | |
self.connect_nodes(1, 2) | |
self.sync_all() | |
Finalmente, se hace una conexión P2P al nodo 2 para verificar los bloques que | |
recibió | |
self.nodes[0].disconnect_p2ps() | |
peer_receiving = self.nodes[2].add_p2p_connection(BaseNode()) | |
Se espera a que se hayan recibido todos los bloques que se enviaron en el test, | |
y luego se verifica que cada uno llegó solo una vez. | |
peer_receiving.wait_until(lambda: sorted(blocks) == sorted(list(peer_receiving.block_receive_map.keys())), timeout=5) | |
for block in peer_receiving.block_receive_map.values(): | |
assert_equal(block, 1) | |
Modificación: | |
Para hacer que el nodo 1 mine otro bloque. Utilizamos el método generate luego | |
de que el nodo 1 se ha sincronizado con los 10 bloques creados por el nodo 0. | |
another_block = int(self.nodes[1].generate(nblocks=1)[0], 16) | |
blocks.append(another_block) | |
No es necesario enviar el nuevo bloque de forma explícita porque a continuación | |
los nodos se sincronizan | |
self.sync_all() | |
Finalmente, se agrega una verificación para comprobar que específicamente el | |
bloque generado por el nodo 1 fue recibido por el nodo 2. | |
with p2p_lock: | |
assert_equal(another_block in peer_receiving.block_receive_map, True) | |
Problemas | |
--------- | |
configure: error: libdb_cxx headers missing, Bitcoin Core requires this library for BDB wallet support (--without-bdb to disable BDB wallet support) | |
The newer libdb should work on most coin daemons, the issue you might find is that the database files (wallet.dat in particular) isn't compatible with all other systems if they're built on an older libdb. | |
This will break binary wallet compatibility with the distributed executables, which are based on BerkeleyDB 4.8. | |
Solución: instalar dependencias | |
cannot create regular file '/usr/local/lib/libbitcoinconsensus.so.0.0.0': Permission denied | |
Solución: make with sudo |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment