Kadena测试网部署失败:Keyset failure (keys-all): 'todo-admin-keyset'
Kadena测试网部署:密钥集验证失败(keys-all)问题排查与解决
问题概述
部署Pact合约时触发错误:失败:交易执行失败:密钥集验证失败(keys-all):'todo-admin-keyset',对应部署YAML配置如下:
codeFile: pact/todos.pact networkId: testnet04 publicMeta: chainId: "1" gasLimit: 1000 ttl: 28000 creationTime: sender: "nambi001" gasPrice: 0.00001 data: todo-admin-keyset: ["ba54b224d1924dd98403f5c751abdd10de6cd81b0121800bf7bdbdcfaec7388d"] keyPairs: public: ba54b224d1924dd98403f5c751abdd10de6cd81b0121800bf7bdbdcfaec7388d secret: 8693e641ae2bbe9ea802c736f42027b03f86afe63cae315e7169c9c496c17332 nonce: fetch-todos
交易查询密钥:tnx2phZpQOyOtloY2eD4M48yzm_tOpqeq9abNn2TGCo
核心原因分析
该错误表明合约定义的todo-admin-keyset密钥集规则,与交易提交时的签名验证逻辑不匹配,常见触发场景:
- 合约内密钥集要求多签(keys-all),但提交的签名不符合规则
- 部署时传递的密钥集格式错误
- 签名使用的密钥对与合约预期的密钥集不匹配
- 交易元数据(如
creationTime)不合法导致连锁验证失败
具体修复步骤
1. 检查Pact合约中的密钥集定义
确认pact/todos.pact内的todo-admin-keyset定义,比如是否为:
(defcap admin-guard () (enforce (keys-all 'todo-admin-keyset) "Admin only"))
或直接定义密钥集:
(define-keyset 'todo-admin-keyset (read-keyset "todo-admin-keyset"))
若合约要求keys-all,需确保交易使用密钥集中所有公钥完成签名,且YAML传递的公钥与签名密钥完全一致。
2. 修正YAML配置的关键问题
问题点1:creationTime字段为空
Kadena交易要求creationTime必须为当前秒级Unix时间戳,空值会直接导致交易合法性验证失败,进而触发密钥集验证错误。需填充有效时间戳,示例:
publicMeta: # ...其他字段 creationTime: 1720000000
问题点2:Nonce值重复
nonce: fetch-todos若曾被使用过,会被标记为重复交易,间接引发验证错误。建议使用唯一值,比如当前时间戳+随机字符串:
nonce: deploy-todo-1720000000
问题点3:密钥集与签名一致性
确保data中的todo-admin-keyset数组包含的公钥,与keyPairs中的公钥完全匹配,且交易确实使用该密钥对完成了签名。
3. 验证交易签名
确认使用的签名工具(如pact-cli)正确加载密钥对,部署命令示例:
pact deploy pact/todos.pact -n testnet04 -k keys.yaml -d deploy-data.yaml
其中keys.yaml需包含你的密钥对,deploy-data.yaml需正确传递todo-admin-keyset参数。
4. 查看交易日志细节
使用提供的交易密钥查询测试网交易日志,重点确认:
- 签名是否有效
- 密钥集参数是否正确传递
- 交易元数据(如
creationTime)是否合法
验证修复后的部署流程
- 填充正确的
creationTime时间戳 - 使用唯一的
nonce值 - 确保合约密钥集定义与YAML参数一致
- 重新签名并提交交易
内容的提问来源于stack exchange,提问作者Harsh Nambiar
相关产品推荐
相关产品推荐

