Fixing SSTORE gas calculation
This commit is contained in:
parent
fa1f0d1cf4
commit
012474b237
@ -6,6 +6,25 @@ use super::instructions as instructions;
|
|||||||
use super::instructions::Instruction;
|
use super::instructions::Instruction;
|
||||||
use std::num::wrapping::OverflowingOps;
|
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 CodePosition = usize;
|
||||||
type Gas = U256;
|
type Gas = U256;
|
||||||
type ProgramCounter = usize;
|
type ProgramCounter = usize;
|
||||||
@ -45,7 +64,9 @@ impl<S : fmt::Display> Stack<S> for Vec<S> {
|
|||||||
let val = self.pop();
|
let val = self.pop();
|
||||||
match val {
|
match val {
|
||||||
Some(x) => {
|
Some(x) => {
|
||||||
// println!("Poping from stack: {}", x);
|
evm_debug!({
|
||||||
|
format!(" POP: {}", x)
|
||||||
|
});
|
||||||
x
|
x
|
||||||
},
|
},
|
||||||
None => panic!("Tried to pop from empty stack.")
|
None => panic!("Tried to pop from empty stack.")
|
||||||
@ -62,7 +83,9 @@ impl<S : fmt::Display> Stack<S> for Vec<S> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn push(&mut self, elem: S) {
|
fn push(&mut self, elem: S) {
|
||||||
// println!("Pushing to stack: {}", elem);
|
evm_debug!({
|
||||||
|
format!(" PUSH: {}", elem)
|
||||||
|
});
|
||||||
self.push(elem);
|
self.push(elem);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,10 +123,13 @@ fn is_valid_range(off: usize, size: usize) -> bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Memory for Vec<u8> {
|
impl Memory for Vec<u8> {
|
||||||
|
|
||||||
fn dump(&self) {
|
fn dump(&self) {
|
||||||
println!("MemoryDump:");
|
println!("MemoryDump:");
|
||||||
for i in self.iter() {
|
for i in self.iter() {
|
||||||
print!("{:02x} ", i);
|
println!({
|
||||||
|
format!("{:02x} ", i)
|
||||||
|
});
|
||||||
}
|
}
|
||||||
println!("");
|
println!("");
|
||||||
}
|
}
|
||||||
@ -211,6 +237,7 @@ enum InstructionResult {
|
|||||||
StopExecution
|
StopExecution
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub struct Interpreter;
|
pub struct Interpreter;
|
||||||
|
|
||||||
impl evm::Evm for Interpreter {
|
impl evm::Evm for Interpreter {
|
||||||
@ -236,11 +263,15 @@ impl evm::Evm for Interpreter {
|
|||||||
mem.expand(mem_size);
|
mem.expand(mem_size);
|
||||||
current_gas = current_gas - gas_cost;
|
current_gas = current_gas - gas_cost;
|
||||||
|
|
||||||
// println!("Executing: {} (0x{:x}) [Gas Cost: {} (Left: {})]",
|
evm_debug!({
|
||||||
// instructions::get_info(instruction).name, instruction,
|
format!("[0x{:x}][{}(0x{:x}) Gas: {}\n Gas Before: {}",
|
||||||
// gas_cost,
|
reader.position,
|
||||||
// current_gas
|
color(instruction, instructions::get_info(instruction).name),
|
||||||
// );
|
instruction,
|
||||||
|
gas_cost,
|
||||||
|
current_gas + gas_cost
|
||||||
|
)
|
||||||
|
});
|
||||||
|
|
||||||
// Execute instruction
|
// Execute instruction
|
||||||
let result = try!(self.exec_instruction(
|
let result = try!(self.exec_instruction(
|
||||||
@ -306,7 +337,7 @@ impl Interpreter {
|
|||||||
let gas = if self.is_zero(&val) && !self.is_zero(newval) {
|
let gas = if self.is_zero(&val) && !self.is_zero(newval) {
|
||||||
schedule.sstore_set_gas
|
schedule.sstore_set_gas
|
||||||
} else if !self.is_zero(&val) && self.is_zero(newval) {
|
} else if !self.is_zero(&val) && self.is_zero(newval) {
|
||||||
schedule.sstore_set_gas
|
schedule.sstore_reset_gas
|
||||||
} else {
|
} else {
|
||||||
schedule.sstore_reset_gas
|
schedule.sstore_reset_gas
|
||||||
};
|
};
|
||||||
|
@ -13,6 +13,9 @@ fn do_json_test(json_data: &[u8]) -> Vec<String> {
|
|||||||
flush(format!("\n"));
|
flush(format!("\n"));
|
||||||
|
|
||||||
for (name, test) in json.as_object().unwrap() {
|
for (name, test) in json.as_object().unwrap() {
|
||||||
|
// if name != "TestStoreGasPrices" {
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
let mut fail = false;
|
let mut fail = false;
|
||||||
{
|
{
|
||||||
let mut fail_unless = |cond: bool| if !cond && !fail {
|
let mut fail_unless = |cond: bool| if !cond && !fail {
|
||||||
|
Loading…
Reference in New Issue
Block a user