do RNG before proving

This commit is contained in:
Ajinkya Kulkarni 2024-04-18 23:40:25 +02:00
parent 34c5b9044d
commit f57af0519d
4 changed files with 18 additions and 22 deletions

View file

@ -3,7 +3,6 @@
use bincode::serialize; use bincode::serialize;
use ed25519_consensus::*; use ed25519_consensus::*;
use mtcs_core::*; use mtcs_core::*;
use rand::thread_rng;
use rs_merkle::{algorithms::Sha256, Hasher, MerkleProof}; use rs_merkle::{algorithms::Sha256, Hasher, MerkleProof};
sp1_zkvm::entrypoint!(main); sp1_zkvm::entrypoint!(main);
@ -11,7 +10,7 @@ pub fn main() {
println!("reading inputs into guest..."); println!("reading inputs into guest...");
let cycle: Cycle = sp1_zkvm::io::read::<Cycle>(); let cycle: Cycle = sp1_zkvm::io::read::<Cycle>();
let _secret: PrivateKey = sp1_zkvm::io::read::<PrivateKey>(); let key: SigningKey = sp1_zkvm::io::read::<SigningKey>();
let proof: Proof = sp1_zkvm::io::read::<Proof>(); let proof: Proof = sp1_zkvm::io::read::<Proof>();
let merkle_data: MerkleData = sp1_zkvm::io::read::<MerkleData>(); let merkle_data: MerkleData = sp1_zkvm::io::read::<MerkleData>();
assert_eq!( assert_eq!(
@ -53,15 +52,16 @@ pub fn main() {
let message = { let message = {
let hashed_cycle = Sha256::hash(&serialize(&cycle).unwrap()); let hashed_cycle = Sha256::hash(&serialize(&cycle).unwrap());
// Generate a signing key and sign the message // Generate a signing key and sign the message
let sk = SigningKey::new(thread_rng());
let sig = sk.sign(&bincode::serialize(&hashed_cycle).unwrap()[..]);
let vk_bytes: [u8; 32] = VerificationKey::from(&sk).into(); let sig = key.sign(&bincode::serialize(&hashed_cycle).unwrap()[..]);
let vk_bytes: [u8; 32] = VerificationKey::from(&key).into();
(hashed_cycle, vk_bytes, sig) (hashed_cycle, vk_bytes, sig)
}; };
sp1_zkvm::io::commit(&message); sp1_zkvm::io::commit(&message);
println!("cryptography magic happening...")
} }
// TODO: for every edge involved in clearing, the total offsets of all cycles // TODO: for every edge involved in clearing, the total offsets of all cycles
// passing through that edge should be less than the value of that edge // passing through that edge should be less than the value of that edge

1
script/Cargo.lock generated
View file

@ -2243,6 +2243,7 @@ dependencies = [
"ed25519-consensus", "ed25519-consensus",
"hex", "hex",
"mtcs-core", "mtcs-core",
"rand",
"rs_merkle", "rs_merkle",
"serde_json", "serde_json",
"sp1-helper", "sp1-helper",

View file

@ -12,6 +12,7 @@ bincode = "1.3.3"
hex = "0.4.3" hex = "0.4.3"
serde_json = "1.0" serde_json = "1.0"
ed25519-consensus = "2.1.0" ed25519-consensus = "2.1.0"
rand = "0.8.5"
[build-dependencies] [build-dependencies]
sp1-helper = { git = "https://github.com/succinctlabs/sp1.git" } sp1-helper = { git = "https://github.com/succinctlabs/sp1.git" }

View file

@ -1,8 +1,7 @@
// These constants represent the RISC-V ELF and the image ID generated by risc0-build.
// The ELF is used for proving and the ID is used for verification.
use bincode::serialize; use bincode::serialize;
use ed25519_consensus::*; use ed25519_consensus::*;
use mtcs_core::*; use mtcs_core::*;
use rand::thread_rng;
use rs_merkle::{algorithms::Sha256 as MerkleSha256, Hasher, MerkleTree}; use rs_merkle::{algorithms::Sha256 as MerkleSha256, Hasher, MerkleTree};
use std::fs; use std::fs;
use std::time::SystemTime; use std::time::SystemTime;
@ -17,9 +16,6 @@ fn main() {
println!("generating guest inputs..."); println!("generating guest inputs...");
// For example: // For example:
let key: Vec<u8> = "passw0rdpassw0rdpassw0rdpassw0rd".as_bytes().to_vec();
let secret = PrivateKey { key };
let cycle_data: String = fs::read_to_string("../cycle.json").unwrap(); let cycle_data: String = fs::read_to_string("../cycle.json").unwrap();
let all_obligation_data: String = fs::read_to_string("../obligations.json").unwrap(); let all_obligation_data: String = fs::read_to_string("../obligations.json").unwrap();
@ -50,7 +46,6 @@ fn main() {
let bytes = merkle_proof.to_bytes(); let bytes = merkle_proof.to_bytes();
let key: PrivateKey = secret;
let proof: Proof = Proof { let proof: Proof = Proof {
bytes: bytes.as_slice().try_into().unwrap(), bytes: bytes.as_slice().try_into().unwrap(),
}; };
@ -60,7 +55,7 @@ fn main() {
indexes: indexes.try_into().unwrap(), indexes: indexes.try_into().unwrap(),
len, len,
}; };
let key = SigningKey::new(thread_rng());
let mut stdin = SP1Stdin::new(); let mut stdin = SP1Stdin::new();
let client = ProverClient::new(); let client = ProverClient::new();
@ -70,8 +65,6 @@ fn main() {
stdin.write(&proof); stdin.write(&proof);
stdin.write(&aux); stdin.write(&aux);
println!("generating proof...");
let mut proof = client.prove(ELF, stdin).expect("proving failed"); let mut proof = client.prove(ELF, stdin).expect("proving failed");
println!("proof generation completed!"); println!("proof generation completed!");
@ -80,18 +73,19 @@ fn main() {
client.verify(ELF, &proof).expect("verification failed"); client.verify(ELF, &proof).expect("verification failed");
println!("verification completed!"); println!("verification completed!");
println!("validating digital signature...");
let (hash, verification_key, sign): &([u8; 32], VerificationKey, Signature) =
&proof.public_values.read();
// let read_values: ([u8; 32], Signature) = pub_values.read();
let sig_verify = verification_key.verify(sign, hash).is_ok();
assert!(sig_verify);
let end_time = SystemTime::now(); let end_time = SystemTime::now();
let difference = end_time let difference = end_time
.duration_since(start_time) .duration_since(start_time)
.expect("Clock may have gone backwards"); .expect("Clock may have gone backwards");
println!("Total time: {difference:?}"); println!("Total prover time: {difference:?}");
println!("validating digital signature...");
let (hash, verification_key, sign): &([u8; 32], VerificationKey, Signature) =
&proof.public_values.read();
let sig_verify = verification_key.verify(sign, hash).is_ok();
assert!(sig_verify);
proof proof
.save("proof-with-io.json") .save("proof-with-io.json")