Entendiendo Blockchain

Desde hace relativamente poco tiempo, el mundo del blockchain ha aparecido como una tecnología disruptiva que está llamada a realizar cambios en el sistema de seguridad en gestión de transacciones.

Todo sistema de seguridad informático, o al menos la gran mayoría, se basan en problemas matemáticos de difícil solución, y blockchain no iba a ser menos, así que vamos a tratar de explicar la relación de una base de datos y los algoritmos matemáticos.

Para empezar diremos que blockchain como su propio nombre indica es un sistema de cadena de bloques consecutivos que todos asimilan a un libro contable tradicional, ya que los bloqueas van “contabilizando” las transacciones que se van realizando.

Supongamos que tenemos una cadena de bloques con la siguiente situación y cada bloque tiene una información independiente pero consecutiva

Y tenemos una red donde la base de datos está distribuida en tantos nodos como aquellos que participan en los retos matemáticos que existen en blockchain. En este caso y para simplificarlo vamos a crear una red mayada de 6 nodos

En esta red, todos los nodos están conectados con todos de forma bidireccional, con lo que podemos calcular el número de conexiones (aristas) de los nodos con la siguiente fórmula matemática nodos(nodos-1)/2, en este caso sería 6(6-1)/2 = 15

En esta situación vamos a suponer que hay varios usuarios utilizando la cadena de bloques y quieren realizar una transacción nueva donde el usuario A tiene 10 botellas, el B 5 y el C solo 1

El usuario A quiere traspasa 4 botellas al usuario C y queremos que esta transacción se guarde, esto representa algunos problemas que podemos expresarlo en preguntas (hay que aclarar que aunque en este caso solo vamos a guardar una transacción, en un bloque de datos se pueden guardar varias transacciones seguidas).

1.- ¿Cómo garantizamos el orden de los bloques?

2.- ¿Cómo garantizamos la integridad de los datos?

3.- ¿Cómo evitamos la colisión de información?

Vamos a ir contestando estas preguntas explicando el funcionamiento de una red de blockchain.

Lo primero que tenemos que saber para ello es que es un HASH, un HASH es una cadena de datos que han sido transformadas mediante un algoritmo, si quisiéramos hacer referencia al sistema  más famoso que utiliza blockchain como base donde se guarda la información, hablaríamos de Bitcoins, esta red utiliza el algoritmo SHA256 para securizar sus transacciones.

El algoritmo SHA256 fue diseñado por la NSA en los años 2001 como estándar federal de procesamiento de la información.

Una de las características del algoritmo SHA256 es que convierte todo un texto en una cadena de caracteres de una misma longitud, esta cadena de caracteres es el HASH.

Y el HASH de esta última frase sería: 

E5A32EC10292ABB938ABD978DE25A2516C413CD71D5B14B22CB6B40400D53027

Pero si cambiamos un solo dato de la cadena como puede ser el último punto, el HASH cambia

C3A2F3E77062AF4D4A7504253137AFB7303DE4274721952FDD5519279ACC3746

Para realizar este cálculo se ha utilizado esta web pública que realiza el algoritmo SHA256 sobre un texto cualquiera

https://passwordsgenerator.net/sha256-hash-generator/

Por lo que podríamos comprobar sin problema si se ha variado un texto o mensaje inicial comprobando si el HASH coincide con el texto o mensaje.

Pero ¿es seguro este algoritmo? La respuesta es sí, ya que no es reversible y aunque capturen el HASH no podrían ver la información original con solo esa información, esto hace que solo se pueda atacar por fuerza bruta.

Hoy en día, la mayoría de los lenguajes de programación tienen implementado este algoritmo con una función directa sin necesidad de programar demasiado

Phyton

>>> import hashlib
>>> m = hashlib.sha256()
>>> m.update(b"Nobody inspects")
>>> m.update(b" the spammish repetition")
>>> m.digest()
b'\x03\x1e\xdd}Ae\x15\x93\xc5\xfe\\\x00o\xa5u+7\xfd\xdf\xf7\xbcN\x84:\xa6\xaf\x0c\x95\x0fK\x94\x06'
>>> m.digest_size
32
>>> m.block_size
64

https://docs.python.org/3/library/hashlib.html

Java

MessageDigest digest = MessageDigest.getInstance(«SHA-256»);

byte[] encodedhash = digest.digest(

  originalString.getBytes(StandardCharsets.UTF_8));

private static String bytesToHex(byte[] hash) {

    StringBuffer hexString = new StringBuffer();

    for (int i = 0; i < hash.length; i++) {

    String hex = Integer.toHexString(0xff & hash[i]);

    if(hex.length() == 1) hexString.append(‘0’);

        hexString.append(hex);

    }

    return hexString.toString();

}

y otros como .Net

https://docs.microsoft.com/es-es/dotnet/api/system.security.cryptography.sha256?view=netframework-4.7.2

Se puede ver una extensa información sobre SHA2 en la url

https://es.m.wikipedia.org/wiki/SHA-2

Pero si alguien se pregunta si se puede realizar el cálculo a mano podéis ver este video donde se demuestra cómo se realiza el algoritmo SHA256 a mano

EXPLICAR EL RETO MATEMÁTICO

Una vez que sabemos que es un HASH, podemos decir en que parte se componen un bloque de la base de datos

La cabecera está compuesta por un HASH que se calcula con el valor del anterior nodo,  en el ejemplo que hemos puesto tendríamos que escribir el bloque número 7 y se calculará el HASH de la cabecera con el HASH que sale de utilizar el algoritmo SHA256 sobre los datos del bloque 6 (todos los datos contenidos en el bloque), y esto da contestación a la primera respuesta,  se lee el último bloque escrito y se obtiene la siguiente cabecera.

De esta forma si un nodo quisiera modificar los datos del bloque 2 por ejemplo, el HASH de los bloques siguientes no sería válido, ya que tendríamos que aplicar el algoritmos SHA256 a todos los siguientes bloques, en este caso del 3 al 6, y se demostraría que los datos han sido manipulados, como la base de datos está distribuida en todos los nodos y ha sido solo un nodo el que lo ha modificado, el resto de los nodos rechazará esta modificación y volverá a re-escribir los datos del nodo modificado con el consenso del resto de los nodos.

Para romper el consenso hay que manipular la mitad de los nodos +1 o à (nodos/2) + 1 esto es la regla del 51%, en una red de 6 nodos sería viable un ataque, pero si imaginamos una red de 1.000 nodos ya sería muy complicado atacar a la mitad de ellos simultáneamente, y así exponencialmente a 10.000, 100.000 o más.

Para entenderlo de forma rápida, la red blockchaing asume el siguiente principio “si el 51% de los nodos de la red toman algo por cierto, el recto de los nodos lo toman como cierto”

Aunque en teoría este ataque podría ser cierto, veremos como en la práctica el coste real de realizar un ataque en este sentido tiene un coste tan elevado que no merece la pena.

Con lo que ya hemos respondido a las dos primeras preguntas y ahora vamos a por la tercera y quizás la más interesante de todas, como evitamos la colisión de la información.

Hay varios sistemas, pero en este caso vamos a explicar el que utiliza bitcoins que se denomina Proof Of Work (POW) o prueba de trabajo

En que consiste la prueba de trabajo propuesta por bitcoins, pues en un reto matemático que de forma sencilla nos dice que si tenemos un algoritmo SHA256, donde es un dato de 256 bits, queremos que halles el HASH de la cabecera del siguiente bloque que empiece por n número de 0

En este ejemplo solicitamos un HASh que sus primero ocho números sean ocho ceros, y ¿cómo podemos calcularlo? Pues la respuesta es que no se puede, simplemente  empiezan a realizar prueba error añadiendo datos a la 3 parte del bloque hasta que por casualidad uno de los nodos que están haciendo los cálculos de forma simultáneamente lo encuentra y se lo comunica al resto de los nodos, se verifica que sea cierto y así se pasa a escribir el bloque número 7 que es retransmitido a todos los nodos para que se pueda crear el bloque número 8 con el HASH que se volverá a calcular gracias al anterior bloque que acabamos de escribir.

Por si alguien le parece fácil o sencillo podemos mostrar el gráfico donde se ver el nivel de dificultad y las transacciones de un día

https://www.blockchain.com/es/charts/difficulty

Para que nos hagamos una idea del número de HASH y la capacidad de computación por segundo que se está utilizando para encontrar el reto matemático

https://www.blockchain.com/es/charts/hash-rate

Cuantos más nodos están realizando cálculo más nivel de dificultad se añade al HASH.

Por este último punto, realizar el ataque del 51% no tiene sentido por el coste, no solo por modificar un dato en un momento dado, sino porque habría que recalcular todos los demás datos de la red siguientes al dato modificado, y con el coste computacional, aparte de convencer al 51% de los nodos para realizar una modificación, habría que recalcular todos los HASH.

Vamos a ver el mapa de nodos aproximadamente que hay

https://bitnodes.earn.com/

Si realizamos el cálculo veremos que actualmente hay una red con conexiones increíble, apliquemos la formula nodos(nodos-1)/2 à 10.339(10.338)/2=53.442.291, de esta cifra de conexiones (aristas) se puede comprobar la maravilla tecnológica y de interconexión que es la red blockchain y lo difícil que sería romper la seguridad del bitconint en este caso.

BIBLIOGRAFÍA

Todas las direcciones web ya mencionadas en el documento y las siguientes fuentes de información

https://www.coincrispy.com/2018/03/03/proof-of-work-stake-pow-pos/

https://en.bitcoin.it/wiki/Proof_of_work

https://academy.bit2me.com

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *