From 471a4d5416557aa7de9d29eefcce70f41fa412b9 Mon Sep 17 00:00:00 2001 From: thesimplekid Date: Sat, 24 Jun 2023 22:51:53 -0400 Subject: [PATCH] fix: order split correctly --- src/mint.rs | 62 +++++++++++++-------------------------------------- src/wallet.rs | 36 ++++++++++++------------------ 2 files changed, 29 insertions(+), 69 deletions(-) diff --git a/src/mint.rs b/src/mint.rs index 3035d3b1..a95e246b 100644 --- a/src/mint.rs +++ b/src/mint.rs @@ -93,48 +93,12 @@ impl Mint { }) } - fn create_split_response( - &self, - amount: Amount, - outputs: &[BlindedMessage], - ) -> Result { - let mut outputs = outputs.to_vec(); - outputs.reverse(); - let mut target_total = Amount::ZERO; - let mut change_total = Amount::ZERO; - let mut target = Vec::with_capacity(outputs.len()); - let mut change = Vec::with_capacity(outputs.len()); - - // Create sets of target and change amounts that we're looking for - // in the outputs (blind messages). As we loop, take from those sets, - // target amount first. - for output in outputs { - let signed = self.blind_sign(&output)?; - - // Accumulate outputs into the target (send) list - if target_total + signed.amount <= amount { - target_total += signed.amount; - target.push(signed); - } else { - change_total += signed.amount; - change.push(signed); - } - } - - println!("change: {:?}", serde_json::to_string(&change)); - println!("send: {:?}", serde_json::to_string(&target)); - - Ok(SplitResponse { - fst: change, - snd: target, - }) - } - pub fn process_split_request( &mut self, split_request: SplitRequest, ) -> Result { let proofs_total = split_request.proofs_amount(); + if proofs_total < split_request.amount { return Err(Error::Amount); } @@ -153,21 +117,25 @@ impl Mint { secrets.push(self.verify_proof(proof)?); } - let mut split_response = - self.create_split_response(split_request.amount, &split_request.outputs)?; + let outs_fst = (proofs_total - split_request.amount).split(); - if split_response.target_amount() != split_request.amount { - let mut outputs = split_request.outputs; - outputs.reverse(); - split_response = self.create_split_response(split_request.amount, &outputs)?; - } + // Blinded change messages + let b_fst = split_request.outputs[0..outs_fst.len()].to_vec(); + let b_snd = split_request.outputs[outs_fst.len()..].to_vec(); + + let fst: Vec = + b_fst.iter().map(|b| self.blind_sign(b).unwrap()).collect(); + let snd: Vec = + b_snd.iter().map(|b| self.blind_sign(b).unwrap()).collect(); + + let split_response = SplitResponse { snd, fst }; if split_response.target_amount() != split_request.amount { return Err(Error::OutputOrdering); } - for secret in secrets { - self.spent_secrets.insert(secret); + for proof in split_request.proofs { + self.spent_secrets.insert(proof.secret); } Ok(split_response) @@ -208,7 +176,7 @@ impl Mint { ) -> Result { let mut spendable = vec![]; for proof in &check_spendable.proofs { - spendable.push(self.spent_secrets.contains(&proof.secret)) + spendable.push(!self.spent_secrets.contains(&proof.secret)) } Ok(CheckSpendableResponse { spendable }) diff --git a/src/wallet.rs b/src/wallet.rs index 27241f21..e6f44b3b 100644 --- a/src/wallet.rs +++ b/src/wallet.rs @@ -139,6 +139,12 @@ impl Wallet { proofs: Proofs, ) -> Result { let keep_blinded_messages = BlindedMessages::random(keep_amount)?; + let out_amounts: Vec = keep_blinded_messages + .blinded_messages + .iter() + .map(|o| o.amount) + .collect(); + println!("keep outs: {:?}", out_amounts); let send_blinded_messages = BlindedMessages::random(send_amount)?; let outputs = { @@ -146,6 +152,9 @@ impl Wallet { outputs.extend(send_blinded_messages.blinded_messages.clone()); outputs }; + + let out_amounts: Vec = outputs.iter().map(|o| o.amount).collect(); + println!("outs: {:?}", out_amounts); let split_payload = SplitRequest { amount: send_amount, proofs, @@ -337,22 +346,13 @@ mod tests { let wallet = Wallet::new(client, keys.keys); - let blinded_messages = BlindedMessages::random(Amount::from_sat(100)).unwrap(); + let blinded_messages = BlindedMessages::random(Amount::from_sat(64)).unwrap(); let mint_request = nut04::MintRequest { outputs: blinded_messages.blinded_messages.clone(), }; let res = mint.process_mint_request(mint_request).unwrap(); - /* - let proofs = construct_proofs( - res.promises, - blinded_messages.rs, - blinded_messages.secrets, - &mint.active_keyset_pubkeys().keys, - ) - .unwrap(); - */ let proofs = wallet .process_split_response(blinded_messages, res.promises) @@ -362,26 +362,18 @@ mod tests { } let split = wallet - .create_split(Amount::from_sat(33), Amount::from_sat(67), proofs.clone()) + .create_split(Amount::from_sat(24), Amount::from_sat(40), proofs.clone()) .unwrap(); let split_request = split.split_payload; + let split_response = mint.process_split_request(split_request).unwrap(); - let mut p = split_response.snd; - p.reverse(); + let p = split_response.snd; let snd_proofs = wallet .process_split_response(split.send_blinded_messages, p) .unwrap(); - /* - let snd_proofs = construct_proofs( - split_response.snd, - split.send_blinded_messages.rs, - split.send_blinded_messages.secrets, - &mint.active_keyset_pubkeys().keys, - ) - .unwrap(); - */ + let mut error = false; for proof in &snd_proofs { if let Err(err) = mint.verify_proof(proof) {