use super::*;
#[cfg(feature = "private_key")]
impl<N: Network> TryFrom<PrivateKey<N>> for ViewKey<N> {
type Error = Error;
fn try_from(private_key: PrivateKey<N>) -> Result<Self, Self::Error> {
Self::try_from(&private_key)
}
}
#[cfg(feature = "private_key")]
impl<N: Network> TryFrom<&PrivateKey<N>> for ViewKey<N> {
type Error = Error;
fn try_from(private_key: &PrivateKey<N>) -> Result<Self, Self::Error> {
let compute_key = ComputeKey::try_from(private_key)?;
Ok(Self::from_scalar(private_key.sk_sig() + private_key.r_sig() + compute_key.sk_prf()))
}
}
#[cfg(feature = "private_key")]
impl<N: Network> TryFrom<(&PrivateKey<N>, &ComputeKey<N>)> for ViewKey<N> {
type Error = Error;
fn try_from((private_key, compute_key): (&PrivateKey<N>, &ComputeKey<N>)) -> Result<Self, Self::Error> {
Ok(Self::from_scalar(private_key.sk_sig() + private_key.r_sig() + compute_key.sk_prf()))
}
}
#[cfg(test)]
mod tests {
use super::*;
use snarkvm_console_network::MainnetV0;
type CurrentNetwork = MainnetV0;
const ITERATIONS: u64 = 1000;
#[test]
fn test_try_from() -> Result<()> {
let rng = &mut TestRng::default();
for _ in 0..ITERATIONS {
let private_key = PrivateKey::<CurrentNetwork>::new(rng)?;
let compute_key = ComputeKey::try_from(private_key)?;
let view_key = ViewKey::try_from(private_key)?;
let candidate = ViewKey(private_key.sk_sig() + private_key.r_sig() + compute_key.sk_prf());
assert_eq!(view_key, candidate);
let view_key2 = ViewKey::try_from((&private_key, &compute_key))?;
assert_eq!(view_key2, candidate);
}
Ok(())
}
}