You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

206 lines
5.7 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. use evm::*;
  2. #[test]
  3. fn stack_simple_push_pop() {
  4. let mut s = Stack::new();
  5. s.push(u256::str_to_u256("1"));
  6. s.push(u256::str_to_u256("2"));
  7. s.push(u256::str_to_u256("3"));
  8. assert_eq!(s.pop(), u256::str_to_u256("3"));
  9. assert_eq!(s.pop(), u256::str_to_u256("2"));
  10. assert_eq!(s.pop(), u256::str_to_u256("1"));
  11. // assert_eq!(s.pop(), error); // TODO expect error as stack is empty
  12. }
  13. #[test]
  14. fn available_opcodes() {
  15. let s = Stack::new();
  16. println!("available opcodes {}/130", s.opcodes.len());
  17. }
  18. // arithmetic
  19. #[test]
  20. fn execute_opcodes_0() {
  21. let code = hex::decode("6005600c01").unwrap(); // 5+12
  22. let calldata = vec![];
  23. let mut s = Stack::new();
  24. s.execute(&code, &calldata, false);
  25. assert_eq!(s.pop(), u256::str_to_u256("17"));
  26. assert_eq!(s.gas, 9999999991);
  27. assert_eq!(s.pc, 5);
  28. }
  29. #[test]
  30. fn execute_opcodes_1() {
  31. let code = hex::decode("60056004016000526001601ff3").unwrap();
  32. let calldata = vec![];
  33. let mut s = Stack::new();
  34. let out = s.execute(&code, &calldata, false);
  35. assert_eq!(out[0], 0x09);
  36. assert_eq!(s.gas, 9999999976);
  37. assert_eq!(s.pc, 12);
  38. // assert_eq!(s.pop(), err); // TODO expect error as stack is empty
  39. }
  40. #[test]
  41. fn execute_opcodes_2() {
  42. let code = hex::decode("61010161010201").unwrap();
  43. let calldata = vec![];
  44. let mut s = Stack::new();
  45. s.execute(&code, &calldata, false);
  46. // assert_eq!(out[0], 0x09);
  47. assert_eq!(s.gas, 9999999991);
  48. assert_eq!(s.pc, 7);
  49. assert_eq!(s.pop(), u256::str_to_u256("515"));
  50. }
  51. #[test]
  52. fn execute_opcodes_3() {
  53. // contains calldata
  54. let code = hex::decode("60003560203501").unwrap();
  55. let calldata = hex::decode("00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000004").unwrap();
  56. let mut s = Stack::new();
  57. s.execute(&code, &calldata, false);
  58. assert_eq!(s.gas, 9999999985);
  59. assert_eq!(s.pc, 7);
  60. assert_eq!(s.pop(), u256::str_to_u256("9"));
  61. }
  62. // storage and execution
  63. #[test]
  64. fn execute_opcodes_4() {
  65. // contains loops
  66. let code = hex::decode("6000356000525b600160005103600052600051600657").unwrap();
  67. let calldata =
  68. hex::decode("0000000000000000000000000000000000000000000000000000000000000005").unwrap();
  69. let mut s = Stack::new();
  70. s.execute(&code, &calldata, false);
  71. assert_eq!(s.gas, 9999999795);
  72. assert_eq!(s.pc, 22);
  73. assert_eq!(s.stack.len(), 0);
  74. }
  75. #[test]
  76. fn execute_opcodes_5() {
  77. // contains loops, without using mem
  78. let code = hex::decode("6000355b6001900380600357").unwrap();
  79. let calldata =
  80. hex::decode("0000000000000000000000000000000000000000000000000000000000000001").unwrap();
  81. let mut s = Stack::new();
  82. s.execute(&code, &calldata, false);
  83. assert_eq!(s.gas, 9999999968);
  84. assert_eq!(s.pc, 12);
  85. let code = hex::decode("6000355b6001900380600357").unwrap();
  86. let calldata =
  87. hex::decode("0000000000000000000000000000000000000000000000000000000000000002").unwrap();
  88. let mut s = Stack::new();
  89. s.execute(&code, &calldata, false);
  90. assert_eq!(s.gas, 9999999942);
  91. assert_eq!(s.pc, 12);
  92. let code = hex::decode("6000355b6001900380600357").unwrap();
  93. let calldata =
  94. hex::decode("0000000000000000000000000000000000000000000000000000000000000005").unwrap();
  95. let mut s = Stack::new();
  96. s.execute(&code, &calldata, false);
  97. assert_eq!(s.gas, 9999999864);
  98. assert_eq!(s.pc, 12);
  99. }
  100. #[test]
  101. fn execute_opcodes_6() {
  102. // 0x36: calldata_size
  103. let code = hex::decode("366020036101000a600035045b6001900380600c57").unwrap();
  104. let calldata = hex::decode("01").unwrap();
  105. let mut s = Stack::new();
  106. s.execute(&code, &calldata, false);
  107. assert_eq!(s.gas, 9999999892);
  108. assert_eq!(s.pc, 21);
  109. assert_eq!(s.stack.len(), 1);
  110. let code = hex::decode("366020036101000a600035045b6001900380600c57").unwrap();
  111. let calldata = hex::decode("05").unwrap();
  112. let mut s = Stack::new();
  113. s.execute(&code, &calldata, false);
  114. assert_eq!(s.gas, 9999999788);
  115. assert_eq!(s.pc, 21);
  116. assert_eq!(s.stack.len(), 1);
  117. let code = hex::decode("366020036101000a600035045b6001900380600c57").unwrap();
  118. let calldata = hex::decode("0101").unwrap();
  119. let mut s = Stack::new();
  120. s.execute(&code, &calldata, false);
  121. assert_eq!(s.gas, 9999993236);
  122. assert_eq!(s.pc, 21);
  123. assert_eq!(s.stack.len(), 1);
  124. }
  125. #[test]
  126. fn execute_opcodes_7() {
  127. // contract deployment (code_copy)
  128. let code = hex::decode("600580600b6000396000f36005600401").unwrap();
  129. let calldata = hex::decode("").unwrap();
  130. let mut s = Stack::new();
  131. let out = s.execute(&code, &calldata, true);
  132. assert_eq!(s.gas, 9999999976);
  133. assert_eq!(s.pc, 10);
  134. assert_eq!(s.stack.len(), 0);
  135. assert_eq!(s.mem.len(), 32);
  136. assert_eq!(
  137. s.mem,
  138. hex::decode("6005600401000000000000000000000000000000000000000000000000000000").unwrap()
  139. );
  140. assert_eq!(out, hex::decode("6005600401").unwrap());
  141. }
  142. #[test]
  143. fn execute_opcodes_8() {
  144. let code = hex::decode("611000805151").unwrap();
  145. let calldata = hex::decode("").unwrap();
  146. let mut s = Stack::new();
  147. s.execute(&code, &calldata, false);
  148. assert_eq!(s.gas, 9999999569);
  149. assert_eq!(s.pc, 6);
  150. assert_eq!(s.stack.len(), 2);
  151. assert_eq!(s.mem.len(), 4128);
  152. }
  153. #[test]
  154. fn execute_opcodes_9() {
  155. // sstore (0x55)
  156. let code = hex::decode("60026000556001600055").unwrap();
  157. let calldata = hex::decode("").unwrap();
  158. let mut s = Stack::new();
  159. s.execute(&code, &calldata, true);
  160. assert_eq!(s.gas, 9999974988);
  161. // assert_eq!(s.gas, 9999977788); // TODO WIP geth reported gas
  162. assert_eq!(s.pc, 10);
  163. assert_eq!(s.stack.len(), 0);
  164. assert_eq!(s.storage.len(), 1);
  165. }