Bitcoin ha sido la criptomoneda más popular y ampliamente utilizada desde su creación en 2009. Sin embargo, a medida que la adopción de Bitcoin creció exponencialmente, surgieron desafíos en términos de escalabilidad y eficiencia de la red. Una de las soluciones más innovadoras para abordar estos problemas es el Segregated Witness, denominado SegWit.
Segregated Witness, de ahora en adelante SegWit, es una actualización del protocolo de Bitcoin que se implementó el 24 de agosto de 2017. Su objetivo principal era resolver el problema de escalabilidad al aumentar el tamaño de bloque de Bitcoin y mejorar la eficiencia de la red.
El SegWit no es un Hard Fork, sino una actualización flexible, denominada Soft Fork, lo que significa que no requiere que todos los nodos y participantes de la red actualicen su software.
Para comprender esto, primero tendremos que analizar algunos conceptos básicos.
¿Cómo funcionan las transacciones con Bitcoin? Supongamos que Ana quiere enviar una cierta cantidad de bitcoins a Bill.
¿Cómo funciona el sistema de transacciones con Bitcoin? El sistema de transacciones es muy distinto al de las transacciones con un monedero tradicional donde se operan con monedas FIAT.
Si Ana le diera $ 2 a Bill, ella tomaría físicamente esos $ 2 de su monedero y se los entregaría a Bill.
Sin embargo, las cosas no funcionan así con Bitcoin. No posees físicamente ningún Bitcoin, ya que lo que tienes en tu haber es una prueba de que tienes esos bitcoins.
Hay un par de cosas que tienes que saber:
- Los mineros validan tus transacciones colocando los datos dentro de los bloques que han bloqueado. A cambio de dar este servicio, cobran una comisión por transacción.
- Cuando se trata de la moneda FIAT, no se toma nota ni se hace un seguimiento de cómo y de dónde se obtienen las operaciones realizadas. Por ejemplo: abres tu monedero y certificas todas las operaciones y monedas que contiene. ¿Puedes decir exactamente de dónde has realizado cada una de las operaciones y conseguido las monedas específicas? Es muy probable que no. Sin embargo, con Bitcoin, se toma nota del historial de todas y cada una de las transacciones.
Ahora vamos a profundizar en cómo se lleva a cabo una transacción de bitcoins entre Ana y Bill.
Hay dos lados en una transacción, la Entrada y la Salida.
Todas estas transacciones tendrán un nombre que descubriremos al final. Por ahora, veamos la dinámica.
¿Cómo funciona SegWit?
El corazón de SegWit es la separación de las firmas de transacción (Scriptsig) y los datos de la transacción (Scriptpubkey).
Antes de la activación de SegWit, las firmas de transacción se incluían en el bloque junto con otros datos de transacción.
Esto limitaba la cantidad de transacciones que podían ser procesadas en un bloque y aumentaba los costos de la transacción.
SegWit soluciona este problema al mover las firmas de transacción a una estructura de datos separada, llamada Testigo (Witness).
El Witness es almacenado fuera del bloque principal, lo que permite una reducción significativa en el tamaño de la transacción.
En lugar de incluir todas las firmas en cada bloque, solo se incluye un hash del Witness en el bloque principal.
Esto permite que más transacciones se ajusten en un bloque, aumentando así la capacidad de la red y reduciendo los tiempos de confirmación.
Ahora si, veamos los ejemplos más interesantes de la entrada y la salida en una transacción.
Entrada de la transacción
Para hacer que esta transacción ocurra, Ana necesita obtener bitcoins que ha recibido de varias transacciones anteriores.
Recuerda, como se mencionó anterormente, cada moneda se contabiliza a través de un historial de transacciones.
Entonces, supongamos que Ana necesita extraer bitcoins de las siguientes transacciones, que denominamos TX(0), TX(1) y TX(2).
Estas tres transacciones se agregarán juntas y eso nos otorgará la transacción de entrada que llamaremos TX(Entrada).
El diagrama de entrada se verá de la siguiente forma:
Entonces, esto será desde el lado de la entrada, ahora veamos, cómo se verá desde el lado de la salida.
Salida de la transacción
La salida básicamente será un número de bitcoins que Bill tendrá después de la transacción y cualquier cambio restante sobrante, luego se enviará nuevamente a Ana.
Este cambio restante se convierte en su valor de entrada para todas las transacciones futuras.
El diagrama de salida se verá de la siguiente forma:
Ahora bien, esta es una transacción muy simple que tiene solo un resultado (además del cambio restante), hay transacciones que son posibles con múltiples salidas.
Este es el aspecto del diseño básico de una transacción, sin embargo, para que todo esto suceda, se deben cumplir ciertas condiciones.
Condiciones de la transacción
TX(Entrada) > TX(Salida). La transacción de entrada tiene que ser siempre mayor que la transacción de salida.
En cualquier transacción, el déficit entre la entrada y la salida (Salida + Cambio) son las comisiones de transacción que los mineros recaudan.
Entonces: comisiones de transacción = TX(Entrada) – (TX(Salida) + Cambio)
Por el lado de la entrada: TX(0) + TX(1) + TX(2) = TX(Entrada)
Si Ana no cuenta con los fondos necesarios para llevar a cabo las transacciones, los mineros simplemente rechazarán las transacciones.
Bill tendrá que demostrar que puede proporcionar la prueba necesaria para obtener los bitcoins.
Ana bloqueará las transacciones con la dirección pública de Bill.
Bill tendrá que presentar su clave privada para desbloquear las transacciones y obtener acceso a sus comisiones.
Ana también necesitará verificar que tenga los derechos necesarios para enviar los bitcoins en primer lugar.
La forma que lo hace es firmando la transacción con su firma digital (también conocida como su clave privada)
Cualquiera puede decodificar esto usando su clave pública y así verificar que fue Ana quien envió los datos.
Esta prueba se llama ‘Datos de firma’. Recuerda esto porque será muy importante más adelante.
Entonces, ¿cuál va a ser el nombre de toda esta transacción?
La entrada (incluidos los datos de firma) y los datos de salida, se suman y se procesan utilizando el algoritmo hash SHA 256.
El hash de salida es el nombre que se le da a esta transacción.
Detalles del código de transacción
Supongamos que Ana quiere enviar 0.0015 BTC a Bill, y para hacerlo, envía entradas que valen 0.0015770 BTC.
Así es como se ve la transacción en el código del formulario:
Lo primero que verás:
Es el nombre de la transacción, también conocido como el valor de hash de entrada y salida.
Vin_sz es la cantidad de datos de entrada desde que Ana envía los datos utilizando solo una de sus transacciones anteriores, su valor es 1.
Vout_sz es 2 porque las únicas salidas son Bill y el cambio restante.
Así son los datos de entrada:
¿Ves los datos de entrada? Ana solamente está usando una transacción de entrada (en el ejemplo de arriba, esta será TX (0)), esta es la razón por la cual vin_sz era 1.
Debajo de los datos de entrada están sus datos de firma.
Debajo de todo esto están los datos de salida:
La primera parte de los datos significa que Bill obtiene 0.0015 BTC.
La segunda parte significa que 0.00005120 BTC es lo que Ana está recibiendo como cambio restante.
Ahora, ¿Recuerdas que los datos de entrada fueron de 0.0015770 BTC? Esto es mayor que (0.0015 + 0.00005120).
El déficit de estos dos valores es la comisión de transacción que los mineros están cobrando.
Entonces, esta es la anatomía de una transacción simple.
Sin embargo, antes de continuar, analicemos un tipo especial de transacción llamada transacción de Coinbase.
Básicamente, es la primera información de transacción que está en el bloque, y significa la recompensa minera que obtienen los mineros al extraer el bloque.
La recompensa es de 6.25 BTC. Estas transacciones no tienen datos de entrada y solo tienen datos de salida.
Recuerda esto porque se volverá un tema muy importante más adelante.
Escalabilidad del SegWit
Ahora recuerda, todas las transacciones que suceden en la cadena de bloques se llevan a cabo realmente porque los mineros extraen estos bloques y colocan las transacciones en los bloques para validarlos.
Pero, solo hay muchas transacciones que puedes poner en el bloque. Cuando se concibió Bitcoin por primera vez, no existía el límite de bloque.
Sin embargo, Satoshi Nakamoto (fundador(es) de Bitcoin), se vio obligado a agregar el límite porque previeron un posible ataque DoS que los hackers pueden infligir en la cadena de bloques.
Pueden completar los bloques con transacciones de correo no deseado, y pueden extraer bloques que podrían ser innecesariamente grandes para obstruir el sistema.
Como resultado, a los bloques se les dio un límite de tamaño de 1 MB.
Esto era viable al principio, pero a medida que su popularidad se hizo cada vez más grande, comenzaron a sumarse varias transacciones.
Este gráfico muestra la cantidad de transacciones que han estado sucediendo cada mes:
Como puedes ver, el número de transacciones mensuales solo está aumentando y con el límite del tamaño de bloque en su momento de 1 MB, Bitcoin solo podía gestionar 4.4 transacciones por segundo.
Una de las principales razones por la que las transacciones son voluminosas y ocupan tanto espacio, es debido a los datos de firma que contienen (se había comentado que tuvieras esto en cuenta).
El hecho es que el 65% del espacio que utiliza la transacción, está ocupado por los datos de la firma.
A medida que el número de transacciones ha aumentado a pasos agigantados, también aumentó la velocidad a la que los bloques se completaban.
En la mayoría de los casos, el usuario tenía que esperar hasta que se crearan nuevos bloques para que sus transacciones se llevaran a cabo.
Esto creó un retraso en las transacciones, de hecho, la única manera de priorizar sus transacciones, fue pagar una comisión de transacción lo suficientemente alta como para atraer e incentivar a los mineros para darles prioridad.
Esto introdujo el sistema de ‘reemplazo por comisión’. Básicamente, así es como funciona.
Supongamos que Ana está enviando 5 bitcoins a Bill, pero la transacción no se realiza debido a un retraso.
Ella no puede borrar la transacción porque los bitcoins una vez gastados, nunca pueden ser devueltos.
Sin embargo, Ana puede realizar otra transacción de 5 bitcoins con Bill, aunque esta vez, con comisiones de transacción lo suficientemente altas como para incentivar a los mineros.
A medida que los mineros pongan su transacción en el bloque, también sobrescribirá la transacción anterior y la anulará.
Si bien el sistema de ‘reemplazo por comisión’ es rentable para los mineros, es un inconveniente para los usuarios que pueden no ser tan generosos.
De hecho, aquí vemos un gráfico del tiempo de espera que un usuario tiene que pasar si pagó las comisiones mínimas de transacción posibles:
Si pagas las comisiones de transacción más bajas posibles, tendrás que esperar un tiempo medio de 13 minutos para que tu transacción se complete.
Una posible solución que se pensó para acelerar las transacciones fue la presentación de la Red Lightning.
La red Lightning
La red Lightning es un sistema de micropagos por fuera de la blockchain que está diseñado para hacer que las transacciones funcionen más rápido dentro de la blockchain.
Fue conceptualizado por Joseph Poon y Tadge Dryja en su whitepaper, y tenía como objetivo resolver el límite del tamaño de bloque y de los problemas en el retraso de la transacción. Opera sobre Bitcoin y generalmente se denomina ‘Capa 2’.
La red permitirá a Ana y a Bill realizar transacciones entre ellos sin que una tercera parte, incluso los mineros, los mantengan cautivos.
Para activar esto, la transacción debe ser firmada por Ana y Bill antes de que se emita en la red.
Esta doble firma es crítica para que la transacción se realice. Sin embargo, aquí es donde enfrentamos otro problema.
Como la verificación doble depende en gran medida del identificador de transacción, si por algún motivo se cambia el identificador, esto causará un error en el sistema y la red Lightning no se activará.
En caso de que te preguntes cuál es el identificador, es el nombre de la transacción, también conocido como el hash de las transacciones de entrada y salida, en el ejemplo que se ha mencionado antes como el identificador de transacción.
Ahora, te preguntarás, ¿Qué causaría que cambie el identificador de transacción? Esto nos lleva a un error interesante en el sistema de Bitcoin denominado ‘Maleabilidad de transacciones’.
¿Qué es la maleabilidad de una transacción?
Antes de que puedas comprender qué es la maleabilidad de transacciones, es importante recapitular una de las funciones más importantes en el modelo cripto-económico: el hash.
Para darte una breve descripción general, una función de hash puede tomar cualquier entrada de cualquier longitud, pero la salida que da siempre es de una longitud fija.
Sin embargo, hay otra función importante del hash que necesitarás saber para comprender y se llama ‘error de maleabilidad de la transacción’.
Cualquier pequeño cambio en los datos de entrada cambiará drásticamente el hash de salida.
Por ejemplo, puedes verificar esta prueba que se ha realizado con el algoritmo SHA-256, conocido como el algoritmo hash utilizado por Bitcoin:
¿Viste eso? ¡Acabamos de cambiar la letra T de mayúscula a minúscula y verás lo que pasó a la salida!
Una cosa más que tienes que entender acerca de la cadena de bloques es que es inmutable, lo que significa que una vez que los datos se han insertado en un bloque, nunca más se podrán cambiar.
Si bien esto demuestra una red de alta seguridad contra la corrupción, hubo una debilidad que nadie vio venir.
¿Qué pasa si los datos fueran manipulados antes de que ingresaran al bloque? Incluso si los usuarios se enteraran más tarde, ¡No había nada ni nadie que pudiera hacer al respecto porque los datos una vez ingresados en un bloque nunca se pueden eliminar!
Eso en esencia es por qué la maleabilidad de una transacción es un problema. Ahora, ¿Por qué ocurre la maleabilidad de las transacciones?
Resulta que la firma que acompaña a los datos de entrada se puede manipular, lo que a su vez puede cambiar la identificación de la transacción.
De hecho, puede que parezca que la transacción ni siquiera ocurrió en primer lugar. Veamos esto en un ejemplo.
Supongamos que Bill quiere que Ana le envíe 3 BTC.
Ana inicia una transacción de 3 BTC a la dirección pública de Bill y luego la envía a los mineros para su aprobación.
Mientras la transacción está en lista de espera, Bill utiliza la maleabilidad de transacciones para alterar la firma de Ana y cambiar la identificación de la transacción.
Ahora existe la posibilidad de que esta transacción manipulada sea aprobada antes de que Ana sea aprobada, lo que a su vez sobreescribe la transacción de Ana.
Cuando Bill consigue sus 3 BTC, simplemente puede decirle a Ana que no los recibió.
Luego, Ana verá que su transacción no se realizó y lo reenviará.
Como resultado, Bill terminará con 6 BTC en lugar de 3 BTC.
Así es como la maleabilidad de las transacciones puede funcionar y este es un problema serio.
Mira esta gráfica a continuación:
Estas son estadísticas del ataque de maleabilidad de 2015 con Bitcoin.
Las líneas rojas representan aproximadamente las transacciones mal hechas en la red.
Ahora, ¿Recuerdas lo que se ha mencionado al principio? La maleabilidad de una transacción estaba sucediendo porque los datos de la firma eran templables.
Por lo tanto, no solo los datos de la firma consumían espacio en el bloque, sino que también representaban una amenaza grave con la maleabilidad.
El Segwit y las cadenas laterales
Las cadenas laterales como concepto, han estado en los círculos de Bitcoin desde hace bastante tiempo.
La idea es muy directa, tienes una cadena paralela que corre junto con la cadena principal.
La cadena lateral se unirá a la cadena principal a través de un punto de dos vías.
Esto es lo que parecía ser la idea principal de Blockstream sobre la blockchain principal de Bitcoin y la cadena lateral:
Lo que el Dr. Wiulle pensó fue simple ¿Por qué no agregar una característica a esta cadena lateral?
Esta característica incluiría los datos de firma de todas las transacciones, separándolas en el proceso de la cadena principal.
Esta característica se llamaría Witness Segregated.
Así es como se vería un bloque, una vez que se implementa en el SegWit:
De esta manera, al eliminar los datos de firma de las transacciones, se matan dos pájaros de un tiro, el espacio del bloque se vacía y las transacciones se vuelven maleables.
Sin embargo, había una cosa más que necesitaba ser trabajada.
La activación del SegWit solo fue posible a través de un Hard Fork, que era lo que todos querían evitar.
Los desarrolladores querían ver alternativas a través de un Soft Fork.
El SegWit como Soft Fork
Para utilizar el SegWit como un Soft Fork, los desarrolladores tuvieron que proponer dos ingeniosas innovaciones:
- Organizar los datos de la firma en las cadenas laterales en forma de un árbol de Merkle
- Guardar una parte de los datos de firma en una nueva parte del bloque
Antes de continuar, realicemos un breve repaso de los árboles de Merkle.
El árbol de Merkle
El diagrama de arriba muestra cómo es un árbol de Merkle.
En un árbol de Merkle, cada nodo sin hoja es el valor hash de sus nodos secundarios.
- Nodos hoja: son los nodos del nivel más bajo del árbol. En el diagrama de arriba, los nodos hoja son los bloques L1, L2, L3 y L4.
- Nodos secundarios: son los nodos debajo de su nivel alimentados por sus nodos secundarios. En el diagrama, los nodos etiquetados como ‘Hash 0-0’ y ‘Hash 0-1’ son los nodos secundarios del nodo etiquetado como ‘Hash 0’.
- Nodos raíz: el nodo individual del nivel más alto etiquetado como ‘Hash Superior’ es el nodo raíz, también conocido como Raíz de Merkle.
Todas las transacciones dentro de un bloque se organizan en forma de este árbol, y la raíz de todos los datos se guarda dentro del bloque.
Se puede acceder a todas las transacciones atravesando la raíz de Merkle.
Entonces, ¿Qué sugirieron los desarrolladores de Segwit? ¿Por qué no ejecutar otro árbol de Merkle, pero solo con los datos de firma? Esa fue la primera innovación.
La segunda innovación fue saber exactamente dónde poner la raíz de Merkle con los datos de la firma.
Los desarrolladores sabían que para activar la bifurcación del SegWit, la raíz de la firma debía colocarse en el bloque.
El lugar que eligieron fue el punto de transacción de Coinbase.
Ahora recuerda, como se ha mencionado antes, la transacción de Coinbase es la primera transacción que tiene lugar en un bloque, esta es básicamente la transacción que le otorga a los mineros su recompensa y no tiene ningún valor de entrada de ningún tipo.
Lo que los desarrolladores no se dieron cuenta fue que al hacerlo, sin darse cuenta tropezaron con algo que tendría repercusiones mucho más amplias.
Al colocar la firma de Merkle en un nuevo lugar en el bloque, fueron aumentando cada vez más su tamaño, ¡Sin aumentar el límite del tamaño de bloque en primer lugar!
Así que básicamente, lo que lograron fue que aumentaron el tamaño de bloque e hicieron que toda la transición fuera compatible con versiones anteriores, también conocido como el Soft Fork.
Este fue un avance importante que le dio a la red de Bitcoin una solución temporal para sus problemas de escalabilidad.
Beneficios del SegWit
A continuación destacamos las ventajas y beneficios más importantes del SegWit:
- Aumento de capacidad: al separar las firmas de transacción, SegWit permite más transacciones para ser encajadas en un bloque, lo que aumenta la capacidad de la red y reduce la congestión.
- Reducción de costos: al reducir el tamaño de las transacciones, SegWit disminuye las tarifas de transacción. Las tarifas más bajas hacen que Bitcoin sea más accesible para microtransacciones promoviendo una mayor adopción.
- Solución de maleabilidad: resuelve un problema conocido en Bitcoin como ‘Maleabilidad’. La maleabilidad de una transacción significa que su identificador único puede ser alterado sin cambiar su contenido. SegWit soluciona este problema al separar los identificadores de transacción de las firmas, evitando así la maleabilidad.
- Posibilidad de mejoras futuras: la implementación de SegWit ha abierto la puerta a mejoras adicionales en el protocolo de Bitcoin. Ahora es posible agregar nuevas características sin afectar la compatibilidad con versiones anteriores.
Impacto en el ecosistema de Bitcoin
Desde su implementación, SegWit ha tenido un impacto significativo en el ecosistema de Bitcoin.
Su adopción ha sido gradual pero constante. Muchos proveedores de carteras y exchanges han actualizado sus sistemas para ser compatibles con SegWit, lo que ha llevado a un aumento en la cantidad de transacciones que utilizan esta tecnología.
A medida que más usuarios la adopten, se espera que los beneficios de escalabilidad y eficiencia se amplifiquen aún más.
Una de sus principales ventajas es la reducción de las tarifas de transacción. Antes de su implementación, las tarifas de transacción con Bitcoin eran notoriamente altas, especialmente durante los períodos de congestión en la red.
Con SegWit, los usuarios pueden optar por utilizar direcciones de SegWit (comenzando con ‘bc1’), lo que les permite disfrutar de tarifas de transacción considerablemente más bajas en comparación con las direcciones tradicionales de Bitcoin.
Además, SegWit ha proporcionado una solución para el problema de maleabilidad de las transacciones con Bitcoin.
Antes del SegWit, la maleabilidad permitía que un tercero modificara el identificador único (hash) de una transacción, lo que podía causar confusión y dificultades en la implementación de soluciones de segunda capa, como la Red Lightning.
Con SegWit, los identificadores de transacción son inmutables, lo que mejora la seguridad y permite el desarrollo de aplicaciones más seguras y confiables en la capa de Bitcoin.
Otro beneficio es que allana el camino para futuras mejoras en el protocolo de Bitcoin.
Al separar las firmas de transacción, se abren posibilidades para agregar nuevas características y funcionalidades sin la necesidad de un hard fork.
Esto permite una mayor flexibilidad y adaptabilidad en el desarrollo de Bitcoin a medida que evoluciona con el tiempo.
Sin embargo, es importante tener en cuenta que SegWit no es la única solución para los desafíos de escalabilidad en Bitcoin.
Existen otros enfoques, como el aumento del tamaño de bloque y el desarrollo de soluciones de segunda capa, que también se han explorado en la comunidad de Bitcoin.
Estos enfoques pueden complementar a SegWit y juntos contribuir a una red más eficiente y escalable.
En conclusión, Segregated Witness ha sido una actualización clave en el protocolo de Bitcoin que ha abordado los desafíos de escalabilidad y eficiencia.
Al separar las firmas de transacción, ha aumentado la capacidad de la red y ha reducido sus tarifas, convirtiéndola en una solución valiosa para mejorar la experiencia de usuario y promover una mayor adopción de Bitcoin.
A medida que más participantes de la red adopten SegWit, es probable que sus beneficios se amplifiquen y se abran nuevas oportunidades para el desarrollo y la evolución del ecosistema de Bitcoin en el futuro.