BLS 签名算法扫盲:从原理到面试题全解

一、BLS是什么BLS=Boneh-Lynn-Shacham签名算法,是一种基于双线性配对的数字签名方案,核心优势是支持签名聚合。它的设计目标,就是解决区块链中「大量节点签名导致数据膨胀、验证成本过高」的痛点。二、解决了什么问题?在区块链里,ECDSA/Ed25519有个致命短板:不支

一、BLS是什么

BLS = Boneh-Lynn-Shacham 签名算法,是一种基于双线性配对的数字签名方案,核心优势是支持签名聚合。它的设计目标,就是解决区块链中「大量节点签名导致数据膨胀、验证成本过高」的痛点。

二、解决了什么问题?

在区块链里,ECDSA/Ed25519 有个致命短板:不支持原生聚合

  • 1000 个节点签名,就要存 1000 个签名、验 1000 次,数据量大、链上 Gas 成本极高。
  • BLS 可以把 1000 个签名,压缩成 1 个 48 字节的聚合签名,一次验证搞定所有,完美适配 PoS 共识、跨链验证、Rollup 等场景。

BLS VS ECDSA

特性 ECDSA(secp256k1/Ed25519) BLS(BLS12-381/BN254)
签名大小 64 字节 48 字节(G1 群)
公钥大小 32 字节 96 字节(G2 群)
聚合能力 不支持原生聚合 支持,N 个签名合成 1 个
单签验证速度 稍慢(需配对运算)
批量验证速度 极快(一次配对搞定)
链上场景 账户交易签名 共识签名、多签、跨链验证

三、底层原理

BLS 的核心是双线性配对,先搞懂这个数学基础,再看签名流程就不懵了。

1. 双线性配对是什么?

定义:存在一个映射 e: G1 × G2 → GT,满足核心性质:

e(aP,bQ)=e(P,Q)ab

大白话解释:

  • 把 G1、G2 两个群的点 PQ 丢进配对函数 e,得到 GT 群的一个值;
  • 这个函数满足「线性」,标量乘法可以从配对里提出来,这就是 BLS 聚合的数学根基。

2. BLS 签名核心流程(标准模式:签名在 G1,公钥在 G2)

① 密钥生成

  • 私钥 sk:从 Z_r(标量群)中随机选一个数,保密;
  • 公钥 pkpk = sk · g2,其中 g2 是 G2 群的生成元,公开。

② 签名生成

  1. 把消息 m 哈希映射到 G1 群的点 H(m)(用标准的 Hash-to-Curve 算法);
  2. 签名 σ = sk · H(m)(G1 群的点,48 字节)。

③ 签名验证

用配对函数检查:

e(σ,g2)=e(H(m),pk)

  • 如果等式成立,说明签名有效;否则无效。
  • 原理:σ = sk·H(m)pk = sk·g2,代入配对性质:e(sk·H(m), g2) = e(H(m), sk·g2) → 等式成立 ✅

四、BLS 聚合签名

1. 聚合签名是什么?

多个签名者对同一个 / 不同消息签名,把所有签名加起来,得到一个聚合签名,公钥也可以聚合,最终一次验证搞定所有。

举个例子:100 个验证者对同一个消息 m 签名

  • 每个验证者 i 的签名:σ_i = sk_i · H(m)
  • 聚合签名:σ = σ_1 + σ_2 + ... + σ_100(椭圆曲线点加法)
  • 聚合公钥:pk = pk_1 + pk_2 + ... + pk_100
  • 验证:检查 e(σ, g2) = e(H(m), pk) 即可 ✅

对不同消息的聚合(以太坊信标链场景)

  • 每个验证者 i 对不同消息 m_i 签名:σ_i = sk_i · H(m_i)
  • 聚合签名:σ = σ_1 + σ_2 + ... + σ_n
  • 验证:e(σ, g2) = ∏ e(H(m_i), pk_i)(一次配对 + 多次乘法)

2. 为什么聚合这么香?

  • 数据压缩:1000 个签名 → 1 个 48 字节的签名,区块数据量直接打 1/1000;
  • 验证成本:1000 次验证 → 1 次配对运算,链上 Gas 大幅降低;
  • 适配 PoS:以太坊信标链上成千上万的验证者,全靠 BLS 聚合签名撑着共识性能。
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
mengbuluo222
mengbuluo222
0x9Ff1...FaA5
前端开发求职中... 8年+开发经验,拥有丰富的开发经验,擅长VUE、React开发。