INTRODUCCIÓN
Los recibos de estampación que se suelen obtener tienen seis grupos de información que utilizaremos para verificar la estampación de nuestro documento en la cadena de bloques. Los grupos de información son:
– El documento que ha sido estampado. En la mayoría de los casos, el documento estampado tiene un formato pdf, aunque en ciertas ocasiones se ha podido estampar en otro formato. En cualquier caso, podrá encontrar el documento en el formato de estampación como documento adjunto al recibo de estampación;
– El hash del documento estampado;
– El merkle root del merkel tree;
– El hash de la transacción donde se encuentra el merkel root;
– El sello de tiempo o momento de la estampación del documento en la cadena de bloques;
– Los hashes del merkel tree.
A continuación, explicaremos a qué se refiere cada uno de estos grupos de información, y cómo deberemos utilizarlos para verificar la estampación de nuestro documento.
HASH DEL DOCUMENTO ESTAMPADO
En primer lugar, lo que hay que entender es que nuestro documento no se sube a la cadena de bloques. Lo que se estampa es un identificador único de nuestro documento, que se calcula a través de una función hash. En nuestro caso, utilizamos la función SHA-256 (para profundizar más sobre las funciones hash y los códigos hash, le recomendamos este post).
Por tanto, lo primero que debemos hacer es comprobar que el hash de nuestro documento que nos indica el recibo de estampación es correcto. Para ello, utilizaremos nuestro documento original (es necesario utilizar la función de adobe de “guardar documento adjunto”, si utilizamos la función de “guardar como” no nos generará el documento correcto) y calcular su hash (SHA-256). Existen numerosas páginas que nos permiten realizar esta tarea:
– https://md5file.com/calculator
– https://defuse.ca/checksums.htm
– https://www.fileformat.info/tool/hash.htm
MERKLE TREE Y MERKLE ROOT
En segundo lugar, tenemos que explicar que cada vez que se realiza una transacción en la cadena de bloques, esa transacción tiene un coste de unos 0.10 $ aproximadamente. El sistema de estampación de documentos utiliza las transacciones para estampar los documentos, solo pudiendo estampar un hash por transacción.
Sería muy costoso estampar un documento por transacción y no se podría utilizar este servicio de manera gratuita. Para solventar dicho problema, se utiliza el sistema “merkel tree” que, como veremos, nos permite estampar todos los documentos que queramos con un solo hash y, por tanto, en una sola transacción.
El merkle tree empieza colocando todos los documentos en la base del árbol y calculando el hash de cada uno de esos documentos.
La función hash que utilizamos es SHA-256. Esta función nos calcula un código binario de 256 dígitos (1001010…01010) para cualquier documento o frase. Normalmente, para que sea más sencillo representar ese código de 256 dígitos, transformamos dicho código a lenguaje hexadecimal, que nos da un código alfanumérico como los que se encuentran en el recibo de estampación. Ejemplo:
“ada09c973ff99ea54f2d70c5ecba656a0bb80c054ea53076c4f027aae8caea78”
A continuación, emparejamos los hashes de los documentos, creando un código binario de 512 dígitos (256 + 256). Es decir, un hash al lado del otro. A este nuevo código de 512 dígitos le aplicamos la función hash, y obtenemos un nuevo hash de 256 dígitos (en la imagen correspondería a “HASH DOC 1-2” o “HASH DOC 3-4”).
Se utiliza el procedimiento que acabamos de describir en cada uno de los niveles del merkle tree hasta que obtenemos un hash final de 256 dígitos denominado el merkle root. Este sistema nos permite hacer un merkle tree con todos los niveles que queramos, pudiendo incluir en el hash final o merkle root todos los documentos que deseemos. Una de las características principales del sistema merkle tree es su inalterabilidad, es decir, si se modifica uno solo de los hashes incluidos el merkle tree, el merkel root final será diferente.
Llegados a este punto, nos preguntamos ¿cómo podemos verificar que el hash de nuestro documento es parte del merkel root?
Para poder comprobar este extremo, el recibo de estampación nos da los hashes del merkle tree para que podamos hacer la comprobación de manera manual. El recibo nos da una serie de hashes, uno encima del otro y cada uno de ellos tiene indicado “left” o “right” (izquierda o derecha).
Para poder comprobar que el hash de nuestro documento es parte del merkle root deberemos coger el hash de nuestro documento y juntarlo con el primer hash de la lista “hashes del merkle tree”, obteniendo un código binario de 512 dígitos. Si el primer hash de la lista tiene indicado “izquierda” colocaremos a la izquierda los 256 dígitos del hash de la lista y a la derecha los 256 dígitos del has de nuestro documento.
En el caso contrario, cuando el hash de la lista tenga la indicación “derecha”, para formar el código de 512 dígitos situaremos los 256 dígitos del hash de nuestro documento a la izquierda y los 256 dígitos del hash de la lista a la derecha.
Una vez calculado el nuevo hash del siguiente nivel, realizaremos nuevamente la misma operación juntando el nuevo hash obtenido con el segundo hash de la lista de “hashes del merkel tree”.
Continuaremos realizando las mismas operaciones subiendo los niveles del merkle tree hasta obtener el hash final o merkle root, pudiendo así, comprobar que el hash de nuestro documento es parte del merkle root.
COMPROBACIÓN DE LA ESTAMPACIÓN DEL MERKLE ROOT EN LA CADENA DE BLOQUES
Una vez que hemos comprobado el hash de nuestro documento, y que dicho hash es parte del merkel root, debemos comprobar que el merkle root se encuentra estampado en la cadena de bloques.
El primer paso será buscar la transacción registrada en la cadena de bloques en la que se encuentra nuestro merkel root. Para poder visualizar una transacción en la cadena de bloques deberemos dirigirnos a algún explorador de la cadena de bloques. Os recomendamos los siguientes:
Estos sitios web tienen cajas de búsqueda, donde deberemos introducir el hash de la transacción que aparece en el recibo de estampación. Una vez tengamos la información de la transacción buscaremos la variable OP_RETURN entre los datos, y podremos comprobar que esa variable coincide con el merkle root. Es posible que el explorador que utilice no recoja exactamente una variable con el nombre OP_RETURN, pero como hay pocas variables en las transacciones podrá rápidamente identificar el merkle root. Por último, tenga en cuenta que algunos exploradores muestran de primeras una información reducida de la transacción, pero suelen tener una opción para ver todos los detalles de la transacción, donde encontrará el merkel root.
Una vez encontrado el merkle root en la transacción, habrá comprobado la estampación. En dicha transacción podrá, asimismo, comprobar la hora y fecha en la que se estampó el merkle root, (deberá tener en cuenta los husos horarios) que debería coincidir con la del recibo de estampación. En caso de discrepancia entre fechas y horas deberá prevalecer la establecida en la transacción de la cadena de bloques.
RESUMEN DE LOS PASOS PARA REALIZAR LA COMPROBACIÓN DE LA ESTAMPACIÓN
En primer lugar, hemos comprobado que el hash de nuestro documento coincide con el indicado en el recibo. Tras dicha comprobación, hemos realizado los cálculos de los hashes de los diferentes niveles del merkle tree para asegurarnos que el hash de nuestro documento es parte del hash del merkle root. A continuación, hemos comprobado que el merkle root se encuentra en una transacción de la cadena de bloques, encontrando dicha transacción con un explorador y el hash de la transacción del recibo de estampación. Finalmente hemos podido comprobar la efectiva estampación e integridad de nuestro documento y la fecha y hora a la que fue realizada.