OpenTimestamps (OTS) es un sistema descentralizado de sellado de tiempo que utiliza Bitcoin para probar la existencia de documentos. Interactúa normalmente con servidores de calendario para agrupar peticiones y registrar atestaciones.[2]

OpenTimestamps
Información general
Tipo de programa Sellado de tiempo
Desarrollador Abierto
Modelo de desarrollo Software libre
Licencia LGPL3
Información técnica
Programado en Python, Java, Javascript, Rust
Versiones
Última versión estable 0.7.0[1]( 21 de agosto de 2019 (5 años, 1 mes y 16 días))
Enlaces

Prueba OTS y sello de tiempo

editar

Una prueba OTS está compuesta por un sello de tiempo (también llamado «fichero OTS»), así como por el fichero original al que se refiere ese sello de tiempo. Cualquier persona o entidad que posea la prueba OTS puede verificar que el contenido del fichero se mantiene sin modificaciones al menos desde el momento en que se creó el sello de tiempo. Esta verificación de integridad se puede obtener sin delegar la consulta en un tercero de confianza.[3]

Creación del sello de tiempo

editar

La operación stamp crea la primera versión del sello de tiempo. Se aplica sobre el fichero del que se quiere demostrar su existencia (fichero original).

$ cat hello.txt
Hello World!
$ ots stamp hello.txt
Submitting to remote calendar https://a.pool.opentimestamps.org
Submitting to remote calendar https://b.pool.opentimestamps.org
Submitting to remote calendar https://a.pool.eternitywall.com

La operación stamp calcula el hash SHA256 del fichero original, le concatena un nonce aleatorio de 128 bits para mantener la privacidad, y vuelve a calcular el hash SHA256, enviando este único valor a los servidores de calendario. Cada uno de los servidores de calendario añadirá el hash recibido a su árbol de Merkle y devolverá la respuesta necesaria para generar el fichero OTS inicial. Este fichero OTS está aún incompleto porque no contiene el registro en la cadena de bloques.[3]

Una vez que ha transcurrido un tiempo prudencial, el usuario lanzará la operación upgrade sobre el mismo fichero OTS. Así se comunicará con los servidores de calendario y se actualizará el fichero OTS con la atestación de la cabecera de bloque de Bitcoin.[4]

$ ots upgrade hello.txt.ots
Success! Timestamp complete

También se pueden crear sellos de tiempo para varios ficheros diferentes de forma simultánea. En ese caso, la operación stamp envíará una única petición a los servidores de calendario con una raíz de árbol de Merkle derivada a partir de los ficheros originales. Posteriormente esa misma operación recalculará las rutas del árbol de Merkle y creará los ficheros OTS adaptados a cada uno de los ficheros originales.

Verificación de la prueba OTS

editar

La verificación de la prueba OTS requiere el fichero OTS y el fichero original. Para que la verificación se pueda realizar sin depender de terceros de confianza, el usuario debe tener un nodo de Bitcoin en su máquina con la cadena de bloques actualizada.[5]

$ ots verify hello.txt.ots
Assuming target filename is 'hello.txt'
Success! Bitcoin attests data existed as of Mon Apr 16 01:15:16 2018 CEST

Formato del sello de tiempo

editar

El sello de tiempo se divide en tres secciones principales:[3]

  1. Hash del fichero original
  2. Construcción del árbol de Merkle
  3. Atestación de la cabecera de bloque de Bitcoin

El sello de tiempo se guarda en un fichero binario para ahorrar en espacio y evitar problemas de interpretación, de codificación y de compatibilidad entre sistemas. Generalmente, este fichero tiene una extensión .ots y su número mágico es \x00 O p e n T i m e s t a m p s \x00 \x00 P r o o f \x00 \xbf \x89 \xe2 \xe8 \x84 \xe8 \x92 \x94.[6]

La operación info presenta el contenido del fichero de sello de tiempo de forma legible. En este caso se muestra una única atestación del fichero hello.txt que alcanza hasta la cabecera del bloque 518387 de Bitcoin.

$ ots info hello.txt.ots
File sha256 hash: 03ba204e50d126e4674c005e04d82e84c21366780af1f43bd54a37816b6ab340
Timestamp:
append 72d8a09f54b12580b48c2f7c7dea4ce0
sha256
 -> append fe0d089c9bfe5289c3ee579904af3551
    sha256
    prepend 5ad3d92b
    append 8fefb42191040403
    verify PendingAttestation('https://alice.btc.calendar.opentimestamps.org')
    sha256
    prepend f0e8b62a519b0b8fad763c33c558e0179a43b8d89cb4130b6dbaa91e3d3252f6
    sha256
    prepend beca183da3f86784a7d54778bc48e78c570245d51474f32475e6d1851989b140
    sha256
    append a95879c35c15ace7dc5fd1d2cf0a7d9b0e4110b5b8a74da4c64082835f6f6a2e
    sha256
    append cf9b259e4506235f97225706f3a675f51ecf2657814639d87e4e6f42d8581ae7
    sha256
    prepend e3b7ff694e1b14b4420556ca77ea8e9509e44b7fbed0dc9a3b67c00fcf016ca2
    sha256
    prepend 01000000017230dffb1edd7cae0c8feb3fec7c91c34b33b22fdfac071b83e790ce34254b340000000017160014a4282cbf0f17fd6d51b61da f7cf4d56e32183b60fdffffff02d7c062000000000017a914365c46ff772b9f1da73efeb2c559777e1a2c33b4870000000000000000226a20
    append f2e80700
    # Bitcoin transaction id 7e6e5aafa1fc9d933992621a7ac321dc7b9368d0e1baa72ff77665b07b75315f
    sha256
    sha256
    append d67f1615f986694d707d7d044883c7885f3dded2ac9df5f6b9270a5bdda38aa3
    sha256
    sha256
    append e551a80b2bdd88f417fc95014662f7a65d8c0c4d833b6df034bc12f1af35b953
    sha256
    sha256
    append 0902830fc37fde4996c350de40c0ae621c739ce002a7be4b3725d7e281fc02a3
    sha256
    sha256
    append 7ac1e262423598f1477825882f78ededc98b44bf0136f059e438391aa0e7a686
    sha256
    sha256
    prepend 9ee83975bef756160275a336203059109fd4336572e5e47e9a3edadb82a8934c
    sha256
    sha256
    append 7a3229b63fc7a88d4edde4aa5b855416265842120fde246462271e5418f895bd
    sha256
    sha256
    prepend a4c712ca130f63862f329874f11466eb74ee7b505c191344ee11b30d14ca4946
    sha256
    sha256
    append 13bf98cdb708ed3321b8d48ff290c5bdbefa6fb9be34717e97a3f3cfa9b87994
    sha256
    sha256
    prepend d2aec8bd2edf2d6d10606df92f1b8b53a97362d7aba7d3fa15bf55c0aab94e35
    sha256
    sha256
    verify BitcoinBlockHeaderAttestation(518387)
    # Bitcoin block merkle root b4f71191dc633cfb125543211022b1059d78b42a359408da5958fc15231ef6de

Casos de uso

editar
  • Los 750 000 000 ficheros de Internet Archive han sido registrados mediante OpenTimestamps para que no puedan ser modificados de forma encubierta. La evidencia final resultó en la anotación irreversible de la raíz de Merkle de todos esos ficheros en una única transacción de Bitcoin.[7]
  • Bitcoin Core usa OpenTimestamps para sellar el tiempo en Git de las actualizaciones de su código fuente.[8]

Otras aplicaciones incluyen publicaciones defensivas,[9]​ evidencias contra plagios, verificación de firmas desde claves PGP revocadas, etc.

Referencias

editar
  1. «OpenTimestamps client». Consultado el 24 de agosto de 2019. 
  2. Peter Todd y Harry Halpin (abril de 2017). Springer, ed. «OpenTimestamps: Securing Software Updates Using the Bitcoin Blockchain». Consultado el 22 de febrero de 2019. 
  3. a b c William Thomas Weilbach (11 de diciembre de 2017). «Practical Application of Distributed Ledger Technology in Support of Digital Evidence Integrity Verification Processes». Archivado desde el original el 18 de abril de 2018. Consultado el 17 de abril de 2018. 
  4. «OpenTimestamps: Scalable, Trust-Minimized, Distributed Timestamping with Bitcoin». 15 de septiembre de 2016. Consultado el 17 de abril de 2018. 
  5. «OpenTimestamps Client». Consultado el 17 de abril de 2018. 
  6. «python-opentimestamps/opentimestamps/core/timestamp.py». Github. Consultado el 17 de abril de 2018. 
  7. Aaron van Wirdum (6 de junio de 2017). Bitcoin Magazine, ed. «For the first time ever, historical archived data cannot be altered without being noticed.». Consultado el 12 de noviembre de 2017. 
  8. «Bitcoin Core devtools README - Create and verify timestamps of merge commits». GitHub. Consultado el 22 de febrero de 2019. 
  9. Douglas Heaven (4 de febrero de 2019). Nature, ed. «Bitcoin for the biological literature». Consultado el 22 de febrero de 2019.