mirror of
https://github.com/arnaucube/sonobe-light-btc.git
synced 2026-01-27 22:43:46 +01:00
update to last sonobe version with full solidity-verifier
This commit is contained in:
9
Cargo.lock
generated
9
Cargo.lock
generated
@@ -135,7 +135,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ark-circom"
|
name = "ark-circom"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/gakonst/ark-circom.git#170b10fc9ed182b5f72ecf379033dda023d0bf07"
|
source = "git+https://github.com/arnaucube/circom-compat.git#8b2d7915a029f4a6a9285eed3eb7322172cc64d4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ark-bn254",
|
"ark-bn254",
|
||||||
"ark-crypto-primitives",
|
"ark-crypto-primitives",
|
||||||
@@ -1316,7 +1316,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "folding-schemes"
|
name = "folding-schemes"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/privacy-scaling-explorations/folding-schemes.git?branch=feature/solidity-decider-verifier#a45761a395d9a9a917c5a36d8cc8cddcd9541a87"
|
source = "git+https://github.com/privacy-scaling-explorations/sonobe.git?branch=feature/solidity-decider-verifier#9c68076782017b0fe205574c894cf6b3e1b5204f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ark-bn254",
|
"ark-bn254",
|
||||||
"ark-circom",
|
"ark-circom",
|
||||||
@@ -1333,6 +1333,7 @@ dependencies = [
|
|||||||
"ark-std",
|
"ark-std",
|
||||||
"color-eyre",
|
"color-eyre",
|
||||||
"num-bigint",
|
"num-bigint",
|
||||||
|
"num-integer",
|
||||||
"rayon",
|
"rayon",
|
||||||
"subroutines",
|
"subroutines",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
@@ -2453,11 +2454,9 @@ dependencies = [
|
|||||||
"auto_impl",
|
"auto_impl",
|
||||||
"bitflags 2.5.0",
|
"bitflags 2.5.0",
|
||||||
"bitvec",
|
"bitvec",
|
||||||
"c-kzg",
|
|
||||||
"enumn",
|
"enumn",
|
||||||
"hashbrown 0.14.3",
|
"hashbrown 0.14.3",
|
||||||
"hex",
|
"hex",
|
||||||
"once_cell",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -2816,7 +2815,7 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "solidity-verifiers"
|
name = "solidity-verifiers"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/privacy-scaling-explorations/folding-schemes.git?branch=feature/solidity-decider-verifier#a45761a395d9a9a917c5a36d8cc8cddcd9541a87"
|
source = "git+https://github.com/privacy-scaling-explorations/sonobe.git?branch=feature/solidity-decider-verifier#9c68076782017b0fe205574c894cf6b3e1b5204f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ark-bn254",
|
"ark-bn254",
|
||||||
"ark-ec",
|
"ark-ec",
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ edition = "2021"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
ark-r1cs-std = { git = "https://github.com/arnaucube/ark-r1cs-std-cherry-picked/" }
|
ark-r1cs-std = { git = "https://github.com/arnaucube/ark-r1cs-std-cherry-picked/" }
|
||||||
folding-schemes = { git = "https://github.com/privacy-scaling-explorations/folding-schemes.git", branch="feature/solidity-decider-verifier" }
|
folding-schemes = { git = "https://github.com/privacy-scaling-explorations/sonobe.git", package="folding-schemes", branch="feature/solidity-decider-verifier", features=["light-test"] }
|
||||||
solidity-verifiers = { git = "https://github.com/privacy-scaling-explorations/folding-schemes.git", package="solidity-verifiers", branch="feature/solidity-decider-verifier" }
|
solidity-verifiers = { git = "https://github.com/privacy-scaling-explorations/sonobe.git", package="solidity-verifiers", branch="feature/solidity-decider-verifier" }
|
||||||
ark-light-bitcoin-client = { git = "https://github.com/dmpierre/ark-light-bitcoin-client.git" }
|
ark-light-bitcoin-client = { git = "https://github.com/dmpierre/ark-light-bitcoin-client.git" }
|
||||||
ark-ff = "0.4.0"
|
ark-ff = "0.4.0"
|
||||||
ark-relations = "0.4.0"
|
ark-relations = "0.4.0"
|
||||||
|
|||||||
59
src/main.rs
59
src/main.rs
@@ -25,7 +25,7 @@ use solidity_verifiers::{
|
|||||||
get_decider_template_for_cyclefold_decider,
|
get_decider_template_for_cyclefold_decider,
|
||||||
utils::get_function_selector_for_nova_cyclefold_verifier,
|
utils::get_function_selector_for_nova_cyclefold_verifier,
|
||||||
};
|
};
|
||||||
use solidity_verifiers::{Groth16Data, KzgData, NovaCyclefoldData};
|
use solidity_verifiers::{Groth16Data, KzgData, NovaCycleFoldData};
|
||||||
use std::{fs, marker::PhantomData, time::Instant};
|
use std::{fs, marker::PhantomData, time::Instant};
|
||||||
use utils::setup;
|
use utils::setup;
|
||||||
mod utils;
|
mod utils;
|
||||||
@@ -129,14 +129,14 @@ fn main() {
|
|||||||
NOVA,
|
NOVA,
|
||||||
>;
|
>;
|
||||||
|
|
||||||
let n_blocks_checked = blocks_prepared.len();
|
let n_blocks_checked = blocks_prepared.len() / 20; // TMP rm '/20'
|
||||||
let circuit = BTCBlockCheckerFCircuit::<Fr>::new(blocks_prepared.clone());
|
let circuit = BTCBlockCheckerFCircuit::<Fr>::new(blocks_prepared.clone());
|
||||||
let (prover_params, poseidon_config, kzg_vk) = setup(circuit.clone());
|
let (fs_prover_params, kzg_vk) = setup(circuit.clone());
|
||||||
let z_0 = vec![Fr::from(0)];
|
let z_0 = vec![Fr::from(0)];
|
||||||
let mut nova = NOVA::init(&prover_params, circuit, z_0.clone()).unwrap();
|
let mut nova = NOVA::init(&fs_prover_params, circuit, z_0.clone()).unwrap();
|
||||||
|
|
||||||
println!("Computing folds...");
|
println!("Computing folds...");
|
||||||
let now = Instant::now();
|
let start = Instant::now();
|
||||||
for i in 0..n_blocks_checked {
|
for i in 0..n_blocks_checked {
|
||||||
let current_state = nova.z_i[0].into_bigint();
|
let current_state = nova.z_i[0].into_bigint();
|
||||||
if i % 10 == 0 {
|
if i % 10 == 0 {
|
||||||
@@ -144,13 +144,13 @@ fn main() {
|
|||||||
}
|
}
|
||||||
nova.prove_step().unwrap();
|
nova.prove_step().unwrap();
|
||||||
}
|
}
|
||||||
let elapsed = now.elapsed();
|
|
||||||
println!(
|
println!(
|
||||||
"Done folding. Checked {} blocks in: {:.2?}",
|
"Done folding. Checked {} blocks in: {:.2?}",
|
||||||
n_blocks_checked, elapsed
|
n_blocks_checked,
|
||||||
|
start.elapsed()
|
||||||
);
|
);
|
||||||
|
|
||||||
let circuit = DeciderEthCircuit::<
|
let decider_circuit = DeciderEthCircuit::<
|
||||||
Projective,
|
Projective,
|
||||||
GVar,
|
GVar,
|
||||||
Projective2,
|
Projective2,
|
||||||
@@ -163,23 +163,17 @@ fn main() {
|
|||||||
|
|
||||||
// decider setup
|
// decider setup
|
||||||
println!("Starting setup...");
|
println!("Starting setup...");
|
||||||
let now = Instant::now();
|
let start = Instant::now();
|
||||||
let (g16_pk, g16_vk) =
|
let (g16_pk, g16_vk) =
|
||||||
Groth16::<Bn254>::circuit_specific_setup(circuit.clone(), &mut rng).unwrap();
|
Groth16::<Bn254>::circuit_specific_setup(decider_circuit.clone(), &mut rng).unwrap();
|
||||||
let elapsed = now.elapsed();
|
println!("Setup done in: {:.2?}", start.elapsed());
|
||||||
println!("Setup done in: {:.2?}", elapsed);
|
|
||||||
|
|
||||||
// decider proof generation
|
// decider proof generation
|
||||||
println!("Generating proof...");
|
println!("Generating proof...");
|
||||||
let now = Instant::now();
|
let start = Instant::now();
|
||||||
let decider_pp = (
|
let decider_pp = (g16_pk, fs_prover_params.cs_params.clone());
|
||||||
poseidon_config.clone(),
|
|
||||||
g16_pk,
|
|
||||||
prover_params.clone().cs_params,
|
|
||||||
);
|
|
||||||
let proof = DECIDER::prove(decider_pp, rng, nova.clone()).unwrap();
|
let proof = DECIDER::prove(decider_pp, rng, nova.clone()).unwrap();
|
||||||
let elapsed = now.elapsed();
|
println!("Proof generated in: {:.2?}", start.elapsed());
|
||||||
println!("Proof generated in: {:.2?}", elapsed);
|
|
||||||
|
|
||||||
// decider proof verification
|
// decider proof verification
|
||||||
println!("Verifying proof...");
|
println!("Verifying proof...");
|
||||||
@@ -198,9 +192,9 @@ fn main() {
|
|||||||
let g16_data = Groth16Data::from(g16_vk);
|
let g16_data = Groth16Data::from(g16_vk);
|
||||||
let kzg_data = KzgData::from((
|
let kzg_data = KzgData::from((
|
||||||
kzg_vk,
|
kzg_vk,
|
||||||
Some(prover_params.cs_params.powers_of_g[0..3].to_vec()),
|
fs_prover_params.cs_params.powers_of_g[0..3].to_vec(),
|
||||||
));
|
));
|
||||||
let nova_cyclefold_data = NovaCyclefoldData::from((g16_data, kzg_data, nova.z_0.len()));
|
let nova_cyclefold_data = NovaCycleFoldData::from((g16_data, kzg_data, nova.z_0.len()));
|
||||||
let function_selector =
|
let function_selector =
|
||||||
get_function_selector_for_nova_cyclefold_verifier(nova.z_0.len() * 2 + 1);
|
get_function_selector_for_nova_cyclefold_verifier(nova.z_0.len() * 2 + 1);
|
||||||
|
|
||||||
@@ -216,17 +210,18 @@ fn main() {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let decider_template = get_decider_template_for_cyclefold_decider(nova_cyclefold_data);
|
let decider_template = get_decider_template_for_cyclefold_decider(nova_cyclefold_data);
|
||||||
save_solidity("./NovaLightBTCClientDecider.sol", &decider_template);
|
|
||||||
fs::write("./solidity-calldata.calldata", calldata).unwrap();
|
|
||||||
|
|
||||||
|
// save smart contract
|
||||||
|
save_solidity("./NovaLightBTCClientDecider.sol", &decider_template.clone());
|
||||||
// save calldata
|
// save calldata
|
||||||
|
fs::write("./solidity-calldata.calldata", calldata.clone()).unwrap();
|
||||||
|
|
||||||
// let nova_cyclefold_verifier_bytecode = compile_solidity(decider_template, "NovaDecider");
|
let nova_cyclefold_verifier_bytecode = compile_solidity(decider_template, "NovaDecider");
|
||||||
//
|
|
||||||
// let mut evm = Evm::default();
|
let mut evm = Evm::default();
|
||||||
// let verifier_address = evm.create(nova_cyclefold_verifier_bytecode);
|
let verifier_address = evm.create(nova_cyclefold_verifier_bytecode);
|
||||||
//
|
|
||||||
// let (_, output) = evm.call(verifier_address, calldata.clone());
|
let (_, output) = evm.call(verifier_address, calldata);
|
||||||
// println!("Output: {:?}", output);
|
println!("Output: {:?}", output);
|
||||||
// assert_eq!(*output.last().unwrap(), 1);
|
assert_eq!(*output.last().unwrap(), 1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
use crate::BTCBlockCheckerFCircuit;
|
use crate::BTCBlockCheckerFCircuit;
|
||||||
use ark_bn254::{constraints::GVar, Bn254, Fr, G1Projective as Projective};
|
use ark_bn254::{constraints::GVar, Bn254, Fr, G1Projective as Projective};
|
||||||
use ark_crypto_primitives::sponge::poseidon::PoseidonConfig;
|
|
||||||
use ark_grumpkin::{constraints::GVar as GVar2, Projective as Projective2};
|
use ark_grumpkin::{constraints::GVar as GVar2, Projective as Projective2};
|
||||||
use ark_poly_commit::kzg10::VerifierKey as KZGVerifierKey;
|
use ark_poly_commit::kzg10::VerifierKey as KZGVerifierKey;
|
||||||
use folding_schemes::{
|
use folding_schemes::{
|
||||||
@@ -17,7 +16,6 @@ pub fn setup(
|
|||||||
circuit: BTCBlockCheckerFCircuit<Fr>,
|
circuit: BTCBlockCheckerFCircuit<Fr>,
|
||||||
) -> (
|
) -> (
|
||||||
ProverParams<Projective, Projective2, KZG<'static, Bn254>, Pedersen<Projective2>>,
|
ProverParams<Projective, Projective2, KZG<'static, Bn254>, Pedersen<Projective2>>,
|
||||||
PoseidonConfig<Fr>,
|
|
||||||
KZGVerifierKey<Bn254>,
|
KZGVerifierKey<Bn254>,
|
||||||
) {
|
) {
|
||||||
let mut rng = ark_std::test_rng();
|
let mut rng = ark_std::test_rng();
|
||||||
@@ -40,7 +38,6 @@ pub fn setup(
|
|||||||
cs_params: kzg_pk.clone(),
|
cs_params: kzg_pk.clone(),
|
||||||
cf_cs_params: cf_pedersen_params,
|
cf_cs_params: cf_pedersen_params,
|
||||||
},
|
},
|
||||||
poseidon_config,
|
|
||||||
kzg_vk,
|
kzg_vk,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user