前言[失踪人口回归 (*/ω\*)] 真的好久好久没有更新了,因为自己也还在找方向,但还是把新学的知识记录在博客里 。今天要介绍的是BLS签名算法 。
一、BLS签名算法简介BLS签名算法[1]是由斯坦福大学的 Dan Boneh、Ben Lynn 和 Hovav Shacham一同提出的 。
一般将 ECDSA签名算法、Schnorr签名算法和BLS进行对比 。
ECDSA签名算法局限性:
无法进行签名聚合和密钥聚合 。换句话说,当我们验证多重签名交易的时候,我们只能逐个对签名进行验证,显然这会耗费大量的区块空间和交易费 。因此并不适用于多重签名场景 。
Schnorr签名算法:
【BLS签名算法】可以将一笔交易中的所有签名和公钥合并成单个签名和公钥,其过程是不可见的(即无法判断该签名或公钥是否通过合并得到的) 。这样就可以实现只需要一次就可以对合并后的签名做验证,加快了区块验证的速度 。
但其仍然存在着局限性:
- 多重签名需要多次(签名者之间的)通信,这对冷钱包来说过于麻烦;
- 聚合签名算法依赖随机数生成器,而不像 ECDSA 那样可以使用指定的随机点(R);
- m-n 多重签名机制比较取巧,需要构建公钥的默克尔树 。当 m 和 n 较大时,树所占空间会相当大;
- 无法把一个区块中的所有签名聚合成一个签名 。
(1)不需要随机数生成器,可以将区块中的所有签名聚合成一个;
(2)容易实现 m-n 多重签名,也可以避免签名者之间的多余通信;
(3)签名的长度更短(签名为椭圆曲线上的一个点而非两个),是 Schnorr 或 ECDSA 的 2 分之一 。
二、基础知识在对BLS算法进行阐述之前,首先了解一下曲线哈希和曲线配对 。
2.1 曲线哈希Hashing to the curve 一般可以翻译为曲线哈希或者是哈希成曲线上的点 。没了解之前听到曲线哈希可能会不知道是啥,但听到哈希成曲线上的点就大概知道意思了 。
在一般的哈希计算中,常常是对于不定长的输入最终输出一个定长的数值 。但曲线哈希就不一样,其输出结果会对应到椭圆曲线上的一个点 。
具体做法如下:
哈希函数保持不变,将得到的哈希值作为点的 x 值寻找椭圆曲线上的对应点 。
通常来说(比如比特币所用的曲线),椭圆曲线有 2256 个点,而 SHA-256 哈希算法的值是 256 位 。不过,一个有效的 x 坐标,会对应一正一负两个 y 坐标(因为(x, y)和(x, -y)都是曲线y2=x3+ax+b上的点) 。换句话说,新的哈希算法大约有 50% 的概率在曲线上找到 2 个对应点,另 50% 的概率则一个点也找不到 。因此,在应用过程中会出现需要尝试多次才能找到对应点的情况 。
· 有两个对应点怎么解决呢?
选择y坐标较小的作为结果即可 。
· 那出现找不到对应点的情况怎么办呢?
可以在消息体后面附加一个数 。当找不到对应点的时候,将该数加一再重新计算直到找到对应的点 。
下面给出一个例子 。
以在模为 23 的有限域上定义的椭圆曲线 y2=x3+7为例 。只有一半的 x 坐标在曲线上能找到对应点 。
① 计算 hash(m||0),没有对应的点 。
② 计算 hash(m||1),没有对应的点 。
③ 计算 hash(m||2),发现对应的点 。对应的点有两个,选择y坐标较小的作为结果 。
文章插图
2.2 曲线配对在曲线哈希中,我们将输入(一个值)映射到一个椭圆曲线上的点 。显然,我们还需要能将点映射为数的函数 。下面介绍一种特殊的函数,这种函数能够把一条(或 2 条不同的)曲线上的两个点 P 和 Q映射为一个数:
经验总结扩展阅读
- 从源码分析 MGR 的新主选举算法
- 吸引个性签名2021
- GC plan_phase二叉树挂接的一个算法
- AVX图像算法优化系列一: 初步接触AVX。
- 2021微信状态最可爱的签名大全
- 禁止焦虑的签名短句 引人深思的好听签名
- 心累的低调又含蓄的签名 星星说它累了让我别许愿了
- 很不错ins风的微信签名简短 会很吸睛的签名短句
- 什么是a3算法
- 淡雅系高级有质感的个性签名 适合有气质的人用的签名