3个版本

0.0.3 2024年5月3日
0.0.2 2023年7月20日
0.0.1 2023年3月14日

#3 in #groth16

Download history 688/week @ 2024-05-06 815/week @ 2024-05-13 825/week @ 2024-05-20 1068/week @ 2024-05-27 763/week @ 2024-06-03 1022/week @ 2024-06-10 351/week @ 2024-06-17 243/week @ 2024-06-24 232/week @ 2024-07-01 93/week @ 2024-07-08 151/week @ 2024-07-15 204/week @ 2024-07-22 113/week @ 2024-07-29 277/week @ 2024-08-05 196/week @ 2024-08-12 133/week @ 2024-08-19

745 每月下载量
用于 13 个crate(11个直接使用)

MIT 许可协议

34KB
603

groth16-solana

Groth16零知识证明验证与Solana altbn254 syscalls

验证所需计算单元少于200,000个。

这些syscalls包含在Solana 1.15.0及以后的版本中,但尚未在公共网络上激活。

输入需要以大端格式存储在u8数组中。

请参阅功能测试示例,了解如何使用此库。

此crate与Groth16证明的circom电路兼容。

verifier文件可以使用snarkjs生成的verifyingkey.json文件生成的javascript脚本来生成。

用法

let mut public_inputs_vec = Vec::new();
for input in PUBLIC_INPUTS.chunks(32) {
    public_inputs_vec.push(input);
}
let proof_a: G1 =
    <G1 as FromBytes>::read(&*[&change_endianness(&PROOF[0..64])[..], &[0u8][..]].concat())
        .unwrap();
let mut proof_a_neg = [0u8; 65];
<G1 as ToBytes>::write(&proof_a.neg(), &mut proof_a_neg[..]).unwrap();
let proof_a = change_endianness(&proof_a_neg[..64]).try_into().unwrap();
let proof_b = PROOF[64..192].try_into().unwrap();
let proof_c = PROOF[192..256].try_into().unwrap();
let mut verifier = Groth16Verifier::new(
    &proof_a,
    &proof_b,
    &proof_c,
    public_inputs_vec.as_slice(),
    &VERIFYING_KEY,
)
.unwrap();
verifier.verify().unwrap();

请参阅功能测试以获取如何使用此库的运行示例。

从snarkjs verifyingKey.json创建Verifyingkey

使用snarkjs将verifyingkey导出为json。

在此仓库中

  • npm i
  • npm run parse-vk

许可协议

Apache License, Version 2.0下许可。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的任何有意提交以包含在工作中的贡献,均应如上所述双重许可,无需任何附加条款或条件。

依赖项

~16–25MB
~425K SLoC