Blockchain: una introducción rápida

Me interesé en blockchains y comencé a buscar un tutorial relevante. Hay muchos tutoriales de blockchain (videos y blogs), pero encontré la mayoría de ellos o demasiado diluidos y caricaturescos o simplemente describiendo la mecánica de blockchains sin describir el fundamento de las decisiones de diseño.

Entonces, después de leer algunos de estos tutoriales, creo que finalmente logré comprender mejor qué problema están tratando de resolver las cadenas de bloques y cómo lo hacen. De ninguna manera soy un experto en el campo, pero decidí escribir este artículo porque:

Qué problema está tratando de resolver Blockchain

Supongamos que queremos crear una lista de cosas inmutables (por ejemplo, transacciones financieras) en las que todos pueden confiar en su inmutabilidad. Podemos escribir esta lista en una hoja de papel y dársela a una persona en quien confiamos. Cada vez que necesitamos agregar algo a la lista, le pedimos a la persona de confianza que agregue la nueva entrada a la lista.

Problemas con este enfoque:

Un enfoque distribuido donde la misma lista es mantenida por múltiples entidades parece una solución natural que no tiene los problemas mencionados anteriormente. Sin embargo, el enfoque distribuido tiene sus propios problemas:

Cómo Blockchain resuelve estos problemas

El objetivo es crear un bloque que contenga los datos (que queremos asegurarnos de que no sean manipulados) y metadatos que ayuden a que los datos sean a prueba de manipulaciones. Agregar un hash que se calcula en los datos por sí solo no protege los datos contra la manipulación porque un mal actor puede simplemente cambiar los datos y luego volver a calcular el hash basándose en los datos modificados y todo se verifica. Esto se muestra en la siguiente figura.

Ahora, suponga que agregamos otro campo de metadatos que es el hash calculado en el bloque anterior.

Después de vincular el bloque A y el bloque B como se muestra en la figura anterior, si un mal actor intenta modificar el campo de transacción en el bloque A, tiene que volver a calcular el hash del bloque A y, por lo tanto, el “hash del anterior “Campo del bloque B. Esto, a su vez, obliga al mal actor a volver a calcular el hash del bloque B también (tenga en cuenta que el hash del bloque B se calcula en el campo de transacción de B y el campo” hash del anterior “en el bloque B) . Por inducción, podemos ver que modificar el bloque A tiene un efecto dominó en los bloques que vienen después del bloque A.

Calcular un hash no es prohibitivamente caro, por lo que requerir volver a calcular los valores hash para lo que viene después del bloque A no es particularmente oneroso. En otras palabras, todavía no hemos logrado nuestro objetivo de hacer que los bloques sean inmutables. Con ese fin, se agrega otro campo, a saber, un campo Nonce, a cada bloque. El objetivo de incluir un campo Nonce es dificultar la manipulación de un gran conjunto de bloques.

Hacer las cosas intencionadamente difíciles

Nonce (también conocido como “Prueba de trabajo”) es un número de 32 bytes con la siguiente propiedad:

SHA256 (Transacción | Nonce | Hash_of_previous) = 00… 000xxxxxx

SHA256 es una función hash con propiedades deseables y se describe aquí. Aquí, el número de ceros iniciales se especifica mediante el protocolo de blockchain específico y se denomina “dificultad” del algoritmo de blockchain.

No existe una solución de forma cerrada para resolver esta ecuación para Nonce porque las funciones hash están diseñadas para ser unidireccionales (es decir, dada una entrada, es fácil calcular el valor hash, pero no es posible ir en la otra dirección y mal definido). La única forma de encontrar un valor de Nonce que satisfaga la ecuación anterior es probar diferentes valores de Nonce y examinar la salida del hash para asegurarse de que el valor hash tenga al menos el número deseado de ceros iniciales. Cuanto mayor sea el número requerido de ceros iniciales, más tiempo se necesita para encontrar un Nonce que satisfaga esta ecuación (de ahí el nombre “dificultad”). Para el protocolo Bitcoin, la dificultad se ajusta para que, en promedio, se tarden unos 10 minutos en encontrar dicho valor de Nonce.

A primera vista, el requisito de incluir un Nonce con la propiedad mencionada anteriormente puede parecer extraño. ¿Por qué queremos perder el tiempo de la computadora para calcular un Nonce con esta propiedad arbitraria? La respuesta está relacionada con lo que descubrimos en la sección anterior. Específicamente, recuerde que la manipulación de los datos en cualquier bloque obliga al mal actor a volver a calcular todos los valores hash para los bloques posteriores. Volver a calcular el hash de un bloque cambia la entrada a la función hash del bloque siguiente. Esto, a su vez, requiere que se calcule un nuevo valor de Nonce. Para una cadena de bloques larga, volver a calcular una gran cantidad de valores de Nonce que satisfagan la ecuación de “Prueba de trabajo” llevará mucho tiempo y consumirá una cantidad significativa de recursos informáticos.

Además, incluso si el actor malo logra volver a generar todos los valores de Nonce para los bloques subsiguientes, todavía necesita transmitir la cadena de bloques modificada a otras entidades que participan en la validación de la cadena de bloques. La aceptación de una nueva cadena de bloques se basa en el consenso, por lo tanto, el mal actor no logrará que se acepten los bloques manipulados.

En la práctica, un bloque en la cadena de bloques contiene un índice y un campo de marca de tiempo y ambos también son entradas para la función hash.

¿Qué es la minería?

Cuando un usuario envía una transacción para agregarla a blockchain (por ejemplo, Bob le dio a Alice dos Bitcoins), la transacción se agrega a una lista de transacciones no verificadas. Un proceso minero, toma algunas transacciones de esta lista y agrega una transacción adicional (como la primera transacción en el bloque) que recompensa al minero con una cierta cantidad de Bitcoins (por ejemplo, 12.5 BTC). Esta recompensa parece inusualmente generosa por aproximadamente 10 minutos de tiempo de computadora (que es la cantidad de tiempo promedio que se tarda en calcular el Nonce para un bloque). Pero, el sistema solo necesita un bloque válido y, por lo tanto, solo se aceptará el bloque del primer minero que construya el bloque y lo publique. La energía y el tiempo que consumen todos los demás mineros se desperdician.

Entonces, la verdadera recompensa minera son bitcoins de “12,5 * probabilidad_de_aceptación_de_bloques”. Dado que hay muchas granjas mineras con GPU muy rápidas, todas compitiendo para ganar esta recompensa por cada bloque, el valor esperado de esta recompensa minera es relativamente bajo y es posible que ni siquiera cubra el costo de la electricidad en la región donde ocurre la minería. Este sitio tiene una calculadora para calcular la rentabilidad minera.

Resumen

Ahora sabemos qué hacen las cadenas de bloques y cómo funcionan. Es muy fácil construir tu propia cadena de bloques experimentando con ella. Este es un gran tutorial en Python.