@@ -27,14 +27,14 @@ import (
27
27
28
28
// Call executes within the given contract
29
29
func Call (env vm.Environment , caller vm.ContractRef , addr common.Address , input []byte , gas , gasPrice , value * big.Int ) (ret []byte , err error ) {
30
- ret , _ , err = exec (env , caller , & addr , & addr , input , env .Db ().GetCode (addr ), gas , gasPrice , value )
30
+ ret , _ , err = exec (env , caller , & addr , & addr , env . Db (). GetCodeHash ( addr ), input , env .Db ().GetCode (addr ), gas , gasPrice , value )
31
31
return ret , err
32
32
}
33
33
34
34
// CallCode executes the given address' code as the given contract address
35
35
func CallCode (env vm.Environment , caller vm.ContractRef , addr common.Address , input []byte , gas , gasPrice , value * big.Int ) (ret []byte , err error ) {
36
36
callerAddr := caller .Address ()
37
- ret , _ , err = exec (env , caller , & callerAddr , & addr , input , env .Db ().GetCode (addr ), gas , gasPrice , value )
37
+ ret , _ , err = exec (env , caller , & callerAddr , & addr , env . Db (). GetCodeHash ( addr ), input , env .Db ().GetCode (addr ), gas , gasPrice , value )
38
38
return ret , err
39
39
}
40
40
@@ -43,13 +43,13 @@ func DelegateCall(env vm.Environment, caller vm.ContractRef, addr common.Address
43
43
callerAddr := caller .Address ()
44
44
originAddr := env .Origin ()
45
45
callerValue := caller .Value ()
46
- ret , _ , err = execDelegateCall (env , caller , & originAddr , & callerAddr , & addr , input , env .Db ().GetCode (addr ), gas , gasPrice , callerValue )
46
+ ret , _ , err = execDelegateCall (env , caller , & originAddr , & callerAddr , & addr , env . Db (). GetCodeHash ( addr ), input , env .Db ().GetCode (addr ), gas , gasPrice , callerValue )
47
47
return ret , err
48
48
}
49
49
50
50
// Create creates a new contract with the given code
51
51
func Create (env vm.Environment , caller vm.ContractRef , code []byte , gas , gasPrice , value * big.Int ) (ret []byte , address common.Address , err error ) {
52
- ret , address , err = exec (env , caller , nil , nil , nil , code , gas , gasPrice , value )
52
+ ret , address , err = exec (env , caller , nil , nil , crypto . Keccak256Hash ( code ), nil , code , gas , gasPrice , value )
53
53
// Here we get an error if we run into maximum stack depth,
54
54
// See: https://github.com/ethereum/yellowpaper/pull/131
55
55
// and YP definitions for CREATE instruction
@@ -59,7 +59,7 @@ func Create(env vm.Environment, caller vm.ContractRef, code []byte, gas, gasPric
59
59
return ret , address , err
60
60
}
61
61
62
- func exec (env vm.Environment , caller vm.ContractRef , address , codeAddr * common.Address , input , code []byte , gas , gasPrice , value * big.Int ) (ret []byte , addr common.Address , err error ) {
62
+ func exec (env vm.Environment , caller vm.ContractRef , address , codeAddr * common.Address , codeHash common. Hash , input , code []byte , gas , gasPrice , value * big.Int ) (ret []byte , addr common.Address , err error ) {
63
63
evm := env .Vm ()
64
64
// Depth check execution. Fail if we're trying to execute above the
65
65
// limit.
@@ -105,7 +105,7 @@ func exec(env vm.Environment, caller vm.ContractRef, address, codeAddr *common.A
105
105
// EVM. The contract is a scoped environment for this execution context
106
106
// only.
107
107
contract := vm .NewContract (caller , to , value , gas , gasPrice )
108
- contract .SetCallCode (codeAddr , code )
108
+ contract .SetCallCode (codeAddr , codeHash , code )
109
109
defer contract .Finalise ()
110
110
111
111
ret , err = evm .Run (contract , input )
@@ -135,7 +135,7 @@ func exec(env vm.Environment, caller vm.ContractRef, address, codeAddr *common.A
135
135
return ret , addr , err
136
136
}
137
137
138
- func execDelegateCall (env vm.Environment , caller vm.ContractRef , originAddr , toAddr , codeAddr * common.Address , input , code []byte , gas , gasPrice , value * big.Int ) (ret []byte , addr common.Address , err error ) {
138
+ func execDelegateCall (env vm.Environment , caller vm.ContractRef , originAddr , toAddr , codeAddr * common.Address , codeHash common. Hash , input , code []byte , gas , gasPrice , value * big.Int ) (ret []byte , addr common.Address , err error ) {
139
139
evm := env .Vm ()
140
140
// Depth check execution. Fail if we're trying to execute above the
141
141
// limit.
@@ -155,7 +155,7 @@ func execDelegateCall(env vm.Environment, caller vm.ContractRef, originAddr, toA
155
155
156
156
// Iinitialise a new contract and make initialise the delegate values
157
157
contract := vm .NewContract (caller , to , value , gas , gasPrice ).AsDelegate ()
158
- contract .SetCallCode (codeAddr , code )
158
+ contract .SetCallCode (codeAddr , codeHash , code )
159
159
defer contract .Finalise ()
160
160
161
161
ret , err = evm .Run (contract , input )
0 commit comments