use pasta_curves::pallas;
use halo2_gadgets::poseidon::{
primitives::{self as poseidon, ConstantLength},
Hash as PoseidonHash, Pow5Chip as PoseidonChip, Pow5Config as PoseidonConfig,
};
use halo2_proofs::{
circuit::{AssignedCell, Layouter},
plonk,
};
pub const DOMAIN_VC: u64 = 1;
pub fn vote_commitment_hash(
voting_round_id: pallas::Base,
shares_hash: pallas::Base,
proposal_id: pallas::Base,
vote_decision: pallas::Base,
) -> pallas::Base {
poseidon::Hash::<_, poseidon::P128Pow5T3, ConstantLength<5>, 3, 2>::init().hash([
pallas::Base::from(DOMAIN_VC),
voting_round_id,
shares_hash,
proposal_id,
vote_decision,
])
}
pub fn vote_commitment_poseidon(
poseidon_config: &PoseidonConfig<pallas::Base, 3, 2>,
layouter: &mut impl Layouter<pallas::Base>,
label: &str,
domain_vc: AssignedCell<pallas::Base, pallas::Base>,
voting_round_id: AssignedCell<pallas::Base, pallas::Base>,
shares_hash: AssignedCell<pallas::Base, pallas::Base>,
proposal_id: AssignedCell<pallas::Base, pallas::Base>,
vote_decision: AssignedCell<pallas::Base, pallas::Base>,
) -> Result<AssignedCell<pallas::Base, pallas::Base>, plonk::Error> {
let message = [domain_vc, voting_round_id, shares_hash, proposal_id, vote_decision];
let hasher = PoseidonHash::<
pallas::Base,
_,
poseidon::P128Pow5T3,
ConstantLength<5>,
3,
2,
>::init(
PoseidonChip::construct(poseidon_config.clone()),
layouter.namespace(|| alloc::format!("{label} Poseidon init")),
)?;
hasher.hash(
layouter.namespace(|| alloc::format!("{label} Poseidon(DOMAIN_VC, ...)")),
message,
)
}