Marzo de 2018

Volumen 33, número 3

Cadena de bloques: aspectos básicos de la cadena de bloques

Por Jonathan Waldman | Marzo de 2018

En 1999, la red para compartir archivos Napster permitió compartir archivos de audio (normalmente, de música) en una red híbrida de punto a punto (híbrida porque usaba un servidor de directorio central). Esa red para compartir archivos permitía más cosas, además de compartir archivos de música: permitía a los usuarios conservar copias de los archivos compartidos de modo que un solo activo digital generara un número ilimitado de copias perfectas en una red global. La facilidad con que cualquier usuario con un equipo podía utilizar esta tecnología pilló a la respetada Tower Records por sorpresa y en 2006 ya se había visto obligada a cerrar sus 89 tiendas de EE. UU.

En 2008 se produjo la debacle de las hipotecas de alto riesgo, durante la cual influyentes instituciones financieras y empresas aseguradoras de EE. UU. bien consolidadas declararon la bancarrota o estuvieron a punto de hacerlo. Dichas circunstancias requerían una intervención gubernamental federal inmediata a fin de evitar un colapso financiero nacional y, posiblemente, internacional. Este importante evento dejó una población recelosa de los bancos centralizados y expuso el peligro de tener libros de contabilidad financiera cerrados al escrutinio público. En marzo de 2008, la vulneración de datos de Heartland Payment Systems expuso más de 130 millones de números de tarjetas de crédito, muchos de los cuales se utilizaron después para hacer compras fraudulentas.

Estos eventos ponen de manifiesto los peligros de vivir en un mundo digital conectado que depende de intermediarios que generan comisiones de transacción y deja a la gente expuesta a las vulnerabilidades digitales, la avaricia y los delitos. El reto académico fue cómo crear una infraestructura digital disponible y sin intermediarios que permitiera transferir de modo abierto y confiable (en lugar de copiar y compartir) un activo digital entre distintos propietarios, que no tuviera una autoridad central corrompible ni falible, y que fuera segura y de confianza.

Creación de la cadena de bloques de Bitcoin

En aparente respuesta al contexto histórico en que sucedió, el 3 de enero de 2009, un nuevo tipo de infraestructura produjo 50 monedas digitales y las registró en un libro de contabilidad público a prueba de manipulación que está replicado en una red punto a punto descentralizada de equipos conectados a Internet. Estas 50 unidades de criptomoneda, llamadas bitcoins, se registraron como el bloque de génesis: el primer vínculo de lo que se acabaría conociendo como cadena de bloques de Bitcoin.

Lo más destacable de esta criptomoneda con tecnología de cadena de bloques es que no existe ninguna institución ni autoridad de confianza (como un banco o gobierno) que valide cada transacción. Además, elimina la intermediación de las transacciones, lo que hace posible transferir monedas digitales internacionalmente mediante una red global sin intermediarios como agentes o agencias. Debido a su dependencia de la criptografía moderna, los datos que contiene la cadena de bloques están a prueba de manipulación y se basan en seudónimos. Además, dado que cada cadena de bloques se replica en cada nodo que comprende su red punto a punto, no existe ningún punto único de error, lo que hace que la tecnología esté disponible y sea fiable.

Desde el lanzamiento de Bitcoin, las tecnologías de cadenas de bloques no han parado de madurar rápidamente. Los detalles de su implementación varían drásticamente, lo que hacen que el estudio de cadenas de bloques sea dinámico, amplio y complejo. De hecho, el término “cadena de bloques” ya no se aplica solo a Bitcoin en concreto ni a las criptomonedas en general. Las cadenas de bloques se están refinando y perfeccionando para que funcionen de un modo más rápido e inteligente. De hecho, algunas tecnologías de cadena de bloques permiten la creación de scripts para admitir contratos inteligentes, lo que permite aplicar reglas personalizadas a las transacciones. De este modo, las cadenas de bloques se han transformado en un nuevo tipo de tecnología de almacenamiento programable a prueba de hackers. Este es el motivo por el que los profesionales de TI, empresas e instituciones financieras, entre otros, están reclamando poder utilizar su auténtico potencial.

Si se ha mantenido al margen de la cadena de bloques, ha llegado la hora de ponerse al día. En este artículo introductorio, no se pueden abarcar los pequeños detalles técnicos de una tecnología de cadena de bloques concreta, ya que cada una tiene sus propias reglas, características y personalizaciones. Sin embargo, las ideas que expondré aquí le ayudarán a comprender los principales pilares técnicos en que se basan muchas tecnologías de cadena de bloques.

Funcionamiento de las cadenas de bloques

La cadena de bloques de Bitcoin es el primer ejemplo práctico de tecnología de cadena de bloques. Debido a esa distinción, a menudo se confunde “cadena de bloques” como sinónimo de Bitcoin. Sin embargo, las ofertas de tecnología de cadena de bloques modernas hacen un seguimiento de otros activos digitales, además de monedas digitales, y esas cadenas de bloques tienen un funcionamiento bastante distinto del de la cadena de bloques de Bitcoin. Además, la cadena de bloques de Bitcoin popularizó la noción de que una cadena de bloques es una estructura de datos que virtualiza un libro de contabilidad bancario haciendo un seguimiento de los créditos y los débitos al mismo tiempo que ofrece una solución criptográfica creativa que impide de forma eficaz el doble gasto de unidades de criptomoneda. Por este motivo, los términos “libro de contabilidad digital” y “doble gasto” están asociados a las cadenas de bloques de criptomonedas. Sin embargo, en general, estos términos se aplican, respectivamente, al seguimiento de la propiedad y la aplicación de una única transferencia de activos digitales. Cuando vea esta términos, no asuma que se refieren únicamente a tecnologías de cadena de bloques orientadas a criptomonedas.

Básicamente, una cadena de bloques es una estructura de datos a prueba de manipulación que hace un seguimiento de algo de valor o interés a medida que cambia de propietario. Ese “algo” puede ser cualquier tipo de activo digital, como una moneda digital, un documento de Word o el número de serie de una tableta Microsoft Surface. De hecho, se puede hacer el seguimiento en una cadena de bloques de cualquier elemento que se pueda asociar con una huella digital única. Las cadenas de bloques resuelven el problema del llamado “doble gasto” al requerir que la propiedad de un activo digital se transfiera, en lugar de copiarse o compartirse. Pero lo que hace interesante la tecnología de cadena de bloques es que establece un protocolo, aplica reglas de transacciones y permite que los nodos de su red distribuida de equipos autocontrolen toda la operación. Además, consigue este logro destacable sin un servidor central ni una autoridad de confianza, de una manara rápida y global (es decir, internacionalmente). Esta promesa entusiasma a quienes la ven como una manera de eliminar intermediarios, y reducir o eliminar las comisiones por transacción de modo que el comercio resulte más eficiente tanto para las empresas como para los consumidores.

Componentes principales de la cadena de bloques

La red de la cadena de bloques de Bitcoin es pública: cualquier persona de cualquier parte del mundo puede participar. Sin embargo, las nuevas ofertas de la cadena de bloques, como la cadena de bloques hospedada por Microsoft Azure, se pueden configurar como redes públicas, privadas o con permisos. Las cadenas de bloques se consideran descentralizadas, pero este término requiere aclaración: Tal como explica Vitalik Buterin (bit.ly/2tEUYyT), que sean cadenas de bloques descentralizadas significa que están políticamente descentralizadas (nadie las controla) y arquitectónicamente descentralizadas (no existe ningún punto de error central de infraestructura), pero lógicamente centralizadas (existe un estado acordado de forma común y el sistema se comporta como un único equipo). La descentralización ofrece tolerancia a errores, y resistencia frente a ataques y conspiraciones (esto se aclara más adelante con la descripción de las pruebas de trabajo).

Para comprender la ingeniería de una cadena de bloques pública, se necesitan conocimientos de hashes criptográficos, criptografía de claves públicas (PKC), cadenas de hashes binarios (árboles de Merkle, en concreto) y algoritmos de consenso. Revisaré brevemente estos conceptos y, a continuación, mostraré que una cadena de bloques es una cadena de hashes que contiene una cadena de hashes de transacciones. Cuando comprenda el concepto de cadena de hashes anidados, comprenderá el diseño básico de la tecnología de las cadenas de bloques.

Hashes criptográficos Aunque hay muchas variantes de algoritmo de hash criptográfico unidireccional, a menudo se usa SHA-256 (bit.ly/29kkpft), una función hash unidireccional que acepta un mensaje de hasta (264-1)/8 bytes y devuelve un valor hash de 32 bytes (64 caracteres hexadecimales) del intervalo de decimales de 0 a, aproximadamente, 1,16 x 1077. Para poner la magnitud de este número en perspectiva, una gota de agua contiene unos 5 x 1012 átomos, mientras que se calcula que el universo observable tiene entre 1078 y 1082 átomos. Al retocar cualquier carácter del mensaje y volver a calcular el valor de hash SHA-256, se genera un valor de hash completamente nuevo. (Para experimentarlo, visite onlinemd5.com y defina el tipo de suma de comprobación del texto o el archivo como SHA-256).

Con la misma entrada, el algoritmo SHA-256 siempre produce la misma salida de longitud fija. Respecto a las tecnologías de cadena de bloques, el valor de usar hashes criptográficos SHA-256 reside en que son lo suficientemente únicos como para servir de un tipo de huella digital al mismo tiempo que actúan como suma de comprobación. Además, las funciones hash unidireccionales, en la práctica, no se pueden descodificar. Considere el valor de SHA-256 para mi nombre: 8F12D83BA54AC0EA7687AD4AFDE5E258BBFF970AA8D60C6588381784C502CA8E. Con este valor de hash, no hay ninguna manera práctica de revertirlo algorítmicamente a mi nombre. (Una técnica de hacking aprovecha las tablas arcoíris que enumeran valores hash previamente calculados para cadenas comunes como “password”, pero eso no es invertir el hash algorítmicamente. Para evitar estas vulnerabilidades, se suele adornar la cadena a la que se debe aplicar el hash agregando una cadena aleatoria conocida como valor de “sal”).

Si no tiene ningún generador de SHA-256 a mano, considere la tabla de la Figura 1, que muestra cómo cadenas de distintas longitudes siempre producen un valor de hash hexadecimal de 64 dígitos, y que un pequeño cambio en cualquier cadena concreta produce un resultado totalmente distinto.

Figura 1 Aplicación de hash a cadenas de distinta longitud mediante el algoritmo SHA-256

Cadena de entrada Valor de hash SHA-256
m 62C66A7A5DD70C3146618063C344E531E6D4B59E379808443CE962B3ABD63C5A
M 08F271887CE94707DA822D5263BAE19D5519CB3614E0DAEDC4C7CE5DAB7473F1
M1 2D214CA69B86C255BE416D42CCA977A59B34A7492873105522C35015FAB806F0
M2 0892A10ECE1F933EE98F5D554601B28F8437801D1AA1B77799E4035DDCB6950C
Marzo 9D95A2CF0D7180B5089691163B188A7203B0CDE179346B8CFAA8AB6C2C3E6414
1 de marzo de 2018 767328E7367048FA9DB37354CFA43DBB1691E8330DB54D54F52C1A444CA2E680
2 de marzo de 2018 CCF33BF1C08B74EDE6A7C15C56EEC16269D83967670032ACDA6EE395361B7595

A veces, un valor de hash tiene doble hash, lo que significa que se vuelve a aplicar la función hash al primer hash mediante una segunda ronda del algoritmo SHA-256. Si aplico la función hash dos veces a los valores de la Figura 1, obtengo los resultados de la Figura 2.

Figura 2 Doble hash de los valores de la figura 1

Cadena de entrada Valor de doble hash SHA-256
m A5FCE7E78734EC317F83F9019C80FFAF2508689B06EFA02191495A7D21FECE9A
M 6F6DCF58526B0D29EE664A708A939B7CDAC124A6A8569FCACE46FEAD38868E2E
M1 6C5D08BE9FFBBABD24B5F19AFFE6590FD402D347A50B519A59D40E15DCC0A6CB
M2 B2307311CC5877D5A581EDC821F3BFD5F99EB4E3B1D1B4009D9545BCF07E2E1A
Marzo B5410E155022AE6EB22CA21FADEDE65F0F7296DE14CA1D7A720A4937BD23AA5D
1 de marzo de 2018 345DD725FEE80F8C5953A66C1495605E4ED01C4CE5AEF6C0A6D238999266A1A6
2 de marzo de 2018 3E85B3D910BA77F88ECD5E24D1396457C532C73B89C032DED9AD0CBB4D4D9794

Criptografía de claves públicas Recuerde que una de las principales funciones de una cadena de bloques es hacer el seguimiento de la propiedad de un activo digital. El activo digital en cuestión puede no tener ningún valor o tener un valor de muchos millones de dólares, de modo que la prueba de propiedad debe garantizar que no se pueda engañar al propietario. Para llevar a cabo esta prueba en el ámbito digital, las cadenas de bloques utilizan PKC, que permite al propietario firmar digitalmente su activo para demostrar que es el propietario y autorizar su transferencia. Al contrario de lo que sucede con el cifrado de clave simétrica, en que se usa una única clave privada (secreta) tanto para cifrar como para descifrar un mensaje, PKC usa un cifrado de clave asimétrica.

Dado que un algoritmo de validación de propiedad de activos digitales preciso resulta fundamental para las cadenas de bloques, se usa una estrategia de generación de par de claves públicas/privadas muy seguras que se basa en Elliptic Curve Digital Signature Algorithm (ECDSA). La magia de ECDSA es que crea claves más breves pero más seguras criptográficamente que las claves de la misma longitud que genera el algoritmo habitual: Digital Signature Authorization (DSA). Cuando lo necesitan, los usuarios acceden a una aplicación de software que usa ECDSA para generar el par de claves criptográficas. El usuario debe conservar una copia de seguridad de la clave privada porque dicha clave es necesaria para transferir o utilizar el valor que contiene un activo digital almacenado en una cadena de bloques. Si solo tiene acceso a la clave privada de un par de claves públicas/privadas, puede volver a generar la clave pública, ya que existe una relación matemática entre las dos claves. Pero la clave privada no se puede generar a partir de la clave pública, lo que significa que, si hace una copia de seguridad de una sola clave, debe asegurarse de que sea la clave privada.

Estas claves se suelen usar de una de dos maneras. El primer caso de uso (consulte la Figura 3) se da cuando quiere que alguien le envíe un mensaje cifrado que solo usted pueda abrir. Para hacerlo, dé a la otra persona su clave pública y pídale que la use para cifrar el documento mediante un software que aplique un algoritmo de cifrado y produzca un texto cifrado: la versión cifrada de su mensaje. A continuación, le enviará solo el texto cifrado. Dado que ha usado su clave pública para cifrar el documento, debe usar la clave privada correspondiente para descifrarlo.

Usar PKC para que alguien le envíe un documento/mensaje cifrado que solo usted pueda abrir
Figura 3 Usar PKC para que alguien le envíe un documento/mensaje cifrado que solo usted pueda abrir

El segundo caso de uso (consulte la Figura 4) tiene lugar cuando quiere cifrar un mensaje y demostrar que es suyo. Para hacerlo, use la clave privada para crear un texto cifrado del documento. A continuación, envíe el texto cifrado a otra persona. Esta persona usará su clave pública para descrifrarlo. Dado que solo su clave pública puede descifrar ese documento, el destinatario puede asumir que el documento se cifró con su clave privada y que, a menos que alguien haya robado su clave privada, el documento procede de usted.

Usar PKC para enviar a alguien un documento/mensaje cifrado para asegurarle que usted es el remitente
Figura 4 Usar PKC para enviar a alguien un documento/mensaje cifrado para asegurarle que usted es el remitente

Un tercer caso de uso usa PKC para demostrar la propiedad de un activo digital a través de un proceso de firma digital. Para este caso de uso (vea la Figura 5), imagine que Bill ha redactado un documento de Word a partir de un documento legalmente vinculante que debe enviar por correo a Susan. Susan quiere estar segura de que la copia del documento que reciba de Bill procede, en realidad, de Bill y no se ha visto alterada durante el proceso de envío. En primer lugar, Bill crea un hash SHA-256 del documento de Word y registra el valor como H(W). A continuación, usa su clave privada para cifrar el hash del documento, lo que da como resultado Enc(H(W)). A continuación, envía el documento de Word (opcionalmente, se puede cifrar) y el valor Enc(H(W)) (la firma digital de Bill para el documento W) a Susan.

Usar PKC junto con un hash criptográfico para firmar digitalmente un documento/mensaje
Figura 5 Usar PKC junto con un hash criptográfico para firmar digitalmente un documento/mensaje

Susan vuelve a calcular el valor H(W) de la copia del documento de Word que recibió y usa la clave pública de Bill para descifrar el valor Enc(H(W)) (vea la Figura 6). Si el hash que Susan ha calculado es igual al valor descifrado H(W), Susan puede concluir que Bill firmó el documento y que la copia que recibió es exactamente la misma que firmó Bill.

Usar PKC junto con un hash criptográfico para verificar que la parte que se espera firmó un documento/mensaje
Figura 6 Usar PKC junto con un hash criptográfico para verificar que la parte que se espera firmó un documento/mensaje

Al utilizar código hash y PKC, una cadena de bloques mantiene el historial de la propiedad de activos digitales mediante transacciones. Los objetos de datos de transacción están vinculados entre sí y forman una estructura de datos denominada cadena de hash. Su funcionamiento es el siguiente: cada registro de transacción constituye el mensaje (m) al que se aplica el hash mediante la función (H) y, a continuación, se firma con la clave privada del propietario (s). (Se suele usar “s”, de “secreto”, para representar la clave privada a fin de no confundirla con la “p” de clave pública). Este proceso produce una firma (sig):

sig = signature(H(m), s)

Cuando se transfiere un activo digital de un propietario a otro, su firma digital se examina, verifica y firma digitalmente por parte del nuevo propietario. A continuación, se registra como nodo nuevo en la cadena de hash. Aunque los detalles de la implementación varían drásticamente entre distintas tecnologías y versiones de cadena de bloques, la idea básica es la misma para todas ellas. Por ejemplo, tal como se muestra en la Figura 7, Bill es el propietario de un activo digital y usa su clave privada para iniciar una transferencia del activo digital a Susan. El registro de transacción de Susan usa la clave pública de Bill para verificar su firma. Después, se usa la clave pública de Susan para firmar el activo digital, lo que convierte a Susan en su nueva propietaria. Esto crea un nuevo registro de transacción: un vínculo nuevo en la cadena de hash de transacción.

La cadena de hash de transacción usa firmas digitales para transferir la propiedad de un activo digital. Cada registro de transacción mantiene un vínculo de retroceso criptográfico a la transacción anterior de la cadena de hash.
Figura 7 La cadena de hash de transacción usa firmas digitales para transferir la propiedad de un activo digital. Cada registro de transacción mantiene un vínculo de retroceso criptográfico a la transacción anterior de la cadena de hash.

Esta cadena de hash de transacciones es criptográficamente segura y está a prueba de manipulación. Cualquier cambio en la transacción 0 haría que Sig0 cambiara, lo que requeriría una actualización al valor de hash almacenado en la transacción 1 y cada transacción subsiguiente de la cadena de hash.

Estos objetos de transacción se representan con datos. Los datos que contiene cada transacción varían para cada implementación de cadena de bloques, de modo que he resumido los datos subyacentes para nuestros fines porque el punto principal que se debe comprender es que la cadena hash es una cadena vinculada criptográficamente de transacciones, que están vinculadas por el valor hash del registro de transacción del propietario anterior. (En las cadenas de bloques de criptomonedas, cada objeto de transacción contiene una lista de entradas y salidas de moneda digital, junto con metadatos, como una marca de tiempo y una comisión de transacción opcional. Estas entradas y salidas de criptomoneda proporcionan los detalles de transacción necesarios para modelar un libro de contabilidad financiero de forma precisa).

Árboles de Merkle Algunas cadenas de bloques agrupan transacciones mediante otro tipo de cadena de hash: la cadena de hash binario o árbol de Merkle. Se hace referencia a un árbol de Merkle completo como una estructura de árbol binario porque crea una rama dos veces en cada nivel a partir de la raíz, como se muestra en la Figura 8.

Un árbol de Merkle es un tipo de árbol de hash binario que produce un hash de raíz de Merkle; esta estructura de datos puede agregar nodos hoja y calcular una nueva raíz de Merkle sin necesidad de requerir un nuevo cálculo completo
Figura 8 Un árbol de Merkle es un tipo de árbol de hash binario que produce un hash de raíz de Merkle; esta estructura de datos puede agregar nodos hoja y calcular una nueva raíz de Merkle sin necesidad de requerir un nuevo cálculo completo

La dificultad de configurar un árbol de Merkle radica en crear una serie de nodos hoja calculando el hash SHA-256 de los datos que contiene cada objeto de transacción (la cadena de bloques de Bitcoin aplica un doble hash a cada nodo de Merkle; el hash doble puede ayudar a reforzar el valor criptográfico del resultado del hash en caso de una detección de vulnerabilidad en el algoritmo SHA-256). El árbol de Merkle requiere un número par de nodos hoja: se suele duplicar el último nodo hoja si se empieza por un número impar. A continuación, se aplica el hash a cada par de nodos hoja conjuntamente y se produce un nuevo valor de hash. En la Figura 8, la hoja A muestra el hash de la transacción A como HP; la hoja B muestra el hash de la transacción B como HB y así sucesivamente. Este patrón se repite en cada nivel del árbol hasta que llega al nodo raíz final. El valor de hash del nodo raíz es la suma de hash criptográfico del resto de sumas de hash del árbol. Cualquier cambio en los datos de cualquier nodo hoja hace que el valor de hash de raíz del árbol de Merkle recalculado cambie.

La estructura de árbol de hash binario de Merkle tiene algunas ventajas. Por ejemplo, permite actualizar fácilmente los datos de una transacción y calcular un nuevo hash de raíz de Merkle sin tener que volver a generar todo el árbol de Merkle desde el principio. Por ejemplo, si la transacción E cambia (resaltada en la Figura 8), solo tiene que volver de forma eficiente a la raíz de Merkle calculando hashes nuevos una vez por cada nivel. Así pues, en primer lugar calcula el nuevo hash de hoja HE; a continuación, calcula HEF a partir de HE y HF; a continuación, calcula HEFGH a partir de HEFy HGH; a continuación, calcula un nuevo hash de raíz de Merkle a partir de HABCD y HEFGH. La actualización del hash de raíz de Merkle solo necesitó cuatro cálculos, en comparación con los 15 necesarios para crear el árbol de Merkle desde el principio.

Creación de una cadena de bloques

Para crear una cadena de bloques (consulte la Figura 9), el objeto de datos de cadena de hash binario que contiene transacciones se debe enviar de algún modo a un almacén de datos a prueba de manipulación que cualquier usuario pueda utilizar (recuerde, se trata de una cadena de bloques pública: cualquier nodo de la red puede leerla o escribir en ella). La estructura del árbol de Merkle contiene transacciones y está a prueba de manipulación, así que, aparentemente, podría servir como cadena de bloques. Pero existen varios problemas. Para que Bill envíe su activo digital a Susan, debe confiar en el servicio o sitio web que actúa como agente para procesar su solicitud de transferencia de activos digitales y debe confiar en el servidor que persiste la estructura de hash. Sin un nodo central que procese las transacciones nuevas ni una autoridad central en que delegar su procesamiento, cualquier nodo podría procesar la transacción pendiente de Bill. Un nodo no autorizado o dominante con una capacidad de procesamiento superior podría permitir transacciones no válidas o fraudulentas que se podrían propagar a nodos honestos. Para resolverlo, la red podría intentar asignar aleatoriamente un nodo para procesar la transacción de Bill, pero eso también centralizaría el control y requeriría confianza en que el generador de números aleatorios aplicara la aleatoriedad. Para eliminar este problema, las cadenas de bloques usan algoritmos de consenso, descritos a continuación.

La cadena de bloques está formada por bloques que, a su vez, incluyen árboles de hash de transacción; los bloques de la cadena de bloques se vinculan mediante un vínculo de retroceso a los bloques anteriores y se validan mediante un algoritmo de prueba de trabajo
Figura 9 La cadena de bloques está formada por bloques que, a su vez, incluyen árboles de hash de transacción; los bloques de la cadena de bloques se vinculan mediante un vínculo de retroceso a los bloques anteriores y se validan mediante un algoritmo de prueba de trabajo

Algoritmos de consenso Las tecnologías de cadena de bloques evitan problemas de almacén de datos centralizado y autoridades de confianza, ya que siguen un protocolo que indica cómo se agregan y mantienen los bloques. Para hacerlo, aplican un algoritmo de consenso de generación de cadena de bloques. Existen distintos tipos de algoritmo de consenso. A continuación, describiré el funcionamiento de los algoritmos de prueba de trabajo (PoW).

PoW se basa en la idea de que un nodo de la red debe demostrar sus buenas intenciones incurriendo en un costo y dedicando el tiempo necesario para resolver un problema complicado desde el punto de vista computacional. Para inducir a un nodo para que participe en dicho sistema y siga sus reglas, la red ofrece un incentivo (a menudo, dinero); es decir, se paga a los operadores del nodo por agregar un bloque a la cadena de bloques. Para ganar ese dinero, los nodos deben validar todas las transacciones (para asegurarse de que cumplen las reglas específicas de la cadena de bloques) y, a continuación, resolver un enigma criptográfico.

Anteriormente, mencioné que una autoridad central podría asignar un nodo aleatoriamente para procesar un lote de nuevas transacciones. Ese enfoque requeriría un generador de números aleatorio central, que podría tener errores, o se podría alterar o deshabilitar. Sin embargo, asignar a los nodos un enigma difícil de resolver tiene el efecto deseado: no se puede determinar con antelación qué nodo resolverá el enigma, lo que genera un tipo de lotería de nodos en la red. No se necesita ninguna autoridad central, lo que supone una de las innovaciones clave de las tecnologías de cadena de bloques. También mencioné que las cadenas de bloques están descentralizadas y, por este motivo, son resistentes a conspiraciones. Dado que PoW requiere tiempo y cuesta dinero en términos de trabajo computacional, es prácticamente imposible que un único nodo o grupo de nodos conspiren en la red y consigan una ventaja de creación de cadenas de bloques respecto a otros nodos del mismo nivel. (Hay un riesgo de “ataque del 51 por ciento” que sugiere que se puede producir una conspiración si un grupo de nodos consigue el 51 por ciento de trabajo computacional, pero el empleo de un algoritmo de consenso de PoW hace que la posibilidad de ese ataque no sea viable).

Para construir un bloque de transacciones, un nodo utiliza transacciones sin procesar almacenadas en la red y crea un árbol de Merkle para calcular el hash de raíz de Merkle. Por lo tanto, un bloque candidato contiene una lista de transacciones, además de un encabezado de bloque que incluye el valor de hash de raíz de Merkle, una marca de tiempo actual y el nivel de dificultad de PoW (algunas veces, incluso datos de encabezado adicionales). A continuación, debe resolver el enigma de PoW, que implica calcular un hash doble del valor completo de hash de bloque de 256 bits, buscar un número de 32 bits, llamado nonce, que se pueda concatenar a este para que el hash del número de 288 bits resultante produzca un resultado con un determinado número de ceros iniciales. El intervalo del nonce de 32 bits es de 0 a 232 (4,294,967,295), así que, en lugar de intentar adivinar el nonce, se suele empezar con un nonce 0, generar el hash SHA-256 y determinar si tiene el número de destino de ceros iniciales (es decir, el hash resultante es inferior a un valor de destino). Si no lo tiene, el nodo incrementa el valor del nonce y lo vuelve a intentar. Si el nodo intenta todos los valores de nonce y no resuelve el enigma, vuelve a calcular el valor de hash de bloque. Esto garantiza la producción de otro valor de hash de bloque, ya que se incluye una marca de tiempo del encabezado de bloque en el cálculo del hash de bloque. En cualquier momento, un nodo puede seleccionar otro lote de transacciones pendientes para incluirlas en el bloque nuevo (o agregar nuevas transacciones pendientes que puedan haber aparecido desde la última comprobación), lo que cambia el valor de hash de raíz de Merkle y, junto con la marca de hora, el valor de hash de bloque recién calculado. Cada vez que se vuelve a calcular el hash de bloque, el nodo itera de nuevo los más de 4000 millones de nonces.

Con el tiempo, algún nodo de la red resolverá su enigma criptográfico. Cuando lo haga, agregará el nuevo bloque al final de su copia de la cadena de bloques (cada nodo conserva una copia de la cadena de bloques) y transmitirá el nuevo bloque al resto de nodos de la red para que puedan actualizar su copia de cadena de bloques. Cuando un nodo transmite un bloque nuevo, el resto de nodos no se limita a confiar en que sea válido, sino que lo validan para comprobarlo. Para hacerlo, el nodo verifica la solución del enigma de PoW calculando el hash SHA-256 del bloque concatenado con el valor del nonce y comprueba que la respuesta produce un hash con el número de ceros iniciales que especifica el valor de dificultad de PoW del bloque.

Incidentalmente, en algunas cadenas de bloques, el protocolo ajusta continuamente el valor de dificultad de PoW para que los bloques nuevos se agreguen a la cadena de bloques con un intervalo de tiempo prescrito. Este ajuste continuo es necesario porque aparecen y desaparecen nodos en la red continuamente, de modo que la capacidad media computacional de los nodos nunca deja de cambiar. Recuerde que, en PoW, existe un incentivo por agregar bloques a la cadena de bloques, de modo que los administradores de nodos suelen fortalecer su hardware para competir por un premio. En la cadena de bloques de Bitcoin, el valor de dificultad cambia cada 2016 bloques para que se sigan agregando bloques con una velocidad media de 10 minutos por bloque.

En algunas ocasiones, se crean ramas. El motivo es que, en una red de gran tamaño, la propagación de bloques nuevos lleva tiempo. Es posible que, durante la propagación, otro nodo resuelva su enigma de PoW, agregue un bloque nuevo a su copia de la cadena de bloques y transmita la cadena de bloques a la red. Los nodos receptores siempre agregan un bloque válido a su copia de la cadena de bloques y, dado que cada bloque está vinculado al bloque anterior, si dos nodos distintos publican dos nuevos bloques, el resultado será una rama vinculada al mismo bloque al final de la cadena. Sin embargo, esto no supone ningún problema. Con el tiempo, los nodos agregan bloques nuevos al final de lo que el protocolo considera la “cadena más larga”. Por ejemplo, dada una rama, la cadena más larga podría definirse con la que tiene la marca de tiempo de bloque más reciente. Con el tiempo, una única rama prevalecerá con su longitud, los bloques de ramas abandonadas (más cortas) se quitarán y sus transacciones volverán al grupo de transacciones sin procesar.

Resumen

En este artículo, he mostrado cómo se construye una cadena de bloques pública compuesta de bloques vinculados criptográficamente, cada uno de los cuales contiene su propia cadena de hash de transacciones vinculadas criptográficamente, en una red punto a punto de nodos descentralizada. He tratado los aspectos básicos de las tecnologías de cadena de bloques e intentado no centrarme en una única implementación, sino en algunas de las características técnicas más típicas que comparten. Si quiere explorar el tema en mayor profundidad, le sugiero que elija una tecnología de cadena de bloques concreta, como Bitcoin, Ethereum o Ripple, y que intente controlar los detalles de su implementación particular. Si quiere experimentar con cadenas de bloques por su cuenta, eche un vistazo a las ofertas de cadenas de bloques hospedadas por Azure en bit.ly/2Gj2zaC.


Jonathan Waldman es un Microsoft Certified Professional que trabaja con las tecnologías de Microsoft desde su origen. Su especialidad es la ergonomía de software. Waldman es miembro del equipo técnico de Pluralsight y, actualmente, dirige proyectos de desarrollo de software del sector privado e institucional. Puede ponerse en contacto con él a través de la dirección jonathan.waldman@live.com.

 Gracias al siguiente experto técnico de Microsoft por revisar este artículo: James McCaffrey


Discuta sobre este artículo en el foro de MSDN Magazine