| 17 | use tempfile::tempdir; |
| 18 | |
| 19 | pub fn stark_to_succinct( |
| 20 | succinct_receipt: SuccinctReceipt<ReceiptClaim>, |
| 21 | journal: &[u8], |
| 22 | ) -> (Seal, [u8; 31]) { |
| 23 | let ident_receipt = risc0_zkvm::recursion::identity_p254(&succinct_receipt).unwrap(); |
| 24 | let identity_p254_seal_bytes = ident_receipt.get_seal_bytes(); |
| 25 | let receipt_claim = succinct_receipt.claim.value().unwrap(); |
| 26 | |
| 27 | // This part is from risc0-groth16 |
| 28 | if !is_x86_architecture() { |
| 29 | panic!("stark_to_snark is only supported on x86 architecture.") |
| 30 | } |
| 31 | if !is_docker_installed() { |
| 32 | panic!("Please install docker first.") |
| 33 | } |
| 34 | |
| 35 | let tmp_dir = tempdir().unwrap(); |
| 36 | let work_dir = std::env::var("RISC0_WORK_DIR"); |
| 37 | let work_dir = work_dir.as_ref().map(Path::new).unwrap_or(tmp_dir.path()); |
| 38 | println!("work_dir: {:?}", work_dir); |
| 39 | std::fs::write(work_dir.join("seal.r0"), identity_p254_seal_bytes.clone()).unwrap(); |
| 40 | let seal_path = work_dir.join("input.json"); |
| 41 | let proof_path = work_dir.join("proof.json"); |
| 42 | let output_path = work_dir.join("public.json"); |
| 43 | let mut seal_json = Vec::new(); |
| 44 | to_json(&*identity_p254_seal_bytes, &mut seal_json).unwrap(); |
| 45 | std::fs::write(seal_path.clone(), seal_json).unwrap(); |
| 46 | |
| 47 | let pre_state: risc0_zkvm::MaybePruned<SystemState> = receipt_claim.clone().pre; |
| 48 | println!("pre_state: {:?}", pre_state); |
| 49 | let pre_state_digest: Digest = pre_state.clone().digest(); |
| 50 | println!("pre_state_digest: {:?}", pre_state_digest); |
| 51 | let pre_state_digest_bits: Vec<String> = pre_state_digest |
| 52 | .as_bytes() |
| 53 | .iter() |
| 54 | .flat_map(|&byte| (0..8).rev().map(move |i| ((byte >> i) & 1).to_string())) |
| 55 | .collect(); |
| 56 | println!("pre_state_digest_bits: {:?}", pre_state_digest_bits); |
| 57 | let post_state: risc0_zkvm::MaybePruned<SystemState> = receipt_claim.clone().post; |
| 58 | println!("post_state: {:?}", post_state); |
| 59 | let post_state_digest: Digest = post_state.clone().digest(); |
| 60 | let post_state_digest_bits: Vec<String> = post_state_digest |
| 61 | .as_bytes() |
| 62 | .iter() |
| 63 | .flat_map(|&byte| (0..8).rev().map(move |i| ((byte >> i) & 1).to_string())) |
| 64 | .collect(); |
| 65 | println!("post_state_digest_bits: {:?}", post_state_digest_bits); |
| 66 | |
| 67 | let mut journal_bits = Vec::new(); |
| 68 | for byte in journal { |
| 69 | for i in 0..8 { |
| 70 | journal_bits.push((byte >> (7 - i)) & 1); |
| 71 | } |
| 72 | } |
| 73 | println!("journal_bits len: {:?}", journal_bits.len()); |
| 74 | |
| 75 | let succinct_verifier_params = SuccinctReceiptVerifierParameters::default(); |
| 76 | println!("Succinct verifier params: {:?}", succinct_verifier_params); |