可验证随机函数(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")
}
}
网友评论