Kadena Pact属性校验问题:create-account未按预期校验账户名长度
Kadena Pact属性校验未生效原因及修复方案
核心问题
你混淆了Pact中模型属性(@model defproperty)与运行时校验的作用:
- 模型属性仅用于形式化验证/静态模型检查,由Pact的模型分析工具(如
pact model-check)扫描合约逻辑,验证是否符合属性约束,不会在函数实际执行时自动触发校验。 - 你期望的账户名长度拦截属于运行时安全检查,必须在函数内显式添加断言逻辑才能生效。
你的create-account函数仅标注了模型属性,但未添加运行时校验逻辑,因此无论账户名是否合法,函数都会执行insert操作,导致测试未达预期。
修复方案
在create-account函数中添加enforce断言(Pact用于前置条件校验的内置函数,条件不满足时抛出错误终止执行),同时保留原模型属性用于静态验证:
(defun create-account:string ( account:string guard:guard ) @doc " Create a new account. " @model [ (property (valid-account-id account)) ] ; 新增运行时账户名长度校验 (enforce (>= (length account) 3) "Account name must be at least 3 characters") (enforce (<= (length account) 256) "Account name cannot exceed 256 characters") (enforce-reserved account guard) (insert token-table account { "balance" : 0.0 , "guard" : guard } ) )
补充说明
- 原有的
valid-account-id模型属性可以保留,它能配合Pact的模型检查工具,静态验证合约中所有涉及账户ID的操作是否符合长度约束,属于合约逻辑正确性的额外保障。 - 修改后重新运行REPL单元测试,三类非法账户名的测试会得到预期的失败结果,因为
enforce会在条件不满足时抛出错误,阻止后续的写入操作。
内容的提问来源于stack exchange,提问作者att
相关产品推荐
相关产品推荐

