Estoy sincronizando un nuevo nodo. ¿Cómo puedo saber cuál es el último bloque para saber cuánto me queda por recorrer?
Para Geth, en otra terminal, adjunte a la consola Geth, como geth attach
. Esto le permitirá mantener su nodo de sincronización en ejecución, sin reiniciar, y no verá los registros ruidosos como lo haría si simplemente ejecutara "geth console" sin otros parámetros.
En la consola, ejecutaeth.syncing
> eth.syncing
{
currentBlock: 745600,
highestBlock: 889152,
startingBlock: 745553
}
A continuación, puede ver dónde se encuentra (bloque actual) y el bloque al que todavía tiene que llegar (bloque más alto). (La diferencia entre ellos es el número de bloques que te quedan).
Puede ejecutar eth.syncing
varias veces para verificar su progreso, y regresará false
cuando haya terminado. Luego puede usar eth.blockNumber
y también comparar con un explorador de blockchain, como mencionan otras respuestas aquí.
Para mayor claridad web3.eth.isSyncing()
, también regresará false
cuando la sincronización aún no haya comenzado (o no se esté ejecutando actualmente). Si este es el caso, debe verificar que su red se esté conectando a pares: ¿Por qué mi nodo Ethereum no tiene pares?
geth attach
no funciona si tiene el --mine
indicador especificado (para cadenas de prueba), por lo que si lo usa, probablemente también debería usar un script de minería.geth
versión 1.4.6 y eth.syncing
solo devuelve true
o false
. ¿Cuál es la nueva versión del eth.syncing
comando?web3.eth.isSyncing()
volverá false
también cuando la sincronización aún no haya comenzado (o no se esté ejecutando actualmente). Por lo tanto, no se puede confiar únicamente en esta función para determinar el estado del cliente de Ethereum. Como mencionó, probablemente necesite combinar los resultados de web3.eth.getBlockNumber()
un explorador de blockchain en la toma de decisiones.eth.blockNumber
me da0
Si está utilizando Geth:
geth attach http://host
luego ingrese:
web3.eth.blockNumber
Le dará el número de bloque como un número entero, aquí está la documentación de la función . Si está buscando el hash de bloque, puede usar:
web3.eth.getBlock(BLOCK_NUMBER).hash
entonces para el bloque actual (atm) será:
web3.eth.getBlock(887893).hash
y para el último bloque:
web3.eth.getBlock(web3.eth.blockNumber).hash
En la última versión de web3, puede usar getBlockNumber()
which devuelve una promesa (gracias @PaulRBerg por mencionar eso)
blockNumber
se le ha cambiado el nombre getBlockNumber
y devuelve una promesa.Podría usar un explorador de bloques, como Etherchain .
hay 2 scripts útiles en https://github.com/lyricalpolymath/Ethereum-Scripts
con geth ejecutándose, copie y pegue este código en una ventana de terminal para tener una retroalimentación simple del progreso de sincronización de blockchain
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
obtendrás una salida como esta
------------ GETH SYNCING PROGRESS
progress: 81.9161292631709 %
blocks left to parse: 368837
current Block: 1670754 of 2039591
descargue el script y con geth ejecutándose, copie y pegue este código en una ventana de terminal para obtener una retroalimentación simple del progreso de sincronización de blockchain
geth --exec "loadScript('GethSyncingProgress_2TimeEstimate.js')" attach
le dará una salida como
------------ 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
para obtener un feed de actualización: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"
La billetera Ethereum mostrará el último número de bloque. El sitio web oficial de estadísticas de Ethereum también lo muestra. (Nota: esto no representa a todos los pares en la red).
web3.eth.blockNumber
obtiene la última altura de bloque en su nodo. Tenga en cuenta que debe tener un nodo sincronizado para eso. Cuando aún esté descargando la cadena de bloques, este número será menor.
Si aún está sincronizando, puede escribir eth.syncing e informará
Si eth.syncing es falso, utilice el comando eth.blockNumber mencionado por Sebastian y compárelo con la altura de bloque informada de su explorador de bloques en línea favorito.
syncing===false
, ¿no garantiza que geth esté sincronizado? si proporciona un ejemplo de un explorador de bloques en línea y cómo recuperar la altura del bloque informado, votaré su respuestaweb3.eth.getBlock('último').then(function(x){console.log(x.timestamp)});
Uso JSON RPC para verificar desde otra máquina (suponiendo acceso). Reemplace 0.0.0.0:8545 con la dirección RPC y el puerto de la máquina que ejecuta GETH con RPC.
curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' 0.0.0.0:8545
devoluciones
{"jsonrpc":"2.0","id":69,"result":{"currentBlock":"0x767811","highestBlock":"0x767879","knownStates":"0x8ba1951","pulledStates":"0x8ba0752","startingBlock":"0x5a95a1"}}
Estaba molesto porque eth.syncing
regresa false
incluso antes de que comience la sincronización (y también regresa después de que finalizafalse
la sincronización , por lo que no hay forma de saberlo).
Una forma diferente de hacerlo, si no necesita el número de bloque real: puede comparar la marca de tiempo de su último bloque sincronizado con la hora actual:
Date.now()/1000 - eth.getBlock('latest').timestamp
Si esta cantidad es mayor a, digamos, 2 minutos ( 120
), entonces es muy probable que no tengas los últimos bloques.
farhad ghanaatgar