Pact智能合约模块的keyset是如何被强制执行的?
Pact模块治理keyset的核心逻辑说明
(module foo 'foo-keyset ...)定义里的'foo-keyset是链上keyset的名称索引,具体规则如下:
- 这个字符串没有内置固定语义,支持任意合法命名,不需要和模块名、谓词名、公钥值做强制绑定
- 强制校验的完整执行流程:
- 触发模块升级、受治理权限保护的操作时,节点首先从链上全局状态中,读取名称为
foo-keyset的已存储keyset对象,对象结构就是标准的公钥列表+谓词定义格式:
- 触发模块升级、受治理权限保护的操作时,节点首先从链上全局状态中,读取名称为
{ "keys": ["abc6bab9b88e08d","fe04ddd404feac2"], "pred": "keys-2" } { "keys": ["abc6bab9b88e08d","fe04ddd404feac2"], "pred": "my-module.custom-pred" }
- 提取当前交易附带的所有签名公钥,和读取到的keyset中
keys字段的公钥列表做匹配,统计匹配成功的公钥数量 - 调用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
相关产品推荐
相关产品推荐

