Entonces, ¿qué es realmente el hash?
TLDR:
- El hash es generar un valor o valores a partir de una cadena de texto utilizando una función matemática.
- El hash es una forma de habilitar la seguridad durante el proceso de transmisión de mensajes cuando el mensaje está destinado únicamente a un destinatario en particular. Una fórmula genera el hash, que ayuda a proteger la seguridad de la transmisión contra la manipulación.
Es importante saber cómo funciona blockchain Hashing. Sin embargo, para hacer eso, primero debemos comprender uno de los principios básicos que intervienen en la creación de blockchain. La tecnología Blockchain es uno de los descubrimientos más innovadores y que definen una era del siglo pasado. Viendo la influencia que ha tenido en los últimos años y el impacto que tendrá en el futuro, seguramente no es una exageración decir eso. Para comprender cómo funcionan varias criptomonedas como Ethereum y Bitcoin.
Entonces, ¿qué es el hash?
En términos simples, hash significa tomar una cadena de entrada de cualquier longitud y dar una salida de una longitud fija. En el contexto de las criptomonedas como bitcoin, las transacciones se toman como entrada y se ejecutan a través de un algoritmo hash (bitcoin usa SHA-256) que da una salida de una longitud fija.
Veamos cómo funciona el proceso de hash. Vamos a poner ciertos insumos. Para este ejercicio, usaremos SHA-256 (Secure Hashing Algorithm 256).
Como puede ver, en el caso de SHA-256, no importa cuán grande o pequeña sea su entrada, la salida siempre tendrá una longitud fija de 256 bits. Esto se vuelve crítico cuando se trata de una gran cantidad de datos y transacciones. Entonces, básicamente, en lugar de recordar los datos de entrada que podrían ser enormes, puede recordar el hash y realizar un seguimiento. Antes de continuar, primero debemos ver las diversas propiedades de las funciones hash y cómo se implementan en la cadena de bloques.
Funciones hash criptográficas
Una función hash criptográfica es una clase especial de funciones hash que tiene varias propiedades que la hacen ideal para la criptografía. Hay ciertas propiedades que una función hash criptográfica debe tener para ser considerada segura. Repasemos uno por uno.
Propiedad 1: determinista
Esto significa que no importa cuántas veces analice una entrada en particular a través de una función hash, siempre obtendrá el mismo resultado. Esto es fundamental porque si obtiene diferentes hashes cada vez, será imposible realizar un seguimiento de la entrada.
Propiedad 2: Computación rápida
La función hash debería ser capaz de devolver rápidamente el hash de la entrada. Si el proceso no es lo suficientemente rápido, el sistema simplemente no será eficiente.
Propiedad 3: Resistencia previa a la imagen
Los estados de resistencia previos a la imagen son que dado H (A) no es factible determinar A, donde A es la entrada y H (A) es el hash de salida. Observe el uso de la palabra “inviable” en lugar de “imposible”. Ya sabemos que no es imposible determinar la entrada original a partir de su valor hash. Tomemos un ejemplo.
Suponga que está tirando un dado y el resultado es el hash del número que sale de los dados. ¿Cómo podrá determinar cuál era el número original? Es simple, todo lo que tiene que hacer es encontrar los valores hash de todos los números del 1 al 6 y comparar. Dado que las funciones hash son deterministas, el hash de una entrada en particular siempre será el mismo, por lo que puede simplemente comparar los hash y averiguar la entrada original.
Pero esto solo funciona cuando la cantidad dada de datos es muy inferior. ¿Qué sucede cuando tienes una gran cantidad de datos? Suponga que está tratando con un hash de 128 bits. El único método que tiene para encontrar la entrada original es mediante el “método de fuerza bruta”. El método de fuerza bruta básicamente significa que debe seleccionar una entrada aleatoria, hacer un hash y luego comparar la salida con el hash de destino y repetir hasta que encuentre una coincidencia.
Entonces, ¿qué pasará si usa este método?
- En el mejor de los casos: obtiene su respuesta en el primer intento. En serio, tendrás que ser la persona más afortunada del mundo para que esto suceda. Las probabilidades de que esto suceda son astronómicas.
- En el peor de los casos: obtiene su respuesta después de 2 ^ 128 – 1 veces. Básicamente, significa que encontrará su respuesta al final de todos los datos.
- Escenario promedio: lo encontrará en algún lugar en el medio, así que básicamente después de 2 ^ 128/2 = 2 ^ 127 veces. Para poner eso en perspectiva, 2 ^ 127 = 1.7 X 10 ^ 38. En otras palabras, es un número enorme.
Entonces, si bien es posible romper la resistencia de la imagen previa a través del método de fuerza bruta, lleva tanto tiempo que no importa.
Propiedad 4: Pequeños cambios en la entrada Cambia el hash.
Incluso si realiza un pequeño cambio en su entrada, los cambios que se reflejarán en el hash serán enormes. Probémoslo con SHA-256:
¿Ves eso? Aunque acaba de cambiar el caso del primer alfabeto de la entrada, observe cuánto ha afectado al hash de salida. Esta es una función crítica porque esta propiedad de hash conduce a una de las mayores cualidades de la cadena de bloques, su inmutabilidad (más sobre eso más adelante).
Propiedad 5: Resistente a colisiones
Dadas dos entradas diferentes A y B donde H (A) y H (B) son sus respectivos valores hash, no es factible que H (A) sea igual a H (B). Lo que eso significa es que, en su mayor parte, cada entrada tendrá su propio hash único. ¿Por qué dijimos “en su mayor parte”? Hablemos de un concepto interesante llamado “La paradoja del cumpleaños”.
¿Qué es la paradoja del cumpleaños?
Si te encuentras con un extraño al azar en la calle, las posibilidades de que ambos tengan el mismo cumpleaños son muy bajas. De hecho, asumiendo que todos los días del año tienen la misma probabilidad de tener un cumpleaños, las posibilidades de que otra persona comparta su cumpleaños es 1/365, que es del 0,27%. En otras palabras, es realmente bajo.
Sin embargo, habiendo dicho eso, si reúne a 20-30 personas en una habitación, las probabilidades de que dos personas compartan exactamente el mismo cumpleaños aumentan astronómicamente. De hecho, hay una probabilidad de 50-50 de que 2 personas compartan el mismo cumpleaños en este escenario.
¿Por qué pasa eso? Es debido a una simple regla de probabilidad que es la siguiente. Suponga que tiene N posibilidades diferentes de que ocurra un evento, entonces necesita la raíz cuadrada de N elementos aleatorios para que tengan un 50% de probabilidad de colisión.
Entonces, aplicando esta teoría para los cumpleaños, tiene 365 posibilidades diferentes de cumpleaños, por lo que solo necesita Sqrt (365), que es ~ 23 ~, personas elegidas al azar para un 50% de probabilidad de que dos personas compartan cumpleaños.
¿Cuál es la aplicación de esto en hash?
Suponga que tiene un hash de 128 bits que tiene 2 ^ 128 posibilidades diferentes. Al usar la paradoja del cumpleaños, tiene un 50% de posibilidades de romper la resistencia a la colisión en la instancia sqrt (2 ^ 128) = 2 ^ 64th.
Como puede ver, es mucho más fácil romper la resistencia a colisiones que romper la resistencia de preimagen. Ninguna función hash está libre de colisiones, pero por lo general lleva tanto tiempo encontrar una colisión. Entonces, si está utilizando una función como SHA-256, es seguro asumir que si H (A) = H (B) entonces A = B.
Propiedad 6: Rompecabezas amigable
Ahora, esta es una propiedad fascinante, y la aplicación y el impacto que esta propiedad ha tenido en la criptomoneda son enormes (más sobre eso más adelante cuando cubramos la minería y los rompecabezas de criptomonedas). Primero definamos la propiedad, luego repasaremos cada término en detalle.
Para cada salida “Y”, si k se elige de una distribución con alta minientropía, no es factible encontrar una entrada x tal que H (k | x) = Y.
¡Eso probablemente se te pasó por la cabeza! Pero está bien, ahora entendamos qué significa esa definición.
¿Cuál es el significado de “alta mínima entropía”?
Significa que la distribución de la que se elige el valor se distribuye enormemente tanto que elegir un valor aleatorio tiene una probabilidad insignificante. Básicamente, si le dijeron que eligiera un número entre 1 y 5, esa es una distribución de mínima entropía baja. Sin embargo, si tuviera que elegir un número entre 1 y un trillón, esa es una distribución de minientropía alta.
¿Qué significa “k | x”?
El “|” denota concatenación. La concatenación significa sumar dos cadenas. P.ej. Si tuviera que concatenar “AZUL” y “CIELO” juntos, entonces el resultado será “BLUESKY”.
Así que ahora revisemos la definición.
Suponga que tiene un valor de salida “Y”. Si elige un valor aleatorio “k” de una distribución amplia, no es factible encontrar un valor X tal que el hash de la concatenación de k y x dé la salida Y.
Una vez más, observe la palabra “inviable”, no es imposible porque la gente hace esto todo el tiempo. De hecho, todo el proceso de minería funciona sobre esto (más sobre eso más adelante).
Ejemplos de funciones hash criptográficas
- MD 5: Produce un hash de 128 bits. La resistencia a la colisión se rompió después de ~ 2 ^ 21 hashes.
- SHA 1: produce un hash de 160 bits. La resistencia a la colisión se rompió después de ~ 2 ^ 61 hashes.
- SHA 256: produce un hash de 256 bits. Bitcoin lo está utilizando actualmente.
- Keccak-256: produce un hash de 256 bits y actualmente lo utiliza ethereum.
Hashing y estructuras de datos
Una estructura de datos es una forma especializada de almacenar datos. Hay dos propiedades de estructura de datos que son críticas si desea comprender cómo funciona una cadena de bloques. Ellos son:
- Punteros.
- Listas vinculadas.
- Punteros
Los punteros son variables de programación que almacenan la dirección de otra variable. Por lo general, las variables normales en cualquier lenguaje de programación almacenan datos.
P.ej. int a = 10, significa que hay una variable “a” que almacena valores enteros. En este caso, está almacenando un valor entero que es 10. Esta es una variable normal.
Sin embargo, los punteros, en lugar de almacenar valores, almacenarán direcciones de otras variables. Por eso se denominan punteros, porque literalmente apuntan hacia la ubicación de otras variables.
Listas vinculadas
Una lista vinculada es uno de los elementos más importantes en las estructuras de datos. Así es como se ve una lista enlazada:
Es una secuencia de bloques, cada uno de los cuales contiene datos vinculados al siguiente bloque mediante un puntero. La variable de puntero, en este caso, contiene la dirección del siguiente nodo en ella y, por lo tanto, se realiza la conexión. El último nodo, como puede ver, tiene un puntero nulo, lo que significa que no tiene ningún valor.
Una cosa importante a tener en cuenta aquí, el puntero dentro de cada bloque contiene la dirección del siguiente bloque. Así es como se logra el apuntado. Ahora podría preguntarse qué significa eso para el primer bloque de la lista. ¿Dónde queda el puntero del primer bloque?
El primer bloque se llama “bloque de génesis” y su puntero se encuentra en el sistema mismo. Se parece a esto:
Imagen cortesía: Coursera
Si se está preguntando qué significa el “puntero hash”, llegaremos allí en un momento.
Como ya habrás adivinado, en esto se basa la estructura de la cadena de bloques. Una cadena de bloques es básicamente una lista vinculada. Veamos cómo se ve la estructura de la cadena de bloques:
La cadena de bloques es una lista vinculada que contiene datos y un puntero hash que apunta a su bloque anterior, creando así la cadena. ¿Qué es un puntero hash? Un puntero hash es similar a un puntero, pero en lugar de solo contener la dirección del bloque anterior, también contiene el hash de los datos dentro del bloque anterior. Este pequeño ajuste es lo que hace que las cadenas de bloques sean tan increíblemente fiables y pioneras.
Imagínese esto por un segundo, un hacker ataca el bloque 3 e intenta cambiar los datos. Debido a las propiedades de las funciones hash, un ligero cambio en los datos cambiará drásticamente el hash. Esto significa que cualquier pequeño cambio realizado en el bloque 3, cambiará el hash que está almacenado en el bloque 2, ahora que a su vez cambiará los datos y el hash del bloque 2, lo que dará como resultado cambios en el bloque 1 y así sucesivamente. . Esto cambiará completamente la cadena, lo cual es imposible. Así es exactamente como las cadenas de bloques alcanzan la inmutabilidad.
Entonces, ¿cómo se ve un encabezado de bloque?
Un encabezado de bloque contiene:
- Versión: el número de versión del bloque.
- Hora: la marca de tiempo actual.
- El objetivo de dificultad actual. (Más sobre esto más adelante).
- Hash del bloque anterior.
- Nonce (más sobre esto más adelante).
- Hachís de la raíz de Merkle.
- En este momento, centrémonos en el hash de la raíz Merkle. Pero antes de eso, necesitamos entender qué es un árbol Merkle.
¿Qué es un árbol Merkle?
Cortesía de imagen: Wikipedia
El diagrama anterior muestra cómo se ve un árbol Merkle. En un árbol de Merkle, cada nodo no hoja es el hash de los valores de sus nodos secundarios.
Nodo de hoja: Los nodos de hoja son los nodos en el nivel más bajo del árbol. Entonces, en el diagrama de arriba, los nodos hoja serán L1, L2, L3 y L4.
Nodos secundarios: para un nodo, los nodos por debajo de su nivel que lo alimentan son 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”.
Nodo raíz: el nodo único en el nivel más alto etiquetado como “Top Hash” es el nodo raíz.
Entonces, ¿qué tiene que ver un árbol Merkle con las cadenas de bloques?
Cada bloque contiene miles y miles de transacciones. Será muy poco eficiente almacenar todos los datos dentro de cada bloque como una serie. Hacerlo hará que encontrar cualquier transacción en particular sea extremadamente engorroso y requiera mucho tiempo. Sin embargo, si utiliza un árbol Merkle, reducirá considerablemente el tiempo necesario para averiguar si una transacción en particular pertenece a ese bloque o no.
Veamos esto en un ejemplo. Considere el siguiente árbol de Merkle:
Ahora suponga que quiero averiguar si estos datos en particular pertenecen al bloque o no:
En lugar de pasar por el engorroso proceso de mirar cada hash individual y ver si pertenece a los datos o no, simplemente puedo rastrearlo siguiendo el rastro de los hash que conducen a los datos:
Hacer esto reduce significativamente el tiempo necesario.
Hashing en minería: los rompecabezas criptográficos.
Cuando decimos “minería”, básicamente significa buscar un nuevo bloque para agregar en la cadena de bloques. Los mineros de todo el mundo trabajan constantemente para asegurarse de que la cadena siga creciendo. Anteriormente, solía ser fácil para las personas minar usando solo sus computadoras portátiles, pero con el tiempo, la gente comenzó a formar grupos de minería para reunir los poderes de su computadora y minar de manera más eficiente.
Sin embargo, esto podría haber sido un problema. Hay un límite para cada criptomoneda, por ejemplo. para bitcoin, son solo 21 millones. Solo hay 21 millones de bitcoins por ahí. Si a los mineros se les permite continuar, a este ritmo, pescarán todos los bitcoins existentes. Además de eso, debe haber un límite de tiempo específico entre la creación de cada bloque. Para bitcoin, el límite de tiempo entre la creación de bloques es de 10 minutos. Si se permitiera que los bloques se crearan más rápido, resultaría en:
- Más colisiones: se generarán más funciones hash que inevitablemente provocarán más colisiones.
- Más bloques huérfanos: si muchos mineros terminan de minar, crearán nuevos bloques simultáneamente. Esto dará como resultado que más bloques no formen parte de la cadena principal y se conviertan en bloques huérfanos.
Entonces, para restringir la creación de bloques, se establece un nivel de dificultad específico. La minería es como un juego, resuelves el rompecabezas y obtienes recompensas. Establecer la dificultad hace que ese rompecabezas sea mucho más difícil de resolver y, por lo tanto, requiere más tiempo. Bitcoins WRT el objetivo de dificultad es una cadena de 64 caracteres (que es lo mismo que una salida SHA-256) que comienza con un montón de ceros. Un número de ceros aumenta a medida que aumenta el nivel de dificultad. El nivel de dificultad cambia después de cada bloque 2016.
El proceso minero
Nota: Aquí hablaremos principalmente de la minería de Bitcoin.
Cuando el software de minería de bitcoins quiere agregar un nuevo bloque a la cadena de bloques, este es el procedimiento que sigue. Siempre que llega un nuevo bloque, primero se aplica un hash a todo el contenido de los bloques. Si el hash es menor que el objetivo de dificultad, entonces se agrega a la cadena de bloques y todos en la comunidad reconocen el nuevo bloque.
Sin embargo, no es tan simple como eso. Tendrá que tener mucha suerte para obtener un nuevo bloque así. Aquí es donde entra el nonce. El nonce es una cadena arbitraria que está concatenada con el hash del bloque. Después de eso, esta cadena concatenada se vuelve a hacer hash y se compara con el nivel de dificultad. Si no es menor que el nivel de dificultad, entonces se cambia el nonce y este se sigue repitiendo un millón de veces hasta que finalmente se cumplen los requisitos. Cuando eso sucede, el bloque se agrega a la cadena de bloques.
Entonces, para recapitular:
- Se toma el hash del contenido del nuevo bloque.
- Se agrega un nonce (cadena aleatoria) al hash.
- La nueva cadena se vuelve a codificar.
- Luego, el hash final se compara con el nivel de dificultad y se ve si en realidad es menor que eso o no.
- Si no es así, se cambia el nonce y el proceso se repite nuevamente.
- En caso afirmativo, el bloque se agrega a la cadena y el libro mayor público se actualiza y se alerta de la adición.
- Los mineros responsables de esto son recompensados con bitcoins.
¿Recuerda la propiedad número 6 de las funciones hash? ¿La amabilidad del rompecabezas?
Para cada salida “Y”, si k se elige de una distribución con alta minientropía, no es factible encontrar una entrada x tal que H (k | x) = Y.
Entonces, cuando se trata de minería de bitcoins:
- K = Nonce
- x = el hash del bloque
- Y = el objetivo de dificultad
Todo el proceso es completamente aleatorio, no hay un proceso de pensamiento detrás de la selección de los nonces. Es solo fuerza bruta pura en la que el software sigue generando cadenas de forma aleatoria hasta que alcanzan su objetivo. Todo el proceso sigue el protocolo de Prueba de trabajo, que básicamente significa:
- La resolución de acertijos debería ser difícil.
- Sin embargo, verificar la respuesta debería ser fácil para todos. Esto se hace para asegurarse de que no se hayan utilizado métodos engañosos para resolver el problema.
¿Qué es la tasa de hash?
La tasa de hash básicamente significa qué tan rápido se llevan a cabo estas operaciones de hash durante la extracción. Una alta tasa de hash significa que más personas y máquinas de software participan en el proceso de minería y, como resultado, el sistema funciona sin problemas. Si la tasa de hash es demasiado rápida, aumenta el nivel de dificultad. Si la tasa de hash se vuelve demasiado lenta, el nivel de dificultad disminuye.
Conclusión: ¿Qué es el hash?
El hash ha sido realmente fundamental en la creación de la tecnología blockchain. Si uno quiere entender de qué se trata la cadena de bloques, definitivamente debería entender lo que significa el hash.