github.com/cheng762/platon-go@v1.8.17-0.20190529111256-7deff2d7be26/core/vm/wasmstatedb.go (about)

     1  package vm
     2  
     3  import (
     4  	"github.com/PlatONnetwork/PlatON-Go/common"
     5  	"github.com/PlatONnetwork/PlatON-Go/core/types"
     6  	"github.com/PlatONnetwork/PlatON-Go/params"
     7  	"encoding/hex"
     8  	"fmt"
     9  	"math/big"
    10  )
    11  
    12  type WasmStateDB struct {
    13  	StateDB  StateDB
    14  	evm      *EVM
    15  	cfg      *Config
    16  	contract *Contract
    17  }
    18  
    19  func NewWasmStateDB(db *WasmStateDB, contract ContractRef) *WasmStateDB {
    20  	stateDb := &WasmStateDB{
    21  		StateDB: db.StateDB,
    22  		evm: db.evm,
    23  		cfg : db.cfg,
    24  	}
    25  	if c, ok := contract.(*Contract); ok {
    26  		stateDb.contract = c
    27  	}
    28  	return stateDb
    29  }
    30  
    31  
    32  func (self *WasmStateDB) GasPrice() int64 {
    33  	return self.evm.Context.GasPrice.Int64()
    34  }
    35  
    36  func (self *WasmStateDB) BlockHash(num uint64) common.Hash {
    37  	return self.evm.GetHash(num)
    38  }
    39  
    40  func (self *WasmStateDB) BlockNumber() *big.Int {
    41  	return self.evm.BlockNumber
    42  }
    43  
    44  func (self *WasmStateDB) GasLimimt() uint64 {
    45  	return self.evm.GasLimit
    46  }
    47  
    48  func (self *WasmStateDB) Time() *big.Int {
    49  	return self.evm.Time
    50  }
    51  
    52  func (self *WasmStateDB) Coinbase() common.Address {
    53  	return self.evm.Coinbase
    54  }
    55  
    56  func (self *WasmStateDB) GetBalance(addr common.Address) *big.Int {
    57  	return self.StateDB.GetBalance(addr)
    58  }
    59  
    60  func (self *WasmStateDB) Origin() common.Address {
    61  	return self.evm.Origin
    62  }
    63  
    64  func (self *WasmStateDB) Caller() common.Address {
    65  	return self.contract.Caller()
    66  }
    67  
    68  func (self *WasmStateDB) Address() common.Address {
    69  	return self.contract.Address()
    70  }
    71  
    72  func (self *WasmStateDB) CallValue() *big.Int {
    73  	return self.contract.Value()
    74  }
    75  
    76  /*func (self *WasmStateDB) AddLog(log *types.Log)  {
    77  	self.evm.StateDB.AddLog(log)
    78  }*/
    79  
    80  func (self *WasmStateDB) AddLog(address common.Address, topics []common.Hash, data []byte, bn uint64)  {
    81  	log := &types.Log {
    82  		Address: address,
    83  		Topics: topics,
    84  		Data: data,
    85  		BlockNumber: bn,
    86  	}
    87  	self.evm.StateDB.AddLog(log)
    88  }
    89  
    90  
    91  func (self *WasmStateDB) SetState(key []byte, value []byte)  {
    92  	self.evm.StateDB.SetState(self.Address(), key, value)
    93  }
    94  
    95  func (self *WasmStateDB) GetState(key []byte) []byte {
    96  	return self.evm.StateDB.GetState(self.Address(), key)
    97  }
    98  
    99  func (self *WasmStateDB) GetCallerNonce() int64 {
   100  	addr := self.contract.Caller()
   101  	return int64(self.evm.StateDB.GetNonce(addr))
   102  }
   103  
   104  func (self *WasmStateDB) Transfer(toAddr common.Address, value *big.Int) (ret []byte, leftOverGas uint64, err error) {
   105  	caller := self.contract
   106  	
   107  	gas := self.evm.callGasTemp
   108  	if value.Sign() != 0 {
   109  		gas += params.CallStipend
   110  	}
   111  	fmt.Println("Transfer to:", toAddr.String())
   112  	fmt.Println("Transfer caller:", caller.self.Address().Hex())
   113  	ret, returnGas, err := self.evm.Call(caller, toAddr, nil, gas, value)
   114  	return ret, returnGas, err
   115  }
   116  
   117  func (self *WasmStateDB) Call(addr, param []byte) ([]byte, error) {
   118  	
   119  	ret, _, err := self.evm.Call(self.contract, common.HexToAddress(hex.EncodeToString(addr)), param, self.contract.Gas, self.contract.value)
   120  	return ret, err
   121  }
   122  
   123  func (self *WasmStateDB) DelegateCall(addr, param []byte) ([]byte, error) {
   124  	
   125  	ret, _, err := self.evm.DelegateCall(self.contract, common.HexToAddress(hex.EncodeToString(addr)), param, self.contract.Gas)
   126  	return ret, err
   127  }
   128  
   129