From 012474b2377c2e2129f75636f843538d4d2ce701 Mon Sep 17 00:00:00 2001 From: Tomusdrw Date: Sat, 16 Jan 2016 13:59:48 +0100 Subject: [PATCH] Fixing SSTORE gas calculation --- src/evm/interpreter.rs | 49 ++++++++++++++++++++++++++++++++++-------- src/tests/state.rs | 3 +++ 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/evm/interpreter.rs b/src/evm/interpreter.rs index 5a4dc2d3f..ffe3f87bd 100644 --- a/src/evm/interpreter.rs +++ b/src/evm/interpreter.rs @@ -6,6 +6,25 @@ use super::instructions as instructions; use super::instructions::Instruction; use std::num::wrapping::OverflowingOps; +#[cfg(feature = "evm_debug")] +macro_rules! evm_debug { + ($x: expr) => { + println!($x); + } +} +#[cfg(feature = "evm_debug")] +fn color(instruction: Instruction, name: &'static str) -> String { + let c = instruction as usize % 6; + let colors = [31, 34, 33, 32, 35, 36]; + format!("\x1B[1;{}m{}\x1B[0m", colors[c], name) +} + +#[cfg(not(feature = "evm_debug"))] +macro_rules! evm_debug { + ($x: expr) => {} +} + + type CodePosition = usize; type Gas = U256; type ProgramCounter = usize; @@ -45,7 +64,9 @@ impl Stack for Vec { let val = self.pop(); match val { Some(x) => { - // println!("Poping from stack: {}", x); + evm_debug!({ + format!(" POP: {}", x) + }); x }, None => panic!("Tried to pop from empty stack.") @@ -62,7 +83,9 @@ impl Stack for Vec { } fn push(&mut self, elem: S) { - // println!("Pushing to stack: {}", elem); + evm_debug!({ + format!(" PUSH: {}", elem) + }); self.push(elem); } @@ -100,10 +123,13 @@ fn is_valid_range(off: usize, size: usize) -> bool { } impl Memory for Vec { + fn dump(&self) { println!("MemoryDump:"); for i in self.iter() { - print!("{:02x} ", i); + println!({ + format!("{:02x} ", i) + }); } println!(""); } @@ -211,6 +237,7 @@ enum InstructionResult { StopExecution } + pub struct Interpreter; impl evm::Evm for Interpreter { @@ -236,11 +263,15 @@ impl evm::Evm for Interpreter { mem.expand(mem_size); current_gas = current_gas - gas_cost; - // println!("Executing: {} (0x{:x}) [Gas Cost: {} (Left: {})]", - // instructions::get_info(instruction).name, instruction, - // gas_cost, - // current_gas - // ); + evm_debug!({ + format!("[0x{:x}][{}(0x{:x}) Gas: {}\n Gas Before: {}", + reader.position, + color(instruction, instructions::get_info(instruction).name), + instruction, + gas_cost, + current_gas + gas_cost + ) + }); // Execute instruction let result = try!(self.exec_instruction( @@ -306,7 +337,7 @@ impl Interpreter { let gas = if self.is_zero(&val) && !self.is_zero(newval) { schedule.sstore_set_gas } else if !self.is_zero(&val) && self.is_zero(newval) { - schedule.sstore_set_gas + schedule.sstore_reset_gas } else { schedule.sstore_reset_gas }; diff --git a/src/tests/state.rs b/src/tests/state.rs index d4a921add..70cb1e90f 100644 --- a/src/tests/state.rs +++ b/src/tests/state.rs @@ -13,6 +13,9 @@ fn do_json_test(json_data: &[u8]) -> Vec { flush(format!("\n")); for (name, test) in json.as_object().unwrap() { + // if name != "TestStoreGasPrices" { + // continue; + // } let mut fail = false; { let mut fail_unless = |cond: bool| if !cond && !fail {