Fixing gas conversion
This commit is contained in:
parent
4f32a9ccc1
commit
bdf6a5660e
@ -151,10 +151,14 @@ impl CostType for usize {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn from_u256(val: U256) -> Result<Self> {
|
fn from_u256(val: U256) -> Result<Self> {
|
||||||
if U256::from(val.low_u64()) != val {
|
let res = val.low_u64() as usize;
|
||||||
|
|
||||||
|
// validate if value fits into usize
|
||||||
|
if U256::from(res) != val {
|
||||||
return Err(Error::OutOfGas);
|
return Err(Error::OutOfGas);
|
||||||
}
|
}
|
||||||
Ok(val.low_u64() as usize)
|
|
||||||
|
Ok(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn as_usize(&self) -> usize {
|
fn as_usize(&self) -> usize {
|
||||||
@ -191,6 +195,7 @@ pub trait Evm {
|
|||||||
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
#[cfg(test)]
|
||||||
fn should_calculate_overflow_mul_shr_without_overflow() {
|
fn should_calculate_overflow_mul_shr_without_overflow() {
|
||||||
// given
|
// given
|
||||||
let num = 1048576;
|
let num = 1048576;
|
||||||
@ -207,6 +212,7 @@ fn should_calculate_overflow_mul_shr_without_overflow() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
#[cfg(test)]
|
||||||
fn should_calculate_overflow_mul_shr_with_overflow() {
|
fn should_calculate_overflow_mul_shr_with_overflow() {
|
||||||
// given
|
// given
|
||||||
let max = ::std::u64::MAX;
|
let max = ::std::u64::MAX;
|
||||||
@ -225,3 +231,15 @@ fn should_calculate_overflow_mul_shr_with_overflow() {
|
|||||||
assert!(o1);
|
assert!(o1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[cfg(test)]
|
||||||
|
fn should_validate_u256_to_usize_conversion() {
|
||||||
|
// given
|
||||||
|
let v = U256::from(::std::usize::MAX) + U256::from(1);
|
||||||
|
|
||||||
|
// when
|
||||||
|
let res = Gas::<usize>::from_u256(v);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert!(res.is_err());
|
||||||
|
}
|
||||||
|
@ -515,11 +515,11 @@ impl<Cost: CostType> Interpreter<Cost> {
|
|||||||
Ok(InstructionResult::Ok)
|
Ok(InstructionResult::Ok)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn copy_data_to_memory(&mut self, stack: &mut Stack<U256>, data: &[u8]) {
|
fn copy_data_to_memory(&mut self, stack: &mut Stack<U256>, source: &[u8]) {
|
||||||
let dest_offset = stack.pop_back();
|
let dest_offset = stack.pop_back();
|
||||||
let source_offset = stack.pop_back();
|
let source_offset = stack.pop_back();
|
||||||
let size = stack.pop_back();
|
let size = stack.pop_back();
|
||||||
let source_size = U256::from(data.len());
|
let source_size = U256::from(source.len());
|
||||||
|
|
||||||
let output_end = match source_offset > source_size || size > source_size || source_offset + size > source_size {
|
let output_end = match source_offset > source_size || size > source_size || source_offset + size > source_size {
|
||||||
true => {
|
true => {
|
||||||
@ -531,7 +531,7 @@ impl<Cost: CostType> Interpreter<Cost> {
|
|||||||
for i in zero_slice.iter_mut() {
|
for i in zero_slice.iter_mut() {
|
||||||
*i = 0;
|
*i = 0;
|
||||||
}
|
}
|
||||||
data.len()
|
source.len()
|
||||||
},
|
},
|
||||||
false => (size.low_u64() + source_offset.low_u64()) as usize
|
false => (size.low_u64() + source_offset.low_u64()) as usize
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user