From eb03993c6d43fe6f8db280fbcd05c61aeb11f713 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 11 Jan 2016 13:52:40 +0100 Subject: [PATCH] Transaction struct improvements. --- src/transaction.rs | 48 +++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/src/transaction.rs b/src/transaction.rs index d13a728bb..f162bb2c5 100644 --- a/src/transaction.rs +++ b/src/transaction.rs @@ -1,37 +1,33 @@ use util::*; +pub enum Action { + Create, + Call(Address), +} + /// A set of information describing an externally-originating message call /// or contract creation operation. pub struct Transaction { nonce: U256, gas_price: U256, gas: U256, - to: Option
, + action: Action, value: U256, data: Bytes, hash: RefCell>, //TODO: make this private } -impl Transaction { - /// Is this transaction meant to create a contract? - pub fn is_contract_creation(&self) -> bool { - self.to.is_none() - } - - /// Is this transaction meant to send a message? - pub fn is_message_call(&self) -> bool { - !self.is_contract_creation() - } -} - impl RlpStandard for Transaction { fn rlp_append(&self, s: &mut RlpStream) { s.append_list(6); s.append(&self.nonce); s.append(&self.gas_price); s.append(&self.gas); - s.append(&self.to); + match self.action { + Action::Create => s.append_empty_data(), + Action::Call(ref to) => s.append(to), + }; s.append(&self.value); s.append(&self.data); } @@ -54,18 +50,19 @@ impl Transaction { pub fn note_dirty(&self) { *self.hash.borrow_mut() = None; } + + /// Returns transaction type. + pub fn action(&self) -> &Action { &self.action } } -impl Encodable for Transaction { - fn encode(&self, encoder: &mut E) where E: Encoder { - encoder.emit_list(| e | { - self.nonce.encode(e); - self.gas_price.encode(e); - self.gas.encode(e); - self.to.encode(e); - self.value.encode(e); - self.data.encode(e); - }) +impl Decodable for Action { + fn decode(decoder: &D) -> Result where D: Decoder { + let rlp = decoder.as_rlp(); + if rlp.is_empty() { + Ok(Action::Create) + } else { + Ok(Action::Call(try!(rlp.as_val()))) + } } } @@ -77,7 +74,7 @@ impl Decodable for Transaction { nonce: try!(Decodable::decode(&d[0])), gas_price: try!(Decodable::decode(&d[1])), gas: try!(Decodable::decode(&d[2])), - to: try!(Decodable::decode(&d[3])), + action: try!(Decodable::decode(&d[3])), value: try!(Decodable::decode(&d[4])), data: try!(Decodable::decode(&d[5])), hash: RefCell::new(None) @@ -86,4 +83,3 @@ impl Decodable for Transaction { Ok(transaction) } } -