use anyhow::Result; use filecoin_proofs_v1::{constants::SectorShape32GiB, verify_seal, VerifyInput}; use std::env; use std::fs::File; use std::io::Read; use std::ops::Range; use std::path::Path; use std::process::exit; fn main() { let args: Vec = env::args().collect(); if args.len() == 1{ println!("用法:\n./verify-tool // 校验单个扇区\n./verify-tool .. // (检验范围内的扇区, 不包含最后一个)"); exit(0); } if args.len() > 2 { println!("格式错误"); exit(0); } if let Ok(sector_id) = args[1].parse::() { verify_single(sector_id); } else { let mut split = args[1].split(".."); if split.clone().count() != 2 { println!("sector_id 格式错误"); exit(0); } let start = split.next().unwrap().parse().unwrap(); let end = split.next().unwrap().parse().unwrap(); verify_range(start..end); } } fn verify_range(range: Range) { for sector in range { verify_single(sector); } } fn verify_single(sector_id: u64) { if let Ok(path) = env::var("VERIFY_INPUT_DIR") { let path = Path::new(&path).join(format!("{}", sector_id)); if path.exists() { let mut file = File::open(&path).unwrap(); let mut buf: Vec = Vec::new(); file.read(&mut buf).unwrap(); let decode: VerifyInput = bincode::deserialize(&buf).unwrap(); match verify_call(decode) { Ok(true) => { println!("sector: {} 校验通过", sector_id); } Ok(false) => { println!("sector: {} 未通过", sector_id); } Err(err) => { println!("校验失败, {}", err); } } } else { println!("sector {} verify 文件不存在", sector_id); } } else { println!("请设置 VERIFY_INPUT_DIR"); exit(0); } } fn verify_call(input: VerifyInput) -> Result { let VerifyInput { porep_config, comm_r_in, comm_d_in, prover_id, sector_id, ticket, seed, proof_vec, } = input; verify_seal::( porep_config, comm_r_in, comm_d_in, prover_id, sector_id, ticket, seed, &proof_vec, ) }