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

Pact智能合约模块的keyset是如何被强制执行的?

Pact模块治理keyset的核心逻辑说明

(module foo 'foo-keyset ...)定义里的'foo-keyset是链上keyset的名称索引,具体规则如下:

  • 这个字符串没有内置固定语义,支持任意合法命名,不需要和模块名、谓词名、公钥值做强制绑定
  • 强制校验的完整执行流程:
    1. 触发模块升级、受治理权限保护的操作时,节点首先从链上全局状态中,读取名称为foo-keyset的已存储keyset对象,对象结构就是标准的公钥列表+谓词定义格式:
{ "keys": ["abc6bab9b88e08d","fe04ddd404feac2"], "pred": "keys-2" }
{ "keys": ["abc6bab9b88e08d","fe04ddd404feac2"], "pred": "my-module.custom-pred" }
  1. 提取当前交易附带的所有签名公钥,和读取到的keyset中keys字段的公钥列表做匹配,统计匹配成功的公钥数量
  2. 调用keyset中pred字段指定的谓词逻辑,传入匹配结果做判断:谓词返回true则校验通过,允许执行操作;返回false则直接拒绝交易
  • 「keyset名称需要和谓词名绑定」是常见误解:keyset名称只用来定位链上存储的keyset对象,和对象内部的公钥列表、谓词逻辑没有命名关联。比如你完全可以把叫foo-keyset的keyset的谓词设为内置的keys-2,不需要自定义同名谓词。
    内置keyset谓词的核心逻辑确实是基于签名匹配数量做判断:
    • keys-all:要求keyset内所有公钥都对当前交易签名
    • keys-any:要求keyset内至少1个公钥对当前交易签名
    • keys-2:要求keyset内至少2个公钥对当前交易签名
      自定义谓词可以在匹配数量的基础上扩展额外规则,比如增加块高判断、多签权重逻辑,但核心判断依据依然是交易签名和keyset公钥列表的匹配结果。

注意:部署模块时如果指定的治理keyset名称在链上不存在,交易会直接失败。你需要在部署模块前先写入对应名称的keyset;后续要调整治理规则时,只需要用原keyset授权更新同名称下的keyset内容即可,不需要修改模块代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:06:21