vm_test.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package vm
  2. // import (
  3. // "bytes"
  4. // "fmt"
  5. // "io/ioutil"
  6. // "log"
  7. // "math/big"
  8. // "os"
  9. // "testing"
  10. // "github.com/ethereum/go-ethereum/crypto"
  11. // "github.com/ethereum/go-ethereum/ethutil"
  12. // "github.com/ethereum/go-ethereum/logger"
  13. // "github.com/ethereum/go-ethereum/state"
  14. // "github.com/ethereum/go-ethereum/trie"
  15. // // "github.com/obscuren/mutan"
  16. // )
  17. // type TestEnv struct{}
  18. // func (TestEnv) Origin() []byte { return nil }
  19. // func (TestEnv) BlockNumber() *big.Int { return nil }
  20. // func (TestEnv) BlockHash() []byte { return nil }
  21. // func (TestEnv) PrevHash() []byte { return nil }
  22. // func (TestEnv) Coinbase() []byte { return nil }
  23. // func (TestEnv) Time() int64 { return 0 }
  24. // func (TestEnv) GasLimit() *big.Int { return nil }
  25. // func (TestEnv) Difficulty() *big.Int { return nil }
  26. // func (TestEnv) Value() *big.Int { return nil }
  27. // func (TestEnv) AddLog(state.Log) {}
  28. // func (TestEnv) Transfer(from, to Account, amount *big.Int) error {
  29. // return nil
  30. // }
  31. // // This is likely to fail if anything ever gets looked up in the state trie :-)
  32. // func (TestEnv) State() *state.State {
  33. // return state.New(trie.New(nil, ""))
  34. // }
  35. // const mutcode = `
  36. // var x = 0;
  37. // for i := 0; i < 10; i++ {
  38. // x = i
  39. // }
  40. // return x`
  41. // func setup(level logger.LogLevel, typ Type) (*Closure, VirtualMachine) {
  42. // code, err := ethutil.Compile(mutcode, true)
  43. // if err != nil {
  44. // log.Fatal(err)
  45. // }
  46. // // Pipe output to /dev/null
  47. // logger.AddLogSystem(logger.NewStdLogSystem(ioutil.Discard, log.LstdFlags, level))
  48. // ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "")
  49. // stateObject := state.NewStateObject([]byte{'j', 'e', 'f', 'f'})
  50. // callerClosure := NewClosure(nil, stateObject, stateObject, code, big.NewInt(1000000), big.NewInt(0))
  51. // return callerClosure, New(TestEnv{}, typ)
  52. // }
  53. // var big9 = ethutil.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000009")
  54. // func TestDebugVm(t *testing.T) {
  55. // // if mutan.Version < "0.6" {
  56. // // t.Skip("skipping for mutan version", mutan.Version, " < 0.6")
  57. // // }
  58. // closure, vm := setup(logger.DebugLevel, DebugVmTy)
  59. // ret, _, e := closure.Call(vm, nil)
  60. // if e != nil {
  61. // t.Fatalf("Call returned error: %v", e)
  62. // }
  63. // if !bytes.Equal(ret, big9) {
  64. // t.Errorf("Wrong return value '%x', want '%x'", ret, big9)
  65. // }
  66. // }
  67. // func TestVm(t *testing.T) {
  68. // // if mutan.Version < "0.6" {
  69. // // t.Skip("skipping for mutan version", mutan.Version, " < 0.6")
  70. // // }
  71. // closure, vm := setup(logger.DebugLevel, StandardVmTy)
  72. // ret, _, e := closure.Call(vm, nil)
  73. // if e != nil {
  74. // t.Fatalf("Call returned error: %v", e)
  75. // }
  76. // if !bytes.Equal(ret, big9) {
  77. // t.Errorf("Wrong return value '%x', want '%x'", ret, big9)
  78. // }
  79. // }
  80. // func BenchmarkDebugVm(b *testing.B) {
  81. // closure, vm := setup(logger.InfoLevel, DebugVmTy)
  82. // b.ResetTimer()
  83. // for i := 0; i < b.N; i++ {
  84. // closure.Call(vm, nil)
  85. // }
  86. // }
  87. // func BenchmarkVm(b *testing.B) {
  88. // closure, vm := setup(logger.InfoLevel, StandardVmTy)
  89. // b.ResetTimer()
  90. // for i := 0; i < b.N; i++ {
  91. // closure.Call(vm, nil)
  92. // }
  93. // }
  94. // func RunCode(mutCode string, typ Type) []byte {
  95. // code, err := ethutil.Compile(mutCode, true)
  96. // if err != nil {
  97. // log.Fatal(err)
  98. // }
  99. // logger.AddLogSystem(logger.NewStdLogSystem(os.Stdout, log.LstdFlags, logger.InfoLevel))
  100. // ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "")
  101. // stateObject := state.NewStateObject([]byte{'j', 'e', 'f', 'f'})
  102. // closure := NewClosure(nil, stateObject, stateObject, code, big.NewInt(1000000), big.NewInt(0))
  103. // vm := New(TestEnv{}, typ)
  104. // ret, _, e := closure.Call(vm, nil)
  105. // if e != nil {
  106. // fmt.Println(e)
  107. // }
  108. // return ret
  109. // }
  110. // func TestBuildInSha256(t *testing.T) {
  111. // ret := RunCode(`
  112. // var in = 42
  113. // var out = 0
  114. // call(0x2, 0, 10000, in, out)
  115. // return out
  116. // `, DebugVmTy)
  117. // exp := crypto.Sha256(ethutil.LeftPadBytes([]byte{42}, 32))
  118. // if bytes.Compare(ret, exp) != 0 {
  119. // t.Errorf("Expected %x, got %x", exp, ret)
  120. // }
  121. // }
  122. // func TestBuildInRipemd(t *testing.T) {
  123. // ret := RunCode(`
  124. // var in = 42
  125. // var out = 0
  126. // call(0x3, 0, 10000, in, out)
  127. // return out
  128. // `, DebugVmTy)
  129. // exp := ethutil.RightPadBytes(crypto.Ripemd160(ethutil.LeftPadBytes([]byte{42}, 32)), 32)
  130. // if bytes.Compare(ret, exp) != 0 {
  131. // t.Errorf("Expected %x, got %x", exp, ret)
  132. // }
  133. // }
  134. // func TestOog(t *testing.T) {
  135. // // This tests takes a long time and will eventually run out of gas
  136. // // t.Skip()
  137. // logger.AddLogSystem(logger.NewStdLogSystem(os.Stdout, log.LstdFlags, logger.InfoLevel))
  138. // ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "")
  139. // stateObject := state.NewStateObject([]byte{'j', 'e', 'f', 'f'})
  140. // closure := NewClosure(nil, stateObject, stateObject, ethutil.Hex2Bytes("60ff60ff600057"), big.NewInt(1000000), big.NewInt(0))
  141. // vm := New(TestEnv{}, DebugVmTy)
  142. // _, _, e := closure.Call(vm, nil)
  143. // if e != nil {
  144. // fmt.Println(e)
  145. // }
  146. // }