Chainpoint

Chainpoint is an open standard for creating a timestamp proof of any data, file, or process.

Anchor an unlimited amount of data to multiple blockchains. Verify the integrity and existence of data without relying on a trusted third-party.


...plus hundreds of others use Chainpoint.

How does Chainpoint work?

Chainpoint links a hash of your data to a blockchain and returns a timestamp proof. A Chainpoint service receives hashes which are aggregated together using a Merkle tree. The root of this tree is anchored in the Bitcoin and Ethereum blockchains. Throughout this process a Chainpoint proof is created and continually upgraded. The final Chainpoint proof defines a path of operations that cryptographically links your data to one or more blockchains.

What is a Chainpoint Proof?

A proof is a JSON-LD document, that contains the information to cryptographically verify a piece of 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 Node API

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 Tutorial

Chainpoint JS Client

This 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 Client

Chainpoint Proof Versions

The third major version of the Chainpoint proof specification is currently in testing and scheduled for release soon. A JSON schema validator is available.

NameDescription
@context
string, required
the JSON-LD context for the proof
typestring, requiredthe JSON-LD type definition
hashstring, requiredhash value between 40 and 128 hex characters. Must be even length.
hash_id_nodestring, requireda 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_atstring, requiredHuman readable ISO 8601 timestamp extracted from time embedded in the hash_id_node
hash_id_corestring, requireda 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_atstring, requiredHuman 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)
labelstring, optionaltext string representing the branch name
opsarray, optionalan array of operations objects. Operations are performed in sequence to arrive at an intermediate hash prior to entering a nested branch.
branchesarray, optionalnested 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, optionalleft 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, optionalright 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.
opstring, optionalan 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).
typestring, requiredone of 'cal' (Calendar), 'btc' (Bitcoin), or 'eth' (Ethereum) anchor types
anchor_idstring, requiredan identifier used to look up embedded anchor data. e.g. a Bitcoin transaction or block ID.
urisarray, optionalan 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].

Example

{
  "@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"
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}
NameDescription
@contextthe JSON-LD context for the receipt
typereceipt type definition specifying hash method and version
targetHashhash value being anchored to the blockchain
merkleRootmerkle tree root value that is anchored to the blockchain
proofmerkle proof establishing link from the targetHash to the merkleRoot
anchors
typeanchor type definition specifying anchoring method
sourceIdidentifier, such as a transaction id, used to locate anchored data

Example

{
  "@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 Types

Receipt type values indicate the hash type and version of the receipt. The following values are supported.

TypeDescription
ChainpointSHA224v2Chainpoint 2.0 receipt using SHA-224
ChainpointSHA256v2Chainpoint 2.0 receipt using SHA-256
ChainpointSHA384v2Chainpoint 2.0 receipt using SHA-384
ChainpointSHA512v2Chainpoint 2.0 receipt using SHA-512
ChainpointSHA3-224v2Chainpoint 2.0 receipt using SHA3-224
ChainpointSHA3-256v2Chainpoint 2.0 receipt using SHA3-256
ChainpointSHA3-384v2Chainpoint 2.0 receipt using SHA3-384
ChainpointSHA3-512v2Chainpoint 2.0 receipt using SHA3-512

Anchor Types

Anchor type values indicate the method and location of the anchored data. The following values are supported. Support for additional methods is planned.

TypeDescription
BTCOpReturnAnchored to a Bitcoin transaction within an OP_RETURN output.
ETHDataAnchored to an Ethereum transaction within the data field.
NameDescription
Header
chainpoint_versionversion of the Chainpoint standard
hash_typehashing algorithm used to encrypt target data (sha­256)
merkle_rootroot of the Merkle Tree that is published in the blockchain
tx_idblockchain transaction id
timestampnon­authoritative Unix timestamp of the target
Target
target_hashhash of the target that is being recorded in the blockchain
target_proofMerkle 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

Example

{
  "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"
    }
  ]
}

Verifying Chainpoint Proofs

Verification confirms that the proof is well formatted, and all proof operations lead to the expected anchor hash on the blockchain(s). 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.