From aea7a2cd8cbbc5a30bc3314dbcd9cb4c9183014b Mon Sep 17 00:00:00 2001 From: Igor Matsak Date: Sun, 20 Aug 2023 22:19:44 +0300 Subject: [PATCH] Move ticket balance updates to tmp state --- layered_store/src/store.rs | 24 +++++++++++++++++++----- michelson_vm/src/interpreter.rs | 2 +- michelson_vm/src/mock.rs | 2 +- michelson_vm/src/store.rs | 8 ++++++-- michelson_vm/src/types/ticket.rs | 5 +++++ 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/layered_store/src/store.rs b/layered_store/src/store.rs index 7c0681a..d2c3edf 100644 --- a/layered_store/src/store.rs +++ b/layered_store/src/store.rs @@ -42,7 +42,7 @@ pub struct LayeredStore { backend: Backend, pending_state: HashMap>, modified_keys: HashSet, - //tmp_state: HashMap>, + tmp_state: HashMap>, } impl LayeredStore { @@ -51,7 +51,7 @@ impl LayeredStore { backend, pending_state: HashMap::new(), modified_keys: HashSet::new(), - //tmp_state: Hash + tmp_state: HashMap::new(), } } @@ -111,14 +111,26 @@ impl LayeredStore { pub fn set_tmp(&mut self, key: String, val: Option) -> Result<()> { match val { Some(value) => self - .pending_state + .tmp_state .insert(key.clone(), Some((Box::new(value), Box::new(T::serialize)))), - None => self.pending_state.insert(key.clone(), None), + None => self.tmp_state.insert(key.clone(), None), }; Ok(()) } - //pub fn iter_pending(&mut self, key_prefix: String, ) + pub fn pop_tmp(&mut self) -> Result> { + let values: Vec = self + .tmp_state + .drain() + .filter(|v| v.1.is_some()) + .map(|v| { + let (dyn_value, _) = v.1.expect("Value must be not None"); + T::downcast_ref(&dyn_value).unwrap().clone() + }) + .collect(); + + Ok(values) + } pub fn commit(&mut self) -> Result<()> { let modified_keys: Vec = self.modified_keys.drain().collect(); @@ -145,12 +157,14 @@ impl LayeredStore { for key in self.modified_keys.drain().into_iter() { self.pending_state.remove(&key); } + //self.tmp_state.clear(); } pub fn clear(&mut self) { self.pending_state.clear(); self.modified_keys.clear(); self.backend.clear(); + self.tmp_state.clear(); } } diff --git a/michelson_vm/src/interpreter.rs b/michelson_vm/src/interpreter.rs index ad091a7..98174f8 100644 --- a/michelson_vm/src/interpreter.rs +++ b/michelson_vm/src/interpreter.rs @@ -52,7 +52,7 @@ pub trait InterpreterContext { owner: &Address, value: IBig, ) -> Result<()>; - fn aggregate_ticket_updates(&self) -> Vec; + fn aggregate_ticket_updates(&mut self) -> Vec; } pub struct OperationScope { diff --git a/michelson_vm/src/mock.rs b/michelson_vm/src/mock.rs index 479f268..95ef8aa 100644 --- a/michelson_vm/src/mock.rs +++ b/michelson_vm/src/mock.rs @@ -169,7 +169,7 @@ impl InterpreterContext for MockContext { todo!() } - fn aggregate_ticket_updates(&self) -> Vec { + fn aggregate_ticket_updates(&mut self) -> Vec { todo!() } } diff --git a/michelson_vm/src/store.rs b/michelson_vm/src/store.rs index e78c8e3..a180f4d 100644 --- a/michelson_vm/src/store.rs +++ b/michelson_vm/src/store.rs @@ -147,7 +147,11 @@ impl InterpreterContext for LayeredStore { Ok(()) } - fn aggregate_ticket_updates(&self) -> Vec { - todo!() + fn aggregate_ticket_updates(&mut self) -> Vec { + self.pop_tmp::() + .unwrap() + .iter() + .map(|v| TicketBalanceDiff::from_micheline(v)) + .collect() } } diff --git a/michelson_vm/src/types/ticket.rs b/michelson_vm/src/types/ticket.rs index 3199666..9646771 100644 --- a/michelson_vm/src/types/ticket.rs +++ b/michelson_vm/src/types/ticket.rs @@ -248,7 +248,12 @@ impl TicketBalanceDiff { value, } } + pub fn into_micheline(&self) -> Micheline { todo!() } + + pub fn from_micheline(micheline: &Micheline) -> Self { + todo!() + } }