Después de leer esta respuesta , donde Peter Wuille habla sobre cómo un nodo realmente no puede saber si está sincronizado o no, me hizo preguntarme si hay alguna manera en que podamos saber que un nodo está tan sincronizado como posiblemente puede ser dado el compañeros a los que está conectado.
¿Podríamos agregar una llamada RPC como getsyncstatus
esa para que el nodo pregunte a sus pares por sus bloques más altos conocidos y si la mayoría (o algún porcentaje) de sus pares están todos de acuerdo con la altura de bloque más conocida, entonces podría usar esa información para poder decir (sin una confiabilidad perfecta) qué tan sincronizado está el nodo?
Entonces, por ejemplo, si un nodo tiene 8 pares, y 7 de ellos regresan 330448
como la mejor altura de bloque, y el cliente tiene información sobre el bloque 330448
, entonces podría dar un código de estado y un mensaje que indica que está actualizado. Si los pares dan respuestas diferentes (lo que podría suceder si se conecta a un nodo malicioso que informa falsamente su altura más conocida O si otros pares no están completamente sincronizados), entonces podría dar un código de estado y un mensaje que indica que la búsqueda fue inconcluso y deben volver a intentarlo más tarde. Y, por último, si el 87,5 % de los nodos están diciendo 330448
y el nodo solo está sincronizado para bloquear 1000
, entonces puede dar un código de estado y un mensaje que indica que es probable que el nodo no esté lo suficientemente sincronizado.
Creo que esto sería útil principalmente como una forma de determinar si los servidores están lo suficientemente sincronizados con la red para usar en alguna aplicación. Las respuestas a esta pregunta describen una forma de ver si los nodos están actualizados, pero todos parecen un poco raros y no estoy seguro de que sean lo suficientemente confiables.
El cliente de Bitcoin tiene una forma de detectar si no está lo suficientemente sincronizado. Sin embargo, que yo sepa, no está realmente expuesto a RPC de una manera agradable.
Se llama IsInitialBlockDownload()
, y se considerará no sincronizado si se cumple alguna de las siguientes condiciones:
Puede llamar getblocktemplate
y, si IsInitialBlockDownload()
es cierto, volverá con un error de RPC_CLIENT_IN_INITIAL_DOWNLOAD
(o -10).
Supongamos que estamos diseñando una nueva llamada RPC desde cero. Como han señalado otros carteles, no es posible determinar esto perfectamente en presencia de actores malintencionados. ¿Qué factores podríamos medir para hacer una conjetura educada?
IsInitialBlockDownload()
hace.No, no hay forma de saberlo, porque no existe una definición de "estar sincronizado". ¿Sigues sincronizado en el momento en que un minero encuentra un nuevo bloque? ¿Cómo sabrías?
Lo que describe no tiene ningún beneficio sobre los métodos ya implementados para detectar si el nodo está muy atrasado (también ya está implementado como explica Pieter Wuille en la respuesta que vinculó, aunque no está disponible en la API).
¿Qué es exactamente qué tratar de lograr con esta información? ¿Por qué necesitas saber si un servidor está suficientemente sincronizado? Encontrará los bloques reales mucho antes de que cualquier atacante razonable pueda generarlos.
Bueno, bitcoind es de código abierto , por lo que es completamente posible que intente integrar algo así usted mismo. Sin embargo, en lugar de realizar cambios en el código base, es posible que pueda obtener una funcionalidad similar utilizando las llamadas rpc que ya están implementadas. Esencialmente, el cliente de bitcoin ya hace algo de lo que estás explicando. Cuando te conectas con un compañero, parte del proceso de negociación es compartir el bloque actual de cada uno; si uno es más alto que el otro y es válido, el otro comienza a descargarse desde el par más actual. Si observa el archivo debug.log, puede ver que esto sucede, junto con un campo de "progreso" en ejecución que se registra y le muestra el porcentaje que ha descargado.
Sin embargo, para su idea, donde agrega información, puede intentar usar la llamada rpc "getpeerinfo". Puede tomar la información de allí y analizarla de la forma que desee sin tener que hacer una llamada rpc nativa.
Puede o no ser útil para usted, pero solo para verificar, a veces tengo una pequeña secuencia de comandos/página web que obtiene la altura del bloque actual de cada uno de mis nodos bitcoind; si alguno de ellos es más bajo que la mayoría, entonces no están sincronizados. . Obviamente, necesitaría nodos en diferentes redes y máquinas; de lo contrario, un error podría significar que todos los nodos no están sincronizados. Sin embargo, funciona para mí, es simple y usa una llamada RPC existente.
codificador morse
getblocktemplate
en este caso?Nick ODell
codificador morse
codificador morse
Nick ODell
codificador morse
codificador morse