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

基于ADKG的阈值ECDSA签名地址不一致:聚合r及参数计算问询

背景

我正在secp256k1曲线上实现异步分布式密钥生成(ADKG),让N个节点共同持有一个阈值私钥。DKG完成后每个节点持有一个密钥份额。为生成以太坊兼容交易签名,流程如下:

  1. 部分签名生成:每个节点使用自身密钥份额和相同的临时标量k生成可恢复签名(v_i, r_i, s_i)。
  2. s值插值:收集≥t + 1个部分签名后,用拉格朗日插值计算:
s_agg = sum_i (lambda_i * s_i) mod n

其中:

sum_i lambda_i = 1
  1. 聚合r(测试阶段):我设置:
r_agg = r_i

(因k相同,所有r_i一致)。
4. 归一化:若:

s_agg > n/2

则:

s_agg = n - s_agg
  1. 生成可恢复签名:构建聚合签名(v_agg, r_agg, s_agg),并从中恢复公钥/地址。
问题

当使用相同密钥份额和k签名不同交易时,从最终聚合签名中恢复出的以太坊地址不一致。我已确认:

  • sum_i lambda_i == 1
  • 所有r_i均一致
  • s_agg已正确归一化

我不确定问题是否出在r_agg、v_agg的计算方式或其他环节,目前根因未知。

疑问解答

1. 聚合r的计算

  • 由于所有节点使用了相同的临时标量k,所有R_i = k*G(G为曲线基点)完全一致,r_i = R_i.x mod n也必然相同,直接复用r_i是正确的,无需通过R = sum_i (lambda_i * R_i)重构点——该求和结果仍为k*G,与单个R_i完全一致。

2. v_agg(恢复ID)的计算

  • 以太坊恢复IDv的计算规则为:
    • 若R.y为偶数,初始v=27;若为奇数,初始v=28
    • 若s_agg进行了归一化(即执行过s_agg = n - s_agg),则v += 4(对应以太坊的v=31/32)
  • 单个节点的v_i仅反映自身部分签名的s_i归一化状态,但聚合后的s_agg归一化状态是独立的,且所有节点的R_i一致,因此v_agg需要基于共同的R = k*G的y坐标奇偶性和**s_agg的归一化状态**重新计算,不能直接复用单个节点的v_i。

3. 签名一致性通用问题

  • 错误的r_agg或v_agg都会导致地址不匹配:
    • r_agg错误会直接让公钥恢复过程计算出错误的点,进而生成错误地址
    • v_agg错误会让恢复过程选择错误的公钥分支(r对应两个可能的点,v用于指定分支),最终得到错误地址
  • 阈值ECDSA生成可恢复签名的标准方法:
    1. 确保所有节点使用**相同的临时标量k**生成部分签名,保证R_i完全一致,避免聚合R的复杂度
    2. 聚合s时严格执行拉格朗日插值,确保sum(lambda_i) = 1 mod n
    3. 聚合后基于共同的R = k*G的y坐标奇偶性和s_agg的归一化状态,重新计算v_agg
    4. 签名验证时,用聚合后的(r_agg, s_agg)和v_agg恢复公钥,再与预期地址对比
环境
  • 语言:Rust
  • 曲线:secp256k1
  • 库:secp256k1 crate
  • DKG:基于多项式共享的自定义ADKG协议

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 14:40:14