BLS签名由Dan Boneh提出,能够将区块中所有的签名组合成单个签名,签名者之间需要进行多轮通信,生成的签名为一个曲线点。
BLS签名需要用到两个新的结构:哈希到曲线(hashing to the curve)以及曲线配对 (curve pairing).
哈希到曲线
BLS签名中,需要稍微修改下哈希算法,可直接哈希到椭圆曲线, 最简单的方法是先对消息进行Hash, 并将结果当作 坐标。
曲线配对
双线性对是一种特殊的函数 ,取两个点 和 , 映射到一个数字:
双线性对的性如下:
BLS签名
若私钥为, 公钥为 , 要签名的消息为:
为了计算签名,需要计算哈希到曲线, 再乘以私钥得到签名:。
签名验证:
BLS聚合签名
若一个区块包含1000笔交易,每个交易都有签名, 公钥 和 消息。可以聚合签名:
要验证区块,需要检查下式是否成立:
验证要知道所有的公钥并计算1001个配对函数。
n-of-n 多重签名
若使用多重签名地址,将使用不同的密钥签署相同的交易,可以将它们组合在一起,得到的签名为:, 密钥, 此时方程验证依然有效:
类似于Schnorr, 为了避免密钥免受攻击,每个联合签名者需要证明他们具有公钥的私钥,或者添加非线性元素,即:
签名和密钥的系数根据签名者的公钥和其它公钥确定:
m-of-n 多重签名
BLS构造多重签名需要有一个设置阶段进行初始化过程. 下例假设签名方案,可以推到
初始设置
对于每个签名者 , 其私钥 和公钥 , 计算聚合的公钥为:
每个签名者都需要对编号 签名,聚合这些签名并保存下来:
这个签名称为:成员密钥,将用来生成签名,并且:
签名过程
假设用和签署一笔交易,生成两个签名 和 :
将他们相加得到单个签名和密钥:
要验证这签名,需要检查:
结论
BLS可聚合签名,节省区块时间,但对于多重签名,需要通信进行初始化过程, 并且采用双线性对会导致配对效率低下。
参考
https://eprint.iacr.org/2018/483.pdf
https://blog.csdn.net/BitTribeLab/article/details/102934972
网友评论