#[cfg_attr(not(feature = "hs-pow-full"), path = "pow/v1_stub.rs")]
mod v1;
use crate::err::ProofOfWorkError;
use tor_cell::relaycell::hs::pow::ProofOfWork;
use tor_hscrypto::pk::HsBlindId;
use tor_netdoc::doc::hsdesc::HsDesc;
use tor_netdoc::doc::hsdesc::pow::PowParams;
use v1::HsPowClientV1;
#[derive(Default)]
pub(crate) struct HsPowClient {
v1: Option<HsPowClientV1>,
}
impl HsPowClient {
pub(crate) fn new(hs_blind_id: &HsBlindId, desc: &HsDesc) -> Self {
let mut client: HsPowClient = Default::default();
for params in desc.pow_params() {
if let PowParams::V1(v1) = params {
client.v1 = Some(HsPowClientV1::new(hs_blind_id, v1));
}
}
client
}
pub(crate) fn increase_effort(&mut self) {
if let Some(v1) = &mut self.v1 {
v1.increase_effort();
}
}
pub(crate) async fn solve(&self) -> Result<Option<ProofOfWork>, ProofOfWorkError> {
if let Some(v1) = &self.v1 {
Ok(v1.solve().await?.map(ProofOfWork::V1))
} else {
Ok(None)
}
}
}