¿Por qué las marcas de tiempo en la cadena de bloques no siempre aumentan?

Las marcas de tiempo que comienzan en el bloque 145044 son:

145044: 2011-09-12 15:46:39     
145045: 2011-09-12 16:05:07 
145046: 2011-09-12 16:00:05 // ~5 minutes before prior block
145047: 2011-09-12 15:53:36 // ~7 & ~12 minutes before 2 prior blocks
145048: 2011-09-12 16:04:06 // after 2 prior blocks but still before 145045

¿Cómo ocurre esto?

¿La noción de tiempo en btc sigue siendo tan confusa en 2016? ¿Ha habido algún BIP para hacer esto más estrictamente ordenado?
@smatthewenglish: Si tiene una nueva pregunta, cree otro tema: Cómo preguntar

Respuestas (9)

De la wiki :

Una marca de tiempo se acepta como válida si es mayor que la marca de tiempo mediana de los 11 bloques anteriores y menor que el tiempo ajustado por la red + 2 horas. El "tiempo ajustado por la red" es la mediana de las marcas de tiempo devueltas por todos los nodos conectados a usted.

Cada vez que un nodo se conecta a otro nodo, obtiene una marca de tiempo UTC y almacena su compensación del UTC local del nodo. El tiempo ajustado por la red es entonces el UTC local del nodo más el desplazamiento medio de todos los nodos conectados. Sin embargo, la hora de la red nunca se ajusta a más de 70 minutos de la hora del sistema local.

No es obvio que no haya ningún problema con esta forma de sellado de tiempo. Vea la publicación de blog Timejacking & Bitcoin y la discusión al respecto aquí .

Por lo tanto, bloquear a los productores fuera de sincronía hasta por una hora o 2 no causa problemas reales siempre que permanezcan en la minoría.
Agregué información sobre posibles problemas a la respuesta.
Entonces, la cadena de bloques se trata más de ordenar, y la marca de tiempo solo en un sentido más abstracto, ¿verdad?
¿Qué quiere decir con ****mayor que la marca de tiempo mediana de los 11 bloques anteriores****?

La causa raíz de esto es que sin una autoridad central, es imposible saber con seguridad cuál es la hora actual.

El protocolo rechaza bloques con una marca de tiempo anterior a la mediana de las marcas de tiempo de los 11 bloques anteriores o posterior a 2 horas después de la hora actual de la red. Cualquier otra marca de tiempo es aceptable. Tenga en cuenta que el 'tiempo de la red' puede diferir del tiempo real, ya que la red bitcoin intenta corregir la configuración incorrecta del reloj tomando la mediana del tiempo informado por todos los pares conectados como el tiempo de la red.

Puedes leer sobre un ataque que esto hace posible aquí :

Al anunciar marcas de tiempo inexactas cuando se conecta a un nodo, un atacante puede alterar el contador de tiempo de la red de un nodo y engañarlo para que acepte una cadena de bloques alternativa. Esto podría aumentar significativamente las posibilidades de un doble gasto exitoso, agotar los recursos computacionales de un nodo o simplemente ralentizar la tasa de confirmación de transacciones.

Me doy cuenta de que esta es una publicación muy antigua, pero quisiera preguntar si esta vulnerabilidad aún existe.
No estoy seguro, pero no veo ninguna razón por la que no debería. Las reglas no cambiaron.
Si todavía es una vulnerabilidad, supongo que hay una forma de protegerse contra ella o no es grave: BTC ha sobrevivido a muchos ataques desde 2012.
@Jeff Parece que todavía es un problema y no es lo suficientemente fácil de solucionar en una década. Para ver propuestas, consulte, por ejemplo, (Artículo corto) Hacia marcas de tiempo de Bitcoin más confiables \- Publicación de la conferencia IEEE o Cómo lograr una marca de tiempo confiable en la plataforma de bitcoin \| SpringerLink

Para agregar un poco a las otras respuestas: imagine si el protocolo requiriera que aumenten las marcas de tiempo. Ahora imagine que alguien extrae un bloque con una marca de tiempo de un minuto en el futuro, por lo que puede ver. ¿A qué te dedicas? Si intenta extraer bloques con la marca de tiempo que actualmente cree que es correcta, sus bloques serán rechazados (ya que tendrían una marca de tiempo anterior al último bloque aceptado).

Debido al requisito de que la red acuerde fácilmente si un bloque es válido o no, el protocolo no puede exigir marcas de tiempo de alta precisión como condición para aceptar un bloque como válido. Como resultado, requerir marcas de tiempo monótonas probablemente empeoraría las cosas en lugar de mejorarlas.

No hay ningún requisito de que los bloques tengan una marca de tiempo después del bloque anterior. El único requisito es que la marca de tiempo sea mayor que la marca de tiempo mediana de los últimos 11 bloques. Entonces, esto significa que un bloque puede tener una marca de tiempo más baja que su padre, dentro de un cierto límite.

Esto sucede porque los mineros no tienen relojes perfectamente sincronizados. Puede haber ligeras diferencias en sus relojes internos que los desvían unos segundos. Si un minero tiene mucha suerte y encuentra un bloque poco después de otro, debido a las diferencias de reloj, es posible que su reloj aún esté atrasado con respecto a la marca de tiempo del bloque principal. Eso es probablemente lo que sucedió aquí.

Creo que la marca de tiempo se basa en la máquina que aloja al cliente de bitcoin que envió el bloque, y se permite la variación ya que no todos tienen la hora de su computadora sincronizada correctamente.

¿Sabes dónde está el código que realiza esta función?

Al menos un grupo de minería establece deliberadamente marcas de tiempo 6 minutos en el futuro y el bloque 145045 parece ser de Eligius (la transacción de generación se divide en varias direcciones).

¿Por qué hacen eso? todavia lo hacen?

Las marcas de tiempo de los bloques no son muy precisas y se permite que tengan varias horas de diferencia. Es difícil que una red descentralizada llegue a un acuerdo en un horario oficial.

Las razones por las que podría ser inexacto son los diferentes tiempos del sistema, el retraso y también los mineros a menudo cambian el tiempo en pequeñas cantidades una vez que han probado todos los nonces posibles. Esto les permite obtener nuevos hashes usando los viejos nonces.

Estas son las reglas de qué marcas de tiempo están permitidas.

Hay bastante margen de maniobra en la marca de tiempo del bloque. La marca de tiempo para el bloque N debe ser mayor que el tiempo medio de la red, que se calcula como la mediana de los últimos 11 bloques, y también menor que el tiempo de la network time + 2 hoursred, donde el tiempo de la red se calcula en función del tiempo del sistema del nodo, así como el tiempo medio informado por los pares del nodo.

La marca de tiempo de un bloque solo debe tratarse como una hora aproximada en que se extrajo el bloque. No hay forma de obligar a un minero a incluir 'la hora real' , porque es imposible que la red determine la verdad de esto. Entonces, en cambio, la red impone una regla de que la marca de tiempo debe cumplir con las siguientes reglas para que se considere válida:

(La información a continuación se copia/pega de la referencia del desarrollador de Bitcoin.org )

El tiempo de bloque es una época de Unix cuando el minero comenzó a codificar el encabezado (según el minero). Debe ser estrictamente mayor que la mediana de tiempo de los 11 bloques anteriores. Los nodos completos no aceptarán bloques con encabezados de más de dos horas en el futuro según su reloj.

Por lo tanto, es posible que un bloque en height Ntenga una marca de tiempo posterior a la marca de tiempo del bloque en height N+1, siempre que siga estas reglas.

"Los nodos completos no aceptarán bloques con encabezados de más de dos horas en el futuro según su reloj". eso no es del todo correcto AFAIK. No debe haber más de dos horas desde la 'hora ajustada por la red'. Cuando se conecta a un nodo, el nodo envía una marca de tiempo y usted almacena la diferencia entre la hora que le devuelve el nodo y su reloj local actual. Luego, después de conectarse a todos los nodos, calcula la desviación media entre su reloj y el reloj de la red. En cualquier momento, calcula el 'tiempo ajustado de la red' agregando su hora local a la mediana dev anotada anteriormente