Saltar al contenido
buybitcoinsmart

Glosario / Protocolo y actualizaciones

Tiempo pasado mediano

También se conoce como MTP.

¿Qué es el tiempo pasado mediano?
El tiempo pasado mediano es el reloj de consenso de bitcoin: la mediana de las marcas de tiempo de los once bloques anteriores, y el valor con el que se comprueba todo locktime basado en tiempo.

Se especifica en el BIP-113.

Los nodos toman las marcas de tiempo de los once bloques anteriores al que están validando, las ordenan y usan el valor central como hora actual. Esa mediana queda alrededor de seis bloques atrás, así que va aproximadamente una hora por detrás de la hora real. Por eso, una moneda que usted bloquee hasta el mediodía pasa a ser gastable más cerca de la una de la tarde.

Cómo funciona

El tiempo pasado mediano sale de una función llamada GetMedianTimePast, que recorre hacia atrás los registros de once bloques, copia cada marca de tiempo en un arreglo, lo ordena y devuelve el elemento central.

La constante que BIP-113 define es nMedianTimeSpan = 11, así que la respuesta es siempre el sexto menor de once números. La ordenación es lo que hace fiable el resultado. La marca de tiempo de un bloque puede ser anterior a la de su bloque padre, pero las reglas de consenso ya obligan a que cada nueva marca de tiempo supere la mediana de las once anteriores, así que la mediana solo puede avanzar. Por eso, alterar una sola marca de tiempo apenas le aporta nada a un minero.

El problema que resolvió BIP-113 era un incentivo y no un error. Con la regla antigua, la elegibilidad de una transacción se juzgaba según la marca de tiempo del bloque que la incluía, un número que escribe el minero, lo que la sección de motivación del BIP llama "a perverse incentive for miners to lie about the time of their blocks in order to collect more fees" (un incentivo perverso para que los mineros mientan sobre la hora de sus bloques a fin de cobrar más comisiones). La solución fue un solo reemplazo: las llamadas de consenso a IsFinalTx toman GetMedianTimePast del bloque anterior en lugar de la hora del propio bloque, y la regla abarca todas las transacciones, incluida la transacción coinbase.

Llegó como una bifurcación blanda (soft fork) con los bits de versión de BIP9 en el bit 0, con la señalización en la mainnet abierta desde la medianoche del 1 de mayo de 2016 UTC y con expiración un año después, y se desplegó junto con BIP68 y BIP112 para que las tres reglas de bloqueo temporal (timelock) llegaran como un solo paquete.

Dónde aparece

El tiempo pasado mediano aparece en los resultados de la interfaz RPC de Bitcoin Core como un campo llamado mediantime, justo al lado del campo time, que es el valor en bruto.

La llamada RPC getblock devuelve ambos para cualquier bloque, y la llamada RPC getblockchaininfo indica el tiempo mediano de la punta de la cadena junto a la marca de tiempo de la punta, que es la forma más rápida de ver la hora de retraso en un nodo en funcionamiento. La llamada RPC getchaintxstats va más allá y mide la duración de su ventana como la diferencia entre los tiempos medianos de dos bloques en lugar de las horas de sus encabezados, así que una marca de tiempo alterada en cualquiera de los extremos apenas mueve el resultado.

Donde se nota es en la mempool. La función CheckFinalTxAtTip de Bitcoin Core evalúa una transacción candidata con el tiempo pasado mediano de la punta actual y una altura superior en uno a la de la punta, así que una billetera que difunde la transacción en el instante en que pasa un plazo recibe un rechazo en lugar de una retransmisión, y tiene que seguir reintentándolo hasta que la mediana se ponga al día con el reloj de su pared.

Los bloqueos temporales relativos heredan el mismo reloj en ambos extremos. BIP-68 mide un bloqueo de secuencia basado en tiempo, contado en unidades de 512 segundos, desde el tiempo pasado mediano del bloque anterior a aquel en el que se minó la moneda hasta el tiempo pasado mediano del bloque anterior al gasto, así que el retraso aparece dos veces y en su mayor parte se anula.

Tiempo pasado mediano frente a la marca de tiempo del encabezado de bloque

El tiempo pasado mediano se calcula a partir de once marcas de tiempo de encabezado, pero no se almacena en ningún bloque, mientras que la marca de tiempo de un encabezado es un campo que escribe el minero y que todo nodo conserva para siempre.

Bitcoin usa ambos, para tareas distintas. Los locktimes usan la mediana, porque avanza de forma monótona y no se puede adelantar a la fuerza para obtener ingresos por comisiones. El ajuste de dificultad sigue leyendo las marcas de tiempo en bruto de los encabezados: Bitcoin Core toma la hora del último bloque de la ventana de 14 días, le resta la hora del primero y reescala el objetivo a partir de esa diferencia. Dos relojes en una misma cadena parecen poco ordenados, y es deliberado. Un ajuste necesita el tiempo transcurrido real a lo largo de dos semanas de bloques, mientras que un locktime necesita un número que ningún minero por sí solo pueda mover.

No confundir con

Preguntas frecuentes

¿Por qué una transacción con bloqueo temporal se confirma alrededor de una hora después de la hora que establecí?

Porque bitcoin comprueba los locktimes basados en tiempo con el tiempo pasado mediano, la mediana de las marcas de tiempo de los once bloques anteriores, que va aproximadamente una hora por detrás de la hora real. BIP-113 lo indica en su sección de compatibilidad. Si el momento exacto importa, establezca el plazo una hora antes de cuando quiera que entre en vigor.

¿Se almacena el tiempo pasado mediano dentro de un bloque?

No, cada nodo calcula por sí mismo el tiempo pasado mediano a partir de las marcas de tiempo de los once bloques que preceden al bloque que está validando. Bitcoin Core muestra el resultado como el campo mediantime en las llamadas RPC getblock y getblockchaininfo, pero ninguna parte de los datos del bloque lo contiene.

¿Afecta el tiempo pasado mediano a una compra corriente de bitcoin?

No, un retiro corriente de un exchange o un pago desde una billetera no lleva ningún bloqueo basado en tiempo, así que el tiempo pasado mediano nunca lo retrasa. Solo importa cuando un gasto depende de un locktime basado en tiempo, de un script con OP_CHECKLOCKTIMEVERIFY o de un bloqueo temporal relativo basado en tiempo.

Para seguir leyendo

Términos relacionados

Más en la sección Protocolo y actualizaciones

Leer esta página en inglés