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