99853ac3ce
This moves call and create to the specified environments. Vms are no longer re-used. Vm uses environment's Call(Code) and Create in order to execute new contracts or transfer value between accounts. State transition now uses the same mechanism described above.
55 lines
1.2 KiB
Go
55 lines
1.2 KiB
Go
package vm
|
|
|
|
import (
|
|
"errors"
|
|
"math/big"
|
|
|
|
"github.com/ethereum/go-ethereum/ethutil"
|
|
"github.com/ethereum/go-ethereum/state"
|
|
)
|
|
|
|
type Environment interface {
|
|
State() *state.State
|
|
|
|
Origin() []byte
|
|
BlockNumber() *big.Int
|
|
PrevHash() []byte
|
|
Coinbase() []byte
|
|
Time() int64
|
|
Difficulty() *big.Int
|
|
BlockHash() []byte
|
|
GasLimit() *big.Int
|
|
Transfer(from, to Account, amount *big.Int) error
|
|
AddLog(*state.Log)
|
|
|
|
Depth() int
|
|
SetDepth(i int)
|
|
|
|
Call(me ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error)
|
|
CallCode(me ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error)
|
|
Create(me ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error, ClosureRef)
|
|
}
|
|
|
|
type Object interface {
|
|
GetStorage(key *big.Int) *ethutil.Value
|
|
SetStorage(key *big.Int, value *ethutil.Value)
|
|
}
|
|
|
|
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
|
|
}
|