¿Cómo puedo saber cuál es el bloque más alto?

Estoy sincronizando un nuevo nodo. ¿Cómo puedo saber cuál es el último bloque para saber cuánto me queda por recorrer?

Empecé a sincronizar desde hace 15 días y hoy creo que pasé el bloque más alto 4741144 Descargué 4741185 de 4741144 pero el nodo ethereum comenzó a descargar datos de la cadena. ¿Alguien sabe cuántas estructuras de cadena necesitan descargarse para sincronizarse por completo? mi computadora ya descargó una estructura de cadena de aproximadamente 10 M después de alcanzar el bloque más alto.

Respuestas (10)

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.syncingvarias veces para verificar su progreso, y regresará falsecuando haya terminado. Luego puede usar eth.blockNumbery también comparar con un explorador de blockchain, como mencionan otras respuestas aquí.

Para mayor claridad web3.eth.isSyncing(), también regresará falsecuando 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?

Gracias por la respuesta, solo tenga en cuenta que geth attachno funciona si tiene el --mineindicador especificado (para cadenas de prueba), por lo que si lo usa, probablemente también debería usar un script de minería.
Uso la gethversión 1.4.6 y eth.syncingsolo devuelve trueo false. ¿Cuál es la nueva versión del eth.syncingcomando?
@TMOTTM Podría ser un error y sugiero "Nuevo problema" en github.com/ethereum/go-ethereum/issues
se agregó más información a la salida, pero esta sigue siendo una forma válida de verificar.
La función 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.blockNumberme da0
@goodvibration Gracias, agregué partes de tu comentario a la respuesta. Espero que estés bien.

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)

Agregué una respuesta porque la simple repetición con "consola geth" tendrá registros ruidosos que interfieren con la consola; y eth.syncing proporciona más información.
En las versiones 1.0.0 y superiores, blockNumberse le ha cambiado el nombre getBlockNumbery 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
Combine esto con watchpara 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).

Nota: es 'navegador de niebla' o 'cartera ethereum'. Pero no existe tal cosa como una 'billetera de niebla'. :)
stats.ethdev.com no responde
Arreglé el enlace.

web3.eth.blockNumberobtiene 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á

  • bloque actual
  • bloque más alto
  • bloque de inicio

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.

entonces 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 respuesta
Supongo que este servirá testnet.etherscan.io

web3.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.syncingregresa falseincluso 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.