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  }