如何实现2个及以上密钥交易签名与密钥集验证
多签Keyset配置与签名验证实现方案
三种内置Keyset谓词规则先明确
keys-all:校验规则为Keyset公钥列表内的所有公钥均提供合法签名,才会判定验证通过,完全匹配3个指定密钥必须全部参与签名的需求keys-2:校验规则为Keyset公钥列表内至少2个公钥提供合法签名,即可通过验证keys-any:校验规则为Keyset公钥列表内任意1个公钥提供合法签名,即可通过验证
3个指定密钥强制全签的实现方法
不需要额外编写自定义校验逻辑,直接使用内置keys-all谓词即可,步骤如下:
- 定义Keyset时,将3个要求必须参与签名的公钥全部填入
keys数组 - 将Keyset的谓词(pred)字段指定为
keys-all
示例配置如下:
;; 链上定义Keyset (define-keyset 'mandatory-3-sign-keyset (read-keyset "3sign-ks"))
对应的初始化传入的Keyset数据结构:
{ "3sign-ks": { "keys": ["pubkey-1", "pubkey-2", "pubkey-3"], "pred": "keys-all" } }
配置完成后,链上原生验证逻辑会自动强制校验:3个公钥缺任何一个的合法签名,交易都会直接验证失败,不存在绕过空间。
2个及以上密钥多签的实现、签名与验证流程
配置规则
- 如果需求是「公钥列表内至少2个签名即可通过」,直接使用内置
keys-2谓词,将所有允许参与签名的公钥填入keys数组即可 - 如果需求是自定义阈值(比如4个公钥里要求至少3个签名),可以编写自定义谓词,示例:
;; 自定义谓词:匹配到的有效签名数≥3则通过 (defun require-3-signs (total-key-count matched-sign-count) (>= matched-sign-count 3) )
定义Keyset时将pred字段指定为自定义函数名即可。
签名操作流程
- 生成待签名的交易原始载荷,计算交易哈希
- 将交易载荷分别发送给所有需要参与签名的密钥持有方,各持有方用自己的私钥独立对交易哈希生成签名
- 收集所有签名结果,统一附加到交易的签名字段中,再向链上广播交易
验证逻辑
验证过程由链节点自动执行,无需额外开发:节点收到交易后,会遍历Keyset内的所有公钥,统计和交易附带签名匹配的有效公钥数量,再将统计值传入配置的谓词函数,函数返回true则验证通过,返回false则直接驳回交易。
内容的提问来源于stack exchange,提问作者Manas Gandhi
相关产品推荐
相关产品推荐

