aboutsummaryrefslogtreecommitdiffstats
path: root/core/vm
diff options
context:
space:
mode:
authorJeffrey Wilcke <geffobscura@gmail.com>2016-06-18 17:17:57 +0800
committerPéter Szilágyi <peterke@gmail.com>2016-06-22 16:38:25 +0800
commit7a5b571c671e70e0e4807cf971c15e2d1e09d33d (patch)
tree4ae6b6e4be80171e26aab26b88124cd87a3c53d4 /core/vm
parent599e3c7b3f22b157c4f643a48d391cf972384099 (diff)
downloadgo-tangerine-7a5b571c671e70e0e4807cf971c15e2d1e09d33d.tar.gz
go-tangerine-7a5b571c671e70e0e4807cf971c15e2d1e09d33d.tar.zst
go-tangerine-7a5b571c671e70e0e4807cf971c15e2d1e09d33d.zip
test, cmd/evm, core, core/vm: illegal code hash implementation
This implements a generic approach to enabling soft forks by allowing anyone to put in hashes of contracts that should not be interacted from. This will help "The DAO" in their endevour to stop any whithdrawals from any DAO contract by convincing the mining community to accept their code hash.
Diffstat (limited to 'core/vm')
-rw-r--r--core/vm/environment.go3
-rw-r--r--core/vm/jit_test.go9
-rw-r--r--core/vm/runtime/env.go26
-rw-r--r--core/vm/runtime/runtime.go23
4 files changed, 35 insertions, 26 deletions
diff --git a/core/vm/environment.go b/core/vm/environment.go
index 747627565..37817be9e 100644
--- a/core/vm/environment.go
+++ b/core/vm/environment.go
@@ -73,6 +73,8 @@ type Environment interface {
DelegateCall(me ContractRef, addr common.Address, data []byte, gas, price *big.Int) ([]byte, error)
// Create a new contract
Create(me ContractRef, data []byte, gas, price, value *big.Int) ([]byte, common.Address, error)
+ // Mark the code hash that was executed
+ MarkCodeHash(hash common.Hash)
}
// Vm is the basic interface for an implementation of the EVM.
@@ -96,6 +98,7 @@ type Database interface {
GetCode(common.Address) []byte
SetCode(common.Address, []byte)
+ GetCodeHash(common.Address) common.Hash
AddRefund(*big.Int)
GetRefund() *big.Int
diff --git a/core/vm/jit_test.go b/core/vm/jit_test.go
index 403c15a8d..a9ddd48a5 100644
--- a/core/vm/jit_test.go
+++ b/core/vm/jit_test.go
@@ -175,10 +175,11 @@ func NewEnv(noJit, forceJit bool) *Env {
return env
}
-func (self *Env) RuleSet() RuleSet { return ruleSet{new(big.Int)} }
-func (self *Env) Vm() Vm { return self.evm }
-func (self *Env) Origin() common.Address { return common.Address{} }
-func (self *Env) BlockNumber() *big.Int { return big.NewInt(0) }
+func (self *Env) MarkCodeHash(common.Hash) {}
+func (self *Env) RuleSet() RuleSet { return ruleSet{new(big.Int)} }
+func (self *Env) Vm() Vm { return self.evm }
+func (self *Env) Origin() common.Address { return common.Address{} }
+func (self *Env) BlockNumber() *big.Int { return big.NewInt(0) }
func (self *Env) AddStructLog(log StructLog) {
}
func (self *Env) StructLogs() []StructLog {
diff --git a/core/vm/runtime/env.go b/core/vm/runtime/env.go
index d8c98e545..c510be759 100644
--- a/core/vm/runtime/env.go
+++ b/core/vm/runtime/env.go
@@ -27,9 +27,10 @@ import (
// Env is a basic runtime environment required for running the EVM.
type Env struct {
- ruleSet vm.RuleSet
- depth int
- state *state.StateDB
+ ruleSet vm.RuleSet
+ depth int
+ state *state.StateDB
+ illegalHashes []common.Hash
origin common.Address
coinbase common.Address
@@ -49,14 +50,15 @@ type Env struct {
// NewEnv returns a new vm.Environment
func NewEnv(cfg *Config, state *state.StateDB) vm.Environment {
env := &Env{
- ruleSet: cfg.RuleSet,
- state: state,
- origin: cfg.Origin,
- coinbase: cfg.Coinbase,
- number: cfg.BlockNumber,
- time: cfg.Time,
- difficulty: cfg.Difficulty,
- gasLimit: cfg.GasLimit,
+ ruleSet: cfg.RuleSet,
+ illegalHashes: cfg.illegalHashes,
+ state: state,
+ origin: cfg.Origin,
+ coinbase: cfg.Coinbase,
+ number: cfg.BlockNumber,
+ time: cfg.Time,
+ difficulty: cfg.Difficulty,
+ gasLimit: cfg.GasLimit,
}
env.evm = vm.New(env, vm.Config{
Debug: cfg.Debug,
@@ -79,6 +81,8 @@ func (self *Env) AddStructLog(log vm.StructLog) {
self.logs = append(self.logs, log)
}
+func (self *Env) MarkCodeHash(hash common.Hash) {}
+
func (self *Env) RuleSet() vm.RuleSet { return self.ruleSet }
func (self *Env) Vm() vm.Vm { return self.evm }
func (self *Env) Origin() common.Address { return self.origin }
diff --git a/core/vm/runtime/runtime.go b/core/vm/runtime/runtime.go
index 309d508c3..9b75fcaad 100644
--- a/core/vm/runtime/runtime.go
+++ b/core/vm/runtime/runtime.go
@@ -35,17 +35,18 @@ func (ruleSet) IsHomestead(*big.Int) bool { return true }
// Config is a basic type specifying certain configuration flags for running
// the EVM.
type Config struct {
- RuleSet vm.RuleSet
- Difficulty *big.Int
- Origin common.Address
- Coinbase common.Address
- BlockNumber *big.Int
- Time *big.Int
- GasLimit *big.Int
- GasPrice *big.Int
- Value *big.Int
- DisableJit bool // "disable" so it's enabled by default
- Debug bool
+ RuleSet vm.RuleSet
+ Difficulty *big.Int
+ Origin common.Address
+ Coinbase common.Address
+ BlockNumber *big.Int
+ Time *big.Int
+ GasLimit *big.Int
+ GasPrice *big.Int
+ Value *big.Int
+ DisableJit bool // "disable" so it's enabled by default
+ Debug bool
+ illegalHashes []common.Hash
State *state.StateDB
GetHashFn func(n uint64) common.Hash