Ich habe ein ernsthaftes Problem mit dem Fullnode von bitcoinj gefunden. Ich habe vor zwei Tagen mit Bitcoin-qt angefangen, Blockchain herunterzuladen, und heute ist es fertig. Mit bitcoinj habe ich vor etwa 4 Monaten angefangen, Blockchain herunterzuladen, und jetzt lädt es sie immer noch herunter. Ich habe aufgrund dieser Informationen herausgefunden, dass es sich um ein Problem mit der Downloadgeschwindigkeit handelt:
[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
Selbst wenn mein Knoten nur mit loclahost bitcoin-qt verbunden ist, dauert es etwa 5-7 Minuten, um einen Block herunterzuladen (ich habe auch bitcoin-qt-Protokolle überprüft und je nach Statistik wurde 1 MB an meinen bitcoinj-Knoten gesendet). Danach wird der Download-Peer geschlossen und bitcoinj sucht nach einem neuen Download-Peer. Auch hier gibt es ein Problem:
[Script verification] INFO org.bitcoin.Secp256k1Context - java.lang.UnsatisfiedLinkError: no secp256k1 in java.library.path
Handelt es sich um ein ernstes Problem oder sollte ich diese Informationen vergessen?
Aus meiner Erfahrung ist der Prozess der Synchronisierung der Blockchain CPU-gebunden, nicht IO-gebunden (Sie können dies unter Linux überprüfen, indem Sie den top
Befehl ausführen). bitcoinj
verfügt über zwei Möglichkeiten, Signaturen zu überprüfen, entweder mit nativem Code basierend auf der secp256k1
Bibliothek oder mit Java-Code basierend auf der spongycastle
Bibliothek. Ihre letzte Fehlermeldung weist darauf hin, dass Sie nicht verwenden, secp256k1
was höchstwahrscheinlich eine Quelle für Leistungseinbußen und eine Ursache für einen langsamen Synchronisierungsprozess ist.
Damit Java die secp256k1
Bibliothek verwenden kann, müssen Sie die Umgebungsvariable LD_LIBRARY_PATH
auf einen Pfad setzen, in dem sich die Datei libsecp256k1.so
befindet (ich verwende Debian, diese Datei kann auf verschiedenen Systemen unterschiedliche Namen haben). Sie könnten zum Beispiel den Befehl verwenden:
$ env LD_LIBRARY_PATH=<path-to-directory> java -cp <classpath> MyJavaClass
Aber selbst wenn Sie die Bibliothek bereits libsecp256k1.so
auf Ihrem System haben (weil Sie eine andere Software installiert haben, die darauf angewiesen ist), funktioniert der obige Befehl nicht, es sei denn, die Bibliothek wurde mit der --enable-jni
Option erstellt, Java für die Schnittstelle zu aktivieren damit.
Um ein Java-fähiges zu erstellen libsecp256k1.so
, können Sie wie folgt vorgehen:
$ git clone https://github.com/bitcoin-core/secp256k1
$ cd secp256k1
$ ./autogen.sh
$ ./configure --enable-jni \
--enable-module-ecdh \
--enable-experimental
$ make
$ make check
Die Bibliotheksdatei befindet sich dann im .libs
Verzeichnis. Sie können sich entscheiden, Ihre vorhandene Systemdatei mit dieser neuen Version zu überschreiben (aber Sie gehen das Risiko ein, etwas durcheinander zu bringen), oder Sie können diese Datei einfach an einer beliebigen Stelle ablegen (oder einen symbolischen Link darauf) und sicherstellen, dass die LD_LIBRARY_PATH
Umgebungsvariable ist richtig auf das Verzeichnis gesetzt, in dem es (oder ein symbolischer Link) vorhanden ist.
letzter Kanal
Pieter Wuille