github.com/n1ghtfa1l/go-vnt@v0.6.4-alpha.6/core/vm/vm.go (about)

     1  // Copyright 2019 The go-vnt Authors
     2  // This file is part of the go-vnt library.
     3  //
     4  // The go-vnt library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The go-vnt library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the go-vnt library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package vm
    18  
    19  import (
    20  	"math/big"
    21  
    22  	"github.com/vntchain/go-vnt/common"
    23  	"github.com/vntchain/go-vnt/core/vm/interface"
    24  	"github.com/vntchain/go-vnt/crypto"
    25  	"github.com/vntchain/go-vnt/params"
    26  )
    27  
    28  type OPCode interface {
    29  	String() string
    30  	IsPush() bool
    31  	Byte() byte
    32  }
    33  
    34  // emptyCodeHash is used by create to ensure deployment is disallowed to already
    35  // deployed contract addresses (relevant after the account abstraction).
    36  var emptyCodeHash = crypto.Keccak256Hash(nil)
    37  
    38  type (
    39  	CanTransferFunc func(inter.StateDB, common.Address, *big.Int) bool
    40  	TransferFunc    func(inter.StateDB, common.Address, common.Address, *big.Int)
    41  	// GetHashFunc returns the nth block hash in the blockchain
    42  	GetHashFunc func(uint64) common.Hash
    43  )
    44  
    45  type Context struct {
    46  	// CanTransfer returns whether the account contains
    47  	// sufficient ether to transfer the value
    48  	CanTransfer CanTransferFunc
    49  	// Transfer transfers ether from one account to the other
    50  	Transfer TransferFunc
    51  	// GetHash returns the hash corresponding to n
    52  	GetHash GetHashFunc
    53  
    54  	// Message information
    55  	Origin   common.Address // Provides information for ORIGIN
    56  	GasPrice *big.Int       // Provides information for GASPRICE
    57  
    58  	// Block information
    59  	Coinbase    common.Address // Provides information for COINBASE
    60  	GasLimit    uint64         // Provides information for GASLIMIT
    61  	BlockNumber *big.Int       // Provides information for NUMBER
    62  	Time        *big.Int       // Provides information for TIME
    63  	Difficulty  *big.Int       // Provides information for DIFFICULTY
    64  }
    65  
    66  type VM interface {
    67  	Cancel()
    68  	Create(caller ContractRef, code []byte, gas uint64, value *big.Int) (ret []byte, contractAddr common.Address, leftOverGas uint64, err error)
    69  	Call(caller ContractRef, addr common.Address, input []byte, gas uint64, value *big.Int) (ret []byte, leftOverGas uint64, err error)
    70  	CallCode(caller ContractRef, addr common.Address, input []byte, gas uint64, value *big.Int) (ret []byte, leftOverGas uint64, err error)
    71  	DelegateCall(caller ContractRef, addr common.Address, input []byte, gas uint64) (ret []byte, leftOverGas uint64, err error)
    72  	StaticCall(caller ContractRef, addr common.Address, input []byte, gas uint64) (ret []byte, leftOverGas uint64, err error)
    73  	GetStateDb() inter.StateDB
    74  	ChainConfig() *params.ChainConfig
    75  	GetContext() Context
    76  }