Verifying Blockchain Records¶
This guide explains how to verify that a record has been anchored to the blockchain and has not been tampered with.
What is Verification?¶
Verification confirms that:
- A record's content hash exists in a Merkle tree
- That Merkle root was submitted to the Polygon blockchain
- The transaction was confirmed with sufficient block confirmations
- The record content matches its original hash
Verification Methods¶
Web Interface¶
Visit /audit_trail/verify to use the verification tool:
- By Content Hash - Enter the SHA-256 hash of the record content
- By Record Reference - Select the record type and ID
API Verification¶
POST /api/v1/audit/verify
Content-Type: application/json
Authorization: Bearer <api_token>
{
"content_hash": "0x1234abcd..."
}
Response:
{
"verified": true,
"anchor": {
"id": 123,
"merkle_root": "0xdef456...",
"tx_hash": "0x789abc...",
"block_number": 12345678,
"confirmed_at": "2026-01-15T10:30:00Z",
"network": "polygon_mainnet",
"explorer_url": "https://polygonscan.com/tx/0x789abc..."
},
"proof": {
"leaf_index": 42,
"proof_path": ["0xaaa...", "0xbbb...", "0xccc..."]
}
}
Independent Verification¶
You can verify proofs independently without trusting Kiket:
- Get the proof data from the API or compliance export
- Recompute the Merkle root using the content hash and proof path
- Check the blockchain for the anchor transaction
- Verify the Merkle root in the transaction matches your computation
// Example: Independent Merkle proof verification
const crypto = require('crypto');
function verifyProof(contentHash, proofPath, expectedRoot) {
let current = contentHash;
for (const sibling of proofPath) {
// Sort hashes for consistent ordering
const pair = [current, sibling].sort();
current = crypto
.createHash('sha256')
.update(Buffer.from(pair[0] + pair[1], 'hex'))
.digest('hex');
}
return current === expectedRoot;
}
Understanding Verification Results¶
Verified (Success)¶
The record is confirmed on the blockchain. You'll see:
- Anchor ID - Internal reference for the Merkle tree batch
- Merkle Root - The root hash submitted to blockchain
- Transaction Hash - Polygon transaction containing the anchor
- Block Number - Where the transaction was confirmed
- Explorer Link - Direct link to view on Polygonscan
Not Found¶
Possible reasons:
- Record hasn't been anchored yet (check pending status)
- Invalid content hash format
- Record doesn't exist in the system
Verification Failed¶
The Merkle proof doesn't match. This could indicate:
- Data corruption (rare)
- Incorrect proof data
- Contact support if this occurs unexpectedly
Verification for Compliance¶
For compliance audits, you may need to demonstrate:
- Chain of custody - Export the full audit trail with proofs
- Independent verification - Auditors can verify proofs themselves
- Blockchain transparency - All transactions are public on Polygon
Export Verification Package¶
Generate a compliance report that includes:
- All audit records for a date range
- Merkle proofs for each record
- QR codes linking to blockchain transactions
- Instructions for independent verification
See [Compliance Reports(../compliance/blockchain-reports.md) for details.
Troubleshooting¶
"Record not found"¶
- Ensure the content hash is correctly formatted (64 hex characters)
- Check if the record type and ID are valid
- The record may be pending anchoring
"Anchor not confirmed"¶
- The transaction is submitted but awaiting confirmations
- Wait 5-10 minutes and retry
- Check network status on Polygonscan
"Verification failed"¶
- Contact support - this indicates a potential data integrity issue
- Provide the content hash and anchor ID for investigation
Related¶
- [Blockchain Audit Trail(blockchain-audit-trail.md) - Overview of the anchoring system
- [Blockchain API(../api/blockchain.md) - Programmatic verification
- [EU AI Act Compliance(../compliance/eu-ai-act.md) - AI-specific audit requirements