-
Notifications
You must be signed in to change notification settings - Fork 6
/
evm.go
175 lines (147 loc) · 4.51 KB
/
evm.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package executor
import (
"bytes"
"math/big"
"os"
"reflect"
"github.com/33cn/chain33/common/address"
drivers "github.com/33cn/chain33/system/dapp"
"github.com/33cn/chain33/types"
"github.com/aBitcoinDiamond/slave/executor/evm/executor/vm/common"
"github.com/aBitcoinDiamond/slave/executor/evm/executor/vm/runtime"
"github.com/aBitcoinDiamond/slave/executor/evm/executor/vm/state"
evmtypes "github.com/aBitcoinDiamond/slave/executor/evm/types"
)
var (
evmDebug = false
// EvmAddress 本合约地址
EvmAddress = address.ExecAddress(types.ExecName(evmtypes.ExecutorName))
)
var driverName = evmtypes.ExecutorName
func init() {
ety := types.LoadExecutorType(driverName)
ety.InitFuncList(types.ListMethod(&EVMExecutor{}))
}
// Init 初始化本合约对象
func Init(name string, sub []byte) {
driverName = name
drivers.Register(driverName, newEVMDriver, types.GetDappFork(driverName, evmtypes.EVMEnable))
EvmAddress = address.ExecAddress(types.ExecName(name))
// 初始化硬分叉数据
state.InitForkData()
}
// GetName 返回本合约名称
func GetName() string {
return newEVMDriver().GetName()
}
func newEVMDriver() drivers.Driver {
evm := NewEVMExecutor()
evm.vmCfg.Debug = evmDebug
return evm
}
// EVMExecutor EVM执行器结构
type EVMExecutor struct {
drivers.DriverBase
vmCfg *runtime.Config
mStateDB *state.MemoryStateDB
}
// NewEVMExecutor 新创建执行器对象
func NewEVMExecutor() *EVMExecutor {
exec := &EVMExecutor{}
exec.vmCfg = &runtime.Config{}
exec.vmCfg.Tracer = runtime.NewJSONLogger(os.Stdout)
exec.SetChild(exec)
return exec
}
// GetFuncMap 获取方法列表
func (evm *EVMExecutor) GetFuncMap() map[string]reflect.Method {
ety := types.LoadExecutorType(driverName)
return ety.GetExecFuncMap()
}
// GetDriverName 获取本合约驱动名称
func (evm *EVMExecutor) GetDriverName() string {
return evmtypes.ExecutorName
}
// ExecutorOrder 设置localdb的EnableRead
func (evm *EVMExecutor) ExecutorOrder() int64 {
if types.IsFork(evm.GetHeight(), "ForkLocalDBAccess") {
return drivers.ExecLocalSameTime
}
return evm.DriverBase.ExecutorOrder()
}
// Allow 允许哪些交易在本命执行器执行
func (evm *EVMExecutor) Allow(tx *types.Transaction, index int) error {
err := evm.DriverBase.Allow(tx, index)
if err == nil {
return nil
}
//增加新的规则:
//主链: user.evm.xxx 执行 evm 合约
//平行链: user.p.guodun.user.evm.xxx 执行 evm 合约
exec := types.GetParaExec(tx.Execer)
if evm.AllowIsUserDot2(exec) {
return nil
}
return types.ErrNotAllow
}
// IsFriend 是否允许对应的KEY
func (evm *EVMExecutor) IsFriend(myexec, writekey []byte, othertx *types.Transaction) bool {
if othertx == nil {
return false
}
exec := types.GetParaExec(othertx.Execer)
if exec == nil || len(bytes.TrimSpace(exec)) == 0 {
return false
}
if bytes.HasPrefix(exec, evmtypes.UserPrefix) || bytes.Equal(exec, evmtypes.ExecerEvm) {
if bytes.HasPrefix(writekey, []byte("mavl-evm-")) {
return true
}
}
return false
}
// CheckReceiptExecOk return true to check if receipt ty is ok
func (evm *EVMExecutor) CheckReceiptExecOk() bool {
return true
}
// 生成一个新的合约对象地址
func (evm *EVMExecutor) getNewAddr(txHash []byte) common.Address {
return common.NewAddress(txHash)
}
// CheckTx 校验交易
func (evm *EVMExecutor) CheckTx(tx *types.Transaction, index int) error {
return nil
}
// GetActionName 获取运行状态名
func (evm *EVMExecutor) GetActionName(tx *types.Transaction) string {
if bytes.Equal(tx.Execer, []byte(types.ExecName(evmtypes.ExecutorName))) {
return types.ExecName(evmtypes.ExecutorName)
}
return tx.ActionName()
}
// GetMStateDB 获取内部状态数据库
func (evm *EVMExecutor) GetMStateDB() *state.MemoryStateDB {
return evm.mStateDB
}
// GetVMConfig 获取VM配置
func (evm *EVMExecutor) GetVMConfig() *runtime.Config {
return evm.vmCfg
}
// NewEVMContext 构造一个新的EVM上下文对象
func (evm *EVMExecutor) NewEVMContext(msg *common.Message) runtime.Context {
return runtime.Context{
CanTransfer: CanTransfer,
Transfer: Transfer,
GetHash: GetHashFn(evm.GetAPI()),
Origin: msg.From(),
Coinbase: nil,
BlockNumber: new(big.Int).SetInt64(evm.GetHeight()),
Time: new(big.Int).SetInt64(evm.GetBlockTime()),
Difficulty: new(big.Int).SetUint64(evm.GetDifficulty()),
GasLimit: msg.GasLimit(),
GasPrice: msg.GasPrice(),
}
}