Daml 错误码
Daml 编译、Canton 运行时与 Ledger API 常见错误码参考。
此页面列出了您在 Canton Network 应用程序开发过程中最有可能遇到的错误代码,并按其来源进行分组。每个条目都包含错误消息、其典型原因以及解决方法。
Daml 编译错误
当您运行 dpm build 或编译 Daml 源时,会出现这些错误。
类型不匹配
Couldn't match expected type 'X' with actual type 'Y'
原因: 函数参数或绑定的类型错误。常见情况包括在需要 T 的情况下传递 ContractId T(使用 fetch),或者在需要 Party 的情况下传递 Text。
修复: 检查您正在调用的函数的类型签名。在Daml脚本中使用fetch将ContractId转换为其有效负载,或使用getParty将Text转换为Party。
记录中缺少字段
Fields not initialised: 'fieldName'
原因: 您创建了记录或模板实例,但未提供所有必填字段。
修复: 将缺失的字段添加到您的记录构造中。如果您最近向模板添加了字段,请更新所有呼叫站点。
SCU 兼容性违规
Upgrade check failed: field 'X' has changed type from 'A' to 'B'
原因: 智能合约升级兼容性检查失败。 SCU 要求新的封装版本与以前的版本兼容。您无法删除字段、更改字段类型或重新排序字段。
修复: 添加新的可选字段(使用默认值)而不是修改现有字段。如果您需要根本不同的结构,请创建一个新模板并显式迁移合约。
已弃用的异常警告
warning: Daml exceptions are deprecated
原因: 您的代码使用 exception 声明或 try/catch 块。
修复: 将基于异常的错误处理替换为 Either、Optional 或显式错误契约模式。 Daml 异常已弃用,并将在未来版本中删除。
运行时错误
当交易提交给正在运行的 Canton 验证器时,会发生这些错误。
无效_参数
INVALID_ARGUMENT: <detail>
原因: 提交的命令格式错误或违反了前提条件。子原因包括:
- 创建或执行命令中缺少必填字段
- 无效的参与方标识符格式
- 引用上传包中不存在的模板
修复: 根据 Ledger API 规范检查命令负载。验证模板名称、参与方标识符以及所有必填字段是否存在且输入正确。
未找到
NOT_FOUND: CONTRACT_NOT_FOUND - Contract could not be found with id <contract-id>
原因: 合同已存档(由之前的练习消耗),或者提交方永远看不到。
修复: 在行权前查询活跃合约集(ACS)以确认合约仍然存在。实现先获取后执行模式,或通过重新获取当前合约 ID 的重试来处理此错误。
已经存在_
ALREADY_EXISTS: CONTRACT_KEY_ALREADY_EXISTS - Contract key already exists
原因: 您试图创建一个密钥与已激活的合约相匹配的合约。 Daml 在参与方的可见性内强制每个模板的关键唯一性。修复: 在创建之前检查具有相同密钥的现有合约。在Daml中使用lookupByKey或通过Ledger API查询ACS。如果您想替换现有合同,请先将其存档。
中止(争用)
ABORTED: Interpretation error: ... contract not active
原因: 并发事务消耗了您的阅读和练习之间的合同。这在并发环境中是正常的。
修复: 使用指数退避重试操作。有关重试模式,请参阅开发问题。
账本 API 错误
Ledger API 运行时错误代码(AUTH_INVALID_TOKEN、PACKAGE_NOT_FOUND、PARTY_NOT_KNOWN、PERMISSION_DENIED 等)位于其自己的页面上:Ledger API 错误。
本文由 CC Privacy Club 根据 Canton Network 官方文档(CC-BY-4.0)整理翻译,仅供学习;实现细节以官方最新版本为准。