用途:query 调用由单个副本应答、无共识,故障或恶意副本可能返回伪造数据。认证机制在 update 调用期间把 32 字节哈希(通常是数据 Merkle 树根)写入子网认证状态,query 响应携带子网阈值 BLS 密钥签名的证书;客户端验证证书与 Merkle 见证后,可获得与 update 调用同等可信的快速查询。
主要能力:Rust 侧使用 ic-cdk 0.20 的 certified_data_set/data_certificate、ic-certification 4 的 RbTree Merkle 映射与见证、ic-http-certification 4 认证 http_request 响应;Motoko 侧使用 mo:core/CertifiedData、ic-certification 1.1 的 CertTree、sha2 0.2;前端使用 @icp-sdk/core ^6 与 @dfinity/certificate-verification ^4 做见证验证。ICRC-3 账本通过 icrc3_get_tip_certificate 返回证书与 hash_tree。
使用方式:先确定由谁验证——HTTP 网关、客户端代码或共识。客户端验证需根密钥:浏览器用 ic_env cookie 的 IC_ROOT_KEY,脚本用 icp network status --json 的 root_key,主网用 agent 内置默认值;切勿在发布代码中调用 fetchRootKey()。Rust 在 init/post_upgrade 及每次变更后调用 certified_data_set;Motoko 用 CertTree.Store(稳定)与 transient 的 CertTree.Ops,变更后调用 ct.setCertifiedData()。query 中返回 value、certificate 与 witness,客户端用 verifyCertification 校验签名、时间与根哈希,再用 lookup_path 判断 Found/Absent/Unknown。
适用场景:余额、权限、价格等安全相关查询,以及自定义 http_request 的 HTTP 响应认证。
限制:certified_data_set 最多 32 字节,且不能在 query 中调用;证书仅在 query 调用中可用;升级后堆上的 Merkle 树会丢失需重建;见证必须对应所查键;只有 Absent 才证明键不存在;需做新鲜度检查(如 5 分钟偏移);Motoko 的 CertTree.Ops 不可声明为 stable;HTTP 认证必须包含 IC-CertificateExpression 头。