// Run a contract's code on an isolated and unpersisted state // Cannot be used to create new contracts func Call(fromAddress, toAddress, data []byte) (*ctypes.ResultCall, error) { st := consensusState.GetState() // performs a copy cache := state.NewBlockCache(st) outAcc := cache.GetAccount(toAddress) if outAcc == nil { return nil, fmt.Errorf("Account %x does not exist", toAddress) } callee := toVMAccount(outAcc) caller := &vm.Account{Address: LeftPadWord256(fromAddress)} txCache := state.NewTxCache(cache) params := vm.Params{ BlockHeight: int64(st.LastBlockHeight), BlockHash: LeftPadWord256(st.LastBlockHash), BlockTime: st.LastBlockTime.Unix(), GasLimit: st.GetGasLimit(), } vmach := vm.NewVM(txCache, params, caller.Address, nil) gas := st.GetGasLimit() ret, err := vmach.Call(caller, callee, callee.Code, data, 0, &gas) if err != nil { return nil, err } return &ctypes.ResultCall{Return: ret}, nil }
// Run the given code on an isolated and unpersisted state // Cannot be used to create new contracts func CallCode(fromAddress, code, data []byte) (*ctypes.ResultCall, error) { st := consensusState.GetState() // performs a copy cache := mempoolReactor.Mempool.GetCache() callee := &vm.Account{Address: LeftPadWord256(fromAddress)} caller := &vm.Account{Address: LeftPadWord256(fromAddress)} txCache := state.NewTxCache(cache) params := vm.Params{ BlockHeight: int64(st.LastBlockHeight), BlockHash: LeftPadWord256(st.LastBlockHash), BlockTime: st.LastBlockTime.Unix(), GasLimit: st.GetGasLimit(), } vmach := vm.NewVM(txCache, params, caller.Address, nil) gas := st.GetGasLimit() ret, err := vmach.Call(caller, callee, code, data, 0, &gas) if err != nil { return nil, err } return &ctypes.ResultCall{Return: ret}, nil }