Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 4 additions & 6 deletions circuits/commit-chain-proof/host/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -205,9 +205,8 @@ impl ProofBuilder for CommitChainProofBuilder {
format!("invalid UTF-8 in zkm_version file '{version_path}'")
})
})?;
let prev_output = decode_commit_chain_circuit_output(&public_inputs);
(
CommitChainPrevProofType::PrevProof(prev_output),
CommitChainPrevProofType::PrevProof,
proof_bytes,
public_inputs,
zkm_vk_hash.to_vec(),
Expand Down Expand Up @@ -263,10 +262,9 @@ impl ProofBuilder for CommitChainProofBuilder {

tracing::info!("Commit chain proof cycles: {}", cycles);

// todo: verify the proof laterr
// if let Err(e) = self.client.verify(&proof, &self.verifying_key) {
// panic!("{}", e);
// }
self.client
.verify(&proof, &self.verifying_key)
.context("Failed to verify generated commit chain proof")?;

let input = bincode::serialize(&input)?;
Ok((input, proof, cycles, proving_time))
Expand Down
1 change: 1 addition & 0 deletions circuits/header-chain-proof/guest/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 4 additions & 5 deletions circuits/header-chain-proof/host/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -219,9 +219,8 @@ impl ProofBuilder for HeaderChainProofBuilder {
format!("invalid UTF-8 in zkm_version file '{version_path}'")
})
})?;
let prev_output = zkm_sdk::ZKMPublicValues::from(&public_inputs).read();
(
HeaderChainPrevProofType::PrevProof(prev_output),
HeaderChainPrevProofType::PrevProof,
proof_bytes,
public_inputs,
zkm_vk_hash.to_vec(),
Expand Down Expand Up @@ -282,9 +281,9 @@ impl ProofBuilder for HeaderChainProofBuilder {

tracing::info!("Header chain proof cycles: {}", cycles);

if let Err(e) = self.client.verify(&proof, &self.verifying_key) {
panic!("{}", e);
}
self.client
.verify(&proof, &self.verifying_key)
.context("Failed to verify generated header chain proof")?;

let input = bincode::serialize(&input)?;
Ok((input, proof, cycles, proving_time))
Expand Down
2 changes: 2 additions & 0 deletions circuits/operator-proof/guest/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions circuits/state-chain-proof/guest/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 5 additions & 6 deletions circuits/state-chain-proof/host/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -335,10 +335,8 @@ impl ProofBuilder for StateChainProofBuilder {
format!("invalid UTF-8 in zkm_version file '{version_path}'")
})
})?;
let prev_output: StateChainCircuitOutput =
zkm_sdk::ZKMPublicValues::from(&public_inputs).read();
(
StateChainPrevProofType::PrevProof(prev_output),
StateChainPrevProofType::PrevProof,
proof_bytes,
public_inputs,
zkm_vk_hash.to_vec(),
Expand Down Expand Up @@ -389,9 +387,10 @@ impl ProofBuilder for StateChainProofBuilder {
},
)?;
tracing::info!("State chain proof cycles: {}", cycles);
if let Err(e) = self.client.verify(&proof, &self.verifying_key) {
panic!("{}", e);
}

self.client
.verify(&proof, &self.verifying_key)
.context("Failed to verify generated state chain proof")?;

let input = bincode::serialize(&input)?;
Ok((input, proof, cycles, proving_time))
Expand Down
2 changes: 2 additions & 0 deletions circuits/watchtower-proof/guest/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 0 additions & 2 deletions circuits/watchtower-proof/guest/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,13 @@ use state_chain::StateChainCircuitInput;

pub fn main() {
let genesis_sequencer_commit_txid = zkm_zkvm::io::read::<[u8; 32]>();
let latest_sequencer_commit_txid = zkm_zkvm::io::read::<[u8; 32]>();
let header_chain: HeaderChainCircuitInput = zkm_zkvm::io::read(); // private inputs
let commit_chain: CommitChainCircuitInput = zkm_zkvm::io::read();
let state_chain: StateChainCircuitInput = zkm_zkvm::io::read();
let spv: SPV = zkm_zkvm::io::read();

let (total_work, btc_best_block_height) = bitcoin_light_client_circuit::watch_longest_chain(
genesis_sequencer_commit_txid,
latest_sequencer_commit_txid,
header_chain,
commit_chain,
state_chain,
Expand Down
3 changes: 0 additions & 3 deletions circuits/watchtower-proof/host/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,6 @@ impl ProofBuilder for WatchtowerProofBuilder {
header_chain_input_proof,
commit_chain_input_proof,
state_chain_input_proof,
latest_sequencer_commit_txid,
genesis_sequencer_commit_txid,
target_block,
block_pos,
Expand Down Expand Up @@ -215,7 +214,6 @@ impl ProofBuilder for WatchtowerProofBuilder {
};
// --- spv --- //
let genesis_sequencer_commit_txid = Txid::from_str(&genesis_sequencer_commit_txid)?;
let latest_sequencer_commit_txid = Txid::from_str(&latest_sequencer_commit_txid)?;
let bitcoin_block_headers = {
let headers: Vec<u8> = std::fs::read(&format!("{header_chain_input_proof}.blocks"))?;
headers
Expand Down Expand Up @@ -247,7 +245,6 @@ impl ProofBuilder for WatchtowerProofBuilder {
|| -> anyhow::Result<(ZKMProofWithPublicValues, u64, f32)> {
let mut stdin = ZKMStdin::new();
stdin.write(&genesis_sequencer_commit_txid.to_byte_array());
stdin.write(&latest_sequencer_commit_txid.to_byte_array());
stdin.write(&header_chain_input);
stdin.write(&commit_chain_input);
stdin.write(&state_chain_input);
Expand Down
56 changes: 17 additions & 39 deletions crates/bitcoin-light-client-circuit/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,24 @@ mod signature;
mod utils;
use alloy_primitives::U32;
pub use signature::*;
use state_chain::verify_sequencer_commit;
pub use utils::*;

use alloy_primitives::U256;
use bitcoin::Block;
use bitcoin::hashes::{Hash, HashEngine, sha256};
use commit_chain::{
CommitChainCircuitInput, CommitChainPrevProofType, decode_commit_chain_circuit_output,
CommitChainCircuitInput, decode_commit_chain_circuit_output,
extract_data_from_commitment_outputs, parse_commit_chain_commitment, sequencer_hash,
};
use header_chain::{
BitcoinMerkleTree, CircuitBlockHeader, CircuitTransaction, HeaderChainCircuitInput,
HeaderChainPrevProofType, MMRHost, SPV, verify_merkle_proof,
BitcoinMerkleTree, BlockHeaderCircuitOutput, CircuitBlockHeader, CircuitTransaction,
HeaderChainCircuitInput, MMRHost, SPV, verify_merkle_proof,
};
use state_chain::{StateChainCircuitInput, StateChainPrevProofType};
use state_chain::{StateChainCircuitInput, StateChainCircuitOutput, verify_sequencer_commit};
use zkm_primitives::io::ZKMPublicValues;

use bitcoin::{
ScriptBuf, Transaction, TxOut, Txid,
ScriptBuf, Transaction, TxOut,
secp256k1::{PublicKey, XOnlyPublicKey},
};
pub use guest_executor::io::EthClientExecutorInput;
Expand Down Expand Up @@ -64,7 +63,6 @@ pub fn decode_operator_public_outputs(

pub fn watch_longest_chain(
genesis_sequencer_commit_txid: [u8; 32],
latest_sequencer_commit_txid: [u8; 32],
header_chain: HeaderChainCircuitInput,
commit_chain: CommitChainCircuitInput,
state_chain: StateChainCircuitInput,
Expand All @@ -83,15 +81,10 @@ pub fn watch_longest_chain(
)
.expect("Failed to verify commit chain proof");

let prev_output = decode_commit_chain_circuit_output(&commit_chain.zkm_public_values);
let prev_proof = CommitChainPrevProofType::PrevProof(prev_output);
let CommitChainPrevProofType::PrevProof(commit_chain_output) = &prev_proof else {
panic!("Only PrevProof is supported in watch_longest_chain");
};

let commit_chain_output = decode_commit_chain_circuit_output(&commit_chain.zkm_public_values);
assert_eq!(
commit_chain_output.chain_state.commit_txn.compute_txid(),
Txid::from_byte_array(latest_sequencer_commit_txid)
spv.transaction.0.compute_txid()
);
assert_eq!(genesis_sequencer_commit_txid, commit_chain_output.chain_state.genesis_txid);

Expand All @@ -105,11 +98,8 @@ pub fn watch_longest_chain(
)
.expect("Failed to verify header chain proof");

let prev_output = ZKMPublicValues::from(&header_chain.zkm_public_values).read();
let prev_proof = HeaderChainPrevProofType::PrevProof(prev_output);
let HeaderChainPrevProofType::PrevProof(btc_header_chain_output) = &prev_proof else {
panic!("Only PrevProof is supported in watch_longest_chain");
};
let btc_header_chain_output: BlockHeaderCircuitOutput =
ZKMPublicValues::from(&header_chain.zkm_public_values).read();
// verify that the latest_sequecner_commit_tx is in the header chain
println!("SPV");
assert!(spv.verify(&btc_header_chain_output.chain_state.block_hashes_mmr));
Expand All @@ -121,11 +111,8 @@ pub fn watch_longest_chain(
&state_chain.zkm_version,
)
.expect("Failed to verify state chain proof");
let prev_output = ZKMPublicValues::from(&state_chain.zkm_public_values).read();
let prev_proof = StateChainPrevProofType::PrevProof(prev_output);
let StateChainPrevProofType::PrevProof(state_chain_output) = &prev_proof else {
panic!("Only PrevProof is supported in watch_longest_chain");
};
let state_chain_output: StateChainCircuitOutput =
ZKMPublicValues::from(&state_chain.zkm_public_values).read();
// check the signature.
let cosmos_block_bytes = &state_chain_output.chain_state.latest_cosmos_block;
let cosmos_block: LightBlock =
Expand Down Expand Up @@ -255,11 +242,7 @@ pub fn propose_longest_chain(
&commit_chain.zkm_version,
)
.expect("Failed to verify commit chain proof");
let prev_output = decode_commit_chain_circuit_output(&commit_chain.zkm_public_values);
let prev_proof = CommitChainPrevProofType::PrevProof(prev_output);
let CommitChainPrevProofType::PrevProof(commit_chain_output) = &prev_proof else {
panic!("Only PrevProof is supported in propose_longest_chain");
};
let commit_chain_output = decode_commit_chain_circuit_output(&commit_chain.zkm_public_values);
assert_eq!(
commit_chain_output.chain_state.commit_txn.compute_txid(),
spv_ss_commit.transaction.0.compute_txid()
Expand All @@ -278,11 +261,8 @@ pub fn propose_longest_chain(
&operator_header_chain.zkm_version,
)
.expect("Failed to verify header chain proof");
let prev_output = ZKMPublicValues::from(&operator_header_chain.zkm_public_values).read();
let prev_proof = HeaderChainPrevProofType::PrevProof(prev_output);
let HeaderChainPrevProofType::PrevProof(btc_header_chain_output) = &prev_proof else {
panic!("Only PrevProof is supported in propose_longest_chain");
};
let btc_header_chain_output: BlockHeaderCircuitOutput =
ZKMPublicValues::from(&operator_header_chain.zkm_public_values).read();
let operator_total_work = btc_header_chain_output.chain_state.total_work;
let operator_consensus_block_height = U32::from(commit_chain_output.chain_state.block_height);
// commit header chain best block hash as pis
Expand Down Expand Up @@ -429,11 +409,9 @@ pub fn propose_longest_chain(
)
.expect("Failed to verify state chain proof");

let prev_output = ZKMPublicValues::from(&state_chain.zkm_public_values).read();
let prev_proof = StateChainPrevProofType::PrevProof(prev_output);
let StateChainPrevProofType::PrevProof(state_chain_output) = &prev_proof else {
panic!("Only PrevProof is supported in propose_longest_chain");
};
let state_chain_output: StateChainCircuitOutput =
ZKMPublicValues::from(&state_chain.zkm_public_values).read();

// check the signature.
let cosmos_block_bytes = &state_chain_output.chain_state.latest_cosmos_block;
let cosmos_block: LightBlock =
Expand Down
2 changes: 1 addition & 1 deletion crates/commit-chain/src/commit_chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ pub struct CommitInfo {
#[derive(Serialize, Deserialize, PartialEq, Clone, Debug)]
pub enum CommitChainPrevProofType {
GenesisBlock,
PrevProof(CommitChainCircuitOutput),
PrevProof,
}

#[derive(Serialize, Deserialize, PartialEq, Clone, Debug)]
Expand Down
5 changes: 2 additions & 3 deletions crates/commit-chain/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ pub fn commit_chain_circuit(input: CommitChainCircuitInput) -> CommitChainCircui
CommitChainPrevProofType::GenesisBlock => {
CommitChainState::new(input.commits[0].genesis_txid)
}
CommitChainPrevProofType::PrevProof(prev_proof) => {
CommitChainPrevProofType::PrevProof => {
println!("verify commit chain of prev proof");
verifier::verify_groth16_proof(
&input.zkm_proof,
Expand All @@ -18,8 +18,7 @@ pub fn commit_chain_circuit(input: CommitChainCircuitInput) -> CommitChainCircui
)
.unwrap();

// todo: read from input.zkm_public_values
prev_proof.chain_state
decode_commit_chain_circuit_output(&input.zkm_public_values).chain_state
}
};

Expand Down
1 change: 1 addition & 0 deletions crates/header-chain/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ serde = { workspace = true, default-features = false }
crypto-bigint = { version = "0.5.5", default-features = false }
zkm-zkvm = { workspace = true }
verifier = { workspace = true }
zkm-primitives = { workspace = true }

[dev-dependencies]
hex-literal = "1.0.0"
2 changes: 1 addition & 1 deletion crates/header-chain/src/header_chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,7 @@ pub struct BlockHeaderCircuitOutput {
#[derive(Serialize, Deserialize, Eq, PartialEq, Clone, Debug, BorshDeserialize, BorshSerialize)]
pub enum HeaderChainPrevProofType {
GenesisBlock,
PrevProof(BlockHeaderCircuitOutput),
PrevProof,
}

/// The input of the header chain circuit.
Expand Down
8 changes: 6 additions & 2 deletions crates/header-chain/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ pub use merkle_tree::*;
pub use mmr::*;
pub use transaction::*;

use zkm_primitives::io::ZKMPublicValues;

pub mod spv;
pub use spv::SPV;

Expand All @@ -19,7 +21,7 @@ pub fn header_chain_circuit(input: HeaderChainCircuitInput) -> BlockHeaderCircui
// println!("NETWORK_CONSTANTS: {:?}", NETWORK_CONSTANTS);
let mut chain_state = match input.prev_proof {
HeaderChainPrevProofType::GenesisBlock => ChainState::new(),
HeaderChainPrevProofType::PrevProof(prev_proof) => {
HeaderChainPrevProofType::PrevProof => {
println!("verify header chain of prev proof");
verifier::verify_groth16_proof(
&input.zkm_proof,
Expand All @@ -29,7 +31,9 @@ pub fn header_chain_circuit(input: HeaderChainCircuitInput) -> BlockHeaderCircui
)
.unwrap();

prev_proof.chain_state
let btc_header_chain_output: BlockHeaderCircuitOutput =
ZKMPublicValues::from(&input.zkm_public_values).read();
btc_header_chain_output.chain_state
}
};

Expand Down
1 change: 1 addition & 0 deletions crates/state-chain/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ header-chain = { path = "../header-chain" }
# Ziren
verifier = { workspace = true }
zkm-zkvm = { workspace = true }
zkm-primitives = { workspace = true }
#zkm-verifier = { path = "../../../Ziren/crates/verifier" }
#zkm-zkvm = { path = "../../../Ziren/crates/zkvm/entrypoint", features = ["verify"] }

Expand Down
Loading