Accept filenames as command line arguments

This commit is contained in:
poma 2020-01-08 19:39:29 +07:00
parent a49ebce8f1
commit e8b14ddb00
No known key found for this signature in database
GPG Key ID: BA20CB01FE165657
10 changed files with 155 additions and 79 deletions

@ -147,6 +147,11 @@ name = "either"
version = "1.5.1" version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "exitcode"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "ff_ce" name = "ff_ce"
version = "0.7.1" version = "0.7.1"
@ -310,6 +315,7 @@ dependencies = [
"blake2 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "blake2 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
"byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"crossbeam 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
"exitcode 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
"generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", "generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)",
"hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -490,6 +496,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum crypto-mac 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "779015233ac67d65098614aec748ac1c756ab6677fa2e14cf8b37c08dfed1198" "checksum crypto-mac 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "779015233ac67d65098614aec748ac1c756ab6677fa2e14cf8b37c08dfed1198"
"checksum digest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e5b29bf156f3f4b3c4f610a25ff69370616ae6e0657d416de22645483e72af0a" "checksum digest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e5b29bf156f3f4b3c4f610a25ff69370616ae6e0657d416de22645483e72af0a"
"checksum either 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c67353c641dc847124ea1902d69bd753dee9bb3beff9aa3662ecf86c971d1fac" "checksum either 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c67353c641dc847124ea1902d69bd753dee9bb3beff9aa3662ecf86c971d1fac"
"checksum exitcode 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "de853764b47027c2e862a995c34978ffa63c1501f2e15f987ba11bd4f9bba193"
"checksum ff_ce 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "18af1ea1b80a4b474fae13af4c58cf0a5a2bc33832d5fa70f68a4b286178fdb5" "checksum ff_ce 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "18af1ea1b80a4b474fae13af4c58cf0a5a2bc33832d5fa70f68a4b286178fdb5"
"checksum ff_derive_ce 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d245b4e76c5b36bb7721ea15b7fbc61bebf0c5d2890eaf49fe1e2a3eed36db9" "checksum ff_derive_ce 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d245b4e76c5b36bb7721ea15b7fbc61bebf0c5d2890eaf49fe1e2a3eed36db9"
"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"

@ -20,6 +20,7 @@ typenum = "1.9.0"
byteorder = "1.1.0" byteorder = "1.1.0"
hex-literal = "0.1" hex-literal = "0.1"
rust-crypto = "0.2" rust-crypto = "0.2"
exitcode = "1.1.2"
memmap = "0.7.0" memmap = "0.7.0"
itertools = "0.8.0" itertools = "0.8.0"

@ -28,6 +28,14 @@ const CHECK_INPUT_CORRECTNESS: CheckForCorrectness = CheckForCorrectness::No;
fn main() { fn main() {
let args: Vec<String> = std::env::args().collect();
if args.len() != 3 {
println!("Usage: \n<challenge_file> <response_file>");
std::process::exit(exitcode::USAGE);
}
let challenge_filename = &args[1];
let response_filename = &args[2];
println!("Will contribute a random beacon to accumulator for 2^{} powers of tau", Bn256CeremonyParameters::REQUIRED_POWER); println!("Will contribute a random beacon to accumulator for 2^{} powers of tau", Bn256CeremonyParameters::REQUIRED_POWER);
println!("In total will generate up to {} powers", Bn256CeremonyParameters::TAU_POWERS_G1_LENGTH); println!("In total will generate up to {} powers", Bn256CeremonyParameters::TAU_POWERS_G1_LENGTH);
@ -81,13 +89,14 @@ fn main() {
println!("Done creating a beacon RNG"); println!("Done creating a beacon RNG");
// Try to load `./challenge` from disk. // Try to load challenge file from disk.
let reader = OpenOptions::new() let reader = OpenOptions::new()
.read(true) .read(true)
.open("challenge").expect("unable open `./challenge` in this directory"); .open(challenge_filename)
.expect("unable open challenge file in this directory");
{ {
let metadata = reader.metadata().expect("unable to get filesystem metadata for `./challenge`"); let metadata = reader.metadata().expect("unable to get filesystem metadata for challenge file");
let expected_challenge_length = match INPUT_IS_COMPRESSED { let expected_challenge_length = match INPUT_IS_COMPRESSED {
UseCompression::Yes => { UseCompression::Yes => {
Bn256CeremonyParameters::CONTRIBUTION_BYTE_SIZE Bn256CeremonyParameters::CONTRIBUTION_BYTE_SIZE
@ -98,18 +107,19 @@ fn main() {
}; };
if metadata.len() != (expected_challenge_length as u64) { if metadata.len() != (expected_challenge_length as u64) {
panic!("The size of `./challenge` should be {}, but it's {}, so something isn't right.", expected_challenge_length, metadata.len()); panic!("The size of challenge file should be {}, but it's {}, so something isn't right.", expected_challenge_length, metadata.len());
} }
} }
let readable_map = unsafe { MmapOptions::new().map(&reader).expect("unable to create a memory map for input") }; let readable_map = unsafe { MmapOptions::new().map(&reader).expect("unable to create a memory map for input") };
// Create `./response` in this directory // Create response file in this directory
let writer = OpenOptions::new() let writer = OpenOptions::new()
.read(true) .read(true)
.write(true) .write(true)
.create_new(true) .create_new(true)
.open("response").expect("unable to create `./response` in this directory"); .open(response_filename)
.expect("unable to create response file in this directory");
let required_output_length = match COMPRESS_THE_OUTPUT { let required_output_length = match COMPRESS_THE_OUTPUT {
UseCompression::Yes => { UseCompression::Yes => {
@ -143,7 +153,7 @@ fn main() {
(&mut writable_map[0..]).write(current_accumulator_hash.as_slice()).expect("unable to write a challenge hash to mmap"); (&mut writable_map[0..]).write(current_accumulator_hash.as_slice()).expect("unable to write a challenge hash to mmap");
writable_map.flush().expect("unable to write hash to `./response`"); writable_map.flush().expect("unable to write hash to response file");
} }
// Construct our keypair using the RNG we created above // Construct our keypair using the RNG we created above
@ -161,7 +171,7 @@ fn main() {
CHECK_INPUT_CORRECTNESS, CHECK_INPUT_CORRECTNESS,
&privkey &privkey
).expect("must transform with the key"); ).expect("must transform with the key");
println!("Finihsing writing your contribution to `./response`..."); println!("Finishing writing your contribution to response file...");
// Write the public key // Write the public key
pubkey.write::<Bn256CeremonyParameters>(&mut writable_map, COMPRESS_THE_OUTPUT).expect("unable to write public key"); pubkey.write::<Bn256CeremonyParameters>(&mut writable_map, COMPRESS_THE_OUTPUT).expect("unable to write public key");
@ -171,8 +181,8 @@ fn main() {
let contribution_hash = BachedAccumulator::<Bn256, Bn256CeremonyParameters>::calculate_hash(&output_readonly); let contribution_hash = BachedAccumulator::<Bn256, Bn256CeremonyParameters>::calculate_hash(&output_readonly);
print!("Done!\n\n\ print!("Done!\n\n\
Your contribution has been written to `./response`\n\n\ Your contribution has been written to response file\n\n\
The BLAKE2b hash of `./response` is:\n"); The BLAKE2b hash of response file is:\n");
for line in contribution_hash.as_slice().chunks(16) { for line in contribution_hash.as_slice().chunks(16) {
print!("\t"); print!("\t");

@ -4,6 +4,7 @@ extern crate memmap;
extern crate rand; extern crate rand;
extern crate blake2; extern crate blake2;
extern crate byteorder; extern crate byteorder;
extern crate exitcode;
use powersoftau::bn256::{Bn256CeremonyParameters}; use powersoftau::bn256::{Bn256CeremonyParameters};
use powersoftau::batched_accumulator::{BachedAccumulator}; use powersoftau::batched_accumulator::{BachedAccumulator};
@ -23,6 +24,14 @@ const COMPRESS_THE_OUTPUT: UseCompression = UseCompression::Yes;
const CHECK_INPUT_CORRECTNESS: CheckForCorrectness = CheckForCorrectness::No; const CHECK_INPUT_CORRECTNESS: CheckForCorrectness = CheckForCorrectness::No;
fn main() { fn main() {
let args: Vec<String> = std::env::args().collect();
if args.len() != 3 {
println!("Usage: \n<challenge_file> <response_file>");
std::process::exit(exitcode::USAGE);
}
let challenge_filename = &args[1];
let response_filename = &args[2];
println!("Will contribute to accumulator for 2^{} powers of tau", Bn256CeremonyParameters::REQUIRED_POWER); println!("Will contribute to accumulator for 2^{} powers of tau", Bn256CeremonyParameters::REQUIRED_POWER);
println!("In total will generate up to {} powers", Bn256CeremonyParameters::TAU_POWERS_G1_LENGTH); println!("In total will generate up to {} powers", Bn256CeremonyParameters::TAU_POWERS_G1_LENGTH);
@ -64,13 +73,13 @@ fn main() {
ChaChaRng::from_seed(&seed) ChaChaRng::from_seed(&seed)
}; };
// Try to load `./challenge` from disk. // Try to load challenge file from disk.
let reader = OpenOptions::new() let reader = OpenOptions::new()
.read(true) .read(true)
.open("challenge").expect("unable open `./challenge` in this directory"); .open(challenge_filename)
.expect("unable open challenge file");
{ {
let metadata = reader.metadata().expect("unable to get filesystem metadata for `./challenge`"); let metadata = reader.metadata().expect("unable to get filesystem metadata for challenge file");
let expected_challenge_length = match INPUT_IS_COMPRESSED { let expected_challenge_length = match INPUT_IS_COMPRESSED {
UseCompression::Yes => { UseCompression::Yes => {
Bn256CeremonyParameters::CONTRIBUTION_BYTE_SIZE Bn256CeremonyParameters::CONTRIBUTION_BYTE_SIZE
@ -81,18 +90,19 @@ fn main() {
}; };
if metadata.len() != (expected_challenge_length as u64) { if metadata.len() != (expected_challenge_length as u64) {
panic!("The size of `./challenge` should be {}, but it's {}, so something isn't right.", expected_challenge_length, metadata.len()); panic!("The size of challenge file should be {}, but it's {}, so something isn't right.", expected_challenge_length, metadata.len());
} }
} }
let readable_map = unsafe { MmapOptions::new().map(&reader).expect("unable to create a memory map for input") }; let readable_map = unsafe { MmapOptions::new().map(&reader).expect("unable to create a memory map for input") };
// Create `./response` in this directory // Create response file in this directory
let writer = OpenOptions::new() let writer = OpenOptions::new()
.read(true) .read(true)
.write(true) .write(true)
.create_new(true) .create_new(true)
.open("response").expect("unable to create `./response` in this directory"); .open(response_filename)
.expect("unable to create response file");
let required_output_length = match COMPRESS_THE_OUTPUT { let required_output_length = match COMPRESS_THE_OUTPUT {
UseCompression::Yes => { UseCompression::Yes => {
@ -127,7 +137,7 @@ fn main() {
(&mut writable_map[0..]).write(current_accumulator_hash.as_slice()).expect("unable to write a challenge hash to mmap"); (&mut writable_map[0..]).write(current_accumulator_hash.as_slice()).expect("unable to write a challenge hash to mmap");
writable_map.flush().expect("unable to write hash to `./response`"); writable_map.flush().expect("unable to write hash to response file");
} }
{ {
@ -164,7 +174,7 @@ fn main() {
&privkey &privkey
).expect("must transform with the key"); ).expect("must transform with the key");
println!("Finihsing writing your contribution to `./response`..."); println!("Finishing writing your contribution to response file...");
// Write the public key // Write the public key
pubkey.write::<Bn256CeremonyParameters>(&mut writable_map, COMPRESS_THE_OUTPUT).expect("unable to write public key"); pubkey.write::<Bn256CeremonyParameters>(&mut writable_map, COMPRESS_THE_OUTPUT).expect("unable to write public key");
@ -176,8 +186,8 @@ fn main() {
let contribution_hash = BachedAccumulator::<Bn256, Bn256CeremonyParameters>::calculate_hash(&output_readonly); let contribution_hash = BachedAccumulator::<Bn256, Bn256CeremonyParameters>::calculate_hash(&output_readonly);
print!("Done!\n\n\ print!("Done!\n\n\
Your contribution has been written to `./response`\n\n\ Your contribution has been written to response file\n\n\
The BLAKE2b hash of `./response` is:\n"); The BLAKE2b hash of response file is:\n");
for line in contribution_hash.as_slice().chunks(16) { for line in contribution_hash.as_slice().chunks(16) {
print!("\t"); print!("\t");

@ -11,23 +11,31 @@ use std::io::{Write, BufWriter};
use bellman_ce::pairing::bn256::Bn256; use bellman_ce::pairing::bn256::Bn256;
fn main() { fn main() {
let writer = OpenOptions::new() let args: Vec<String> = std::env::args().collect();
.read(false) if args.len() != 2 {
.write(true) println!("Usage: \n<challenge_file>");
.create_new(true) std::process::exit(exitcode::USAGE);
.open("challenge").expect("unable to create `./challenge`"); }
let challenge_filename = &args[1];
let mut writer = BufWriter::new(writer); let file = OpenOptions::new()
.read(false)
.write(true)
.create_new(true)
.open(challenge_filename)
.expect("unable to create challenge file");
let mut writer = BufWriter::new(file);
// Write a blank BLAKE2b hash: // Write a blank BLAKE2b hash:
writer.write_all(&blank_hash().as_slice()).expect("unable to write blank hash to `./challenge`"); writer.write_all(&blank_hash().as_slice()).expect("unable to write blank hash to challenge file");
let parameters = Bn256CeremonyParameters{}; let parameters = Bn256CeremonyParameters{};
let acc: Accumulator<Bn256, _> = Accumulator::new(parameters); let acc: Accumulator<Bn256, _> = Accumulator::new(parameters);
println!("Writing an empty accumulator to disk"); println!("Writing an empty accumulator to disk");
acc.serialize(&mut writer, UseCompression::No).expect("unable to write fresh accumulator to `./challenge`"); acc.serialize(&mut writer, UseCompression::No).expect("unable to write fresh accumulator to challenge file");
writer.flush().expect("unable to flush accumulator to disk"); writer.flush().expect("unable to flush accumulator to disk");
println!("Wrote a fresh accumulator to `./challenge`"); println!("Wrote a fresh accumulator to challenge file");
} }

@ -17,14 +17,22 @@ use powersoftau::parameters::PowersOfTauParameters;
const COMPRESS_NEW_CHALLENGE: UseCompression = UseCompression::No; const COMPRESS_NEW_CHALLENGE: UseCompression = UseCompression::No;
fn main() { fn main() {
let args: Vec<String> = std::env::args().collect();
if args.len() != 2 {
println!("Usage: \n<challenge_file>");
std::process::exit(exitcode::USAGE);
}
let challenge_filename = &args[1];
println!("Will generate an empty accumulator for 2^{} powers of tau", Bn256CeremonyParameters::REQUIRED_POWER); println!("Will generate an empty accumulator for 2^{} powers of tau", Bn256CeremonyParameters::REQUIRED_POWER);
println!("In total will generate up to {} powers", Bn256CeremonyParameters::TAU_POWERS_G1_LENGTH); println!("In total will generate up to {} powers", Bn256CeremonyParameters::TAU_POWERS_G1_LENGTH);
let file = OpenOptions::new() let file = OpenOptions::new()
.read(true) .read(true)
.write(true) .write(true)
.create_new(true) .create_new(true)
.open("challenge").expect("unable to create `./challenge`"); .open(challenge_filename)
.expect("unable to create challenge file");
let expected_challenge_length = match COMPRESS_NEW_CHALLENGE { let expected_challenge_length = match COMPRESS_NEW_CHALLENGE {
UseCompression::Yes => { UseCompression::Yes => {
@ -42,7 +50,7 @@ fn main() {
// Write a blank BLAKE2b hash: // Write a blank BLAKE2b hash:
let hash = blank_hash(); let hash = blank_hash();
(&mut writable_map[0..]).write(hash.as_slice()).expect("unable to write a default hash to mmap"); (&mut writable_map[0..]).write(hash.as_slice()).expect("unable to write a default hash to mmap");
writable_map.flush().expect("unable to write blank hash to `./challenge`"); writable_map.flush().expect("unable to write blank hash to challenge file");
println!("Blank hash for an empty challenge:"); println!("Blank hash for an empty challenge:");
for line in hash.as_slice().chunks(16) { for line in hash.as_slice().chunks(16) {
@ -76,5 +84,5 @@ fn main() {
println!(""); println!("");
} }
println!("Wrote a fresh accumulator to `./challenge`"); println!("Wrote a fresh accumulator to challenge file");
} }

@ -29,11 +29,18 @@ fn log_2(x: u64) -> u32 {
} }
fn main() { fn main() {
// Try to load `./response` from disk. let args: Vec<String> = std::env::args().collect();
if args.len() != 2 {
println!("Usage: \n<response_filename>");
std::process::exit(exitcode::USAGE);
}
let response_filename = &args[1];
// Try to load response file from disk.
let reader = OpenOptions::new() let reader = OpenOptions::new()
.read(true) .read(true)
.open("response") .open(response_filename)
.expect("unable open `./response` in this directory"); .expect("unable open response file in this directory");
let response_readable_map = unsafe { MmapOptions::new().map(&reader).expect("unable to create a memory map for input") }; let response_readable_map = unsafe { MmapOptions::new().map(&reader).expect("unable to create a memory map for input") };
let current_accumulator = BachedAccumulator::<Bn256, Bn256CeremonyParameters>::deserialize( let current_accumulator = BachedAccumulator::<Bn256, Bn256CeremonyParameters>::deserialize(

@ -61,7 +61,7 @@ fn get_challenge_file_hash(
let mut writable_map = unsafe { MmapOptions::new().map_mut(&writer).expect("unable to create a memory map for output") }; let mut writable_map = unsafe { MmapOptions::new().map_mut(&writer).expect("unable to create a memory map for output") };
(&mut writable_map[0..]).write(&last_response_file_hash[..]).expect("unable to write a default hash to mmap"); (&mut writable_map[0..]).write(&last_response_file_hash[..]).expect("unable to write a default hash to mmap");
writable_map.flush().expect("unable to write blank hash to `./challenge`"); writable_map.flush().expect("unable to write blank hash to challenge file");
if is_initial { if is_initial {
BachedAccumulator::<Bn256, Bn256CeremonyParameters>::generate_initial(&mut writable_map, UseCompression::No).expect("generation of initial accumulator is successful"); BachedAccumulator::<Bn256, Bn256CeremonyParameters>::generate_initial(&mut writable_map, UseCompression::No).expect("generation of initial accumulator is successful");
@ -119,7 +119,7 @@ fn get_response_file_hash(
let mut writable_map = unsafe { MmapOptions::new().map_mut(&writer).expect("unable to create a memory map for output") }; let mut writable_map = unsafe { MmapOptions::new().map_mut(&writer).expect("unable to create a memory map for output") };
(&mut writable_map[0..]).write(&last_challenge_file_hash[..]).expect("unable to write a default hash to mmap"); (&mut writable_map[0..]).write(&last_challenge_file_hash[..]).expect("unable to write a default hash to mmap");
writable_map.flush().expect("unable to write blank hash to `./challenge`"); writable_map.flush().expect("unable to write blank hash to challenge file");
acc.serialize( acc.serialize(
&mut writable_map, &mut writable_map,
@ -158,7 +158,8 @@ fn new_accumulator_for_verify() -> BachedAccumulator<Bn256, Bn256CeremonyParamet
.read(true) .read(true)
.write(true) .write(true)
.create_new(true) .create_new(true)
.open(file_name).expect("unable to create `./tmp_initial_challenge`"); .open(file_name)
.expect("unable to create `./tmp_initial_challenge`");
let expected_challenge_length = Bn256CeremonyParameters::ACCUMULATOR_BYTE_SIZE; let expected_challenge_length = Bn256CeremonyParameters::ACCUMULATOR_BYTE_SIZE;
file.set_len(expected_challenge_length as u64).expect("unable to allocate large enough file"); file.set_len(expected_challenge_length as u64).expect("unable to allocate large enough file");
@ -171,7 +172,8 @@ fn new_accumulator_for_verify() -> BachedAccumulator<Bn256, Bn256CeremonyParamet
let reader = OpenOptions::new() let reader = OpenOptions::new()
.read(true) .read(true)
.open(file_name) .open(file_name)
.expect("unable open `./transcript` in this directory"); .expect("unable open transcript file in this directory");
let readable_map = unsafe { MmapOptions::new().map(&reader).expect("unable to create a memory map for input") }; let readable_map = unsafe { MmapOptions::new().map(&reader).expect("unable to create a memory map for input") };
let initial_accumulator = BachedAccumulator::deserialize( let initial_accumulator = BachedAccumulator::deserialize(
&readable_map, &readable_map,
@ -183,11 +185,19 @@ fn new_accumulator_for_verify() -> BachedAccumulator<Bn256, Bn256CeremonyParamet
} }
fn main() { fn main() {
// Try to load `./transcript` from disk. let args: Vec<String> = std::env::args().collect();
if args.len() != 2 {
println!("Usage: \n<transcript_file>");
std::process::exit(exitcode::USAGE);
}
let transcript_filename = &args[1];
// Try to load transcript file from disk.
let reader = OpenOptions::new() let reader = OpenOptions::new()
.read(true) .read(true)
.open("transcript") .open(transcript_filename)
.expect("unable open `./transcript` in this directory"); .expect("unable open transcript file in this directory");
let transcript_readable_map = unsafe { MmapOptions::new().map(&reader).expect("unable to create a memory map for input") }; let transcript_readable_map = unsafe { MmapOptions::new().map(&reader).expect("unable to create a memory map for input") };
// Initialize the accumulator // Initialize the accumulator

@ -23,15 +23,25 @@ const CONTRIBUTION_IS_COMPRESSED: UseCompression = UseCompression::Yes;
const COMPRESS_NEW_CHALLENGE: UseCompression = UseCompression::No; const COMPRESS_NEW_CHALLENGE: UseCompression = UseCompression::No;
fn main() { fn main() {
let args: Vec<String> = std::env::args().collect();
if args.len() != 4 {
println!("Usage: \n<challenge_file> <response_file> <new_challenge_file>");
std::process::exit(exitcode::USAGE);
}
let challenge_filename = &args[1];
let response_filename = &args[2];
let new_challenge_filename = &args[3];
println!("Will verify and decompress a contribution to accumulator for 2^{} powers of tau", Bn256CeremonyParameters::REQUIRED_POWER); println!("Will verify and decompress a contribution to accumulator for 2^{} powers of tau", Bn256CeremonyParameters::REQUIRED_POWER);
// Try to load `./challenge` from disk. // Try to load challenge file from disk.
let challenge_reader = OpenOptions::new() let challenge_reader = OpenOptions::new()
.read(true) .read(true)
.open("challenge").expect("unable open `./challenge` in this directory"); .open(challenge_filename)
.expect("unable open challenge file in this directory");
{ {
let metadata = challenge_reader.metadata().expect("unable to get filesystem metadata for `./challenge`"); let metadata = challenge_reader.metadata().expect("unable to get filesystem metadata for challenge file");
let expected_challenge_length = match PREVIOUS_CHALLENGE_IS_COMPRESSED { let expected_challenge_length = match PREVIOUS_CHALLENGE_IS_COMPRESSED {
UseCompression::Yes => { UseCompression::Yes => {
Bn256CeremonyParameters::CONTRIBUTION_BYTE_SIZE - Bn256CeremonyParameters::PUBLIC_KEY_SIZE Bn256CeremonyParameters::CONTRIBUTION_BYTE_SIZE - Bn256CeremonyParameters::PUBLIC_KEY_SIZE
@ -41,19 +51,20 @@ fn main() {
} }
}; };
if metadata.len() != (expected_challenge_length as u64) { if metadata.len() != (expected_challenge_length as u64) {
panic!("The size of `./challenge` should be {}, but it's {}, so something isn't right.", expected_challenge_length, metadata.len()); panic!("The size of challenge file should be {}, but it's {}, so something isn't right.", expected_challenge_length, metadata.len());
} }
} }
let challenge_readable_map = unsafe { MmapOptions::new().map(&challenge_reader).expect("unable to create a memory map for input") }; let challenge_readable_map = unsafe { MmapOptions::new().map(&challenge_reader).expect("unable to create a memory map for input") };
// Try to load `./response` from disk. // Try to load response file from disk.
let response_reader = OpenOptions::new() let response_reader = OpenOptions::new()
.read(true) .read(true)
.open("response").expect("unable open `./response` in this directory"); .open(response_filename)
.expect("unable open response file in this directory");
{ {
let metadata = response_reader.metadata().expect("unable to get filesystem metadata for `./response`"); let metadata = response_reader.metadata().expect("unable to get filesystem metadata for response file");
let expected_response_length = match CONTRIBUTION_IS_COMPRESSED { let expected_response_length = match CONTRIBUTION_IS_COMPRESSED {
UseCompression::Yes => { UseCompression::Yes => {
Bn256CeremonyParameters::CONTRIBUTION_BYTE_SIZE Bn256CeremonyParameters::CONTRIBUTION_BYTE_SIZE
@ -63,7 +74,7 @@ fn main() {
} }
}; };
if metadata.len() != (expected_response_length as u64) { if metadata.len() != (expected_response_length as u64) {
panic!("The size of `./response` should be {}, but it's {}, so something isn't right.", expected_response_length, metadata.len()); panic!("The size of response file should be {}, but it's {}, so something isn't right.", expected_response_length, metadata.len());
} }
} }
@ -112,7 +123,7 @@ fn main() {
let response_hash = BachedAccumulator::<Bn256, Bn256CeremonyParameters>::calculate_hash(&response_readable_map); let response_hash = BachedAccumulator::<Bn256, Bn256CeremonyParameters>::calculate_hash(&response_readable_map);
println!("Hash of the `response` file for verification:"); println!("Hash of the response file for verification:");
for line in response_hash.as_slice().chunks(16) { for line in response_hash.as_slice().chunks(16) {
print!("\t"); print!("\t");
for section in line.chunks(4) { for section in line.chunks(4) {
@ -152,20 +163,21 @@ fn main() {
} }
if COMPRESS_NEW_CHALLENGE == UseCompression::Yes { if COMPRESS_NEW_CHALLENGE == UseCompression::Yes {
println!("Don't need to recompress the contribution, please copy `./response` as `./new_challenge`"); println!("Don't need to recompress the contribution, please copy response file as new challenge");
} else { } else {
println!("Verification succeeded! Writing to `./new_challenge`..."); println!("Verification succeeded! Writing to new challenge file...");
// Create `./new_challenge` in this directory // Create new challenge file in this directory
let writer = OpenOptions::new() let writer = OpenOptions::new()
.read(true) .read(true)
.write(true) .write(true)
.create_new(true) .create_new(true)
.open("new_challenge").expect("unable to create `./new_challenge` in this directory"); .open(new_challenge_filename)
.expect("unable to create new challenge file in this directory");
// Recomputation stips the public key and uses hashing to link with the previous contibution after decompression // Recomputation strips the public key and uses hashing to link with the previous contribution after decompression
writer.set_len(Bn256CeremonyParameters::ACCUMULATOR_BYTE_SIZE as u64).expect("must make output file large enough"); writer.set_len(Bn256CeremonyParameters::ACCUMULATOR_BYTE_SIZE as u64).expect("must make output file large enough");
let mut writable_map = unsafe { MmapOptions::new().map_mut(&writer).expect("unable to create a memory map for output") }; let mut writable_map = unsafe { MmapOptions::new().map_mut(&writer).expect("unable to create a memory map for output") };
@ -173,7 +185,7 @@ fn main() {
{ {
(&mut writable_map[0..]).write(response_hash.as_slice()).expect("unable to write a default hash to mmap"); (&mut writable_map[0..]).write(response_hash.as_slice()).expect("unable to write a default hash to mmap");
writable_map.flush().expect("unable to write hash to `./new_challenge`"); writable_map.flush().expect("unable to write hash to new challenge file");
} }
BachedAccumulator::<Bn256, Bn256CeremonyParameters>::decompress( BachedAccumulator::<Bn256, Bn256CeremonyParameters>::decompress(
@ -187,7 +199,7 @@ fn main() {
let recompressed_hash = BachedAccumulator::<Bn256, Bn256CeremonyParameters>::calculate_hash(&new_challenge_readable_map); let recompressed_hash = BachedAccumulator::<Bn256, Bn256CeremonyParameters>::calculate_hash(&new_challenge_readable_map);
println!("Here's the BLAKE2b hash of the decompressed participant's response as `new_challenge` file:"); println!("Here's the BLAKE2b hash of the decompressed participant's response as new_challenge file:");
for line in recompressed_hash.as_slice().chunks(16) { for line in recompressed_hash.as_slice().chunks(16) {
print!("\t"); print!("\t");
@ -200,7 +212,7 @@ fn main() {
println!(""); println!("");
} }
println!("Done! `./new_challenge` contains the new challenge file. The other files"); println!("Done! new challenge file contains the new challenge file. The other files");
println!("were left alone."); println!("were left alone.");
} }
} }

@ -1,22 +1,25 @@
#!/bin/sh #!/bin/sh
rm challenge rm challenge*
rm response rm response*
rm new_challenge rm transcript
rm challenge_old
rm response_old
rm phase1radix* rm phase1radix*
rm tmp_*
cargo run --release --bin new_constrained set -e
cargo run --release --bin compute_constrained
cargo run --release --bin verify_transform_constrained
mv challenge challenge_old cargo run --release --bin new_constrained challenge1
mv response response_old cargo run --release --bin compute_constrained challenge1 response1
cargo run --release --bin verify_transform_constrained challenge1 response1 challenge2
mv new_challenge challenge cargo run --release --bin beacon_constrained challenge2 response2
cargo run --release --bin beacon_constrained cargo run --release --bin verify_transform_constrained challenge2 response2 challenge3
cargo run --release --bin verify_transform_constrained
cat response_old response > transcript cargo run --release --bin beacon_constrained challenge3 response3
cargo run --release --bin verify cargo run --release --bin verify_transform_constrained challenge3 response3 challenge4
cargo run --release --bin beacon_constrained challenge4 response4
cargo run --release --bin verify_transform_constrained challenge4 response4 challenge5
cat response1 response2 response3 response4 > transcript
cargo run --release --bin verify transcript