本文介绍YOUChain 加密签名方面的思考和方案,go-bls 库已于 github 开源,项目地址:[https://github.com/youchainhq/go-bls]
YOUChain 签名方案的考虑
1 面临的问题
YOUChain所采用的共识机制,是基于VRF的一种新型PoS共识。对基于PoS的共识,基本上都存在一个对区块做签名投票的机制,所有这些投票信息,都需要存储及随区块广播。
考虑一个采用secp256k1签名方案的例子,这时单个签名的大小是 64 字节,如果有100个账户给一个区块投票,则仅签名数据就至少62.5KB。这个数据量必须得认真对待。
关于此问题,我们需要考虑,能否减少(压缩)一个区块的签名投票数据,以减轻存储及网络通信负担?
对多个签名进行压缩的技术,已知的包括阈值签名(Threshold signature, 也有翻译叫“门限签名”)方案和BLS签名方案。其中阈值签名方案需要有一个复杂的初始化过程,并且要求参与者集合稳定(若参与者集合发生变更,则必须重新进行一轮全局初始化),这对于YOUChain这种最终将完全去中心化的公链来说,是无法接受的。BLS签名方案也是实现签名聚合的一种主要技术,而这也是我们重点评估并考虑采用的技术。
2 BLS简介
BLS签名方案是由Boneh-Lynn-Shacham三人于2001年提出的一种椭圆曲线签名方案,具有一些良好的特性,最重要的就是“签名聚合”:多个签名可以聚合成单个签名,聚合后的签名长度就是单个签名的长度。基于这些特性,BLS签名方案在多签及签名聚合、m/n多签等方面都能提供很好的支持。
2.1 BLS的基本原理
BLS签名的核心,是椭圆双曲线配对(Elliptic curve pairings)函数,也称双线性映射(bilinear maps)函数。要了解BLS的基本原理,重点是理解配对函数的性质。首先,我们需要一下基本知识:
1.椭圆曲线密码学定义了两个运算:曲线上两个点的加法运算 +,以及一个整数与曲线上的一个点进行的标量称法运算 ,其具体定义当前不需深究,只需要记住这些运算的结果也是