VRF共识算法设计与实现

1 BUMO-VRF实现

3-2

     BUMO的多链采用的是主子链结构,每个节点存储当前子链和主链的状态,所以子链的节点必然是主链节点。主链和子链通过把子链的区块头信息写入到主链进行关联。整个Firework共识算法都依赖于主链的全状态。子链的验证节点是在主链中进行产生,主链通过随机洗牌和分配算法决定验证节点进入那条子链参与共识。每条链在不同阶段Phase,验证节点都不一样。具体的实现过程为:1、确定性随机种子产生过程;2、混洗过程;3、节点分配过程。

  1. 确定性随机种子产生过程

随机数有几个重要特性,如公平性和随机性在3.1中有详细的描述,此处要谈及的是BUMO随机数产生过程对一些难点的解决方式。从上图可以看出验证节点要进行混洗,需要一个确定的随机种子,每个验证节点得到相同的随机种子,这样就会依赖于所有节点共同签名去产生随机种子,在目前的BFT共识体系下,必须要所有人签名这个随机数才是确定的随机数。如有验证节点1234,则必须要1234共同去签名,若4节点突然发生故障,3节点收不到1节点的消息,这样就会导致整个随机没法产生。 如果这样用只需要3个节点进行签名是否可以解决上述节点4故障的情况呢?签名的结果会有1 2 3,2 3 4,1 3 4,1 2 4 这四种组合出现,由于节点 1 2 3 4私钥分别不一样,所有这四组签名出产生的随机数肯定是不一样。基于以上的问题和状况,BUMO Firework的新型设计采用了BLS 阈值签名算法,这里不会对阈值签名算法的原理做详细的说明,本文只会对BLSBUMO Firework中的作用做简单的阐述。若采用BLS签名算法可以实现4个节点中任意3个节点签名出的数据是一样,并且只要任意3个节点进行签名,其它节点都可以验证整个群签名。通过BLS 签名算法有效的避免了签名数据不一致的问题,从而保证了最后每个节点的随机数也是一样。

     一个理想的哈希函数,其值域应该是离散的、均匀分布的,给定不同的输入值,其输出应该没有规律,随机的洒落、分布在值域区间内。因此,可以达到完全的随机性。每一轮的选举都将会将一个种子(seed)作为VRF的输入,随后VRF将输出一段随机哈希值(作为下一轮的种子输入)。这里的种子也就是哈希输入值,创世区块hash作为熵源作为输入值,每个验证节点私钥都有各个验证节点进行保管,则创世区块的种子通过分布式随机数生成器来产生,则BUMO每一轮产生的随机数绝对安全的。

Qr是第 r 轮(块号)的种子Qr的计算方式如下,HX)表示对XhashBLS_Sign(Qr-1)表示对Qr-1采用BLS算法进行签名的结果,Br_H表示第r区块的区块hashQr的计算公式如下:

  • Qr=H(BLS_Sign(Qr-1),Br_H))

BUMO Firework随机产生步骤,整体的过程如图3-2 主链 Phase1中虚线框所示:

  1. 初始熵源为主链的创世区块B1的区块hash B1_H,依据公式创世区块的种子Q1的过程为:B1_H BLS_Sign(B1_H) Q1=H(BLS_Sign(B1_H),B1_H))
  2. 第二块的随机种子产生的过程为:Q1BLS_Sign(Q1) Q2=H(BLS_Sign(Q1),B2_H))

………………………………………………..

3. 不断依据上一轮的种子作为输出,得出第一阶段Phase1最后一个种子Q5Q5作为验证节点在第二阶段Phase2混洗的种子,产生的过程为:Q4BLS_Sign(Q4) Q5=H(BLS_Sign(Q4),B5_H))

2 节点混洗算法

        节点混洗是有效保证验证节点随机进入不同链的关键,,混洗能否彻底必须通过算法来保证,具体的混洗过程:

              1、依据图3-2主链Phase2虚线框所示,混洗种子Q5 取前三个字节mod 32,得到步长rand_size

2、对验证节点列表循环处理,让每个节点在32个序列里彻底与其他节点交换位置,具体的代码如下:

  1. for(n = 0; n < validator_list_size; n++){
  2.  
  3. for (i = 0; i < 32 - (32 % rand_size); i += rand_size) {  
  4.     rand_chunk = hash_seed[i: i + int(rand_size)];  
  5.     for (j = 0; j < rand_size; j++) {  
  6.         value |= rand_chunk[j];  
  7.     }  
  8.     replace_index = value % (validator_list_size - i) + i;  
  9.     exchange(n, replace_index);  
  10. }  
  11. }

                3、按照以上逻辑处理之后,形成新的验证节点列表。

 

原文地址:https://www.cnblogs.com/hzcya1995/p/13313650.html