snarkvm_console_account/view_key/
try_from.rs1use super::*;
17
18#[cfg(feature = "private_key")]
19impl<N: Network> TryFrom<PrivateKey<N>> for ViewKey<N> {
20 type Error = Error;
21
22 fn try_from(private_key: PrivateKey<N>) -> Result<Self, Self::Error> {
24 Self::try_from(&private_key)
25 }
26}
27
28#[cfg(feature = "private_key")]
29impl<N: Network> TryFrom<&PrivateKey<N>> for ViewKey<N> {
30 type Error = Error;
31
32 fn try_from(private_key: &PrivateKey<N>) -> Result<Self, Self::Error> {
34 let compute_key = ComputeKey::try_from(private_key)?;
36 Ok(Self::from_scalar(private_key.sk_sig() + private_key.r_sig() + compute_key.sk_prf()))
38 }
39}
40
41#[cfg(feature = "private_key")]
42impl<N: Network> TryFrom<(&PrivateKey<N>, &ComputeKey<N>)> for ViewKey<N> {
43 type Error = Error;
44
45 fn try_from((private_key, compute_key): (&PrivateKey<N>, &ComputeKey<N>)) -> Result<Self, Self::Error> {
47 Ok(Self::from_scalar(private_key.sk_sig() + private_key.r_sig() + compute_key.sk_prf()))
49 }
50}
51
52#[cfg(test)]
53mod tests {
54 use super::*;
55 use snarkvm_console_network::MainnetV0;
56
57 type CurrentNetwork = MainnetV0;
58
59 const ITERATIONS: u64 = 1000;
60
61 #[test]
62 fn test_try_from() -> Result<()> {
63 let rng = &mut TestRng::default();
64
65 for _ in 0..ITERATIONS {
66 let private_key = PrivateKey::<CurrentNetwork>::new(rng)?;
68 let compute_key = ComputeKey::try_from(private_key)?;
69 let view_key = ViewKey::try_from(private_key)?;
70
71 let candidate = ViewKey(private_key.sk_sig() + private_key.r_sig() + compute_key.sk_prf());
74 assert_eq!(view_key, candidate);
75
76 let view_key2 = ViewKey::try_from((&private_key, &compute_key))?;
77 assert_eq!(view_key2, candidate);
78 }
79 Ok(())
80 }
81}