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 }