Problema con nodo completo

Encontré un problema serio con el nodo completo de bitcoinj. Empecé a descargar blockchain hace dos días con bitcoin-qt y hoy está completo. Con bitcoinj comencé a descargar blockchain hace aproximadamente 4 meses y ahora todavía lo está descargando. Descubrí que es un problema con la velocidad de descarga debido a esta información:

[PeerGroup Thread] INFO org.bitcoinj.core.PeerGroup - 0 blocks/sec, 0 tx/sec, 0 pre-filtered tx/sec, avg/last 2.81/0.00 kilobytes per sec (stall threshold <1.56 KB/sec for 10 seconds)
[PeerGroup Thread] INFO org.bitcoinj.core.PeerGroup - 0 blocks/sec, 0 tx/sec, 0 pre-filtered tx/sec, avg/last 2.50/0.00 kilobytes per sec (stall threshold <1.56 KB/sec for 10 seconds)
[PeerGroup Thread] INFO org.bitcoinj.core.PeerGroup - 0 blocks/sec, 0 tx/sec, 0 pre-filtered tx/sec, avg/last 2.19/0.00 kilobytes per sec (stall threshold <1.56 KB/sec for 10 seconds)
[PeerGroup Thread] INFO org.bitcoinj.core.PeerGroup - 0 blocks/sec, 0 tx/sec, 0 pre-filtered tx/sec, avg/last 1.88/0.00 kilobytes per sec (stall threshold <1.56 KB/sec for 10 seconds)
[PeerGroup Thread] INFO org.bitcoinj.core.PeerGroup - 0 blocks/sec, 0 tx/sec, 0 pre-filtered tx/sec, avg/last 1.56/0.00 kilobytes per sec (stall threshold <1.56 KB/sec for 10 seconds)
[PeerGroup Thread] INFO org.bitcoinj.core.PeerGroup - 0 blocks/sec, 0 tx/sec, 0 pre-filtered tx/sec, avg/last 1.25/0.00 kilobytes per sec (stall threshold <1.56 KB/sec for 10 seconds)
[PeerGroup Thread] WARN org.bitcoinj.core.PeerGroup - Chain download stalled: received 1.25 KB/sec for 10 seconds, require average of 1.56 KB/sec, disconnecting [127.0.0.1]:8333

Incluso cuando mi nodo está conectado solo con loclahost bitcoin-qt, se tarda entre 5 y 7 minutos en descargar un bloque (también revisé los registros de bitcoin-qt y, según las estadísticas, se envió 1 MB a mi nodo bitcoinj). Después de esto, el par de descarga se cierra y bitcoinj busca un nuevo par de descarga. También hay un problema con esto:

[Script verification] INFO org.bitcoin.Secp256k1Context - java.lang.UnsatisfiedLinkError: no secp256k1 in java.library.path

¿Es un problema grave o debo olvidarme de esta información?

No conozco muchos detalles de bitcoinj, pero ¿está utilizando la función de enlace blanco de bitcoin-core? bitcoinj puede estar siendo prohibido por DoS; conectarse al puerto whitebind evitará eso.
¿Para qué necesita la funcionalidad de nodo completo? La función de validación completa de bitfoinj estaba incompleta en el momento en que se escribió, y AFAIK no se ha mantenido durante varios años.

Respuestas (1)

Según mi experiencia, el proceso de sincronización de la cadena de bloques está vinculado a la CPU, no a la E/S (puede verificar esto en Linux ejecutando el topcomando). bitcoinjtiene dos formas de verificar firmas, ya sea usando código nativo basado en la secp256k1biblioteca o usando código java basado en la spongycastlebiblioteca. Su último mensaje de error indica que no está utilizando secp256k1, lo que probablemente sea una fuente de degradación del rendimiento y una causa del proceso de sincronización lento.

Para que java use la secp256k1biblioteca, debe configurar la variable LD_LIBRARY_PATHde entorno en una ruta donde libsecp256k1.sose encuentra el archivo (estoy en Debian, este archivo puede tener diferentes nombres en varios sistemas). Por ejemplo, podrías usar el comando:

$ env LD_LIBRARY_PATH=<path-to-directory> java -cp <classpath> MyJavaClass

Sin embargo, incluso si ya tiene la biblioteca libsecp256k1.soen su sistema (porque instaló alguna otra pieza de software que se basa en ella), el comando anterior no funcionará a menos que la biblioteca se haya creado con la --enable-jniopción para habilitar la interfaz de Java. con eso.

Para construir un Java habilitado libsecp256k1.so, puede hacer lo siguiente:

$ git clone https://github.com/bitcoin-core/secp256k1
$ cd secp256k1
$ ./autogen.sh
$ ./configure --enable-jni \
              --enable-module-ecdh \
              --enable-experimental
$ make
$ make check

El archivo de la biblioteca se ubicará en el .libsdirectorio. Puede decidir sobrescribir su archivo de sistema existente con esta nueva versión (pero corre el riesgo de estropear algo), o simplemente puede colocar este archivo en cualquier lugar que desee (o un enlace simbólico) y asegurarse de que la LD_LIBRARY_PATHvariable de entorno sea configurado correctamente en el directorio en el que está presente (o un enlace simbólico).