通俗易懂的讲解:Schnorr vs. ECDSA 👋

多线程推文

假设Alice、Bob和Charlie要共同授权一笔比特币交易。

ECDSA 多重签名(签名的“物理叠加”)

1. 他们各自用私钥签名交易,生成三个独立的签名。 2. 交易数据中需要包含三把公钥和三份签名。 3. 区块链验证时,必须分别检查每个签名是否匹配对应的公钥。

结果: • 交易数据随签名者数量线性增长 • 费用更高 • 多签结构暴露,隐私性较差

Schnorr 签名(签名的“化学反应”)

1. 三人先沟通,生成一个聚合公钥 C = A + B + C。 2. 各自计算部分签名,最终融合成一个签名。 3. 交易数据只需要存一个公钥 + 一个签名。 4. 区块链验证时,仅需一次验证,确认聚合签名有效。

结果: • 交易数据减少65%+ • 更低费用 • 无法区分是单人签名还是多人签名

[数学解释] 为何 Schnorr 可以融合成一个签名 & 一个公钥?

Schnorr 签名之所以能够将多个签名融合成一个,是因为它具有线性特性。

生成聚合公钥

Alice、Bob、Charlie 各自有公钥 A、B、C。

他们可以简单相加,得到一个聚合公钥 P: P = A + B + C 他们还分别有自己的私钥是小写的a,b,c. P = A + B + C = (a + b + c) G

生成随机公钥

每个人先生成一个随机数 r,创建临时公钥: • Alice 生成 R(A) = r(A) × G • Bob 生成 R(B) = r(B) × G • Charlie 生成 R(C) = r(C) × G 然后,三人将这些随机公钥相加,得到一个聚合随机公钥: R = R(A) + R(B) + R(C)

计算部分签名

每个人用自己的私钥计算部分签名: • Alice: s(A) = r(A) + e × a • Bob: s(B) = r(B) + e × b • Charlie: s(C)= r(C) + e × c

合成聚合签名

三人将部分签名相加,最终形成聚合签名: S = s(A)+ s(B) + s(C) = [r(A)+ r(B)+ r(C)]+ e × (a + b+ c) 由于 R = R(A) + R(B) + R(C) = [r(A)+ r(B)+ r(C)]G 而 P = A + B + C = (a + b + c) × G

所以最终的签名验证方程是 所以 S * G = R+eP

只需 1 个公钥 + 1 个签名,交易更小、更隐私、更便宜!你学会了吗?

Last updated