...plus hundreds of others use Chainpoint.
Chainpoint links a hash of your data to a blockchain and returns a timestamp proof. A Chainpoint Node receives hashes which are aggregated together using a Merkle tree. The root of this tree is published in a Bitcoin transaction. The final Chainpoint proof defines a set of operations that cryptographically link your data to the Bitcoin blockchain.
A Chainpoint proof contains the information to verify that the hash of some data is anchored to a blockchain. It proves the data existed at time it was anchored. Chainpoint proofs can be verified without reliance on a trusted third party.
Chainpoint Nodes have an HTTP API. You can interact with Nodes using any programming language that supports HTTP calls. Thousands of Chainpoint Nodes operate as part of a global network.
Chainpoint Node API TutorialThis Chainpoint javascript client can be used in both Browser and Node.js based Javascript applications using callback functions, Promises (using .then, .catch), or Promises (using async/await) functional styles.
Chainpoint JS ClientThe third major version of the Chainpoint proof specification is currently in testing and scheduled for release soon. A JSON schema validator is available.
Name | Description |
---|---|
@context
string, required | the JSON-LD context for the proof |
type string, required | the JSON-LD type definition |
hash string, required | hash value between 40 and 128 hex characters. Must be even length. |
hash_id_node string, required | a Version 1 UUID with embedded timestamp and 5 byte BLAKE2s hash of the input data. Timestamp represents Node server time (UTC) of hash submission. |
hash_submitted_node_at string, required | Human readable ISO 8601 timestamp extracted from time embedded in the hash_id_node |
hash_id_core string, required | a Version 1 UUID with embedded timestamp and 5 byte BLAKE2s hash of the input data. Timestamp represents Core server time (UTC) of hash submission. |
hash_submitted_core_at string, required | Human readable ISO 8601 timestamp extracted from time embedded in the hash_id_core |
branches - an array of branch objects. Branches can be nested without limit and MUST be traversed only after executing 'ops'. (required only at root) | |
label string, optional | text string representing the branch name |
ops array, optional | an array of operations objects. Operations are performed in sequence to arrive at an intermediate hash prior to entering a nested branch. |
branches array, optional | nested array of branch objects. Each branch contains ops; labels and additional nested branches are optional. |
ops - an array of operation objects (required under every 'branches' object) | |
lstring, optional | left concatenate a value. If the value is a hexadecimal string, it will be read as a hexadecimal byte array, otherwise the string will be converted to its byte value assuming UTF-8 encoding. |
rstring, optional | right concatenate a value. If the value is a hexadecimal string, it will be read as a hexadecimal byte array, otherwise the string will be converted to its byte value assuming UTF-8 encoding. |
op string, optional | an operation to perform on the current value combined with a previous 'l' or 'r' operation. Current operations: 'sha-224', 'sha-256', 'sha-384', 'sha-512', 'sha3-224', 'sha3-256', 'sha3-384', 'sha3-512', or the special purpose 'sha-256-x2' which applies 'sha-256' twice. |
anchors - an array of anchor objects (required under every 'ops' object). | |
type string, required | one of 'cal' (Calendar), 'btc' (Bitcoin), 'tcal' (Testnet Calendar), 'tbtc' (Testnet Bitcoin), or 'eth' (Ethereum) anchor types |
anchor_id string, required | an identifier used to look up embedded anchor data. e.g. a Bitcoin transaction or block ID. |
uris array, optional | an array of special purpose string URI's, each of which can be used to lookup and retrieve the exact hash resource required to validate this anchor. The URI MUST return only a Hexadecimal hash value as a string. The URI MUST also contain the 'anchor_id' value to lookup the URI resource. This strict requirement is to allow automated clients to retrieve and validate intermediate hashes when verifying a proof. The body value returned by the URI MUST be of even length and match the regex [a-fA-F0-9]. |
{
"@context": "https://w3id.org/chainpoint/v3",
"type": "Chainpoint",
"hash": "ffff27222fe366d0b8988b7312c6ba60ee422418d92b62cdcb71fe2991ee7391",
"hash_id_node": "66a34bd0-f4e7-11e7-a52b-016a36a9d789",
"hash_submitted_node_at": "2018-01-09T02:47:15Z",
"hash_id_core": "66bd6380-f4e7-11e7-895d-0176dc2220aa",
"hash_submitted_core_at": "2018-01-09T02:47:15Z",
"branches": [
{
"label": "cal_anchor_branch",
"ops": [
{
"l": "node_id:66a34bd0-f4e7-11e7-a52b-016a36a9d789"
},
{
"op": "sha-256"
},
{
"l": "core_id:66bd6380-f4e7-11e7-895d-0176dc2220aa"
},
{
"op": "sha-256"
},
{
"l": "nist:1515465960:1041862e0f3987dca3aab3a91767d2a2ebbf251451b740879adb0926f0ee325e608d5c311e3f64a002dc5266337efc34ebdbf0032c7a253a8fbb64c1b0fb625f"
},
{
"op": "sha-256"
},
{
"r": "725a969557e64600aa2bbe50e75fc12dd913620144660836441a97f6d36babf9"
},
{
"op": "sha-256"
},
{
"l": "f21aac3945aee46d0cd888faff3364cc7640f88c9bdfefb1072a4bb82c6702b6"
},
{
"op": "sha-256"
},
{
"r": "c59058f17b93b609f4b49366c8808099a715836b6c08b45a1dc6ac762820ae27"
},
{
"op": "sha-256"
},
{
"l": "985635:1515466042:1:https://a.chainpoint.org:cal:985635"
},
{
"r": "0e20cff025777bec277cd3a0599eaf5efbeb1ea7adf5ec5a39126a77fa57f837"
},
{
"op": "sha-256"
},
{
"anchors": [
{
"type": "cal",
"anchor_id": "985635",
"uris": [
"https://a.chainpoint.org/calendar/985635/hash"
]
}
]
}
],
"branches": [
{
"label": "btc_anchor_branch",
"ops": [
{
"l": "0e20cff025777bec277cd3a0599eaf5efbeb1ea7adf5ec5a39126a77fa57f837"
},
{
"op": "sha-256"
},
{
"r": "9d7e8027c869d7446db8f2a5f371d967f5ba9d3a88f1703a1674f57963d3448d"
},
{
"op": "sha-256"
},
{
"l": "28c6aa4416d1b0aa474bc52fd32175ec7d15980772874617b5000aff043ac6cb"
},
{
"op": "sha-256"
},
{
"r": "4c297218f2015d4f84a6561ca06c1c28b2f6cca1500315ef6d4944ad6822b974"
},
{
"op": "sha-256"
},
{
"r": "f6a15401357e6e177583dbf5aa82b5ed5ae1043d1bda3faba88ca0fdb90e01c0"
},
{
"op": "sha-256"
},
{
"r": "ae9137386a03fdcdb9a1554a6e4fcd9697efed17caaa0221ce35e12bfc9fbf2d"
},
{
"op": "sha-256"
},
{
"l": "fa5643778470a9175644affe35e0177a13b2446d73182be0963d53b1d09214ab"
},
{
"op": "sha-256"
},
{
"l": "01000000013d9bfb8c553b3a7c9c030ea9b0f47c7e4c457e47a1ad2d9c751c8eb0e02fee70010000006a47304402201eac07288c3881f354564bb9da0d8267174cdc9e8c42ca82c2129a0416c806220220104e9932a89259472c84be7722f77324efa43a65ca79dd5bb8b6aab0ac9788000121032695ca0d3c0f7f8082a6ef66e7127e48d4eb99bef86be99432b897c485962fa8ffffffff020000000000000000226a20"
},
{
"r": "ca694202000000001976a9149f1f4038857beedd34cc5ba9f26ac7a20c04d51988ac00000000"
},
{
"op": "sha-256-x2"
},
{
"l": "aa7008cdf722a674cc3532727ee39e9ebc810fb047cc7f4edc302705fcee3985"
},
{
"op": "sha-256-x2"
},
{
"l": "f0fae6f1dc00b678596e230584430b95bad9c1439f03293250b5a9bfb993b500"
},
{
"op": "sha-256-x2"
},
{
"l": "a79b18abcde7db6554e95c14ed544231f59670318033fc6e2e28142341ef223a"
},
{
"op": "sha-256-x2"
},
{
"l": "12105db21e488b1d8eb44fbce8bc5e3fcb7becc35fe4d9d30696ef7baff853eb"
},
{
"op": "sha-256-x2"
},
{
"l": "0ce1848d74ea8705858e468e045e7891f2b5f9c8ed37eeaa00be51846460294e"
},
{
"op": "sha-256-x2"
},
{
"l": "52af6b21e7b370f680e984b8a1e34ffdb45770d3cf599357ce245bad8c820d50"
},
{
"op": "sha-256-x2"
},
{
"l": "bb5bd9669a3bc3202e460091185f8103863da4263f417e85479fc3bb40a882d1"
},
{
"op": "sha-256-x2"
},
{
"l": "25bb84e8a36904224182b28adb04956d1251d4312b4e975c4ee3ff74a50bce1d"
},
{
"op": "sha-256-x2"
},
{
"l": "a55b52dc8079febc3a8b673ee123829c176aca7dabb330299afdeac2bfea16d6"
},
{
"op": "sha-256-x2"
},
{
"r": "3bf18e7d4ffaab9988d14b1402fe9817ea6c50fa626dd78bcaba18a9b16184f1"
},
{
"op": "sha-256-x2"
},
{
"r": "af9ae1010333cf6e5ea124e5827a8bf0f40f68ab9a5bf283f93f744046b07a5d"
},
{
"op": "sha-256-x2"
},
{
"anchors": [
{
"type": "btc",
"anchor_id": "503275",
"uris": [
"https://a.chainpoint.org/calendar/985814/data"
]
}
]
}
]
}
]
}
]
}
Name | Description |
---|---|
@context | the JSON-LD context for the receipt |
type | receipt type definition specifying hash method and version |
targetHash | hash value being anchored to the blockchain |
merkleRoot | merkle tree root value that is anchored to the blockchain |
proof | merkle proof establishing link from the targetHash to the merkleRoot |
anchors | |
type | anchor type definition specifying anchoring method |
sourceId | identifier, such as a transaction id, used to locate anchored data |
{
"@context": "https://w3id.org/chainpoint/v2",
"type": "ChainpointSHA256v2",
"targetHash": "bdf8c9bdf076d6aff0292a1c9448691d2ae283f2ce41b045355e2c8cb8e85ef2",
"merkleRoot": "51296468ea48ddbcc546abb85b935c73058fd8acdb0b953da6aa1ae966581a7a",
"proof": [
{
"left": "bdf8c9bdf076d6aff0292a1c9448691d2ae283f2ce41b045355e2c8cb8e85ef2"
},
{
"left": "cb0dbbedb5ec5363e39be9fc43f56f321e1572cfcf304d26fc67cb6ea2e49faf"
},
{
"right": "cb0dbbedb5ec5363e39be9fc43f56f321e1572cfcf304d26fc67cb6ea2e49faf"
}
],
"anchors": [
{
"type": "BTCOpReturn",
"sourceId": "f3be82fe1b5d8f18e009cb9a491781289d2e01678311fe2b2e4e84381aafadee"
}
]
}
Receipt type values indicate the hash type and version of the receipt. The following values are supported.
Type | Description |
---|---|
ChainpointSHA224v2 | Chainpoint 2.0 receipt using SHA-224 |
ChainpointSHA256v2 | Chainpoint 2.0 receipt using SHA-256 |
ChainpointSHA384v2 | Chainpoint 2.0 receipt using SHA-384 |
ChainpointSHA512v2 | Chainpoint 2.0 receipt using SHA-512 |
ChainpointSHA3-224v2 | Chainpoint 2.0 receipt using SHA3-224 |
ChainpointSHA3-256v2 | Chainpoint 2.0 receipt using SHA3-256 |
ChainpointSHA3-384v2 | Chainpoint 2.0 receipt using SHA3-384 |
ChainpointSHA3-512v2 | Chainpoint 2.0 receipt using SHA3-512 |
Anchor type values indicate the method and location of the anchored data. The following values are supported. Support for additional methods is planned.
Type | Description |
---|---|
BTCOpReturn | Anchored to a Bitcoin transaction within an OP_RETURN output. |
ETHData | Anchored to an Ethereum transaction within the data field. |
Name | Description |
---|---|
Header | |
chainpoint_version | version of the Chainpoint standard |
hash_type | hashing algorithm used to encrypt target data (sha256) |
merkle_root | root of the Merkle Tree that is published in the blockchain |
tx_id | blockchain transaction id |
timestamp | nonauthoritative Unix timestamp of the target |
Target | |
target_hash | hash of the target that is being recorded in the blockchain |
target_proof | Merkle proof used to prove target_hash is part of Merkle tree |
target_URI (optional) | path to the target |
Extra | |
custom (optional) | array of user defined key value pairs |
{
"header": {
"chainpoint_version": "1.1",
"hash_type": "SHA-256",
"merkle_root": "8dbd52c5ff89b70711b06c143520ef4eb295c51040757c7a4ab56303f0f6b68f",
"tx_id": "77d93bce0f0ff76f1a52424f9c0aeb165990dc37a5e3aaf85031a2f6ab2967d1",
"timestamp": 1438317621
},
"target": {
"target_hash": "a64f10ca86a880115cc271232dc8577606dc6223cf009a4dd1290cd55b2d6a28",
"target_uri ": "https://www.someurl.com/target/id",
"target_proof": [
{
"parent": "ee32ac6eb702c289ba2a932e6562b2c45070121cacb26cabdee433a6cf2086cd",
"left": "a64f10ca86a880115cc271232dc8577606dc6223cf009a4dd1290cd55b2d6a28",
"right": "f07934733450ba14972b8fbea4c39ac05b0b8e2d8a45ddde9dbe03bb70942b6a"
},
{
"parent": "8dbd52c5ff89b70711b06c143520ef4eb295c51040757c7a4ab56303f0f6b68f",
"left": "ee32ac6eb702c289ba2a932e6562b2c45070121cacb26cabdee433a6cf2086cd",
"right": "07084efda9cf5488ef9d4f9ad8bca8521581aaa32331b62aeb2fe3e132e62d1a"
}
]
},
"extra": [
{
"custom_key_1": "value_1"
},
{
"custom_key_2": "value_2"
}
]
}
Verification confirms that the proof is well formatted, and all proof operations lead to the expected anchor hash on the blockchain. Verification of version 3.x proofs can be performed with the Chainpoint CLI. Verification of older versions can be performed using the chainpoint-validate Javascript package for Node.js.