OpenTimestamps | |
Developer: | Open |
Latest Release Version: | 0.7.1[1] |
Programming Language: | Python, Java, JavaScript, Rust |
Genre: | Decentralized timestamping |
License: | LGPL3 |
OpenTimestamps (OTS) is an open-source[2] project that aims to provide a standard format for blockchain timestamping.[3] With the advent of systems like Bitcoin, it is possible to create and verify proofs of existence of documents (timestamps) without relying on a trusted third party; this represents an enhancement in term of security, since it excludes the possibility of a malicious (or careless) trusted third party to compromise the timestamp.[4]
OTS defines a set of rules for conveniently creating timestamps and later independently verifying them. Currently, timestamping with Bitcoin is fully supported, however the format is flexible enough to support a variety of methods.
Anyone could create timestamp with the permissionless blockchain by paying the transaction fees, for convenience OTS built an infrastructure that aggregates timestamp requests from users and packs them into transactions funded by public calendar servers; as a result, users can timestamp for free, in a trust-minimized setting.
A timestamp is a proof that some data d existed prior to a certain point in time.[5]
To create such proof, it turns out that it is not necessary to publish d on the blockchain, which would be expensive, but it is enough to commit d to the blockchain. Such commitment proves that d existed prior to a certain block, in the sense that if d changes, then the proof becomes invalid and hence useless.
The proof consists in a sequence of commitment operations, such as sha256
, append
, prepend
. These operations are the cryptographic path that proves that d commits to a certain block header. In other words, that d caused the block header to have its value, indeed, if d were different then, due to the mathematical properties of commitment operations, the block header would be different. To verify the commitment, the operations are applied in sequence to the data d, then the result, which should be the transaction merkle root, is checked to be equal to the one observed in the blockchain; if the check goes fine, then one can assert that d existed prior to the block.
For the timestamped file hello.txt
, the OTS proof is encoded in a file named hello.txt.ots
which contains:
With this information, a challenger can independently verify that hello.txt
existed prior to a certain block.
OTS provides users multiple and easy ways to create and independently verify timestamps:
In the following sections it is shown an example of the usage of the Python client.
The stamp operation creates the first version of the timestamp. It is applied to the file for which you want to prove its existence (original file).
The stamp operation calculates the SHA256 hash of the original file, concatenates a random 128-bit nonce to maintain privacy, and recalculates the SHA256 hash, sending this unique value to the calendar servers. Each of the calendar servers will add the received hash to its Merkle tree and return the necessary response to generate the initial OTS file. This OTS file is still incomplete because it does not yet contain the record in the blockchain.[6]
Once a reasonable time has elapsed, the user will run the upgrade operation on the same OTS file. This will communicate with the calendar servers and update the OTS file with the Bitcoin block header attestation.
It is also possible to create timestamps for several different files simultaneously. In that case, the stamp operation will send a single request to the calendar servers with a Merkle root derived from the original files, and later, that same operation will calculate the Merkle tree paths and create the timestamps for each one of the original files.
The verification of the OTS proof requires both the OTS file and the original file. The user must also have an up-to-date Bitcoin node on their own machine to perform the verification without relying on trusted third parties.[7]
The basic structure of a timestamp is divided into three main sections:
The timestamp is saved in a binary file to save space and avoid problems of interpretation, encoding and compatibility between systems. Generally, this file has a .ots extension and its magic number is \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
.[8]
The info operation presents the content of the timestamp on a human-readable format. In this case, a single attestation of the hello.txt file is shown, which hashes all the way to the Bitcoin block header at block 518387.
Applications include defensive publications.[9]