common.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package vm
  2. import (
  3. "math/big"
  4. "github.com/ethereum/go-ethereum/ethutil"
  5. "github.com/ethereum/go-ethereum/logger"
  6. )
  7. var vmlogger = logger.NewLogger("VM")
  8. type Type byte
  9. const (
  10. StdVmTy Type = iota
  11. JitVmTy
  12. MaxVmTy
  13. )
  14. func NewVm(env Environment) VirtualMachine {
  15. switch env.VmType() {
  16. case JitVmTy:
  17. return NewJitVm(env)
  18. default:
  19. vmlogger.Infoln("unsupported vm type %d", env.VmType())
  20. fallthrough
  21. case StdVmTy:
  22. return New(env)
  23. }
  24. }
  25. var (
  26. GasStep = big.NewInt(1)
  27. GasSha = big.NewInt(10)
  28. GasSLoad = big.NewInt(20)
  29. GasSStore = big.NewInt(100)
  30. GasSStoreRefund = big.NewInt(100)
  31. GasBalance = big.NewInt(20)
  32. GasCreate = big.NewInt(100)
  33. GasCall = big.NewInt(20)
  34. GasCreateByte = big.NewInt(5)
  35. GasSha3Byte = big.NewInt(10)
  36. GasSha256Byte = big.NewInt(50)
  37. GasRipemdByte = big.NewInt(50)
  38. GasMemory = big.NewInt(1)
  39. GasData = big.NewInt(5)
  40. GasTx = big.NewInt(500)
  41. GasLog = big.NewInt(32)
  42. GasSha256 = big.NewInt(50)
  43. GasRipemd = big.NewInt(50)
  44. GasEcrecover = big.NewInt(500)
  45. GasMemCpy = big.NewInt(1)
  46. Pow256 = ethutil.BigPow(2, 256)
  47. LogTyPretty byte = 0x1
  48. LogTyDiff byte = 0x2
  49. U256 = ethutil.U256
  50. S256 = ethutil.S256
  51. )
  52. const MaxCallDepth = 1025
  53. func calcMemSize(off, l *big.Int) *big.Int {
  54. if l.Cmp(ethutil.Big0) == 0 {
  55. return ethutil.Big0
  56. }
  57. return new(big.Int).Add(off, l)
  58. }
  59. // Simple helper
  60. func u256(n int64) *big.Int {
  61. return big.NewInt(n)
  62. }
  63. // Mainly used for print variables and passing to Print*
  64. func toValue(val *big.Int) interface{} {
  65. // Let's assume a string on right padded zero's
  66. b := val.Bytes()
  67. if b[0] != 0 && b[len(b)-1] == 0x0 && b[len(b)-2] == 0x0 {
  68. return string(b)
  69. }
  70. return val
  71. }