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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:16:07