Skip to main content

Resolve and check proofs

Resolving a microblock follows all its references and returns an object with usable data, together with all the associated proofs. The proof checker then verifies that object.

Example​

We reuse the receivable that references its debtor. Its anchored data contains a link:

{
"applicationId": "...",
"data": {
"name": "Energy supply invoice",
"reference": "F-2025-11873",
"issuer": "EDF",
"date": "2023-12-05",
"principal": 358.2,
"interest": 12.5,
"debtor": {
"__resolution_link__": "cmts://resolve/al/B304934D7D323D/h/123"
}
}
}

Suppose it was anchored in the microblock cmts://resolve/al/A1480947BF02147CC62FE8163C/h/259.

The resolution request​

The request sent to the resolver contains:

{
"linkedMicroblock": "cmts://resolve/al/A1480947BF02147CC62FE8163C/h/259",
"policies": {
"onResolutionFailure": "throw",
"onCyclicResolution": "throw"
}
}
FieldMeaning
linkedMicroblockThe microblock to resolve.
policies.onResolutionFailureWhat to do if the resolution algorithm fails: ignore or throw (default throw).
policies.onCyclicResolutionWhat to do if a cycle is detected in the references: ignore or throw (default throw). Cycles cannot appear if links only reference microblocks that existed at anchoring time.
digestDataOptional. The clear off-chain data to match against the anchored digests.

The policies are optional, and define the behavior of the resolver.

The resolution proof​

The resolver resolves every link recursively. Each time a link is resolved, its proof is added to the returned proofs. The result is:

{
"type": "resolutionProof",
"info": {
"version": 1,
"chainId": "",
"description": "Resolution proof",
"author": "Operator",
"date": "2026-10-05"
},
"proof": {
"linkedMicroblock": "cmts://resolve/al/A1480947BF02147CC62FE8163C/h/259",
"resolvedMicroblock": {
"name": "Energy supply invoice",
"reference": "F-2025-11873",
"issuer": "EDF",
"date": "2023-12-05",
"principal": 358.2,
"interest": 12.5,
"debtor": { "lastName": "Durand", "firstName": "Pierre" }
},
"proofs": {}
},
"proofSignature": {}
}
FieldMeaning
typeThe type of proof: resolutionProof.
info.versionVersion of the proof format.
info.chainIdId of the chain of the resolved microblock.
info.description, authorA description and the author of the proof.
info.dateGeneration date, in ISO format.
proof.linkedMicroblockThe microblock that was resolved (here, the receivable).
proof.resolvedMicroblockThe resolved data, with every link, digest, signature and presentation replaced by its content.
proof.proofsThe authenticity proofs for every resolved link: here the receivable's microblock and the debtor's microblock.
proof.digestDataPresent when off-chain data was resolved.
proofSignatureOptional signature of the proof.

proofs is shown empty above for brevity. In a real proof it contains one authenticity proof per resolved microblock.

The resolver thus gives you all the anchored data along with its proofs.

Use the proof checker​

Send the resolution proof to the proof checker:

  • directly as JSON; or
  • as a PDF with the JSON attached.

The proof checker verifies all the proofs, and their consistency with the data in resolvedMicroblock.

What can resolve​

Anchored keyChecked at resolution
__resolution_link__The referenced microblock exists and is proven.
__digest__The supplied clear data matches the anchored digest.
__signature__The signature over the payload is valid.
__vp__The presentation is valid; its claims are returned.