Glosario / Protocolo y actualizaciones
Bits de versión
- ¿Qué son los bits de versión?
- Los bits de versión tratan el campo de versión de 32 bits de un encabezado de bloque como una fila de interruptores independientes, para que los mineros puedan señalizar apoyo a varias bifurcaciones blandas (soft forks) a la vez.
Se especifica en el BIP-9.
Un bit de versión representa una bifurcación blanda pendiente, cuyas señales se cuentan sobre una ventana fija de bloques. El BIP-9 ofrece los bits 0 a 28, y un despliegue queda fijado cuando 1.916 bloques de un período de 2.016 bloques activan su bit, o falla al llegar a un timeout (fecha de expiración) para el que se sugiere un año. Leer esas señales le permite saber con meses de antelación si una funcionalidad que desea su billetera se está convirtiendo en una regla de la red.
Cómo funciona
Los bits de versión funcionan como una máquina de cinco estados que cada nodo calcula por sí mismo, una vez por período de ajuste de dificultad, para cada despliegue que conoce.
Los estados son DEFINED, STARTED, LOCKED_IN, ACTIVE y FAILED. Todos los bloques de un período de ajuste de 2.016 bloques comparten un mismo estado, así que una transición solo puede producirse en una altura que sea múltiplo de 2.016. Un despliegue pasa de DEFINED a STARTED cuando el tiempo pasado mediano del bloque anterior supera la fecha de inicio configurada; el tiempo pasado mediano es la marca de tiempo mediana de un bloque y de los diez bloques que lo preceden.
Una vez en STARTED, un nodo recorre hacia atrás exactamente 2.016 ancestros y cuenta los bloques cuyos tres bits de versión superiores son 001 y que tienen activado el bit del despliegue. Todo lo demás cuenta como cero, así que un minero que use otro esquema de versiones no puede señalizar por accidente. La mainnet necesita 1.916 de esos bloques, y la testnet, 1.512. Si no se alcanza el umbral antes de que el tiempo pasado mediano supere el timeout, el despliegue pasa a FAILED de forma permanente. El BIP-9 sugiere situar ese timeout 31.536.000 segundos, un año, después de la fecha de inicio, para que una propuesta estancada libere su bit en lugar de atascar la cola para siempre.
Hay un detalle que confunde a mucha gente. El estado de un bloque nunca depende de su propio campo de versión, solo del de sus ancestros, así que un minero no puede votar por una regla y conseguir que el voto obligue al mismo bloque que lo emite. Establecer en 001 los tres bits superiores también restringe la versión de un bloque que señaliza al intervalo de 0x20000000 a 0x3FFFFFFF, y deja libres los patrones 010 y 011 para cualquier mecanismo que con el tiempo reemplace a los bits de versión.
Los bits se reciclan en lugar de gastarse. Cuando un despliegue se activa o expira, su bit puede llevar una propuesta posterior, tras una pausa en barbecho que el BIP-9 recomienda para que el software con errores se detecte antes. La especificación también pide a los nodos que hagan un seguimiento de los bits que no reconocen y que avisen de forma bien visible cuando un despliegue desconocido quede fijado, que es como el software no actualizado le advierte de que se acerca una regla que no puede hacer cumplir.
Dónde aparece
Dos despliegues se han llevado a cabo en la mainnet de bitcoin con los parámetros del propio BIP-9, y la lista de despliegues del BIP los recoge a ambos en una tabla.
El primero, llamado csv, ocupó el bit 0 con fecha de inicio 2016-05-01 y expiración 2017-05-01, y se activó en el bloque 419.328. Reunía BIP-68, BIP-112 y BIP-113, tres de los cambios que el BIP-9 enumera entre los que vuelven inválidas transacciones que antes eran válidas. El segundo, segwit, ocupó el bit 1 con una ventana de 2016-11-15 a 2017-11-15, y se activó en el bloque 481.824, antes de una fecha límite que podría haber incumplido.
El esquema también se ve en la infraestructura de la minería. El BIP-9 amplió la llamada RPC getblocktemplate con una lista rules que nombra los despliegues ya activos, un objeto vbavailable que asocia el nombre de cada despliegue pendiente con su bit y una máscara opcional vbrequired con los bits que exige el servidor. Un pool de minería lee esas claves para decidir qué señalizar, y eso es lo que convierte una versión publicada en un porcentaje en los sitios de seguimiento.
Bits de versión frente a bloque de versión 2
Un bloque de versión 2 lleva un contador en el campo de versión; los bits de versión llevan un vector de bits en los mismos cuatro bytes. Con el BIP-34, el campo se comparaba como un entero, así que solo podía haber una actualización en curso a la vez y cada éxito quemaba para siempre valores que un bloque válido podía usar. El BIP-9 hace las cuentas: después de BIP-34, BIP-66 y BIP-65 solo quedaban 0x7FFFFFFB valores de versión, lo que limita cualquier esquema de vector de bits a 30 despliegues independientes. Establecer en cambio los tres bits superiores convirtió lo que quedaba en 29 carriles que funcionan en paralelo y pueden reutilizarse.