可验证随机函数VRF实例分析

可验证随机函数(Verifiable Random Function)对区块链的共识非常有帮助。从某种意义上看,VRF可以看作是不需要算力的PoW。
VRF的原理实际上是零知识证明(zero knowledge prove)的一种,本质上是单向函数的应用。Hash函数(SHA256、SHA3等)就是一种很好的单向函数。但是Hash函数的问题是难以和身份信息绑定。例如一种结合了secret的哈希函数。
result = SHA256(secret, info)
那么要验证result,光有info是不够的,必须要有secret才能计算出result。而在现实的场景中,secret是不能提供给验证者的。因此这里引申出了一个问题:有没有可能在不出示密钥secret的情况下,验证result和info是对应匹配的?可验证随机函数Verifiable Random Function(VRF)就是解决这个问题的。
证明者和验证者的协议如下:
证明者:
1)、证明者生成一对密钥,PK(公钥)、SK(私钥);
2)、证明者计算result = Compute(SK,info);
3)、证明者计算proof = Prove(SK,info);
4)、证明者把result和proof递交给验证者;
验证者:
5)、 验证者计算result == VRF_P2H(proof)是否成立,若成立,继续下面的步骤,否则中止;
6)、 证明者把PK,info递交给验证者;
7)、 验证者计算True/False = VRF_Verify(PK, info, proof) ,True表示验证通过,False表示验证未通过。

用一个github上的例子说明上面的协议:
(https://github.com/yahoo/coname/blob/master/vrf/vrf_test.go)

func TestHonestComplete(t *testing.T)   {
        // 证明者
    pk, sk, err := GenerateKey(nil)    // step 1, 生成密钥对
    if err != nil {
        t.Fatal(err)
    }
    alice := []byte("alice")     // Info
    aliceVRF := Compute(alice, sk)   // step 2, 计算result
    aliceVRFFromProof, aliceProof := Prove(alice, sk)  
                                    // step 3, 计算proof,这儿是aliceVRFFromProof

    fmt.Printf("pk:           %X\n", pk)
    fmt.Printf("sk:           %X\n", *sk)
    fmt.Printf("alice(bytes): %X\n", alice)
    fmt.Printf("aliceVRF:     %X\n", aliceVRF)
    fmt.Printf("aliceProof:   %X\n", aliceProof)
        // 接收者
    if !bytes.Equal(aliceVRF, aliceVRFFromProof) {     // step 5,验证result 和proof
        t.Errorf("Compute != Prove")
    }
    if !Verify(pk, alice, aliceVRF, aliceProof) {             // step 7, 加入PK和Info验证
        t.Errorf("Gen -> Compute -> Prove -> Verify -> FALSE")
    }
}

你可能感兴趣的:(可验证随机函数VRF实例分析)