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
相关产品推荐
相关产品推荐

