cleanup sig processing
This commit is contained in:
@ -135,17 +135,6 @@ impl Accountant {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return funds to the 'from' party.
|
|
||||||
fn cancel_transaction(self: &mut Self, plan: &Plan<i64>) {
|
|
||||||
if let Plan::Race(_, ref cancel_plan) = *plan {
|
|
||||||
if let Plan::After(_, Action::Pay(ref payment)) = **cancel_plan {
|
|
||||||
if let Some(x) = self.balances.get_mut(&payment.to) {
|
|
||||||
*x += payment.asset;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Move this to transaction.rs
|
// TODO: Move this to transaction.rs
|
||||||
fn all_satisfied(&self, plan: &Plan<i64>) -> bool {
|
fn all_satisfied(&self, plan: &Plan<i64>) -> bool {
|
||||||
match *plan {
|
match *plan {
|
||||||
@ -183,30 +172,18 @@ impl Accountant {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn process_verified_sig(&mut self, from: PublicKey, tx_sig: Signature) -> Result<()> {
|
fn process_verified_sig(&mut self, from: PublicKey, tx_sig: Signature) -> Result<()> {
|
||||||
let mut cancel = false;
|
let actionable = if let Some(plan) = self.pending.get_mut(&tx_sig) {
|
||||||
if let Some(plan) = self.pending.get(&tx_sig) {
|
plan.process_verified_sig(from)
|
||||||
// Cancel:
|
} else {
|
||||||
// if Signature(from) is in unless_any, return funds to tx.from, and remove the tx from this map.
|
false
|
||||||
|
};
|
||||||
|
|
||||||
// TODO: Use find().
|
if actionable {
|
||||||
if let Plan::Race(_, ref plan_b) = *plan {
|
|
||||||
if let Plan::After(Condition::Signature(pubkey), _) = **plan_b {
|
|
||||||
if from == pubkey {
|
|
||||||
cancel = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if cancel {
|
|
||||||
if let Some(plan) = self.pending.remove(&tx_sig) {
|
if let Some(plan) = self.pending.remove(&tx_sig) {
|
||||||
self.cancel_transaction(&plan);
|
self.complete_transaction(&plan);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process Multisig:
|
|
||||||
// otherwise, if "Signature(from) is in if_all, remove it. If that causes that list
|
|
||||||
// to be empty, add the asset to to, and remove the tx from this map.
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -224,11 +201,6 @@ impl Accountant {
|
|||||||
} else {
|
} else {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
// TODO: Lookup pending Transaction waiting on time, signed by a whitelisted PublicKey.
|
|
||||||
|
|
||||||
// Expire:
|
|
||||||
// if a Timestamp after this DateTime is in unless_any, return funds to tx.from,
|
|
||||||
// and remove the tx from this map.
|
|
||||||
|
|
||||||
// Check to see if any timelocked transactions can be completed.
|
// Check to see if any timelocked transactions can be completed.
|
||||||
let mut completed = vec![];
|
let mut completed = vec![];
|
||||||
@ -244,11 +216,6 @@ impl Accountant {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// TODO: Add this in once we start removing constraints
|
|
||||||
//if tr.plan.if_all.0.is_empty() {
|
|
||||||
// // TODO: Remove tr from pending
|
|
||||||
// self.complete_transaction(plan);
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for key in completed {
|
for key in completed {
|
||||||
|
@ -5,6 +5,7 @@ use serde::Serialize;
|
|||||||
use bincode::serialize;
|
use bincode::serialize;
|
||||||
use hash::Hash;
|
use hash::Hash;
|
||||||
use chrono::prelude::*;
|
use chrono::prelude::*;
|
||||||
|
use std::mem;
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
|
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
|
||||||
pub enum Condition {
|
pub enum Condition {
|
||||||
@ -30,6 +31,55 @@ pub enum Plan<T> {
|
|||||||
Race(Box<Plan<T>>, Box<Plan<T>>),
|
Race(Box<Plan<T>>, Box<Plan<T>>),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<T: Clone> Plan<T> {
|
||||||
|
pub fn run_race(&mut self) -> bool {
|
||||||
|
let new_plan = if let Plan::Race(ref a, ref b) = *self {
|
||||||
|
if let Plan::Action(_) = **a {
|
||||||
|
Some((**a).clone())
|
||||||
|
} else if let Plan::Action(_) = **b {
|
||||||
|
Some((**b).clone())
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(plan) = new_plan {
|
||||||
|
mem::replace(self, plan);
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn process_verified_sig(&mut self, from: PublicKey) -> bool {
|
||||||
|
let mut new_plan = None;
|
||||||
|
match *self {
|
||||||
|
Plan::Race(ref mut plan_a, ref mut plan_b) => {
|
||||||
|
plan_a.process_verified_sig(from);
|
||||||
|
plan_b.process_verified_sig(from);
|
||||||
|
}
|
||||||
|
Plan::After(Condition::Signature(pubkey), ref action) => {
|
||||||
|
if from == pubkey {
|
||||||
|
new_plan = Some(Plan::Action(action.clone()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
if self.run_race() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(plan) = new_plan {
|
||||||
|
mem::replace(self, plan);
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
|
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
|
||||||
pub struct Transaction<T> {
|
pub struct Transaction<T> {
|
||||||
pub from: PublicKey,
|
pub from: PublicKey,
|
||||||
|
Reference in New Issue
Block a user