From 3227d875f7a4663424a6af325ae6e9f75a1e2631 Mon Sep 17 00:00:00 2001 From: Conrado Gouvea Date: Tue, 30 May 2023 00:04:23 -0300 Subject: [PATCH] fix --- src/main/sign.rs | 4 +++- src/note_selection/builder.rs | 45 +++++++++++++++++++++++------------ 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/main/sign.rs b/src/main/sign.rs index 29003f4..eeb6579 100644 --- a/src/main/sign.rs +++ b/src/main/sign.rs @@ -88,8 +88,10 @@ fn main() -> anyhow::Result<()> { 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))?; + + println!("Tx written to {}", out_filename); Ok(()) } diff --git a/src/note_selection/builder.rs b/src/note_selection/builder.rs index 65d1eb8..ba1e79c 100644 --- a/src/note_selection/builder.rs +++ b/src/note_selection/builder.rs @@ -8,7 +8,7 @@ use crate::{AccountData, CoinConfig}; use anyhow::anyhow; use ff::PrimeField; use jubjub::Fr; -use orchard::builder::{Builder as OrchardBuilder, SigningMetadata}; +use orchard::builder::{Builder as OrchardBuilder, MaybeSigned, SigningMetadata}; use orchard::bundle::Flags; use orchard::keys::{FullViewingKey, Scope, SpendAuthorizingKey, SpendingKey}; use orchard::note::Nullifier; @@ -288,29 +288,44 @@ pub fn build_tx( 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 proven = proven.map_authorization( &mut rng, - |_rng, _, SigningMetadata { dummy_ask, parts }| { - alphas.push(parts.alpha); - SigningMetadata { dummy_ask, parts } + |_rng, _partial, maybe| { + if let MaybeSigned::SigningMetadata(parts) = &maybe { + if parts.ak == expected_ak { + alphas.push(parts.alpha); + } + } + maybe }, |_rng, auth| auth, ); - assert!(alphas.len() == 1); - println!("Randomizer: {}", hex::encode(alphas[0].to_repr().as_ref())); - let mut buffer = String::new(); - let stdin = std::io::stdin(); - println!("Input hex-encoded signature: "); - 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::::from(signature); + let mut signatures = Vec::new(); + + for (i, alpha) in alphas.iter().enumerate() { + println!( + "Randomizer #{}: {}", + i, + 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::::from(signature); + signatures.push(signature); + } proven - .prepare(&mut rng, sig_hash) - .append_signatures(&[signature]) + .append_signatures(&signatures) .unwrap() .finalize() .unwrap()