# Zama委托解密排错：链上委托、Permit与余额缺值

整理：链小知（AI 辅助）
资料核对日期：2026-10-14
引用地址：https://lianxiaozhi.com/tools/guides/zama-delegated-balance-permit-scope
难度：进阶
核验方式：官方文档整理，未执行真实账户操作

按已有脱敏材料核谁可读哪个合约、何时有效，以及传播延迟、权限不足和真实零余额的区别。

## 使用工具
- [Zama SDK](https://lianxiaozhi.com/tools/zama) · [官方入口](https://docs.zama.org/protocol/sdk)

## 前置条件
- 准备已有的SDK版本、链ID、代币合约、委托人/读取方、脱敏授权状态及错误记录；保留观察时间，缺值留待核。

## 1. 固定当前SDK、链和三个地址角色

先区分当前@zama-fhe/sdk与legacy @zama-fhe/relayer-sdk，记录链ID、机密代币合约、delegatorAddress、读取方地址；余额持有人另记accountAddress，不能默认四者相同。

官方托管Ethereum/Polygon主网Relayer要求key，Sepolia不需；鉴权配置正确也不代表拥有密文ACL。用已有配置核环境，主网应用的key不应出现在浏览器材料中。

核对结果：SDK版本、链、合约、委托人/读取方/余额持有人已对应；Relayer鉴权和数据权限未混同。
依据：[Zama：当前SDK与legacy Relayer SDK区别](https://docs.zama.org/protocol/sdk)
依据：[Zama：主网与Sepolia Relayer鉴权范围](https://docs.zama.org/protocol/sdk/guides/authentication.md)
依据：[Zama：委托解密、传播、结果及撤销](https://docs.zama.org/protocol/sdk/guides/delegated-decryption.md)

## 2. 将链上委托与本地Permit分开核

链上delegateDecryption每次对应一个(contractAddress, delegateAddress)并产生交易回执；可不设到期，也可设expirationDate，显式日期至少在未来1小时，否则DelegationExpirationTooSoonError会在发送前出现。已有请求材料中的日期需对原请求时点核，不能拿今天倒推当时是否合法。

读取方使用自己的transport key与EIP-712 Permit。Permit绑定签名者、链、可选delegator、合约集合与时长，每份最多10个合约，更多会分块；默认permitTTL为30天且新增范围是追加，不会自动替换旧授权。改TTL也不追溯改变已签Permit。

核对结果：链上tuple/期限和Permit的签名者、链、delegator、合约集合/期限分别有记录，未把两种期限互相覆盖。
依据：[Zama：委托解密、传播、结果及撤销](https://docs.zama.org/protocol/sdk/guides/delegated-decryption.md)
依据：[Zama：Permit范围、到期与本地撤除](https://docs.zama.org/protocol/sdk/concepts/permit-model.md)

## 3. 辨认已确认、传播中与权限缺失

按原材料核委托回执与getStatus返回的isActive、expiryTimestamp；链上确认和Gateway ACL传播是不同状态。官方称通常约10个区块，委托解密内部有约30秒的有界等待；这些是估计与重试预算，不是到账或服务承诺。

DelegationNotPropagatedError可能表示同步超出预算；NotEntitledError则是缺链上ACL的终止错误，不能无限重试当成传播。另分DelegationNotFound、Expired、ChainMismatch和ACL暂停；不完整材料只记录对应错误与待核项。

核对结果：回执、有效委托、传播与终止权限错误分列，估计区块/秒数未当完成保证。
依据：[Zama：委托解密、传播、结果及撤销](https://docs.zama.org/protocol/sdk/guides/delegated-decryption.md)
依据：[Zama：权限、传播与缺密文错误](https://docs.zama.org/protocol/sdk/guides/handle-errors.md)

## 4. 用结果身份与密文区分余额和缺值

decryptBalanceAs默认读取委托人余额；余额持有人不同应明确accountAddress。解密缓存按(accountAddress, token, encryptedValue)绑定，不能把另一个账户、代币或旧密文的明文挪用。

批量Token.batchDecryptBalancesAs返回Map<Address,bigint>；默认任一失败会让整次拒绝，onError才可保留逐币结果。官方示例把失败替为0n只是示例策略，本对照应单列错误而非认定零余额。NoCiphertextError表示未有加密余额，与成功返回0n不同。

核对结果：每个值绑定账户/代币/密文；失败、无密文与成功零余额分别记录，批量缺项未补零。
依据：[Zama：委托解密、传播、结果及撤销](https://docs.zama.org/protocol/sdk/guides/delegated-decryption.md)
依据：[Zama：权限、传播与缺密文错误](https://docs.zama.org/protocol/sdk/guides/handle-errors.md)

## 5. 区分链上撤销与本地清理

已有退出材料中，revokeDelegation针对原合约与读取方撤销链上委托；permits.revokePermits清理的是本地Permit，clear还处理调用签名者的本地key slot，均不能代替原tuple的链上撤销证据。选择性移除Permit会移除触及所列合约的整份Permit，不应假定同份其他合约仍覆盖。

保留撤销/到期、读取错误及原明文披露范围；撤销不能令已获得的明文失忆。地址、交易类型、时间、Gas和shield/unshield金额仍可公开，不能将委托解密称完全匿名。

核对结果：链上撤销与本地清理各有对应材料，历史已披露值和公开元数据边界明确。
依据：[Zama：委托解密、传播、结果及撤销](https://docs.zama.org/protocol/sdk/guides/delegated-decryption.md)
依据：[Zama：Permit范围、到期与本地撤除](https://docs.zama.org/protocol/sdk/concepts/permit-model.md)
依据：[Zama：可见元数据与密钥存储边界（选读）](https://docs.zama.org/protocol/sdk/concepts/security-model.md)

## 常见错误
- 主网key、链上委托与Permit是三个层次。
- SDK内部等待不是无限自动重试，权限不足不当零余额。
- 删除缓存不撤链上委托，也不抹去历史明文。

## 完成检查
- 得到角色、范围、期限、传播与结果的对照；官方方法已核，实际账户权限与解密结果仍以原材料为准。

## 相关知识

## 官方依据
- [Zama：当前SDK与legacy Relayer SDK区别](https://docs.zama.org/protocol/sdk)
- [Zama：主网与Sepolia Relayer鉴权范围](https://docs.zama.org/protocol/sdk/guides/authentication.md)
- [Zama：Permit范围、到期与本地撤除](https://docs.zama.org/protocol/sdk/concepts/permit-model.md)
- [Zama：委托解密、传播、结果及撤销](https://docs.zama.org/protocol/sdk/guides/delegated-decryption.md)
- [Zama：权限、传播与缺密文错误](https://docs.zama.org/protocol/sdk/guides/handle-errors.md)
- [Zama：可见元数据与密钥存储边界（选读）](https://docs.zama.org/protocol/sdk/concepts/security-model.md)
