You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pact域名注册智能合约测试报错:单键账户协议违规

Pact智能合约测试报错排查:Single-key account protocol violation

问题背景

开发域名注册智能合约name.pact并编写测试REPL文件name.repl,文件结构如下:

smartcontract 
├── root 
│   ├── coin-v5.pact 
│   ├── fungible-v2.pact 
│   └── fungible-xchain-v1.pact 
├── name.pact 
└── name.repl

执行测试命令 (load "name.repl") 测试合约register函数时,创建KDA账户环节触发错误,报错信息:

root/coin-v5.pact:516:12: Single-key account protocol violation
 at root/coin-v5.pact:516:12: (enforce false "Single-key account protocol violation")
 at root/coin-v5.pact:515:10: (if (native `=`  Compare alike terms for equality, ret... (native `enforce`  Fail transaction with MSG if pu... (native `enforce`  Fail transaction with MSG if pu...)
 at root/coin-v5.pact:513:8: (if (native `=`  Compare alike terms for equality, ret... true (native `if`  Test COND. If true, evaluate THEN. O...)
 at root/coin-v5.pact:510:4: (if (native `validate-principal`  Validate that PRINCI... true (let (r:<ap> (coin.check-reserved "k:36990b871267e...)
 at root/coin-v5.pact:288:4: (enforce-reserved "k:36990b871267ec4532551e505260806d7f39378cebb5ea2...               KeySet {keys: [domain-admin-gov-keyset],pred: keys...) 
  at name.repl:44:0: (create-account "k:36990b871267ec4532551e505260806d7f39378cebb5ea2... KeySet {keys: [domain-admin-gov-keyset],pred: keys...)

已准备完整合约代码、测试REPL代码及报错信息,需排查解决该错误。

错误原因

该错误是Coin-v5合约的单密钥账户协议校验失败导致的:

  • 单密钥账户要求账户地址的公钥必须与控制该账户的KeySet中的公钥完全一致
  • 从报错看,传入的账户地址k:36990b871267ec4532551e505260806d7f39378cebb5ea2...与控制KeySet{keys: [domain-admin-gov-keyset],pred: keys...}的公钥不匹配,触发了协议校验的enforce断言。

解决方案

1. 匹配账户地址与控制KeySet的公钥

创建单密钥账户时,必须保证账户地址的公钥就是KeySet中包含的公钥。例如domain-admin-gov-keyset对应的公钥是0x36990b871267ec4532551e505260806d7f39378cebb5ea2...,则账户地址必须是k:0x36990b871267ec4532551e505260806d7f39378cebb5ea2...。

2. 修正REPL中的create-account调用

打开name.repl第44行,确认create-account的两个参数公钥一致,示例:

;; 正确示例:账户地址与KeySet公钥匹配
(create-account "k:0x36990b871267ec4532551e505260806d7f39378cebb5ea2..." (read-keyset "domain-admin-gov-keyset"))

3. 验证KeySet定义

检查REPL中domain-admin-gov-keyset的定义,确保公钥与账户地址后缀完全一致:

(define-keyset "domain-admin-gov-keyset" (read-keyset '{"keys": ["0x36990b871267ec4532551e505260806d7f39378cebb5ea2..."], "pred": "keys-all"}))

4. 多签名账户处理(若需求非单密钥账户)

如果需要创建多签名或其他类型账户,需调用Coin合约的create-account-multi方法,同时账户地址使用m:前缀格式。

内容的提问来源于stack exchange,提问作者advanztek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 13:45:07