Zama委托解密排错:链上委托、Permit与余额缺值
链小知 · 进阶 · 核验 · 依官方文档整理
按已有脱敏材料核谁可读哪个合约、何时有效,以及传播延迟、权限不足和真实零余额的区别。
开始前准备
- 准备已有的SDK版本、链ID、代币合约、委托人/读取方、脱敏授权状态及错误记录;保留观察时间,缺值留待核。
1. 固定当前SDK、链和三个地址角色
先区分当前@zama-fhe/sdk与legacy @zama-fhe/relayer-sdk,记录链ID、机密代币合约、delegatorAddress、读取方地址;余额持有人另记accountAddress,不能默认四者相同。
官方托管Ethereum/Polygon主网Relayer要求key,Sepolia不需;鉴权配置正确也不代表拥有密文ACL。用已有配置核环境,主网应用的key不应出现在浏览器材料中。
检查结果:SDK版本、链、合约、委托人/读取方/余额持有人已对应;Relayer鉴权和数据权限未混同。
2. 将链上委托与本地Permit分开核
链上delegateDecryption每次对应一个(contractAddress, delegateAddress)并产生交易回执;可不设到期,也可设expirationDate,显式日期至少在未来1小时,否则DelegationExpirationTooSoonError会在发送前出现。已有请求材料中的日期需对原请求时点核,不能拿今天倒推当时是否合法。
读取方使用自己的transport key与EIP-712 Permit。Permit绑定签名者、链、可选delegator、合约集合与时长,每份最多10个合约,更多会分块;默认permitTTL为30天且新增范围是追加,不会自动替换旧授权。改TTL也不追溯改变已签Permit。
检查结果:链上tuple/期限和Permit的签名者、链、delegator、合约集合/期限分别有记录,未把两种期限互相覆盖。
3. 辨认已确认、传播中与权限缺失
按原材料核委托回执与getStatus返回的isActive、expiryTimestamp;链上确认和Gateway ACL传播是不同状态。官方称通常约10个区块,委托解密内部有约30秒的有界等待;这些是估计与重试预算,不是到账或服务承诺。
DelegationNotPropagatedError可能表示同步超出预算;NotEntitledError则是缺链上ACL的终止错误,不能无限重试当成传播。另分DelegationNotFound、Expired、ChainMismatch和ACL暂停;不完整材料只记录对应错误与待核项。
检查结果:回执、有效委托、传播与终止权限错误分列,估计区块/秒数未当完成保证。
4. 用结果身份与密文区分余额和缺值
decryptBalanceAs默认读取委托人余额;余额持有人不同应明确accountAddress。解密缓存按(accountAddress, token, encryptedValue)绑定,不能把另一个账户、代币或旧密文的明文挪用。
批量Token.batchDecryptBalancesAs返回Map<Address,bigint>;默认任一失败会让整次拒绝,onError才可保留逐币结果。官方示例把失败替为0n只是示例策略,本对照应单列错误而非认定零余额。NoCiphertextError表示未有加密余额,与成功返回0n不同。
检查结果:每个值绑定账户/代币/密文;失败、无密文与成功零余额分别记录,批量缺项未补零。
5. 区分链上撤销与本地清理
已有退出材料中,revokeDelegation针对原合约与读取方撤销链上委托;permits.revokePermits清理的是本地Permit,clear还处理调用签名者的本地key slot,均不能代替原tuple的链上撤销证据。选择性移除Permit会移除触及所列合约的整份Permit,不应假定同份其他合约仍覆盖。
保留撤销/到期、读取错误及原明文披露范围;撤销不能令已获得的明文失忆。地址、交易类型、时间、Gas和shield/unshield金额仍可公开,不能将委托解密称完全匿名。
检查结果:链上撤销与本地清理各有对应材料,历史已披露值和公开元数据边界明确。
怎样确认完成
- 得到角色、范围、期限、传播与结果的对照;官方方法已核,实际账户权限与解密结果仍以原材料为准。
常见错误与边界
- 主网key、链上委托与Permit是三个层次。
- SDK内部等待不是无限自动重试,权限不足不当零余额。
- 删除缓存不撤链上委托,也不抹去历史明文。