github.com/DxChainNetwork/dxc@v0.8.1-0.20220824085222-1162e304b6e7/consensus/dpos/vmcaller/vmcaller.go (about) 1 package vmcaller 2 3 import ( 4 "github.com/DxChainNetwork/dxc/common" 5 "github.com/DxChainNetwork/dxc/core" 6 "github.com/DxChainNetwork/dxc/core/state" 7 "github.com/DxChainNetwork/dxc/core/types" 8 "github.com/DxChainNetwork/dxc/core/vm" 9 "github.com/DxChainNetwork/dxc/params" 10 "math/big" 11 ) 12 13 // ExecuteMsg executes transaction sent to system contracts. 14 func ExecuteMsg(msg core.Message, state *state.StateDB, header *types.Header, chainContext core.ChainContext, chainConfig *params.ChainConfig) (ret []byte, err error) { 15 blockContext := core.NewEVMBlockContext(header, chainContext, nil) 16 vmenv := vm.NewEVM(blockContext, core.NewEVMTxContext(msg), state, chainConfig, vm.Config{}) 17 18 ret, _, err = vmenv.Call(vm.AccountRef(msg.From()), *msg.To(), msg.Data(), msg.Gas(), msg.Value()) 19 // Finalise the statedb so any changes can take effect, 20 // and especially if the `from` account is empty, it can be finally deleted. 21 state.Finalise(true) 22 23 return ret, err 24 } 25 26 // NewLegacyMessage builds a message for consensus and system governance actions, it will not consumes any fee. 27 func NewLegacyMessage(from common.Address, to *common.Address, nonce uint64, amount *big.Int, gasLimit uint64, gasPrice *big.Int, data []byte, checkNonce bool) types.Message { 28 return types.NewMessage(from, to, nonce, amount, gasLimit, gasPrice, gasPrice, gasPrice, data, nil, checkNonce) 29 }