snarkvm_circuit_account/private_key/
mod.rsmod to_compute_key;
mod to_view_key;
#[cfg(test)]
use snarkvm_circuit_types::environment::assert_scope;
use crate::{ComputeKey, ViewKey};
use snarkvm_circuit_network::Aleo;
use snarkvm_circuit_types::{Scalar, environment::prelude::*};
pub struct PrivateKey<A: Aleo> {
sk_sig: Scalar<A>,
r_sig: Scalar<A>,
}
#[cfg(feature = "console")]
impl<A: Aleo> Inject for PrivateKey<A> {
type Primitive = console::PrivateKey<A::Network>;
fn new(mode: Mode, private_key: Self::Primitive) -> Self {
Self { sk_sig: Scalar::new(mode, private_key.sk_sig()), r_sig: Scalar::new(mode, private_key.r_sig()) }
}
}
impl<A: Aleo> PrivateKey<A> {
pub const fn sk_sig(&self) -> &Scalar<A> {
&self.sk_sig
}
pub const fn r_sig(&self) -> &Scalar<A> {
&self.r_sig
}
}
#[cfg(feature = "console")]
impl<A: Aleo> Eject for PrivateKey<A> {
type Primitive = (console::Scalar<A::Network>, console::Scalar<A::Network>);
fn eject_mode(&self) -> Mode {
(&self.sk_sig, &self.r_sig).eject_mode()
}
fn eject_value(&self) -> Self::Primitive {
(&self.sk_sig, &self.r_sig).eject_value()
}
}
#[cfg(all(test, feature = "console"))]
mod tests {
use super::*;
use crate::{Circuit, helpers::generate_account};
use anyhow::Result;
const ITERATIONS: u64 = 500;
fn check_new(
mode: Mode,
num_constants: u64,
num_public: u64,
num_private: u64,
num_constraints: u64,
) -> Result<()> {
for _ in 0..ITERATIONS {
let (private_key, _compute_key, _view_key, _address) = generate_account()?;
let sk_sig = private_key.sk_sig();
let r_sig = private_key.r_sig();
Circuit::scope(format!("New {mode}"), || {
let candidate = PrivateKey::<Circuit>::new(mode, private_key);
assert_eq!(mode, candidate.eject_mode());
assert_eq!((sk_sig, r_sig), candidate.eject_value());
assert_scope!(num_constants, num_public, num_private, num_constraints);
});
Circuit::reset();
}
Ok(())
}
#[test]
fn test_private_key_new_constant() -> Result<()> {
check_new(Mode::Constant, 2, 0, 0, 0)
}
#[test]
fn test_private_key_new_public() -> Result<()> {
check_new(Mode::Public, 0, 2, 0, 0)
}
#[test]
fn test_private_key_new_private() -> Result<()> {
check_new(Mode::Private, 0, 0, 2, 0)
}
}