1use super::common;
2use super::err;
3use super::ext;
4use super::memory;
5use super::opcodes;
6use super::stack;
7use ethereum_types::{Address, H256, U256, U512};
8use log::debug;
9use std::cmp;
10
11#[derive(Clone, Debug, Default)]
12pub struct Context {
13 pub gas_limit: u64,
14 pub coinbase: Address,
15 pub number: U256,
16 pub timestamp: u64,
17 pub difficulty: U256,
18}
19
20#[derive(Clone, Debug)]
23pub struct Log(pub Address, pub Vec<H256>, pub Vec<u8>);
24
25#[derive(Clone, Debug)]
26pub enum InterpreterResult {
27 Normal(Vec<u8>, u64, Vec<Log>),
29 Revert(Vec<u8>, u64),
31 Create(Vec<u8>, u64, Vec<Log>, Address),
33}
34
35#[derive(Clone)]
36pub struct InterpreterConf {
37 pub eip1283: bool,
38 pub stack_limit: u64,
39 pub max_create_code_size: u64, pub max_call_depth: u64,
41
42 pub gas_tier_step: [u64; 8],
43 pub gas_exp: u64, pub gas_exp_byte: u64, pub gas_sha3: u64, pub gas_sha3_word: u64, pub gas_balance: u64, pub gas_memory: u64, pub gas_sload: u64, pub gas_sstore_noop: u64, pub gas_sstore_init: u64, pub gas_sstore_clear_refund: u64, pub gas_sstore_clean: u64, pub gas_sstore_dirty: u64, pub gas_sstore_reset_clear_refund: u64, pub gas_sstore_reset_refund: u64, pub gas_sstore_set: u64, pub gas_sstore_clear: u64, pub gas_sstore_reset: u64, pub gas_sstore_refund: u64, pub gas_log: u64, pub gas_log_data: u64, pub gas_log_topic: u64, pub gas_create: u64, pub gas_jumpdest: u64, pub gas_copy: u64, pub gas_call: u64, pub gas_call_value_transfer: u64, pub gas_call_stipend: u64, pub gas_self_destruct: u64, pub gas_self_destruct_refund: u64, pub gas_extcode: u64, pub gas_call_new_account: u64, pub gas_self_destruct_new_account: u64, pub gas_ext_code_hash: u64, }
77
78impl Default for InterpreterConf {
79 fn default() -> Self {
84 InterpreterConf {
85 eip1283: false,
86 stack_limit: 1024,
87 max_create_code_size: 24567,
88 max_call_depth: 1024,
89
90 gas_tier_step: [0, 2, 3, 5, 8, 10, 20, 0],
91 gas_exp: 10,
92 gas_exp_byte: 50,
93 gas_sha3: 30,
94 gas_sha3_word: 6,
95 gas_balance: 400,
96 gas_memory: 3,
97 gas_sload: 200,
98 gas_sstore_noop: 200,
99 gas_sstore_init: 20000,
100 gas_sstore_clear_refund: 15000,
101 gas_sstore_clean: 5000,
102 gas_sstore_dirty: 200,
103 gas_sstore_reset_clear_refund: 19800,
104 gas_sstore_reset_refund: 4800,
105 gas_sstore_set: 20000,
106 gas_sstore_clear: 5000,
107 gas_sstore_reset: 5000,
108 gas_sstore_refund: 15000,
109 gas_log: 375,
110 gas_log_data: 8,
111 gas_log_topic: 375,
112 gas_create: 32000,
113 gas_jumpdest: 1,
114 gas_copy: 3,
115 gas_call: 700,
116 gas_call_value_transfer: 9000,
117 gas_call_stipend: 2300,
118 gas_self_destruct: 5000,
119 gas_self_destruct_refund: 24000,
120 gas_extcode: 700,
121 gas_call_new_account: 25000,
122 gas_self_destruct_new_account: 25000,
123 gas_ext_code_hash: 400,
124 }
125 }
126}
127
128#[derive(Clone, Debug, Default)]
129pub struct Contract {
130 pub code_address: Address,
131 pub code_data: Vec<u8>,
132}
133
134#[derive(Clone, Debug, Default)]
135pub struct InterpreterParams {
136 pub origin: Address, pub sender: Address, pub receiver: Address, pub address: Address, pub value: U256,
142 pub input: Vec<u8>,
143 pub nonce: U256,
144 pub gas_limit: u64,
145 pub gas_price: U256,
146
147 pub read_only: bool,
148 pub contract: Contract,
149 pub extra: H256,
150 pub is_create: bool,
151 pub disable_transfer_value: bool,
152 pub depth: u64,
153}
154
155pub struct Interpreter {
156 pub context: Context,
157 pub cfg: InterpreterConf,
158 pub data_provider: Box<ext::DataProvider>,
159 pub params: InterpreterParams,
160
161 gas: u64,
162 stack: stack::Stack<U256>,
163 mem: memory::Memory,
164 logs: Vec<Log>,
165 return_data: Vec<u8>,
166 mem_gas: u64,
167 gas_tmp: u64,
168}
169
170impl Interpreter {
171 pub fn new(
172 context: Context,
173 cfg: InterpreterConf,
174 data_provider: Box<ext::DataProvider>,
175 params: InterpreterParams,
176 ) -> Self {
177 let gas = params.gas_limit;
178 Interpreter {
179 context,
180 cfg,
181 data_provider,
182 params,
183 gas,
184 stack: stack::Stack::with_capacity(1024),
185 mem: memory::Memory::default(),
186 logs: Vec::new(),
187 return_data: Vec::new(),
188 mem_gas: 0,
189 gas_tmp: 0,
190 }
191 }
192
193 #[allow(clippy::cognitive_complexity)]
194 pub fn run(&mut self) -> Result<InterpreterResult, err::Error> {
195 let mut pc = 0;
196 while let Some(op) = self.get_op(pc)? {
197 pc += 1;
198 self.trace(&op, pc);
200 let stack_require = op.stack_require();
202 if !self.stack.require(stack_require as usize) {
203 return Err(err::Error::OutOfStack);
204 }
205 if self.stack.len() as u64 - op.stack_require() + op.stack_returns() > self.cfg.stack_limit {
206 return Err(err::Error::OutOfStack);
207 }
208 if self.params.read_only && op.state_changes() {
210 return Err(err::Error::MutableCallInStaticContext);
211 }
212 let op_gas = self.cfg.gas_tier_step[op.gas_price_tier().idx()];
214 self.use_gas(op_gas)?;
215 match op {
216 opcodes::OpCode::EXP => {
217 let expon = self.stack.back(1);
218 let bytes = ((expon.bits() + 7) / 8) as u64;
219 let gas = self.cfg.gas_exp + self.cfg.gas_exp_byte * bytes;
220 self.use_gas(gas)?;
221 }
222 opcodes::OpCode::SHA3 => {
223 let mem_offset = self.stack.back(0);
224 let mem_len = self.stack.back(1);
225 self.mem_gas_work(mem_offset, mem_len)?;
226 self.use_gas(self.cfg.gas_sha3)?;
227 self.use_gas(common::to_word_size(mem_len.low_u64()) * self.cfg.gas_sha3_word)?;
228 }
229 opcodes::OpCode::BALANCE => {
230 self.use_gas(self.cfg.gas_balance)?;
231 }
232 opcodes::OpCode::CALLDATACOPY => {
233 let mem_offset = self.stack.back(0);
234 let mem_len = self.stack.back(2);
235 self.mem_gas_work(mem_offset, mem_len)?;
236 let gas = common::to_word_size(mem_len.low_u64()) * self.cfg.gas_copy;
237 self.use_gas(gas)?;
238 }
239 opcodes::OpCode::CODECOPY => {
240 let mem_offset = self.stack.back(0);
241 let mem_len = self.stack.back(2);
242 self.mem_gas_work(mem_offset, mem_len)?;
243 let gas = common::to_word_size(mem_len.low_u64()) * self.cfg.gas_copy;
244 self.use_gas(gas)?;
245 }
246 opcodes::OpCode::EXTCODESIZE => {
247 self.use_gas(self.cfg.gas_extcode)?;
248 }
249 opcodes::OpCode::EXTCODECOPY => {
250 let mem_offset = self.stack.back(1);
251 let mem_len = self.stack.back(3);
252 self.use_gas(self.cfg.gas_extcode)?;
253 self.mem_gas_work(mem_offset, mem_len)?;
254 let gas = common::to_word_size(mem_len.low_u64()) * self.cfg.gas_copy;
255 self.use_gas(gas)?;
256 }
257 opcodes::OpCode::EXTCODEHASH => {
258 self.use_gas(self.cfg.gas_ext_code_hash)?;
259 }
260 opcodes::OpCode::RETURNDATACOPY => {
261 let mem_offset = self.stack.back(0);
262 let size = self.stack.back(2);
263 self.mem_gas_work(mem_offset, size)?;
264 let size_min = cmp::min(self.return_data.len() as u64, size.low_u64());
265 let gas = common::to_word_size(size_min) * self.cfg.gas_copy;
266 self.use_gas(gas)?;
267 }
268 opcodes::OpCode::MLOAD => {
269 let mem_offset = self.stack.back(0);
270 let mem_len = U256::from(32);
271 self.mem_gas_work(mem_offset, mem_len)?;
272 }
273 opcodes::OpCode::MSTORE => {
274 let mem_offset = self.stack.back(0);
275 let mem_len = U256::from(32);
276 self.mem_gas_work(mem_offset, mem_len)?;
277 }
278 opcodes::OpCode::MSTORE8 => {
279 let mem_offset = self.stack.back(0);
280 self.mem_gas_work(mem_offset, U256::one())?;
281 }
282 opcodes::OpCode::SLOAD => {
283 self.use_gas(self.cfg.gas_sload)?;
284 }
285 opcodes::OpCode::SSTORE => {
286 let address = H256::from(&self.stack.back(0));
287 let current_value = U256::from(&*self.data_provider.get_storage(&self.params.address, &address));
288 let new_value = self.stack.back(1);
289 let original_value =
290 U256::from(&*self.data_provider.get_storage_origin(&self.params.address, &address));
291 let gas: u64 = {
292 if self.cfg.eip1283 {
293 if current_value == new_value {
295 self.cfg.gas_sstore_noop
296 } else if original_value == current_value {
297 if original_value.is_zero() {
298 self.cfg.gas_sstore_init
299 } else {
300 if new_value.is_zero() {
301 self.data_provider
302 .add_refund(&self.params.origin, self.cfg.gas_sstore_clear_refund);
303 }
304 self.cfg.gas_sstore_clean
305 }
306 } else {
307 if !original_value.is_zero() {
308 if current_value.is_zero() {
309 self.data_provider
310 .sub_refund(&self.params.origin, self.cfg.gas_sstore_clear_refund);
311 } else if new_value.is_zero() {
312 self.data_provider
313 .add_refund(&self.params.origin, self.cfg.gas_sstore_clear_refund);
314 }
315 }
316 if original_value == new_value {
317 if original_value.is_zero() {
318 self.data_provider
319 .add_refund(&self.params.origin, self.cfg.gas_sstore_reset_clear_refund);
320 } else {
321 self.data_provider
322 .add_refund(&self.params.origin, self.cfg.gas_sstore_reset_refund);
323 }
324 }
325 self.cfg.gas_sstore_dirty
326 }
327 } else if current_value.is_zero() && !new_value.is_zero() {
328 self.cfg.gas_sstore_set
329 } else if !current_value.is_zero() && new_value.is_zero() {
330 self.data_provider
331 .add_refund(&self.params.origin, self.cfg.gas_sstore_refund);
332 self.cfg.gas_sstore_clear
333 } else {
334 self.cfg.gas_sstore_reset
335 }
336 };
337 self.use_gas(gas)?;
338 }
339 opcodes::OpCode::JUMPDEST => {
340 self.use_gas(self.cfg.gas_jumpdest)?;
341 }
342 opcodes::OpCode::LOG0
343 | opcodes::OpCode::LOG1
344 | opcodes::OpCode::LOG2
345 | opcodes::OpCode::LOG3
346 | opcodes::OpCode::LOG4 => {
347 let n = op.clone() as u8 - opcodes::OpCode::LOG0 as u8;
348 let mem_offset = self.stack.back(0);
349 let mem_len = self.stack.back(1);
350 self.mem_gas_work(mem_offset, mem_len)?;
351 let gas = self.cfg.gas_log
352 + self.cfg.gas_log_topic * u64::from(n)
353 + self.cfg.gas_log_data * mem_len.low_u64();
354 self.use_gas(gas)?;
355 }
356 opcodes::OpCode::CREATE => {
357 let mem_offset = self.stack.back(1);
358 let mem_len = self.stack.back(2);
359 if mem_len > U256::from(self.cfg.max_create_code_size) {
360 return Err(err::Error::ExccedMaxCodeSize);
361 }
362 self.mem_gas_work(mem_offset, mem_len)?;
363 self.use_gas(self.cfg.gas_create)?;
364 self.gas_tmp = self.gas - self.gas / 64;
365 self.use_gas(self.gas_tmp)?;
366 }
367 opcodes::OpCode::CALL | opcodes::OpCode::CALLCODE => {
368 let gas_req = self.stack.back(0);
369 let address = common::u256_to_address(&self.stack.back(1));
370 let value = self.stack.back(2);
371 let mem_offset = self.stack.back(3);
372 let mem_len = self.stack.back(4);
373 let out_offset = self.stack.back(5);
374 let out_len = self.stack.back(6);
375
376 self.use_gas(self.cfg.gas_call)?;
377
378 let is_value_transfer = !value.is_zero();
379 if op == opcodes::OpCode::CALL && is_value_transfer && self.data_provider.is_empty(&address) {
380 self.use_gas(self.cfg.gas_call_new_account)?;
381 }
382 if is_value_transfer {
383 self.use_gas(self.cfg.gas_call_value_transfer)?;
384 }
385 self.mem_gas_work(mem_offset, mem_len)?;
386 self.mem_gas_work(out_offset, out_len)?;
387 self.gas_tmp = cmp::min(self.gas - self.gas / 64, gas_req.low_u64());
388 self.use_gas(self.gas_tmp)?;
389 }
390 opcodes::OpCode::RETURN => {
391 let mem_offset = self.stack.back(0);
392 let mem_len = self.stack.back(1);
393 self.mem_gas_work(mem_offset, mem_len)?;
394 }
395 opcodes::OpCode::DELEGATECALL | opcodes::OpCode::STATICCALL => {
396 let gas_req = self.stack.back(0);
397 let mem_offset = self.stack.back(2);
398 let mem_len = self.stack.back(3);
399 let out_offset = self.stack.back(4);
400 let out_len = self.stack.back(5);
401 self.use_gas(self.cfg.gas_call)?;
402 self.mem_gas_work(mem_offset, mem_len)?;
403 self.mem_gas_work(out_offset, out_len)?;
404 self.gas_tmp = cmp::min(self.gas - self.gas / 64, gas_req.low_u64());
405 self.use_gas(self.gas_tmp)?;
406 }
407 opcodes::OpCode::CREATE2 => {
408 let mem_offset = self.stack.back(1);
409 let mem_len = self.stack.back(2);
410 if mem_len > U256::from(self.cfg.max_create_code_size) {
411 return Err(err::Error::ExccedMaxCodeSize);
412 }
413 self.mem_gas_work(mem_offset, mem_len)?;
414 self.use_gas(self.cfg.gas_create)?;
415 self.use_gas(common::to_word_size(mem_len.low_u64()) * self.cfg.gas_sha3_word)?;
416 self.gas_tmp = self.gas - self.gas / 64;
417 self.use_gas(self.gas_tmp)?;
418 }
419 opcodes::OpCode::REVERT => {
420 let mem_offset = self.stack.back(0);
421 let mem_len = self.stack.back(1);
422 self.mem_gas_work(mem_offset, mem_len)?;
423 }
424 opcodes::OpCode::SELFDESTRUCT => {
425 let address = self.stack.peek();
426 self.use_gas(self.cfg.gas_self_destruct)?;
427 if !self.data_provider.get_balance(&self.params.address).is_zero()
428 && self.data_provider.is_empty(&common::u256_to_address(&address))
429 {
430 self.use_gas(self.cfg.gas_self_destruct_new_account)?;
431 }
432 self.data_provider
433 .add_refund(&self.params.origin, self.cfg.gas_self_destruct_refund);
434 }
435 _ => {}
436 }
437 match op {
439 opcodes::OpCode::STOP => break,
440 opcodes::OpCode::ADD => {
441 let a = self.stack.pop();
442 let b = self.stack.pop();
443 self.stack.push(a.overflowing_add(b).0);
444 }
445 opcodes::OpCode::MUL => {
446 let a = self.stack.pop();
447 let b = self.stack.pop();
448 self.stack.push(a.overflowing_mul(b).0);
449 }
450 opcodes::OpCode::SUB => {
451 let a = self.stack.pop();
452 let b = self.stack.pop();
453 self.stack.push(a.overflowing_sub(b).0);
454 }
455 opcodes::OpCode::DIV => {
456 let a = self.stack.pop();
457 let b = self.stack.pop();
458 self.stack.push(if b.is_zero() { U256::zero() } else { a / b })
459 }
460 opcodes::OpCode::SDIV => {
461 let (a, neg_a) = common::get_sign(self.stack.pop());
462 let (b, neg_b) = common::get_sign(self.stack.pop());
463 let min = (U256::one() << 255) - U256::one();
464 self.stack.push(if b.is_zero() {
465 U256::zero()
466 } else if a == min && b == !U256::one() {
467 min
468 } else {
469 common::set_sign(a / b, neg_a ^ neg_b)
470 })
471 }
472 opcodes::OpCode::MOD => {
473 let a = self.stack.pop();
474 let b = self.stack.pop();
475 self.stack.push(if !b.is_zero() { a % b } else { U256::zero() });
476 }
477 opcodes::OpCode::SMOD => {
478 let ua = self.stack.pop();
479 let ub = self.stack.pop();
480 let (a, sign_a) = common::get_sign(ua);
481 let b = common::get_sign(ub).0;
482 self.stack.push(if !b.is_zero() {
483 let c = a % b;
484 common::set_sign(c, sign_a)
485 } else {
486 U256::zero()
487 });
488 }
489 opcodes::OpCode::ADDMOD => {
490 let a = self.stack.pop();
491 let b = self.stack.pop();
492 let c = self.stack.pop();
493 self.stack.push(if !c.is_zero() {
494 let res = U512::from(a);
495 let res = res.overflowing_add(U512::from(b)).0;
496 let res = res % U512::from(c);
497 U256::from(res)
498 } else {
499 U256::zero()
500 });
501 }
502 opcodes::OpCode::MULMOD => {
503 let a = self.stack.pop();
504 let b = self.stack.pop();
505 let c = self.stack.pop();
506 self.stack.push(if !c.is_zero() {
507 let res = U512::from(a);
508 let res = res.overflowing_mul(U512::from(b)).0;
509 let res = res % U512::from(c);
510 U256::from(res)
511 } else {
512 U256::zero()
513 });
514 }
515 opcodes::OpCode::EXP => {
516 let base = self.stack.pop();
517 let expon = self.stack.pop();
518 let res = base.overflowing_pow(expon).0;
519 self.stack.push(res);
520 }
521 opcodes::OpCode::SIGNEXTEND => {
522 let bit = self.stack.pop();
523 if bit < U256::from(32) {
524 let number = self.stack.pop();
525 let bit_position = (bit.low_u64() * 8 + 7) as usize;
526 let bit = number.bit(bit_position);
527 let mask = (U256::one() << bit_position) - U256::one();
528 self.stack.push(if bit { number | !mask } else { number & mask });
529 }
530 }
531 opcodes::OpCode::LT => {
532 let a = self.stack.pop();
533 let b = self.stack.pop();
534 self.stack.push(common::bool_to_u256(a < b));
535 }
536 opcodes::OpCode::GT => {
537 let a = self.stack.pop();
538 let b = self.stack.pop();
539 self.stack.push(common::bool_to_u256(a > b));
540 }
541 opcodes::OpCode::SLT => {
542 let (a, neg_a) = common::get_sign(self.stack.pop());
543 let (b, neg_b) = common::get_sign(self.stack.pop());
544 let is_positive_lt = a < b && !(neg_a | neg_b);
545 let is_negative_lt = a > b && (neg_a & neg_b);
546 let has_different_signs = neg_a && !neg_b;
547 self.stack.push(common::bool_to_u256(
548 is_positive_lt | is_negative_lt | has_different_signs,
549 ));
550 }
551 opcodes::OpCode::SGT => {
552 let (a, neg_a) = common::get_sign(self.stack.pop());
553 let (b, neg_b) = common::get_sign(self.stack.pop());
554 let is_positive_gt = a > b && !(neg_a | neg_b);
555 let is_negative_gt = a < b && (neg_a & neg_b);
556 let has_different_signs = !neg_a && neg_b;
557 self.stack.push(common::bool_to_u256(
558 is_positive_gt | is_negative_gt | has_different_signs,
559 ));
560 }
561 opcodes::OpCode::EQ => {
562 let a = self.stack.pop();
563 let b = self.stack.pop();
564 self.stack.push(common::bool_to_u256(a == b));
565 }
566 opcodes::OpCode::ISZERO => {
567 let a = self.stack.pop();
568 self.stack.push(common::bool_to_u256(a.is_zero()));
569 }
570 opcodes::OpCode::AND => {
571 let a = self.stack.pop();
572 let b = self.stack.pop();
573 self.stack.push(a & b);
574 }
575 opcodes::OpCode::OR => {
576 let a = self.stack.pop();
577 let b = self.stack.pop();
578 self.stack.push(a | b);
579 }
580 opcodes::OpCode::XOR => {
581 let a = self.stack.pop();
582 let b = self.stack.pop();
583 self.stack.push(a ^ b);
584 }
585 opcodes::OpCode::NOT => {
586 let a = self.stack.pop();
587 self.stack.push(!a);
588 }
589 opcodes::OpCode::BYTE => {
590 let word = self.stack.pop();
591 let val = self.stack.pop();
592 let byte = if word < U256::from(32) {
593 (val >> (8 * (31 - word.low_u64() as usize))) & U256::from(0xff)
594 } else {
595 U256::zero()
596 };
597 self.stack.push(byte);
598 }
599 opcodes::OpCode::SHL => {
600 const CONST_256: U256 = U256([256, 0, 0, 0]);
601 let shift = self.stack.pop();
602 let value = self.stack.pop();
603 let result = if shift >= CONST_256 {
604 U256::zero()
605 } else {
606 value << (shift.as_u32() as usize)
607 };
608 self.stack.push(result);
609 }
610 opcodes::OpCode::SHR => {
611 const CONST_256: U256 = U256([256, 0, 0, 0]);
612 let shift = self.stack.pop();
613 let value = self.stack.pop();
614 let result = if shift >= CONST_256 {
615 U256::zero()
616 } else {
617 value >> (shift.as_u32() as usize)
618 };
619 self.stack.push(result);
620 }
621 opcodes::OpCode::SAR => {
622 const CONST_256: U256 = U256([256, 0, 0, 0]);
623 const CONST_HIBIT: U256 = U256([0, 0, 0, 0x8000_0000_0000_0000]);
624 let shift = self.stack.pop();
625 let value = self.stack.pop();
626 let sign = value & CONST_HIBIT != U256::zero();
627 let result = if shift >= CONST_256 {
628 if sign {
629 U256::max_value()
630 } else {
631 U256::zero()
632 }
633 } else {
634 let shift = shift.as_u32() as usize;
635 let mut shifted = value >> shift;
636 if sign {
637 shifted = shifted | (U256::max_value() << (256 - shift));
638 }
639 shifted
640 };
641 self.stack.push(result);
642 }
643 opcodes::OpCode::SHA3 => {
644 let mem_offset = self.stack.pop();
645 let mem_len = self.stack.pop();
646 let k = self
647 .data_provider
648 .sha3(self.mem.get(mem_offset.low_u64() as usize, mem_len.low_u64() as usize));
649 self.stack.push(U256::from(k));
650 }
651 opcodes::OpCode::ADDRESS => {
652 self.stack.push(common::address_to_u256(self.params.address));
653 }
654 opcodes::OpCode::BALANCE => {
655 let address = common::u256_to_address(&self.stack.pop());
656 let balance = self.data_provider.get_balance(&address);
657 self.stack.push(balance);
658 }
659 opcodes::OpCode::ORIGIN => {
660 self.stack.push(common::address_to_u256(self.params.origin));
661 }
662 opcodes::OpCode::CALLER => {
663 self.stack.push(common::address_to_u256(self.params.sender));
664 }
665 opcodes::OpCode::CALLVALUE => {
666 self.stack.push(self.params.value);
667 }
668 opcodes::OpCode::CALLDATALOAD => {
669 let big_id = self.stack.pop();
670 let id = big_id.low_u64() as usize;
671 let max = id.wrapping_add(32);
672 if !self.params.input.is_empty() {
673 let bound = cmp::min(self.params.input.len(), max);
674 if id < bound && big_id < U256::from(self.params.input.len()) {
675 let mut v = [0u8; 32];
676 v[0..bound - id].clone_from_slice(&self.params.input[id..bound]);
677 self.stack.push(U256::from(&v[..]))
678 } else {
679 self.stack.push(U256::zero())
680 }
681 } else {
682 self.stack.push(U256::zero())
683 }
684 }
685 opcodes::OpCode::CALLDATASIZE => {
686 self.stack.push(U256::from(self.params.input.len()));
687 }
688 opcodes::OpCode::CALLDATACOPY => {
689 let mem_offset = self.stack.pop();
690 let raw_offset = self.stack.pop();
691 let size = self.stack.pop();
692
693 let data = common::copy_data(self.params.input.as_slice(), raw_offset, size);
694 self.mem.set(mem_offset.as_usize(), data.as_slice());
695 }
696 opcodes::OpCode::CODESIZE => {
697 self.stack.push(U256::from(self.params.contract.code_data.len()));
698 }
699 opcodes::OpCode::CODECOPY => {
700 let mem_offset = self.stack.pop();
701 let raw_offset = self.stack.pop();
702 let size = self.stack.pop();
703 let data = common::copy_data(self.params.contract.code_data.as_slice(), raw_offset, size);
704 self.mem.set(mem_offset.as_usize(), data.as_slice());
705 }
706 opcodes::OpCode::GASPRICE => {
707 self.stack.push(self.params.gas_price);
708 }
709 opcodes::OpCode::EXTCODESIZE => {
710 let address = common::u256_to_address(&self.stack.pop());
711 let len = self.data_provider.get_code_size(&address);
712 self.stack.push(U256::from(len));
713 }
714 opcodes::OpCode::EXTCODECOPY => {
715 let address = common::u256_to_address(&self.stack.pop());
716 let mem_offset = self.stack.pop();
717 let code_offset = self.stack.pop();
718 let size = self.stack.pop();
719 let code = self.data_provider.get_code(&address);
720 let data = common::copy_data(code.as_slice(), code_offset, size);
721 self.mem.set(mem_offset.as_usize(), data.as_slice())
722 }
723 opcodes::OpCode::RETURNDATASIZE => self.stack.push(U256::from(self.return_data.len())),
724 opcodes::OpCode::RETURNDATACOPY => {
725 let mem_offset = self.stack.pop();
726 let raw_offset = self.stack.pop();
727 let size = self.stack.pop();
728 let return_data_len = U256::from(self.return_data.len());
729 if raw_offset.saturating_add(size) > return_data_len {
730 return Err(err::Error::OutOfBounds);
731 }
732 let data = common::copy_data(&self.return_data, raw_offset, size);
733 self.mem.set(mem_offset.as_usize(), data.as_slice())
734 }
735 opcodes::OpCode::EXTCODEHASH => {
736 let address = common::u256_to_address(&self.stack.pop());
737 let hash = self.data_provider.get_code_hash(&address);
738 self.stack.push(U256::from(hash));
739 }
740 opcodes::OpCode::BLOCKHASH => {
741 let block_number = self.stack.pop();
742 let block_hash = self.data_provider.get_block_hash(&block_number);
743 self.stack.push(U256::from(&*block_hash));
744 }
745 opcodes::OpCode::COINBASE => {
746 self.stack.push(common::address_to_u256(self.context.coinbase));
747 }
748 opcodes::OpCode::TIMESTAMP => {
749 self.stack.push(U256::from(self.context.timestamp));
750 }
751 opcodes::OpCode::NUMBER => {
752 self.stack.push(self.context.number);
753 }
754 opcodes::OpCode::DIFFICULTY => {
755 self.stack.push(self.context.difficulty);
756 }
757 opcodes::OpCode::GASLIMIT => {
758 self.stack.push(U256::from(self.context.gas_limit));
760 }
761 opcodes::OpCode::POP => {
762 self.stack.pop();
763 }
764 opcodes::OpCode::MLOAD => {
765 let offset = self.stack.pop().as_u64();
766 let word = self.mem.get(offset as usize, 32);
767 self.stack.push(U256::from(word));
768 }
769 opcodes::OpCode::MSTORE => {
770 let offset = self.stack.pop();
771 let word = self.stack.pop();
772 let word = &<[u8; 32]>::from(word)[..];
773 self.mem.set(offset.low_u64() as usize, word);
774 }
775 opcodes::OpCode::MSTORE8 => {
776 let offset = self.stack.pop();
777 let word = self.stack.pop();
778 self.mem.set(offset.low_u64() as usize, &[word.low_u64() as u8]);
779 }
780 opcodes::OpCode::SLOAD => {
781 let key = H256::from(self.stack.pop());
782 let word = U256::from(&*self.data_provider.get_storage(&self.params.address, &key));
783 self.stack.push(word);
784 }
785 opcodes::OpCode::SSTORE => {
786 let address = H256::from(&self.stack.pop());
787 let value = self.stack.pop();
788 self.data_provider
789 .set_storage(&self.params.address, address, H256::from(&value));
790 }
791 opcodes::OpCode::JUMP => {
792 let jump = self.stack.pop();
793 self.pre_jump(jump)?;
794 pc = jump.low_u64();
795 }
796 opcodes::OpCode::JUMPI => {
797 let jump = self.stack.pop();
798 let condition = self.stack.pop();
799 if !condition.is_zero() {
800 self.pre_jump(jump)?;
801 pc = jump.low_u64();
802 }
803 }
804 opcodes::OpCode::PC => {
805 self.stack.push(U256::from(pc - 1));
806 }
807 opcodes::OpCode::MSIZE => {
808 self.stack.push(U256::from(self.mem.len()));
809 }
810 opcodes::OpCode::GAS => {
811 self.stack.push(U256::from(self.gas));
812 }
813 opcodes::OpCode::JUMPDEST => {}
814 opcodes::OpCode::PUSH1
815 | opcodes::OpCode::PUSH2
816 | opcodes::OpCode::PUSH3
817 | opcodes::OpCode::PUSH4
818 | opcodes::OpCode::PUSH5
819 | opcodes::OpCode::PUSH6
820 | opcodes::OpCode::PUSH7
821 | opcodes::OpCode::PUSH8
822 | opcodes::OpCode::PUSH9
823 | opcodes::OpCode::PUSH10
824 | opcodes::OpCode::PUSH11
825 | opcodes::OpCode::PUSH12
826 | opcodes::OpCode::PUSH13
827 | opcodes::OpCode::PUSH14
828 | opcodes::OpCode::PUSH15
829 | opcodes::OpCode::PUSH16
830 | opcodes::OpCode::PUSH17
831 | opcodes::OpCode::PUSH18
832 | opcodes::OpCode::PUSH19
833 | opcodes::OpCode::PUSH20
834 | opcodes::OpCode::PUSH21
835 | opcodes::OpCode::PUSH22
836 | opcodes::OpCode::PUSH23
837 | opcodes::OpCode::PUSH24
838 | opcodes::OpCode::PUSH25
839 | opcodes::OpCode::PUSH26
840 | opcodes::OpCode::PUSH27
841 | opcodes::OpCode::PUSH28
842 | opcodes::OpCode::PUSH29
843 | opcodes::OpCode::PUSH30
844 | opcodes::OpCode::PUSH31
845 | opcodes::OpCode::PUSH32 => {
846 let n = op as u8 - opcodes::OpCode::PUSH1 as u8 + 1;
847 let e = pc + u64::from(n);
848 let e = cmp::min(e, self.params.contract.code_data.len() as u64);
849 let r = U256::from(&self.params.contract.code_data[pc as usize..e as usize]);
850 pc = e;
851 self.stack.push(r);
852 }
853 opcodes::OpCode::DUP1
854 | opcodes::OpCode::DUP2
855 | opcodes::OpCode::DUP3
856 | opcodes::OpCode::DUP4
857 | opcodes::OpCode::DUP5
858 | opcodes::OpCode::DUP6
859 | opcodes::OpCode::DUP7
860 | opcodes::OpCode::DUP8
861 | opcodes::OpCode::DUP9
862 | opcodes::OpCode::DUP10
863 | opcodes::OpCode::DUP11
864 | opcodes::OpCode::DUP12
865 | opcodes::OpCode::DUP13
866 | opcodes::OpCode::DUP14
867 | opcodes::OpCode::DUP15
868 | opcodes::OpCode::DUP16 => {
869 let p = op as u8 - opcodes::OpCode::DUP1 as u8;
870 self.stack.dup(p as usize);
871 }
872 opcodes::OpCode::SWAP1
873 | opcodes::OpCode::SWAP2
874 | opcodes::OpCode::SWAP3
875 | opcodes::OpCode::SWAP4
876 | opcodes::OpCode::SWAP5
877 | opcodes::OpCode::SWAP6
878 | opcodes::OpCode::SWAP7
879 | opcodes::OpCode::SWAP8
880 | opcodes::OpCode::SWAP9
881 | opcodes::OpCode::SWAP10
882 | opcodes::OpCode::SWAP11
883 | opcodes::OpCode::SWAP12
884 | opcodes::OpCode::SWAP13
885 | opcodes::OpCode::SWAP14
886 | opcodes::OpCode::SWAP15
887 | opcodes::OpCode::SWAP16 => {
888 let p = op as u8 - opcodes::OpCode::SWAP1 as u8 + 1;
889 self.stack.swap(p as usize);
890 }
891 opcodes::OpCode::LOG0
892 | opcodes::OpCode::LOG1
893 | opcodes::OpCode::LOG2
894 | opcodes::OpCode::LOG3
895 | opcodes::OpCode::LOG4 => {
896 let n = op as u8 - opcodes::OpCode::LOG0 as u8;
897 let mem_offset = self.stack.pop();
898 let mem_len = self.stack.pop();
899 let mut topics: Vec<H256> = Vec::new();
900 for _ in 0..n {
901 let r = H256::from(self.stack.pop());
902 topics.push(r);
903 }
904 let data = self.mem.get(mem_offset.low_u64() as usize, mem_len.low_u64() as usize);
905 self.logs.push(Log(self.params.address, topics, Vec::from(data)));
906 }
907 opcodes::OpCode::CREATE | opcodes::OpCode::CREATE2 => {
908 self.return_data = vec![];
910
911 let value = self.stack.pop();
912 let mem_offset = self.stack.pop();
913 let mem_len = self.stack.pop();
914 let salt = H256::from({
915 match op {
916 opcodes::OpCode::CREATE => U256::zero(),
917 opcodes::OpCode::CREATE2 => self.stack.pop(),
918 _ => panic!("instruction can only be CREATE/CREATE2 checked above"),
919 }
920 });
921 let data = self.mem.get(mem_offset.low_u64() as usize, mem_len.low_u64() as usize);
922 if value > self.data_provider.get_balance(&self.params.address) {
924 self.gas += self.gas_tmp;
925 self.stack.push(U256::zero());
926 continue;
927 }
928 if self.params.depth >= self.cfg.max_call_depth {
930 self.gas += self.gas_tmp;
931 self.stack.push(U256::zero());
932 continue;
933 }
934 let mut params = InterpreterParams::default();
935 params.origin = self.params.origin;
936 params.sender = self.params.address;
937 params.gas_limit = self.gas_tmp;
938 params.gas_price = self.params.gas_price;
939 params.input = Vec::from(data);
940 params.value = value;
941 params.extra = salt;
942 params.depth = self.params.depth + 1;
943 let r = self.data_provider.call(op, params);
944 match r {
945 Ok(data) => match data {
946 InterpreterResult::Create(_, gas, logs, add) => {
947 self.stack.push(common::address_to_u256(add));
948 self.gas += gas;
949 self.logs.extend(logs);
950 }
951 InterpreterResult::Revert(ret, gas) => {
952 self.stack.push(U256::zero());
953 self.gas += gas;
954 self.return_data = ret;
955 }
956 _ => {}
957 },
958 Err(_) => {
959 self.stack.push(U256::zero());
960 }
961 }
962 }
963 opcodes::OpCode::CALL
964 | opcodes::OpCode::CALLCODE
965 | opcodes::OpCode::DELEGATECALL
966 | opcodes::OpCode::STATICCALL => {
967 let _ = self.stack.pop();
968 let address = common::u256_to_address(&self.stack.pop());
969 let value = {
970 if op == opcodes::OpCode::CALL || op == opcodes::OpCode::CALLCODE {
971 self.stack.pop()
972 } else {
973 U256::zero()
974 }
975 };
976 let mem_offset = self.stack.pop();
977 let mem_len = self.stack.pop();
978 let out_offset = self.stack.pop();
979 let out_len = self.stack.pop();
980
981 if op == opcodes::OpCode::CALL && self.params.read_only && !value.is_zero() {
982 return Err(err::Error::MutableCallInStaticContext);
983 }
984
985 self.return_data = vec![];
987
988 let mut gas = self.gas_tmp;
989 if !value.is_zero() {
991 gas += self.cfg.gas_call_stipend;
992 }
993 if value > self.data_provider.get_balance(&self.params.address) {
995 self.gas += gas;
996 self.stack.push(U256::zero());
997 continue;
998 }
999 if self.params.depth >= self.cfg.max_call_depth {
1001 self.gas += gas;
1002 self.stack.push(U256::zero());
1003 continue;
1004 }
1005 let data = self.mem.get(mem_offset.low_u64() as usize, mem_len.low_u64() as usize);
1006 let mut params = InterpreterParams::default();
1007 params.origin = self.params.origin;
1008 params.gas_limit = gas;
1009 params.gas_price = self.params.gas_price;
1010 params.contract.code_address = address;
1011 params.contract.code_data = self.data_provider.get_code(¶ms.contract.code_address).to_vec();
1012 params.input = Vec::from(data);
1013 params.depth = self.params.depth + 1;
1014 params.read_only = self.params.read_only;
1023
1024 match op {
1025 opcodes::OpCode::CALL => {
1026 params.sender = self.params.address;
1027 params.receiver = address;
1028 params.address = address;
1029 params.value = value;
1030 }
1031 opcodes::OpCode::CALLCODE => {
1032 params.sender = self.params.address;
1033 params.receiver = self.params.address;
1034 params.address = self.params.address;
1035 params.value = value;
1036 }
1037 opcodes::OpCode::DELEGATECALL => {
1038 params.sender = self.params.sender;
1039 params.receiver = self.params.address;
1040 params.address = self.params.address;
1041 params.value = self.params.value;
1051 params.disable_transfer_value = true;
1052 }
1053 opcodes::OpCode::STATICCALL => {
1054 params.sender = self.params.address;
1055 params.receiver = address;
1056 params.address = address;
1057 params.read_only = true;
1058 }
1059 _ => {}
1060 }
1061 let r = self.data_provider.call(op, params);
1062 match r {
1063 Ok(data) => match data {
1064 InterpreterResult::Normal(mut ret, gas, logs) => {
1065 self.stack.push(U256::one());
1066 self.return_data = ret.clone();
1067 if ret.len() > out_len.low_u64() as usize {
1068 ret.resize(out_len.low_u64() as usize, 0u8);
1069 }
1070 self.mem.set(out_offset.low_u64() as usize, ret.as_slice());
1071 self.gas += gas;
1072 self.logs.extend(logs);
1073 }
1074 InterpreterResult::Revert(mut ret, gas) => {
1075 self.stack.push(U256::zero());
1076 self.return_data = ret.clone();
1077 if ret.len() > out_len.low_u64() as usize {
1078 ret.resize(out_len.low_u64() as usize, 0u8);
1079 }
1080 self.mem.set(out_offset.low_u64() as usize, ret.as_slice());
1081 self.gas += gas;
1082 }
1083 _ => {}
1084 },
1085 Err(_) => {
1086 self.stack.push(U256::zero());
1087 }
1088 }
1089 }
1090 opcodes::OpCode::RETURN => {
1091 let mem_offset = self.stack.pop();
1092 let mem_len = self.stack.pop();
1093 let r = self.mem.get(mem_offset.low_u64() as usize, mem_len.low_u64() as usize);
1094 let return_data = Vec::from(r);
1095 return Ok(InterpreterResult::Normal(
1096 return_data.clone(),
1097 self.gas,
1098 self.logs.clone(),
1099 ));
1100 }
1101 opcodes::OpCode::REVERT => {
1102 let mem_offset = self.stack.pop();
1103 let mem_len = self.stack.pop();
1104 let r = self.mem.get(mem_offset.low_u64() as usize, mem_len.low_u64() as usize);
1105 let return_data = Vec::from(r);
1106 return Ok(InterpreterResult::Revert(return_data.clone(), self.gas));
1107 }
1108 opcodes::OpCode::SELFDESTRUCT => {
1109 let address = self.stack.pop();
1110 let b = self
1111 .data_provider
1112 .selfdestruct(&self.params.address, &common::u256_to_address(&address));
1113 if !b {
1114 self.data_provider
1121 .sub_refund(&self.params.origin, self.cfg.gas_self_destruct_refund);
1122 }
1123 break;
1124 }
1125 }
1126 debug!("");
1127 }
1128 Ok(InterpreterResult::Normal(vec![], self.gas, self.logs.clone()))
1129 }
1130
1131 fn use_gas(&mut self, gas: u64) -> Result<(), err::Error> {
1132 debug!("[Gas] - {}", gas);
1133 if self.gas < gas {
1134 return Err(err::Error::OutOfGas);
1135 }
1136 self.gas -= gas;
1137 Ok(())
1138 }
1139
1140 fn mem_gas_cost(&mut self, size: u64) -> u64 {
1141 let goc = common::mem_gas_cost(size, self.cfg.gas_memory);
1142 if goc > self.mem_gas {
1143 let fee = goc - self.mem_gas;
1144 self.mem_gas = goc;
1145 fee
1146 } else {
1147 0
1148 }
1149 }
1150
1151 fn mem_gas_work(&mut self, mem_offset: U256, mem_len: U256) -> Result<(), err::Error> {
1152 if mem_len.is_zero() {
1153 return Ok(());
1154 }
1155 let (mem_sum, b) = mem_offset.overflowing_add(mem_len);
1156 if b || mem_sum.bits() > 64 || mem_sum.low_u64() > 1024 * 1024 * 1024 {
1162 return Err(err::Error::OutOfGas);
1163 }
1164 if mem_len != U256::zero() {
1165 let gas = self.mem_gas_cost(mem_sum.low_u64());
1166 self.use_gas(gas)?;
1167 }
1168 self.mem.expand(mem_sum.low_u64() as usize);
1169 Ok(())
1170 }
1171
1172 fn get_byte(&self, n: u64) -> Option<u8> {
1173 if n < self.params.contract.code_data.len() as u64 {
1174 return Some(self.params.contract.code_data[n as usize]);
1175 }
1176 None
1177 }
1178
1179 fn get_op(&self, n: u64) -> Result<Option<opcodes::OpCode>, err::Error> {
1180 match self.get_byte(n) {
1181 Some(a) => match opcodes::OpCode::from_u8(a) {
1182 Some(b) => Ok(Some(b)),
1183 None => Err(err::Error::InvalidOpcode),
1184 },
1185 None => Ok(None),
1186 }
1187 }
1188
1189 fn pre_jump(&self, n: U256) -> Result<(), err::Error> {
1190 if n.bits() > 63 {
1191 return Err(err::Error::InvalidJumpDestination);
1192 }
1193 let n = n.low_u64() as usize;
1194 if n >= self.params.contract.code_data.len() {
1195 return Err(err::Error::InvalidJumpDestination);
1196 }
1197 if self.params.contract.code_data[n] != opcodes::OpCode::JUMPDEST as u8 {
1199 return Err(err::Error::InvalidJumpDestination);
1200 }
1201 Ok(())
1202 }
1203
1204 fn trace(&self, op: &opcodes::OpCode, pc: u64) {
1206 if *op >= opcodes::OpCode::PUSH1 && *op <= opcodes::OpCode::PUSH32 {
1207 let n = op.clone() as u8 - opcodes::OpCode::PUSH1 as u8 + 1;
1208 let r = {
1209 if pc + u64::from(n) > self.params.contract.code_data.len() as u64 {
1210 U256::zero()
1211 } else {
1212 U256::from(&self.params.contract.code_data[pc as usize..(pc + u64::from(n)) as usize])
1213 }
1214 };
1215 debug!("[OP] {} {:#x} gas={}", op, r, self.gas);
1216 } else {
1217 debug!("[OP] {} gas={}", op, self.gas);
1218 }
1219 debug!("[STACK]");
1220 let l = self.stack.data().len();
1221 for i in 0..l {
1222 debug!("[{}] {:#x}", i, self.stack.back(i));
1223 }
1224 debug!("[MEM] len={}", self.mem.len());
1225 }
1226}
1227
1228#[cfg(test)]
1229mod tests {
1230 use super::super::extmock;
1232 use super::*;
1233
1234 fn default_interpreter() -> Interpreter {
1235 let mut it = Interpreter::new(
1236 Context::default(),
1237 InterpreterConf::default(),
1238 Box::new(extmock::DataProviderMock::default()),
1239 InterpreterParams::default(),
1240 );
1241 it.context.gas_limit = 1_000_000;
1242 it.params.gas_limit = 1_000_000;
1243 it.gas = 1_000_000;
1244 it
1245 }
1246
1247 #[test]
1248 fn test_op_byte() {
1249 let data = vec![
1250 (
1251 "ABCDEF0908070605040302010000000000000000000000000000000000000000",
1252 "0",
1253 "AB",
1254 ),
1255 (
1256 "ABCDEF0908070605040302010000000000000000000000000000000000000000",
1257 "1",
1258 "CD",
1259 ),
1260 (
1261 "00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff",
1262 "0",
1263 "00",
1264 ),
1265 (
1266 "ABCDEF0908070605040302010000000000000000000000000000000000000000",
1267 "1",
1268 "CD",
1269 ),
1270 (
1271 "00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff",
1272 "0",
1273 "00",
1274 ),
1275 (
1276 "00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff",
1277 "1",
1278 "CD",
1279 ),
1280 (
1281 "0000000000000000000000000000000000000000000000000000000000102030",
1282 "31",
1283 "30",
1284 ),
1285 (
1286 "0000000000000000000000000000000000000000000000000000000000102030",
1287 "30",
1288 "20",
1289 ),
1290 (
1291 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1292 "32",
1293 "00",
1294 ),
1295 (
1296 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1297 "4294967295",
1298 "00",
1299 ),
1300 ];
1301 for (val, th, expected) in data {
1302 let mut it = default_interpreter();;
1303 it.stack
1304 .push_n(&[U256::from(val), U256::from(th.parse::<u64>().unwrap())]);
1305 it.params.contract.code_data = vec![opcodes::OpCode::BYTE as u8];
1306 it.run().unwrap();
1307 assert_eq!(it.stack.pop(), U256::from(expected));
1308 }
1309 }
1310
1311 #[test]
1312 fn test_op_shl() {
1313 let data = vec![
1314 (
1315 "0000000000000000000000000000000000000000000000000000000000000001",
1316 "00",
1317 "0000000000000000000000000000000000000000000000000000000000000001",
1318 ),
1319 (
1320 "0000000000000000000000000000000000000000000000000000000000000001",
1321 "01",
1322 "0000000000000000000000000000000000000000000000000000000000000002",
1323 ),
1324 (
1325 "0000000000000000000000000000000000000000000000000000000000000001",
1326 "ff",
1327 "8000000000000000000000000000000000000000000000000000000000000000",
1328 ),
1329 (
1330 "0000000000000000000000000000000000000000000000000000000000000001",
1331 "0100",
1332 "0000000000000000000000000000000000000000000000000000000000000000",
1333 ),
1334 (
1335 "0000000000000000000000000000000000000000000000000000000000000001",
1336 "0101",
1337 "0000000000000000000000000000000000000000000000000000000000000000",
1338 ),
1339 (
1340 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1341 "00",
1342 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1343 ),
1344 (
1345 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1346 "01",
1347 "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe",
1348 ),
1349 (
1350 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1351 "ff",
1352 "8000000000000000000000000000000000000000000000000000000000000000",
1353 ),
1354 (
1355 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1356 "0100",
1357 "0000000000000000000000000000000000000000000000000000000000000000",
1358 ),
1359 (
1360 "0000000000000000000000000000000000000000000000000000000000000000",
1361 "01",
1362 "0000000000000000000000000000000000000000000000000000000000000000",
1363 ),
1364 (
1365 "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1366 "01",
1367 "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe",
1368 ),
1369 ];
1370 for (x, y, expected) in data {
1371 let mut it = default_interpreter();;
1372 it.stack.push_n(&[U256::from(x), U256::from(y)]);
1373 it.params.contract.code_data = vec![opcodes::OpCode::SHL as u8];
1374 it.run().unwrap();
1375 assert_eq!(it.stack.pop(), U256::from(expected));
1376 }
1377 }
1378
1379 #[test]
1380 fn test_op_shr() {
1381 let data = vec![
1382 (
1383 "0000000000000000000000000000000000000000000000000000000000000001",
1384 "00",
1385 "0000000000000000000000000000000000000000000000000000000000000001",
1386 ),
1387 (
1388 "0000000000000000000000000000000000000000000000000000000000000001",
1389 "01",
1390 "0000000000000000000000000000000000000000000000000000000000000000",
1391 ),
1392 (
1393 "8000000000000000000000000000000000000000000000000000000000000000",
1394 "01",
1395 "4000000000000000000000000000000000000000000000000000000000000000",
1396 ),
1397 (
1398 "8000000000000000000000000000000000000000000000000000000000000000",
1399 "ff",
1400 "0000000000000000000000000000000000000000000000000000000000000001",
1401 ),
1402 (
1403 "8000000000000000000000000000000000000000000000000000000000000000",
1404 "0100",
1405 "0000000000000000000000000000000000000000000000000000000000000000",
1406 ),
1407 (
1408 "8000000000000000000000000000000000000000000000000000000000000000",
1409 "0101",
1410 "0000000000000000000000000000000000000000000000000000000000000000",
1411 ),
1412 (
1413 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1414 "00",
1415 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1416 ),
1417 (
1418 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1419 "01",
1420 "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1421 ),
1422 (
1423 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1424 "ff",
1425 "0000000000000000000000000000000000000000000000000000000000000001",
1426 ),
1427 (
1428 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1429 "0100",
1430 "0000000000000000000000000000000000000000000000000000000000000000",
1431 ),
1432 (
1433 "0000000000000000000000000000000000000000000000000000000000000000",
1434 "01",
1435 "0000000000000000000000000000000000000000000000000000000000000000",
1436 ),
1437 ];
1438 for (x, y, expected) in data {
1439 let mut it = default_interpreter();;
1440 it.stack.push_n(&[U256::from(x), U256::from(y)]);
1441 it.params.contract.code_data = vec![opcodes::OpCode::SHR as u8];
1442 it.run().unwrap();
1443 assert_eq!(it.stack.pop(), U256::from(expected));
1444 }
1445 }
1446
1447 #[test]
1448 fn test_op_sar() {
1449 let data = vec![
1450 (
1451 "0000000000000000000000000000000000000000000000000000000000000001",
1452 "00",
1453 "0000000000000000000000000000000000000000000000000000000000000001",
1454 ),
1455 (
1456 "0000000000000000000000000000000000000000000000000000000000000001",
1457 "01",
1458 "0000000000000000000000000000000000000000000000000000000000000000",
1459 ),
1460 (
1461 "8000000000000000000000000000000000000000000000000000000000000000",
1462 "01",
1463 "c000000000000000000000000000000000000000000000000000000000000000",
1464 ),
1465 (
1466 "8000000000000000000000000000000000000000000000000000000000000000",
1467 "ff",
1468 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1469 ),
1470 (
1471 "8000000000000000000000000000000000000000000000000000000000000000",
1472 "0100",
1473 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1474 ),
1475 (
1476 "8000000000000000000000000000000000000000000000000000000000000000",
1477 "0101",
1478 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1479 ),
1480 (
1481 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1482 "00",
1483 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1484 ),
1485 (
1486 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1487 "01",
1488 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1489 ),
1490 (
1491 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1492 "ff",
1493 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1494 ),
1495 (
1496 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1497 "0100",
1498 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1499 ),
1500 (
1501 "0000000000000000000000000000000000000000000000000000000000000000",
1502 "01",
1503 "0000000000000000000000000000000000000000000000000000000000000000",
1504 ),
1505 (
1506 "4000000000000000000000000000000000000000000000000000000000000000",
1507 "fe",
1508 "0000000000000000000000000000000000000000000000000000000000000001",
1509 ),
1510 (
1511 "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1512 "f8",
1513 "000000000000000000000000000000000000000000000000000000000000007f",
1514 ),
1515 (
1516 "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1517 "fe",
1518 "0000000000000000000000000000000000000000000000000000000000000001",
1519 ),
1520 (
1521 "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1522 "ff",
1523 "0000000000000000000000000000000000000000000000000000000000000000",
1524 ),
1525 (
1526 "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1527 "0100",
1528 "0000000000000000000000000000000000000000000000000000000000000000",
1529 ),
1530 ];
1531 for (x, y, expected) in data {
1532 let mut it = default_interpreter();;
1533 it.stack.push_n(&[U256::from(x), U256::from(y)]);
1534 it.params.contract.code_data = vec![opcodes::OpCode::SAR as u8];
1535 it.run().unwrap();
1536 assert_eq!(it.stack.pop(), U256::from(expected));
1537 }
1538 }
1539
1540 #[test]
1541 fn test_op_sgt() {
1542 let data = vec![
1543 (
1544 "0000000000000000000000000000000000000000000000000000000000000001",
1545 "0000000000000000000000000000000000000000000000000000000000000001",
1546 "0000000000000000000000000000000000000000000000000000000000000000",
1547 ),
1548 (
1549 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1550 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1551 "0000000000000000000000000000000000000000000000000000000000000000",
1552 ),
1553 (
1554 "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1555 "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1556 "0000000000000000000000000000000000000000000000000000000000000000",
1557 ),
1558 (
1559 "0000000000000000000000000000000000000000000000000000000000000001",
1560 "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1561 "0000000000000000000000000000000000000000000000000000000000000001",
1562 ),
1563 (
1564 "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1565 "0000000000000000000000000000000000000000000000000000000000000001",
1566 "0000000000000000000000000000000000000000000000000000000000000000",
1567 ),
1568 (
1569 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1570 "0000000000000000000000000000000000000000000000000000000000000001",
1571 "0000000000000000000000000000000000000000000000000000000000000001",
1572 ),
1573 (
1574 "0000000000000000000000000000000000000000000000000000000000000001",
1575 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1576 "0000000000000000000000000000000000000000000000000000000000000000",
1577 ),
1578 (
1579 "8000000000000000000000000000000000000000000000000000000000000001",
1580 "8000000000000000000000000000000000000000000000000000000000000001",
1581 "0000000000000000000000000000000000000000000000000000000000000000",
1582 ),
1583 (
1584 "8000000000000000000000000000000000000000000000000000000000000001",
1585 "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1586 "0000000000000000000000000000000000000000000000000000000000000001",
1587 ),
1588 (
1589 "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1590 "8000000000000000000000000000000000000000000000000000000000000001",
1591 "0000000000000000000000000000000000000000000000000000000000000000",
1592 ),
1593 (
1594 "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb",
1595 "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd",
1596 "0000000000000000000000000000000000000000000000000000000000000001",
1597 ),
1598 (
1599 "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd",
1600 "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb",
1601 "0000000000000000000000000000000000000000000000000000000000000000",
1602 ),
1603 ];
1604 for (x, y, expected) in data {
1605 let mut it = default_interpreter();;
1606 it.stack.push_n(&[U256::from(x), U256::from(y)]);
1607 it.params.contract.code_data = vec![opcodes::OpCode::SGT as u8];
1608 it.run().unwrap();
1609 assert_eq!(it.stack.pop(), U256::from(expected));
1610 }
1611 }
1612
1613 #[test]
1614 fn test_op_slt() {
1615 let data = vec![
1616 (
1617 "0000000000000000000000000000000000000000000000000000000000000001",
1618 "0000000000000000000000000000000000000000000000000000000000000001",
1619 "0000000000000000000000000000000000000000000000000000000000000000",
1620 ),
1621 (
1622 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1623 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1624 "0000000000000000000000000000000000000000000000000000000000000000",
1625 ),
1626 (
1627 "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1628 "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1629 "0000000000000000000000000000000000000000000000000000000000000000",
1630 ),
1631 (
1632 "0000000000000000000000000000000000000000000000000000000000000001",
1633 "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1634 "0000000000000000000000000000000000000000000000000000000000000000",
1635 ),
1636 (
1637 "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1638 "0000000000000000000000000000000000000000000000000000000000000001",
1639 "0000000000000000000000000000000000000000000000000000000000000001",
1640 ),
1641 (
1642 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1643 "0000000000000000000000000000000000000000000000000000000000000001",
1644 "0000000000000000000000000000000000000000000000000000000000000000",
1645 ),
1646 (
1647 "0000000000000000000000000000000000000000000000000000000000000001",
1648 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1649 "0000000000000000000000000000000000000000000000000000000000000001",
1650 ),
1651 (
1652 "8000000000000000000000000000000000000000000000000000000000000001",
1653 "8000000000000000000000000000000000000000000000000000000000000001",
1654 "0000000000000000000000000000000000000000000000000000000000000000",
1655 ),
1656 (
1657 "8000000000000000000000000000000000000000000000000000000000000001",
1658 "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1659 "0000000000000000000000000000000000000000000000000000000000000000",
1660 ),
1661 (
1662 "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1663 "8000000000000000000000000000000000000000000000000000000000000001",
1664 "0000000000000000000000000000000000000000000000000000000000000001",
1665 ),
1666 (
1667 "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb",
1668 "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd",
1669 "0000000000000000000000000000000000000000000000000000000000000000",
1670 ),
1671 (
1672 "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd",
1673 "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb",
1674 "0000000000000000000000000000000000000000000000000000000000000001",
1675 ),
1676 ];
1677 for (x, y, expected) in data {
1678 let mut it = default_interpreter();;
1679 it.stack.push_n(&[U256::from(x), U256::from(y)]);
1680 it.params.contract.code_data = vec![opcodes::OpCode::SLT as u8];
1681 it.run().unwrap();
1682 assert_eq!(it.stack.pop(), U256::from(expected));
1683 }
1684 }
1685
1686 #[test]
1687 fn test_op_mstore() {
1688 let mut it = default_interpreter();;
1689 let v = "abcdef00000000000000abba000000000deaf000000c0de00100000000133700";
1690 it.stack.push_n(&[U256::from(v), U256::zero()]);
1691 it.params.contract.code_data = vec![opcodes::OpCode::MSTORE as u8];
1692 it.run().unwrap();
1693 assert_eq!(it.mem.get(0, 32), common::hex_decode(v).unwrap().as_slice());
1694 it.stack.push_n(&[U256::one(), U256::zero()]);
1695 it.params.contract.code_data = vec![opcodes::OpCode::MSTORE as u8];
1696 it.run().unwrap();
1697 assert_eq!(
1698 it.mem.get(0, 32),
1699 common::hex_decode("0000000000000000000000000000000000000000000000000000000000000001")
1700 .unwrap()
1701 .as_slice()
1702 );
1703 }
1704
1705 #[test]
1706 fn test_op_sstore_eip_1283() {
1707 let data = vec![
1709 ("0x60006000556000600055", 412, 0, 0),
1710 ("0x60006000556001600055", 20212, 0, 0),
1711 ("0x60016000556000600055", 20212, 19800, 0),
1712 ("0x60016000556002600055", 20212, 0, 0),
1713 ("0x60016000556001600055", 20212, 0, 0),
1714 ("0x60006000556000600055", 5212, 15000, 1),
1715 ("0x60006000556001600055", 5212, 4800, 1),
1716 ("0x60006000556002600055", 5212, 0, 1),
1717 ("0x60026000556000600055", 5212, 15000, 1),
1718 ("0x60026000556003600055", 5212, 0, 1),
1719 ("0x60026000556001600055", 5212, 4800, 1),
1720 ("0x60026000556002600055", 5212, 0, 1),
1721 ("0x60016000556000600055", 5212, 15000, 1),
1722 ("0x60016000556002600055", 5212, 0, 1),
1723 ("0x60016000556001600055", 412, 0, 1),
1724 ("0x600160005560006000556001600055", 40218, 19800, 0),
1725 ("0x600060005560016000556000600055", 10218, 19800, 1),
1726 ];
1727 for (code, use_gas, refund, origin) in data {
1728 let mut it = default_interpreter();;
1729 it.cfg.eip1283 = true;
1730 assert_eq!(it.gas, it.context.gas_limit);
1731 it.data_provider
1732 .set_storage_origin(&it.params.contract.code_address, H256::zero(), H256::from(origin));
1733 it.data_provider
1734 .set_storage(&it.params.contract.code_address, H256::zero(), H256::from(origin));
1735 it.params.contract.code_data = common::hex_decode(code).unwrap();
1736 it.run().unwrap();
1737 assert_eq!(it.gas, it.context.gas_limit - use_gas);
1738 assert_eq!(it.data_provider.get_refund(&Address::zero()), refund);
1739 }
1740 }
1741
1742 #[test]
1743 fn test_op_invalid() {
1744 let mut it = default_interpreter();;
1745 it.params.contract.code_data = common::hex_decode("0xfb").unwrap();
1746 let r = it.run();
1747 assert!(r.is_err());
1748 assert_eq!(r.err(), Some(err::Error::InvalidOpcode))
1749 }
1750}