This commit is contained in:
Conrado Gouvea 2023-05-30 00:04:23 -03:00
parent 38d3e9dad9
commit 3227d875f7
2 changed files with 33 additions and 16 deletions

View File

@ -88,8 +88,10 @@ fn main() -> anyhow::Result<()> {
orchard: orchard_sk, orchard: orchard_sk,
}; };
let tx = build_tx(&network, &keys, &tx_plan, true, OsRng)?; let tx = build_tx(&network, &keys, &tx_plan, false, OsRng)?;
fs::write(out_filename, hex::encode(&tx))?; fs::write(out_filename, hex::encode(&tx))?;
println!("Tx written to {}", out_filename);
Ok(()) Ok(())
} }

View File

@ -8,7 +8,7 @@ use crate::{AccountData, CoinConfig};
use anyhow::anyhow; use anyhow::anyhow;
use ff::PrimeField; use ff::PrimeField;
use jubjub::Fr; use jubjub::Fr;
use orchard::builder::{Builder as OrchardBuilder, SigningMetadata}; use orchard::builder::{Builder as OrchardBuilder, MaybeSigned, SigningMetadata};
use orchard::bundle::Flags; use orchard::bundle::Flags;
use orchard::keys::{FullViewingKey, Scope, SpendAuthorizingKey, SpendingKey}; use orchard::keys::{FullViewingKey, Scope, SpendAuthorizingKey, SpendingKey};
use orchard::note::Nullifier; use orchard::note::Nullifier;
@ -288,29 +288,44 @@ pub fn build_tx(
hex::encode(<[u8; 32]>::from(ask)) hex::encode(<[u8; 32]>::from(ask))
); );
let proven = proven.prepare(&mut rng, sig_hash);
let expected_ak = (&orchard_signing_keys[0]).into();
let mut alphas = Vec::new(); let mut alphas = Vec::new();
let proven = proven.map_authorization( let proven = proven.map_authorization(
&mut rng, &mut rng,
|_rng, _, SigningMetadata { dummy_ask, parts }| { |_rng, _partial, maybe| {
alphas.push(parts.alpha); if let MaybeSigned::SigningMetadata(parts) = &maybe {
SigningMetadata { dummy_ask, parts } if parts.ak == expected_ak {
alphas.push(parts.alpha);
}
}
maybe
}, },
|_rng, auth| auth, |_rng, auth| auth,
); );
assert!(alphas.len() == 1);
println!("Randomizer: {}", hex::encode(alphas[0].to_repr().as_ref()));
let mut buffer = String::new(); let mut signatures = Vec::new();
let stdin = std::io::stdin();
println!("Input hex-encoded signature: "); for (i, alpha) in alphas.iter().enumerate() {
stdin.read_line(&mut buffer).unwrap(); println!(
let signature = hex::decode(buffer.trim()).unwrap(); "Randomizer #{}: {}",
let signature: [u8; 64] = signature.try_into().unwrap(); i,
let signature = redpallas::Signature::<SpendAuth>::from(signature); hex::encode(alpha.to_repr().as_ref())
);
let mut buffer = String::new();
let stdin = std::io::stdin();
println!("Input hex-encoded signature #{}: ", i);
stdin.read_line(&mut buffer).unwrap();
let signature = hex::decode(buffer.trim()).unwrap();
let signature: [u8; 64] = signature.try_into().unwrap();
let signature = redpallas::Signature::<SpendAuth>::from(signature);
signatures.push(signature);
}
proven proven
.prepare(&mut rng, sig_hash) .append_signatures(&signatures)
.append_signatures(&[signature])
.unwrap() .unwrap()
.finalize() .finalize()
.unwrap() .unwrap()