go-ethereum/vm/common.go

128 lines
2.9 KiB
Go
Raw Normal View History

2014-10-18 14:31:20 +03:00
package vm
import (
"math"
"math/big"
"github.com/ethereum/go-ethereum/ethutil"
2014-10-31 13:56:05 +02:00
"github.com/ethereum/go-ethereum/logger"
)
2014-10-31 13:56:05 +02:00
var vmlogger = logger.NewLogger("VM")
// Global Debug flag indicating Debug VM (full logging)
var Debug bool
2015-01-19 12:18:34 +02:00
type Type byte
const (
2015-01-19 12:18:34 +02:00
StdVmTy Type = iota
JitVmTy
MaxVmTy
)
2015-02-01 16:30:29 +02:00
func NewVm(env Environment) VirtualMachine {
switch env.VmType() {
case JitVmTy:
return NewJitVm(env)
default:
vmlogger.Infoln("unsupported vm type %d", env.VmType())
fallthrough
case StdVmTy:
return New(env)
}
}
var (
2015-03-02 17:32:02 +02:00
GasQuickStep = big.NewInt(2)
GasFastestStep = big.NewInt(3)
GasFastStep = big.NewInt(5)
GasMidStep = big.NewInt(8)
GasSlowStep = big.NewInt(10)
GasExtStep = big.NewInt(20)
GasStorageGet = big.NewInt(50)
GasStorageAdd = big.NewInt(20000)
GasStorageMod = big.NewInt(5000)
2015-03-03 12:56:43 +02:00
GasLogBase = big.NewInt(375)
GasLogTopic = big.NewInt(375)
2015-03-03 12:11:11 +02:00
GasLogByte = big.NewInt(8)
2015-03-02 17:32:02 +02:00
GasCreate = big.NewInt(32000)
2015-03-03 14:29:52 +02:00
GasCreateByte = big.NewInt(200)
2015-03-02 17:32:02 +02:00
GasCall = big.NewInt(40)
2015-03-03 12:56:43 +02:00
GasCallValueTransfer = big.NewInt(9000)
GasStipend = big.NewInt(2300)
2015-03-02 17:32:02 +02:00
GasCallNewAccount = big.NewInt(25000)
GasReturn = big.NewInt(0)
GasStop = big.NewInt(0)
GasJumpDest = big.NewInt(1)
RefundStorage = big.NewInt(15000)
RefundSuicide = big.NewInt(24000)
GasMemWord = big.NewInt(3)
2015-03-03 12:11:11 +02:00
GasQuadCoeffDenom = big.NewInt(512)
2015-03-02 17:32:02 +02:00
GasContractByte = big.NewInt(200)
GasTransaction = big.NewInt(21000)
2015-03-03 14:29:52 +02:00
GasTxDataNonzeroByte = big.NewInt(68)
GasTxDataZeroByte = big.NewInt(4)
GasTx = big.NewInt(21000)
2015-03-03 12:11:11 +02:00
GasExp = big.NewInt(10)
GasExpByte = big.NewInt(10)
2015-03-02 17:32:02 +02:00
GasSha3Base = big.NewInt(30)
GasSha3Word = big.NewInt(6)
GasSha256Base = big.NewInt(60)
GasSha256Word = big.NewInt(12)
GasRipemdBase = big.NewInt(600)
GasRipemdWord = big.NewInt(12)
GasEcrecover = big.NewInt(3000)
GasIdentityBase = big.NewInt(15)
GasIdentityWord = big.NewInt(3)
GasCopyWord = big.NewInt(3)
Pow256 = ethutil.BigPow(2, 256)
LogTyPretty byte = 0x1
LogTyDiff byte = 0x2
2014-10-15 18:12:26 +03:00
U256 = ethutil.U256
S256 = ethutil.S256
2015-03-02 17:32:02 +02:00
Zero = ethutil.Big0
)
2015-01-06 21:22:31 +02:00
const MaxCallDepth = 1025
func calcMemSize(off, l *big.Int) *big.Int {
if l.Cmp(ethutil.Big0) == 0 {
return ethutil.Big0
}
return new(big.Int).Add(off, l)
}
// Simple helper
func u256(n int64) *big.Int {
return big.NewInt(n)
}
// Mainly used for print variables and passing to Print*
func toValue(val *big.Int) interface{} {
// Let's assume a string on right padded zero's
b := val.Bytes()
if b[0] != 0 && b[len(b)-1] == 0x0 && b[len(b)-2] == 0x0 {
return string(b)
}
return val
}
func getCode(code []byte, start, size uint64) []byte {
x := uint64(math.Min(float64(start), float64(len(code))))
y := uint64(math.Min(float64(x+size), float64(len(code))))
return ethutil.RightPadBytes(code[x:y], int(size))
}