environment.go 1.52 KB
Newer Older
obscuren's avatar
obscuren committed
1
package vm
2 3

import (
4
	"errors"
5
	"fmt"
6 7
	"math/big"

8
	"github.com/ethereum/go-ethereum/ethutil"
obscuren's avatar
obscuren committed
9
	"github.com/ethereum/go-ethereum/state"
10 11 12
)

type Environment interface {
obscuren's avatar
obscuren committed
13
	State() *state.StateDB
14 15 16

	Origin() []byte
	BlockNumber() *big.Int
17
	GetHash(n uint64) []byte
18 19 20
	Coinbase() []byte
	Time() int64
	Difficulty() *big.Int
obscuren's avatar
obscuren committed
21
	GasLimit() *big.Int
22
	Transfer(from, to Account, amount *big.Int) error
obscuren's avatar
obscuren committed
23
	AddLog(state.Log)
24 25 26 27

	Depth() int
	SetDepth(i int)

obscuren's avatar
obscuren committed
28 29 30
	Call(me ContextRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error)
	CallCode(me ContextRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error)
	Create(me ContextRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error, ContextRef)
31 32
}

33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
type Account interface {
	SubBalance(amount *big.Int)
	AddBalance(amount *big.Int)
	Balance() *big.Int
}

// generic transfer method
func Transfer(from, to Account, amount *big.Int) error {
	if from.Balance().Cmp(amount) < 0 {
		return errors.New("Insufficient balance in account")
	}

	from.SubBalance(amount)
	to.AddBalance(amount)

	return nil
}
obscuren's avatar
obscuren committed
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

type Log struct {
	address []byte
	topics  [][]byte
	data    []byte
}

func (self *Log) Address() []byte {
	return self.address
}

func (self *Log) Topics() [][]byte {
	return self.topics
}

func (self *Log) Data() []byte {
	return self.data
}

func (self *Log) RlpData() interface{} {
	return []interface{}{self.address, ethutil.ByteSliceToInterface(self.topics), self.data}
}
72 73 74 75

func (self *Log) String() string {
	return fmt.Sprintf("[A=%x T=%x D=%x]", self.address, self.topics, self.data)
}