ZoKrates证明中的点顺序



我正在尝试使用 go-snark 验证函数(相同的 bn128 参数和 G16 协议(验证 ZoKrates 证明。但是由于某种原因,它不起作用,我怀疑点的顺序存在问题。

在导出的合约中,G1 点的定义是具有两个 uint 的结构体,G2 是具有 2 [2] uint 的结构体。

因此,库以这种方式声明生成器:

/// @return the generator of G1
function P1() pure internal returns (G1Point memory) {
return G1Point(1, 2);
}
/// @return the generator of G2
function P2() pure internal returns (G2Point memory) {
return G2Point(
[11559732032986387107991004021392285783925812861821192530917403151452391805634,
10857046999023057135944570762232829481370756359578518086990519993285655852781],
[4082367875863433681332203403145435568316851327593401208105741076214120093531,
8495653923123431417604973247489272438418190587263600148770280649306958101930]
);
}

同时,go-snark 包使它像这样:

b.Gg1 = [2]*big.Int{
big.NewInt(int64(1)),
big.NewInt(int64(2)),
}
g2_00, ok := new(big.Int).SetString("10857046999023057135944570762232829481370756359578518086990519993285655852781", 10)
if !ok {
return b, errors.New("err with g2_00")
}
g2_01, ok := new(big.Int).SetString("11559732032986387107991004021392285783925812861821192530917403151452391805634", 10)
if !ok {
return b, errors.New("err with g2_00")
}
g2_10, ok := new(big.Int).SetString("8495653923123431417604973247489272438418190587263600148770280649306958101930", 10)
if !ok {
return b, errors.New("err with g2_00")
}
g2_11, ok := new(big.Int).SetString("4082367875863433681332203403145435568316851327593401208105741076214120093531", 10)
if !ok {
return b, errors.New("err with g2_00")
}
b.Gg2 = [2][2]*big.Int{
[2]*big.Int{
g2_00,
g2_01,
},
[2]*big.Int{
g2_10,
g2_11,
},
}

所以 g1 点的顺序相同(我猜(,但 g2 点是相反的,我想所有 bn128 点(pk、vk 和证明中的点(都是相同的。这是因为错误的声明吗?还是固体中的数组索引被颠倒了?结构声明是否相同?proof.json 和 verification.key 中的点是否是为了使它们在 solidity 中工作?

我有点迷茫,不知道如何更改证明中的 alpha、beta、gamma 和 delta 点的点顺序以及验证密钥才能使其在 golang 程序中工作。我什至不确定输入数组顺序。

所以我想通了。简短的回答是,坚固性和go与每种理智的语言具有相同的索引顺序,如果曲线点的定义是一致的,则顺序并不重要。

我的问题是两个包(坚固合约和go-snark(中G2点的定义不同,所以我改用了clearmatic bn256包,用于go,它是专门为与以太坊一起工作而构建的,一切都很顺利。

最新更新