Step-by-step verification process and blockchain verification results:
{
"blockchain_status": "VERIFIED_ON_BLOCKCHAIN",
"blockchain_verification": {
"network_info": {
"chain_id": 137,
"current_block": 96475442,
"is_testnet": false,
"network": "polygon_mainnet",
"rpc_url": "https://polygon-mainnet.g.alchemy.com/v2/7gs1nnlhLR4Az1nPfl-RU"
},
"verification_method": "dynamic_network_config",
"verified": true
},
"credential_status": "ISSUED",
"cryptographic_status": "VERIFIED_AS_ISSUED",
"cryptographic_verification": {
"computed_root": "0x0d0d9e3e8bffb1f735e8306ec0b95de78ada93f7e6bcc50f107b5327574de503",
"stored_root": "0x0d0d9e3e8bffb1f735e8306ec0b95de78ada93f7e6bcc50f107b5327574de503",
"verification_details": {
"computed_merkle_root": "0x0d0d9e3e8bffb1f735e8306ec0b95de78ada93f7e6bcc50f107b5327574de503",
"credential_hash": "0xcb6418184bd566277b7bee531f5a86d7c8b2520b934c024ace53950fa012836b",
"merkle_proof_array": [
"0x1ade787b9ba86d80c1a406dd10658a5575fd34815e564e4b4ef7f210b8cc6ee9",
"0x0ef79a899156957e2aed0901a685cf628908fdb1996dbded97cc36049d20f535",
"0xd3f1440db62f5ca41272c8c4e34f56b281c3eaf28493b2ad9d9eff3a3600a4e4",
"0x662d2bd02a0c9f71fff1257430614e41e9bb7a1fedd1e89a55f558e9efdd6201",
"0x21c82e84e4e04e6c2790450e2e7c985045f15d0b84c16d88db090def56e83e21",
"0xea077c309f73924cd44c0e26a51e665c088ec6a6d71b6f53aef77ea8bf6231e1"
],
"roots_match": true,
"stored_merkle_root": "0x0d0d9e3e8bffb1f735e8306ec0b95de78ada93f7e6bcc50f107b5327574de503",
"verification_method": "cryptographic_merkle_proof_verification"
},
"verified": true
},
"overall_verified": true,
"steps": [
{
"computed_hash": "0xcb6418184bd566277b7bee531f5a86d7c8b2520b934c024ace53950fa012836b",
"description": "Hash the complete credential data using SHA256",
"input": "Full credential JSON data (credentialPreview object)",
"method": "SHA256(JSON.stringify(credentialData, sort_keys=True))",
"note": "For issued credentials, the entire credential data is hashed",
"step": 1
},
{
"computation_details": {
"algorithm": "if bytes(current) \u003c= bytes(sibling): SHA256(current + sibling) else: SHA256(sibling + current)",
"critical_note": "DO NOT use tree index positioning (even=left, odd=right). Use lexicographic byte comparison for deterministic ordering.",
"ordering_rule": "lexicographic_byte_comparison"
},
"computation_example": "Start with credential_hash, compare bytes with sibling1 lexicographically, hash smaller+larger, repeat with result and next sibling",
"computation_method": "For each sibling hash: compare bytes lexicographically, put smaller hash first, then SHA256(smaller + larger)",
"computed_root": "0x0d0d9e3e8bffb1f735e8306ec0b95de78ada93f7e6bcc50f107b5327574de503",
"credential_hash": "0xcb6418184bd566277b7bee531f5a86d7c8b2520b934c024ace53950fa012836b",
"description": "Compute merkle root using lexicographic byte ordering",
"merkle_proof_array": [
"0x1ade787b9ba86d80c1a406dd10658a5575fd34815e564e4b4ef7f210b8cc6ee9",
"0x0ef79a899156957e2aed0901a685cf628908fdb1996dbded97cc36049d20f535",
"0xd3f1440db62f5ca41272c8c4e34f56b281c3eaf28493b2ad9d9eff3a3600a4e4",
"0x662d2bd02a0c9f71fff1257430614e41e9bb7a1fedd1e89a55f558e9efdd6201",
"0x21c82e84e4e04e6c2790450e2e7c985045f15d0b84c16d88db090def56e83e21",
"0xea077c309f73924cd44c0e26a51e665c088ec6a6d71b6f53aef77ea8bf6231e1"
],
"roots_match": true,
"step": 2,
"stored_root": "0x0d0d9e3e8bffb1f735e8306ec0b95de78ada93f7e6bcc50f107b5327574de503"
},
{
"blockchain_network": "polygon_mainnet",
"blockchain_verified": true,
"contract_address": "0x81FE95d5034D2B0B4E293fAe7d51243A09Ff31C5",
"description": "Verify computed merkle root exists on blockchain using stored RPC URL",
"method": "Call smart contract verifyProof() with tree_type=0",
"rpc_url_used": "https://polygon-mainnet.g.alchemy.com/v2/7gs1nnlhLR4Az1nPfl-RU",
"step": 3,
"tree_type": "issuance (tree_type=0)"
}
],
"verification_method": "issuance_tree_verification"
}