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?
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 top
comando). bitcoinj
tiene dos formas de verificar firmas, ya sea usando código nativo basado en la secp256k1
biblioteca o usando código java basado en la spongycastle
biblioteca. 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 secp256k1
biblioteca, debe configurar la variable LD_LIBRARY_PATH
de entorno en una ruta donde libsecp256k1.so
se 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.so
en 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-jni
opció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 .libs
directorio. 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_PATH
variable de entorno sea configurado correctamente en el directorio en el que está presente (o un enlace simbólico).
ultimocanal
pieter wuille