Ich synchronisiere einen neuen Knoten. Wie kann ich herausfinden, was der neueste Block ist, damit ich weiß, wie weit ich gehen muss?
Hängen Sie für Geth in einem anderen Terminal an die Geth-Konsole an, z. B. geth attach
. Auf diese Weise können Sie Ihren Synchronisierungsknoten ohne Neustart weiterlaufen lassen, und Sie werden keine verrauschten Protokolle sehen, wie Sie es tun würden, wenn Sie einfach "geth console" ohne andere Parameter ausführen würden.
Führen Sie in der Konsole auseth.syncing
> eth.syncing
{
currentBlock: 745600,
highestBlock: 889152,
startingBlock: 745553
}
Sie können dann sehen, wo Sie sich befinden (aktueller Block) und den Block, den Sie noch erreichen müssen (höchster Block). (Der Unterschied zwischen ihnen ist die Anzahl der verbleibenden Blöcke.)
Sie können eth.syncing
ein paar Mal laufen, um Ihren Fortschritt zu überprüfen, und es wird zurückgegeben, false
wenn Sie fertig sind. Sie können dann eth.blockNumber
einen Blockchain-Explorer verwenden und auch mit ihm vergleichen, wie andere Antworten hier erwähnen.
Zur Verdeutlichung web3.eth.isSyncing()
wird auch zurückgegeben, false
wenn die Synchronisierung noch nicht begonnen hat (oder gerade nicht läuft). Wenn dies der Fall ist, müssen Sie Ihr Netzwerk überprüfen, das Sie mit Peers verbinden: Warum hat mein Ethereum-Knoten keine Peers?
geth attach
dies nicht funktioniert, wenn Sie das --mine
Flag angegeben haben (für Testketten). Wenn Sie es also verwenden, sollten Sie wahrscheinlich auch ein Mining-Skript verwendengeth
Version 1.4.6 und eth.syncing
gibt nur true
oder zurück false
. Was ist die neue Version des eth.syncing
Befehls?web3.eth.isSyncing()
kehrt false
auch zurück, wenn die Synchronisierung noch nicht gestartet wurde (oder derzeit nicht ausgeführt wird). Man kann sich also nicht allein auf diese Funktion verlassen, um den Status des Ethereum-Clients zu ermitteln. Wie Sie bereits erwähnt haben, müssen Sie wahrscheinlich die Ergebnisse von web3.eth.getBlockNumber()
und einem Blockchain-Explorer in die Entscheidungsfindung integrieren.eth.blockNumber
gibt mir0
Wenn Sie Geth verwenden:
geth attach http://host
dann eingeben:
web3.eth.blockNumber
Es gibt Ihnen die Blocknummer als Ganzzahl, hier ist die Funktionsdokumentation . Wenn Sie stattdessen nach dem Block-Hash suchen, können Sie Folgendes verwenden:
web3.eth.getBlock(BLOCK_NUMBER).hash
also für den aktuellen block (atm) wird es sein:
web3.eth.getBlock(887893).hash
und für den letzten Block:
web3.eth.getBlock(web3.eth.blockNumber).hash
In der neuesten Version von web3 können Sie verwenden, getBlockNumber()
was ein Versprechen zurückgibt (danke @PaulRBerg für die Erwähnung).
blockNumber
es in umbenannt getBlockNumber
und gibt ein Versprechen zurück.Sie könnten einen Block-Explorer wie Etherchain verwenden .
Es gibt 2 nützliche Skripte in https://github.com/lyricalpolymath/Ethereum-Scripts
Wenn Geth ausgeführt wird, kopieren Sie diesen Code und fügen Sie ihn in ein Terminalfenster ein, um eine einfache Rückmeldung über den Fortschritt der Blockchain-Synchronisierung zu erhalten
geth --exec 'var s = eth.syncing; console.log("\n------------ GETH SYNCING PROGRESS\nprogress: " + (s.currentBlock/s.highestBlock*100)+ " %\nblocks left to parse: "+ (s.highestBlock-s.currentBlock) + "\ncurrent Block: " + s.currentBlock + " of " + s.highestBlock)' attach
Sie erhalten eine Ausgabe wie diese
------------ GETH SYNCING PROGRESS
progress: 81.9161292631709 %
blocks left to parse: 368837
current Block: 1670754 of 2039591
Laden Sie das Skript herunter und kopieren Sie diesen Code bei laufendem Geth und fügen Sie ihn in ein Terminalfenster ein, um eine einfache Rückmeldung über den Fortschritt der Blockchain-Synchronisierung zu erhalten
geth --exec "loadScript('GethSyncingProgress_2TimeEstimate.js')" attach
gibt Ihnen eine Ausgabe wie
------------ GETH SYNCING PROGRESS - Time estimate
progress: 83.83513931320763
Estimated Time left*: 7d :11h :4m :4s.3
Time it took to parse 10 blocks: 0d :0h :0m :19s.5
blocks left to parse: 330536
watch
, um einen Aktualisierungs-Feed zu erhalten:watch -n 10 "geth --exec 'var s = eth.syncing; console.log(\"\n------------ GETH SYNCING PROGRESS\nprogress: \" + (s.currentBlock/s.highestBlock*100)+ \" %\nblocks left to parse: \"+ (s.highestBlock-s.currentBlock) + \"\ncurrent Block: \" + s.currentBlock + \" of \" + s.highestBlock)' attach"
Die Ethereum-Brieftasche zeigt die neueste Blocknummer an. Die offizielle Statistik-Website von Ethereum zeigt es ebenfalls an. (Hinweis: Dies repräsentiert nicht alle Peers im Netzwerk.)
web3.eth.blockNumber
erhalten Sie die neueste Blockhöhe auf Ihrem Knoten. Beachten Sie, dass Sie dafür einen synchronisierten Knoten haben müssen. Wenn Sie die Blockchain noch herunterladen, wird diese Zahl kleiner sein.
Wenn Sie immer noch synchronisieren, können Sie eth.syncing eingeben und es wird gemeldet
Wenn eth.syncing falsch ist, verwenden Sie den von Sebastian erwähnten Befehl eth.blockNumber und vergleichen Sie ihn mit der gemeldeten Blockhöhe Ihres bevorzugten Online-Block-Explorers
syncing===false
nicht, dass geth synchron ist? Wenn Sie ein Beispiel für einen Online-Block-Explorer angeben und erfahren, wie Sie die gemeldete Blockhöhe daraus abrufen können, werde ich Ihre Antwort positiv bewertenweb3.eth.getBlock('latest').then(function(x){console.log(x.timestamp)});
Ich verwende den JSON RPC, um von einem anderen Computer aus zu überprüfen (Zugriff vorausgesetzt). Ersetzen Sie 0.0.0.0:8545 durch die RPC-Adresse und den Port des Computers, auf dem GETH mit RPC ausgeführt wird.
curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' 0.0.0.0:8545
kehrt zurück
{"jsonrpc":"2.0","id":69,"result":{"currentBlock":"0x767811","highestBlock":"0x767879","knownStates":"0x8ba1951","pulledStates":"0x8ba0752","startingBlock":"0x5a95a1"}}
Ich war genervt, weil es schon vor Beginn der Synchronisierung zurückkehrt (und es kehrt auch zurück eth.syncing
, nachdem die Synchronisierung beendet ist, also kann man das nicht sagen).false
false
Eine andere Vorgehensweise, wenn Sie die tatsächliche Blocknummer nicht benötigen: Sie können den Zeitstempel Ihres letzten synchronisierten Blocks mit der aktuellen Zeit vergleichen:
Date.now()/1000 - eth.getBlock('latest').timestamp
Wenn dieser Betrag größer als beispielsweise 2 Minuten ( 120
) ist, dann ist es sehr wahrscheinlich, dass Sie die letzten Blöcke nicht haben.
Farhad Ghanaatgar