#circuit #key #cryptography #proof #libzeropool #zkbob #zk-bob

bin+lib libzeropool-zkbob

zk-SNARK 电路和 zkBob 的密码学

4 个版本 (稳定版)

1.3.0 2023 年 5 月 24 日
1.2.0 2023 年 5 月 11 日
1.1.0 2023 年 2 月 17 日
0.6.0 2023 年 2 月 15 日

#90#circuit

每月下载量 46 次
libzkbob-rs 中使用

MIT/Apache

105KB
2K SLoC

libzeropool-zkbob

这是为 (zkBob)https://zkbob.com/ 解决方案适配的 libzeropool 核心库。它从 (原始 ZeroPool 仓库)https://github.com/zeropoolnetwork/libzeropool 分支出来的。这个库以 libzeropool-zkbob 的名称在 crates.io 上发布。

该库的底层依赖:fawkes-crypto-zkbob,该库被 libzkbob-rs (核心 zkbob 库) 使用。

libzeropool

这是一个包含 ZeroPool 电路和密码学的库。

协议描述 https://hackmd.io/_Xm5DjqUTyykcBtDgMxLwA

JS 绑定可在 https://github.com/zeropoolnetwork/libzeropool-rs 找到

基准测试

cargo test --release -- --nocapture test_circuit_tx_setup_and_prove

在 Intel Core i9-9880H 上的基准测试结果

Time elapsed in setup() is: 48.573000645s
Time elapsed in prove() is: 6.915143894s
Time elapsed in verify() is: 5.104347ms

函数

密钥和证明的生成

密钥和证明生成的示例


#[test]
fn test_circuit_tx_setup_and_prove() {
    fn circuit<C:CS<Fr=Fr>>(public: CTransferPub<C>, secret: CTransferSec<C>) {
        c_transfer(&public, &secret, &*POOL_PARAMS);
    }

    let mut rng = thread_rng();
    let state = State::random_sample_state(&mut rng, &*POOL_PARAMS);
    let (public, secret) = state.random_sample_transfer(&mut rng, &*POOL_PARAMS);

    let ts_setup = Instant::now();
    let params = setup::<Bn256, _, _, _>(circuit);
    let duration = ts_setup.elapsed();
    println!("Time elapsed in setup() is: {:?}", duration);

    let ts_prove = Instant::now();
    let (inputs, snark_proof) = prover::prove(&params, &public, &secret, circuit);
    let duration = ts_prove.elapsed();
    println!("Time elapsed in prove() is: {:?}", duration);

    let ts_verify = Instant::now();
    let res = verifier::verify(&params.get_vk(), &snark_proof, &inputs);
    let duration = ts_verify.elapsed();
    println!("Time elapsed in verify() is: {:?}", duration);

    assert!(res, "Verifier result should be true");
}

加密

#[test]
fn test_encryption() {
    let mut rng = thread_rng();
    let sender_eta = rng.gen();
    let receiver_eta = rng.gen();
    let mut account: Account<Fr> = rng.gen();
    let mut note:Vec<Note<Fr>> = (0..2).map(|_| Note::sample(&mut rng, &*POOL_PARAMS)).collect();
    account.eta = sender_eta;
    note[0].p_d = derive_key_p_d(note[0].d.as_num().clone(), receiver_eta, &*POOL_PARAMS).x;
    let ciphertext = cipher::encrypt(&(0..32).map(|_| rng.gen()).collect::<Vec<_>>(), sender_eta, account, &note, &*POOL_PARAMS);
    let result_out = cipher::decrypt_out(sender_eta, &ciphertext, &*POOL_PARAMS);

    assert!(result_out.is_some(), "Could not decrypt outgoing data.");
        let (account_out, note_out) = result_out.unwrap();
        assert!(note.len()==note_out.len() && 
        note.iter().zip(note_out.iter()).all(|(l,r)| l==r) &&
        account == account_out, "Wrong outgoing data decrypted");

    let result_out = cipher::decrypt_in(receiver_eta, &ciphertext, &*POOL_PARAMS);
    assert!(result_out.len()==2 && result_out[0].is_some() && result_out[0].unwrap()==note[0] && result_out[1].is_none(), "Wrong incoming data decrypted");
}

依赖项

~14MB
~399K SLoC