# 平行链 bls 聚合签名
>平行链多个共识节点间通过P2P组成内部局域网，把之前每个节点发送到主链的共识交易转而先互相内部广播，leader节点负责把多个共识交易聚合成一个共识交易发送给主链


#1. 订阅P2P topic
1. 以PARA-BLS-SIGN-TOPIC为topic在P2P订阅，平行链内部节点间通过p2p DHT机制广播同步消息，
1. 消息有两类，一类是leader心跳和监听消息，leader广播心跳消息，候选节点监听心跳，如果超时没收到，则自动选择下一个节点为leader
1. 另一类是bls签名共识交易，广播出来，由leader节点聚合发送
   
#2. 协商leader
1. 考虑到leader轮换发送共识交易，每隔一定共识高度比如100就会轮换下一个节点为leader发送交易，当前共识高度/100后对nodegroup 地址取余base值就是当前leader地址
1. 考虑到某些leader节点可能是僵尸节点，每个节点监听leader节点每隔15s的心跳消息，如果超过1min没收到，则认为leader节点不工作，需要跳到下一个，这里维护
一个offset，如果超时没收到，offset++，和之前的base相加取余一起确定下一个leader节点，如果当前节点发现自己是leader节点则开始发送sync消息，offset停止增长
1. 随着共识高度增长，base增长，offset不变，一起确认新的leader
1. 某些特殊场景有多个leader同步时候，收敛到最大索引值的leader

#3. 发送聚合共识交易
1. 共识交易P2P广播给所有订阅的节点，leader节点负责聚合后上链，如果收集的签名交易不超过2/3节点，则不发送上链交易，聚合交易最终在主链达成共识
1. 节点广播共识交易后，超过一定时间共识高度没增长，重新发送共识交易
1. leader节点长时间未发送成功共识交易，共识高度超过和链高度阈值，任一达成共识的节点都可发送
1. 用户可手工设置达成共识的节点数，可以少于2/3个，其他节点可以选择非聚合签名，直接发送


#4. BLS聚合签名算法
1. BLS签名需要的私钥比SECP256小一倍，采用SECP256私钥不断取hash直到满足BLS范围为止作为BLS私钥，然后确定BLS公钥
1. BLS公钥注册到主链nodegroup里面，和聚合签名一起验证BLS签名，同时防止BLS leader节点作弊
1. 对同一高度，每个节点签名的共识消息是一样的，只需要保留一份，签名聚合成一个，公钥信息压缩到一个bitmap，作为一个交易发送
1. BLS签名有两种paring曲线，G1和G2，G1产生msg较短，G2的较长，一般公钥放G2上，签名消息放G1上，ETH采用公钥放G1，签名放G2，公钥较短，消息较长，
我们由于公钥静态配置在数据库里，主链验证，签名经过消息发送，占用空间，和ETH相反比较好，静态库可以编译支持反转，但目前还是和ETH 2.0一致。


 


