SegWit

¿Qué fue la actualización Segregated Witness?

BIP 141: Segregated Witness

La actualización Segregated Witness (SegWit) en 2017 cambió la estructura de los datos de transacción en Bitcoin.

La principal razón de esta actualización fue corregir la maleabilidad de transacciones (la explicaré en un momento). El otro cambio significativo fue un aumento del tamaño del bloque.

¿Cuál fue el cambio principal?

Transacción legada

En una transacción legada, el código de desbloqueo (y las firmas) se coloca junto a cada entrada, así que el código de desbloqueo queda repartido por todos los datos de la transacción.

El TXID se crea entonces a partir de todos los datos de la transacción:

Diagrama que muestra la posición de las firmas en una transacción legada y el TXID siendo creado a partir de todos los datos de la transacción.

Transacción SegWit

En una transacción segwit, en cambio, todo el código de desbloqueo (y las firmas) se mueve al final de los datos de la transacción.

El TXID se crea entonces a partir de todos los datos de la transacción, excepto el código de desbloqueo:

Diagrama que muestra la posición de las firmas en una transacción segwit y el TXID siendo creado a partir de todos los datos de la transacción excepto las firmas.

Como resultado, el TXID en una transacción segwit solo está influido por los efectos de la transacción (el movimiento de bitcoins) y no por el código necesario para validar la transacción (es decir, las firmas necesarias para desbloquear los bitcoins y gastarlos).

Diagrama que destaca cómo el código de desbloqueo ya no se incluye como parte del TXID en una transacción segwit.

Así que, en esencia, separaste la parte de "validación" (código de desbloqueo) del resto de la transacción.

Si llamaras a ese código de validación de datos de testigo (witness), como podría hacerlo un criptógrafo, se podría decir que "segregaste" el testigo. *guiño*

¿Cuáles son los beneficios?

  1. Corrige la maleabilidad de transacciones
  2. Aumento de la capacidad del bloque

1. Corrige la maleabilidad de transacciones

En Bitcoin, la maleabilidad de transacciones se refiere al hecho de que el TXID de una transacción puede alterarse modificando las firmas:

Diagrama que muestra el TXID de una transacción legada siendo alterado al modificar las firmas dentro de los datos de la transacción.

Una firma puede alterarse invirtiendo el valor s. La firma sigue siendo válida y la transacción tiene el mismo efecto, pero el TXID es diferente.

Eso significa que, cuando envías una transacción legada a la red, cualquier nodo tiene la capacidad de cambiar el TXID antes de reenviarla:

Diagrama que muestra el TXID de una transacción legada siendo modificado después de enviarse a la red bitcoin.

En algún momento, tu transacción llegará a la blockchain con un TXID distinto del que esperabas, lo que sería un poco molesto.

Sin embargo, si las firmas ya no forman parte del TXID, ya no es posible que otra persona cambie el TXID de tu transacción después:

Diagrama que muestra el TXID de una transacción segwit permaneciendo igual después de ser enviada a la red bitcoin.

Así que, en otras palabras, SegWit hace que los TXIDs sean confiables.

2. Aumento de la capacidad del bloque

Debido a que el código de desbloqueo se movió a un nuevo campo de testigo en los datos de la transacción, también se pudo cambiar la forma en que se calculaban los tamaños de los bloques.

Antes, las transacciones se medían en bytes, y el límite de tamaño del bloque era de 1.000.000 bytes (1 MB):

Diagrama que muestra transacciones y capacidad de bloque medidas en bytes.

Con SegWit, las transacciones ya no se miden en bytes. En su lugar, transacciones y bloques recibieron una nueva métrica llamada peso (weight):

Diagrama que muestra transacciones y capacidad de bloque medidas en unidades de peso.

Así que, básicamente, el límite de tamaño del bloque se multiplica por 4 para dar el nuevo límite de peso del bloque.

Cada byte en una transacción se multiplica entonces también por 4 para dar un peso de transacción. Sin embargo, solo multiplicas por 1 los bytes de datos de testigo, lo que básicamente da un descuento del 75% al espacio que ocupa el "código de desbloqueo" en un bloque.

Así que podrías decir que los datos de desbloqueo ocupan un cuarto del espacio que ocupaban antes, lo que significa que hay más espacio en el bloque en general para datos de transacción.

¿SegWit fue un aumento del tamaño del bloque?

Sí, cada bloque ahora puede tener más de 1.000.000 bytes (1 MB) de tamaño.

Así que, aunque el límite de tamaño del bloque no aumentó por un número específico de bytes, el peso con descuento para los datos de desbloqueo significa que los bloques pueden superar el límite anterior de 1 MB.

¿De cuánto fue el aumento del tamaño del bloque con SegWit?

La actualización SegWit aumentó el tamaño máximo para bloques típicos a alrededor de 1,8 MB.

Verás, un bloque típico de transacciones consiste en cerca de 60% de datos de desbloqueo1. Así que, si calculamos el peso de un bloque de 1 MB compuesto por datos de transacción "típicos", obtenemos:

400.000 bytes * 4 = 1.600.000 unidades de peso
600.000 bytes * 1 =   600.000 unidades de peso

Peso total        = 2.200.000 unidades de peso

Ahora, si un bloque puede pesar como máximo 4.000.000 unidades de peso, podemos calcular de cuánto fue ese aumento:

4.000.000 / 2.200.000 = 1,81

Así que podrías decir que, en la práctica, esto fue un aumento del límite de tamaño del bloque a 1,8 MB.

1. Llegué a ese número del 60% recorriendo los archivos blk.dat y sumando los datos de scriptSig de todas las transacciones de un bloque, comparándolo con el tamaño total del bloque. No hice una prueba exhaustiva, pero 60% parece una media justa.

¿Por qué se implementaron los cambios de esta manera?

O, dicho de otro modo…

Si quieres corregir la maleabilidad de transacciones y aumentar la capacidad del bloque, ¿seguro que no hay una forma más directa de hacerlo? ¿Por qué necesitas reestructurar los datos de la transacción y crear una nueva métrica llamada "peso del bloque"?

Buena pregunta. Y tienes razón: esos cambios podrían haberse hecho de una manera mucho más simple. Por ejemplo, podrías haber hecho simplemente esto:

Diagrama que muestra el código de desbloqueo siendo ignorado en una transacción legada al crear un TXID, y un aumento directo del tamaño del bloque a 2 MB.

Sin embargo, si hicieras eso, las transacciones y los bloques se volverían "inválidos" bajo las reglas actuales.

Básicamente, eso significa que los nodos de la red rechazarían esas nuevas transacciones y bloques, porque no cumplen sus reglas de cómo deben "verse" las transacciones y los bloques.

Diagrama que muestra los nodos existentes en la red rechazando bloques que usan los nuevos cambios de hard fork.

Por ejemplo, una de las reglas era que cada bloque debía tener 1 MB o menos.

Por lo tanto, si quisieras hacer estos cambios, necesitarías que todos en la red actualizaran su software (y, obviamente, aceptaran los cambios).

Porque, si no lo hicieras, acabarías con una red que construye dos blockchains diferentes: nodos actualizados construyendo una blockchain con las nuevas reglas, y nodos antiguos continuando a construir una blockchain con las reglas viejas.

Diagrama que muestra la blockchain dividida en dos versiones separadas debido a un cambio de hard fork.

Eso se conoce como hard fork. Puede funcionar, pero es arriesgado y causará problemas para quien no actualice.

¿Cómo evitó SegWit un hard fork?

En vez de ser un hard fork, SegWit se implementó como un soft fork.

Con la actualización SegWit, las transacciones y los bloques todavía siguen las reglas actuales de la red bitcoin, así que todos los nodos siguen viendo los bloques SegWit como válidos. Por lo tanto, los nodos "antiguos" aceptarán esos bloques "nuevos" y los añadirán también a sus blockchains.

Diagrama que muestra nodos antiguos que no actualizaron aceptando los nuevos bloques y transacciones SegWit.

Por lo tanto, los nodos antiguos siguen acompañando a los nuevos nodos, aunque no actualicen.

Diagrama que muestra tanto nodos antiguos como actualizados siguiendo la misma versión de la blockchain tras un cambio de soft fork.

Con un soft fork, todos permanecen sincronizados con una única versión de la blockchain.

La desventaja para los nodos "antiguos" es que no pueden aprovechar las nuevas funciones de SegWit hasta que actualicen. Sin embargo, hasta entonces, pueden seguir haciendo transacciones "al estilo antiguo" normalmente y acompañar la blockchain.

Así que, en resumen, la actualización SegWit puede parecer una forma "parcheada" de corregir la maleabilidad de transacciones y aumentar la capacidad del bloque, pero ese enfoque evita el problema de obligar a todos a actualizar al nuevo software (o quedarse atrás).

¿Cuándo se activó SegWit?

SegWit se activó el , en la altura de bloque 481.824.

Fue cuando los nodos empezaron a aplicar las nuevas reglas de consenso de la actualización SegWit a todos los bloques y transacciones nuevos.

¿Cómo entró en vigor SegWit?

La actualización Segregated Witness entró en vigor cuando 95% de los mineros señalaron que estaban listos para ella.

Los mineros pueden señalar su disposición usando un número de versión designado en los bloques que minan.

Diagrama que muestra el campo de versión en la cabecera del bloque.

El campo de versión forma parte de la cabecera del bloque.

Entonces, cuando el 95% de los bloques tenían ese número de versión, SegWit se programó para su activación:

Diagrama que muestra cómo la actualización SegWit fue programada para el siguiente período de reajuste después de un período de señalización exitoso.

El umbral del 95% se calcula dentro de un período de reajuste de dificultad. Si se alcanza el umbral del 95%, el soft fork se activa al comienzo del siguiente período de ajuste de dificultad (que es de 2016 bloques, o alrededor de 2 semanas).

¿Había un plazo para la activación?

Sí, esta era la ventana de activación:

Ventana de activación de SegWit
Inicio:
Plazo final:

Si suficientes mineros no señalaban su disposición para la actualización Segregated Witness antes de la medianoche del 15 de noviembre de 2017, la propuesta habría expirado.

Cronología de la activación

Aquí tienes una tabla que muestra el número de bloques señalando SegWit en cada período objetivo hasta la activación:

Señalización de la activación de SegWit por período objetivo
Inicio Período Objetivo Bloques Señalando Porcentaje
439.488 a 441.503451/201622,37%
441.504 a 443.519487/201624,16%
443.520 a 445.535520/201625,79%
445.536 a 447.551521/201625,84%
447.552 a 449.567489/201624,26%
449.568 a 451.583468/201623,21%
451.584 a 453.599485/201624,06%
453.600 a 455.615537/201626,64%
455.616 a 457.631532/201626,39%
457.632 a 459.647582/201628,87%
459.648 a 461.663614/201630,46%
461.664 a 463.679671/201633,28%
463.680 a 465.695698/201634,62%
465.696 a 467.711663/201632,89%
467.712 a 469.727622/201630,85%
469.728 a 471.743642/201631,85%
471.744 a 473.759825/201640,92%
473.760 a 475.775917/201645,49%
475.776 a 477.7911440/201671,43%
477.792 a 479.8072016/2016100,00%

Como puedes ver, el umbral del 95% de mineros señalando disposición para SegWit se superó durante el período de ajuste de dificultad entre los bloques 477.792 y 479.807.

En consecuencia, la actualización SegWit se activó 2.016 bloques (cerca de 2 semanas) después, en el bloque 481.824:

Estado final de activación de SegWit
InicioPeríodo ObjetivoNota
479.808 a 481.823SegWit Bloqueado (Locked In)
481.824 en adelanteSegWit Activado

¿Por qué se les dio a los mineros la decisión sobre la activación?

Porque, si quieres que un soft fork tenga éxito, necesitas que la mayoría de los mineros minen el tipo "nuevo" de bloque en la blockchain.

Eso es para que la blockchain con los bloques "nuevos" supere cualquier blockchain que esté siendo construida con bloques "viejos" (de cualquier minero no actualizado que aún pudiera estar minando).

Como resultado, la blockchain "nueva" se construirá más rápido que cualquier blockchain construida con bloques "viejos", así que todos los nodos adoptarán naturalmente la misma cadena más larga:

Diagrama que muestra a la mayoría de los mineros construyendo la cadena más larga con nuevos bloques después de la actualización SegWit.

Tener la mayoría del poder de minería mantiene a todos en la red en la misma cadena.

Así que tener una fuerte mayoría de mineros a bordo permite una actualización fluida, ya que garantiza que toda la red convergerá en una única blockchain.

No es necesariamente que los mineros sean el grupo más capacitado para decidir los méritos de una actualización vía soft fork; es más bien que son necesarios para garantizar una actualización fluida para toda la red.

¿Qué pasa si no ejecuto la actualización SegWit?

Si estás ejecutando un nodo antiguo (por ejemplo, Bitcoin Core v0.13.0 o inferior), cualquier nodo SegWit al que estés conectado eliminará todos los datos de testigo de las transacciones antes de enviártelos.

Diagrama que muestra un nodo antiguo no recibiendo los datos de testigo de transacciones segwit cuando está conectado a un nodo actualizado.

Lo que eso significa es:

Así que, básicamente, tu nodo recibirá una versión "ligera" de las transacciones SegWit.

¿Cómo actualizo?

Ese es el espíritu.

SegWit lleva tanto tiempo existiendo que es poco probable que te encuentres con algún software que no lo soporte (a menos que sea obviamente antiguo).

Recursos

Agradecimientos

Lectura adicional