mirror of https://github.com/zcash/orchard.git
added prepare
This commit is contained in:
parent
aca6c71fb3
commit
d3ad5e14b8
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
use memuse::DynamicUsage;
|
use memuse::DynamicUsage;
|
||||||
use nonempty::NonEmpty;
|
use nonempty::NonEmpty;
|
||||||
use rand::RngCore;
|
use rand::{CryptoRng, RngCore};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
use crate::keys::IssuerValidatingKey;
|
use crate::keys::IssuerValidatingKey;
|
||||||
|
@ -28,6 +28,17 @@ impl IssueAction<Unauthorized> {
|
||||||
authorization: Unauthorized,
|
authorization: Unauthorized,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// inject the `sighash` for signature into the bundle.
|
||||||
|
pub fn prepare(self, sighash: [u8; 32]) -> IssueAction<Prepared> {
|
||||||
|
return IssueAction {
|
||||||
|
ik: self.ik,
|
||||||
|
asset_desc: self.asset_desc,
|
||||||
|
notes: self.notes,
|
||||||
|
finalize: self.finalize,
|
||||||
|
authorization: Prepared { sighash },
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: IssueAuth> IssueAction<T> {
|
impl<T: IssueAuth> IssueAction<T> {
|
||||||
|
@ -234,7 +245,6 @@ impl Default for IssueBundle<Unauthorized> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: IssueAuth> IssueBundle<T> {
|
impl<T: IssueAuth> IssueBundle<T> {
|
||||||
|
|
||||||
/// Return the actions for a given `IssueBundle`.
|
/// Return the actions for a given `IssueBundle`.
|
||||||
pub fn actions(&self) -> &Vec<IssueAction<T>> {
|
pub fn actions(&self) -> &Vec<IssueAction<T>> {
|
||||||
&self.actions
|
&self.actions
|
||||||
|
@ -342,6 +352,22 @@ impl IssueBundle<Unauthorized> {
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Loads the sighash into this bundle, preparing it for signing.
|
||||||
|
///
|
||||||
|
/// This API ensures that all signatures are created over the same sighash.
|
||||||
|
/// pub fn prepare<R: RngCore + CryptoRng>(
|
||||||
|
// self,
|
||||||
|
// mut rng: R,
|
||||||
|
pub fn prepare(self, sighash: [u8; 32]) -> IssueBundle<Prepared> {
|
||||||
|
IssueBundle {
|
||||||
|
actions: self
|
||||||
|
.actions
|
||||||
|
.into_iter()
|
||||||
|
.map(|a| a.prepare(sighash))
|
||||||
|
.collect(),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Errors produced during the issuance process
|
/// Errors produced during the issuance process
|
||||||
|
@ -505,6 +531,39 @@ mod tests {
|
||||||
IssueActionAlreadyFinalized
|
IssueActionAlreadyFinalized
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn issue_bundle_prepare() {
|
||||||
|
let mut rng = OsRng;
|
||||||
|
let sk = SpendingKey::random(&mut rng);
|
||||||
|
let isk: IssuerAuthorizingKey = (&sk).into();
|
||||||
|
let ik: IssuerValidatingKey = (&isk).into();
|
||||||
|
|
||||||
|
let fvk = FullViewingKey::from(&sk);
|
||||||
|
let recipient = fvk.address_at(0u32, Scope::External);
|
||||||
|
|
||||||
|
let mut bundle = IssueBundle::new();
|
||||||
|
|
||||||
|
bundle
|
||||||
|
.add_recipient(
|
||||||
|
ik.clone(),
|
||||||
|
String::from("Frost"),
|
||||||
|
recipient,
|
||||||
|
NoteValue::from_raw(5),
|
||||||
|
false,
|
||||||
|
rng,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let fake_sighash = [1; 32];
|
||||||
|
let prepared = bundle.prepare(fake_sighash);
|
||||||
|
|
||||||
|
let action = prepared
|
||||||
|
.get_action(ik.clone(), String::from("Frost"))
|
||||||
|
.unwrap();
|
||||||
|
let auth = action.authorization();
|
||||||
|
assert_eq!(auth.sighash, fake_sighash);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// mod tests {
|
// mod tests {
|
||||||
|
|
|
@ -212,7 +212,11 @@ impl IssuerAuthorizingKey {
|
||||||
/// RXXXX
|
/// RXXXX
|
||||||
///
|
///
|
||||||
/// XXXXX
|
/// XXXXX
|
||||||
pub fn sign(&self, rng: &mut (impl RngCore + CryptoRng), msg: &[u8]) -> redpallas::Signature<SpendAuth> {
|
pub fn sign(
|
||||||
|
&self,
|
||||||
|
rng: &mut (impl RngCore + CryptoRng),
|
||||||
|
msg: &[u8],
|
||||||
|
) -> redpallas::Signature<SpendAuth> {
|
||||||
self.0.sign(rng, msg)
|
self.0.sign(rng, msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,17 +92,13 @@ pub mod testing {
|
||||||
pub fn arb_note_type()(
|
pub fn arb_note_type()(
|
||||||
is_native in prop::bool::ANY,
|
is_native in prop::bool::ANY,
|
||||||
sk in arb_spending_key(),
|
sk in arb_spending_key(),
|
||||||
// bytes32a in prop::array::uniform32(prop::num::u8::ANY),
|
str in "[A-Za-z]{255}",
|
||||||
// bytes32b in prop::array::uniform32(prop::num::u8::ANY),
|
|
||||||
vec in prop::collection::vec(any::<u8>(), 0..=255),
|
|
||||||
) -> NoteType {
|
) -> NoteType {
|
||||||
if is_native {
|
if is_native {
|
||||||
NoteType::native()
|
NoteType::native()
|
||||||
} else {
|
} else {
|
||||||
//let bytes64 = [bytes32a, bytes32b].concat();
|
|
||||||
let asset_desc = String::from_utf8(vec).unwrap();
|
|
||||||
let isk = IssuerAuthorizingKey::from(&sk);
|
let isk = IssuerAuthorizingKey::from(&sk);
|
||||||
NoteType::derive(&IssuerValidatingKey::from(&isk), asset_desc.as_str())
|
NoteType::derive(&IssuerValidatingKey::from(&isk), &str)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue