instructions_test.go 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. package vm
  2. import (
  3. "fmt"
  4. "math/big"
  5. "testing"
  6. "github.com/ethereum/go-ethereum/common"
  7. "github.com/ethereum/go-ethereum/params"
  8. )
  9. func TestByteOp(t *testing.T) {
  10. var (
  11. env = NewEVM(Context{}, nil, params.TestChainConfig, Config{EnableJit: false, ForceJit: false})
  12. stack = newstack()
  13. )
  14. tests := []struct {
  15. v string
  16. th uint64
  17. expected *big.Int
  18. }{
  19. {"ABCDEF0908070605040302010000000000000000000000000000000000000000", 0, big.NewInt(0xAB)},
  20. {"ABCDEF0908070605040302010000000000000000000000000000000000000000", 1, big.NewInt(0xCD)},
  21. {"00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff", 0, big.NewInt(0x00)},
  22. {"00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff", 1, big.NewInt(0xCD)},
  23. {"0000000000000000000000000000000000000000000000000000000000102030", 31, big.NewInt(0x30)},
  24. {"0000000000000000000000000000000000000000000000000000000000102030", 30, big.NewInt(0x20)},
  25. {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 32, big.NewInt(0x0)},
  26. {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 0xFFFFFFFFFFFFFFFF, big.NewInt(0x0)},
  27. }
  28. pc := uint64(0)
  29. for _, test := range tests {
  30. val := new(big.Int).SetBytes(common.Hex2Bytes(test.v))
  31. th := new(big.Int).SetUint64(test.th)
  32. stack.push(val)
  33. stack.push(th)
  34. opByte(&pc, env, nil, nil, stack)
  35. actual := stack.pop()
  36. if actual.Cmp(test.expected) != 0 {
  37. t.Fatalf("Expected [%v] %v:th byte to be %v, was %v.", test.v, test.th, test.expected, actual)
  38. }
  39. }
  40. }
  41. func opBenchmark(bench *testing.B, op func(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error), args ...string) {
  42. var (
  43. env = NewEVM(Context{}, nil, params.TestChainConfig, Config{EnableJit: false, ForceJit: false})
  44. stack = newstack()
  45. )
  46. // convert args
  47. byteArgs := make([][]byte, len(args))
  48. for i, arg := range args {
  49. byteArgs[i] = common.Hex2Bytes(arg)
  50. }
  51. pc := uint64(0)
  52. bench.ResetTimer()
  53. for i := 0; i < bench.N; i++ {
  54. for _, arg := range byteArgs {
  55. a := new(big.Int).SetBytes(arg)
  56. stack.push(a)
  57. }
  58. op(&pc, env, nil, nil, stack)
  59. stack.pop()
  60. }
  61. }
  62. func precompiledBenchmark(addr, input, expected string, gas uint64, bench *testing.B) {
  63. contract := NewContract(AccountRef(common.HexToAddress("1337")),
  64. nil, new(big.Int), gas)
  65. p := PrecompiledContracts[common.HexToAddress(addr)]
  66. in := common.Hex2Bytes(input)
  67. var (
  68. res []byte
  69. err error
  70. )
  71. data := make([]byte, len(in))
  72. bench.ResetTimer()
  73. for i := 0; i < bench.N; i++ {
  74. contract.Gas = gas
  75. copy(data, in)
  76. res, err = RunPrecompiledContract(p, data, contract)
  77. }
  78. bench.StopTimer()
  79. //Check if it is correct
  80. if err != nil {
  81. bench.Error(err)
  82. return
  83. }
  84. if common.Bytes2Hex(res) != expected {
  85. bench.Error(fmt.Sprintf("Expected %v, got %v", expected, common.Bytes2Hex(res)))
  86. return
  87. }
  88. }
  89. func BenchmarkPrecompiledEcdsa(bench *testing.B) {
  90. var (
  91. addr = "01"
  92. inp = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02"
  93. exp = "000000000000000000000000ceaccac640adf55b2028469bd36ba501f28b699d"
  94. gas = uint64(4000000)
  95. )
  96. precompiledBenchmark(addr, inp, exp, gas, bench)
  97. }
  98. func BenchmarkPrecompiledSha256(bench *testing.B) {
  99. var (
  100. addr = "02"
  101. inp = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02"
  102. exp = "811c7003375852fabd0d362e40e68607a12bdabae61a7d068fe5fdd1dbbf2a5d"
  103. gas = uint64(4000000)
  104. )
  105. precompiledBenchmark(addr, inp, exp, gas, bench)
  106. }
  107. func BenchmarkPrecompiledRipeMD(bench *testing.B) {
  108. var (
  109. addr = "03"
  110. inp = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02"
  111. exp = "0000000000000000000000009215b8d9882ff46f0dfde6684d78e831467f65e6"
  112. gas = uint64(4000000)
  113. )
  114. precompiledBenchmark(addr, inp, exp, gas, bench)
  115. }
  116. func BenchmarkPrecompiledIdentity(bench *testing.B) {
  117. var (
  118. addr = "04"
  119. inp = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02"
  120. exp = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02"
  121. gas = uint64(4000000)
  122. )
  123. precompiledBenchmark(addr, inp, exp, gas, bench)
  124. }
  125. func BenchmarkOpAdd(b *testing.B) {
  126. x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  127. y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  128. opBenchmark(b, opAdd, x, y)
  129. }
  130. func BenchmarkOpSub(b *testing.B) {
  131. x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  132. y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  133. opBenchmark(b, opSub, x, y)
  134. }
  135. func BenchmarkOpMul(b *testing.B) {
  136. x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  137. y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  138. opBenchmark(b, opMul, x, y)
  139. }
  140. func BenchmarkOpDiv(b *testing.B) {
  141. x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  142. y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  143. opBenchmark(b, opDiv, x, y)
  144. }
  145. func BenchmarkOpSdiv(b *testing.B) {
  146. x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  147. y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  148. opBenchmark(b, opSdiv, x, y)
  149. }
  150. func BenchmarkOpMod(b *testing.B) {
  151. x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  152. y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  153. opBenchmark(b, opMod, x, y)
  154. }
  155. func BenchmarkOpSmod(b *testing.B) {
  156. x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  157. y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  158. opBenchmark(b, opSmod, x, y)
  159. }
  160. func BenchmarkOpExp(b *testing.B) {
  161. x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  162. y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  163. opBenchmark(b, opExp, x, y)
  164. }
  165. func BenchmarkOpSignExtend(b *testing.B) {
  166. x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  167. y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  168. opBenchmark(b, opSignExtend, x, y)
  169. }
  170. func BenchmarkOpLt(b *testing.B) {
  171. x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  172. y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  173. opBenchmark(b, opLt, x, y)
  174. }
  175. func BenchmarkOpGt(b *testing.B) {
  176. x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  177. y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  178. opBenchmark(b, opGt, x, y)
  179. }
  180. func BenchmarkOpSlt(b *testing.B) {
  181. x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  182. y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  183. opBenchmark(b, opSlt, x, y)
  184. }
  185. func BenchmarkOpSgt(b *testing.B) {
  186. x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  187. y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  188. opBenchmark(b, opSgt, x, y)
  189. }
  190. func BenchmarkOpEq(b *testing.B) {
  191. x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  192. y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  193. opBenchmark(b, opEq, x, y)
  194. }
  195. func BenchmarkOpAnd(b *testing.B) {
  196. x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  197. y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  198. opBenchmark(b, opAnd, x, y)
  199. }
  200. func BenchmarkOpOr(b *testing.B) {
  201. x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  202. y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  203. opBenchmark(b, opOr, x, y)
  204. }
  205. func BenchmarkOpXor(b *testing.B) {
  206. x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  207. y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  208. opBenchmark(b, opXor, x, y)
  209. }
  210. func BenchmarkOpByte(b *testing.B) {
  211. x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  212. y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  213. opBenchmark(b, opByte, x, y)
  214. }
  215. func BenchmarkOpAddmod(b *testing.B) {
  216. x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  217. y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  218. z := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  219. opBenchmark(b, opAddmod, x, y, z)
  220. }
  221. func BenchmarkOpMulmod(b *testing.B) {
  222. x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  223. y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  224. z := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff"
  225. opBenchmark(b, opMulmod, x, y, z)
  226. }
  227. //func BenchmarkOpSha3(b *testing.B) {
  228. // x := "0"
  229. // y := "32"
  230. //
  231. // opBenchmark(b,opSha3, x, y)
  232. //
  233. //
  234. //}