good morning!!!!

Skip to content
Snippets Groups Projects
Commit 4d987624 authored by Jeffrey Wilcke's avatar Jeffrey Wilcke
Browse files

Fixed state object gas return

parent 73a42d34
Branches
Tags
No related merge requests found
...@@ -11,13 +11,13 @@ type ClosureRef interface { ...@@ -11,13 +11,13 @@ type ClosureRef interface {
ReturnGas(*big.Int, *big.Int, *State) ReturnGas(*big.Int, *big.Int, *State)
Address() []byte Address() []byte
GetMem(*big.Int) *ethutil.Value GetMem(*big.Int) *ethutil.Value
SetStore(*big.Int, *ethutil.Value) SetStorage(*big.Int, *ethutil.Value)
N() *big.Int N() *big.Int
} }
// Basic inline closure object which implement the 'closure' interface // Basic inline closure object which implement the 'closure' interface
type Closure struct { type Closure struct {
callee *StateObject callee ClosureRef
object *StateObject object *StateObject
Script []byte Script []byte
State *State State *State
...@@ -28,7 +28,7 @@ type Closure struct { ...@@ -28,7 +28,7 @@ type Closure struct {
} }
// Create a new closure for the given data items // Create a new closure for the given data items
func NewClosure(callee, object *StateObject, script []byte, state *State, gas, price *big.Int) *Closure { func NewClosure(callee ClosureRef, object *StateObject, script []byte, state *State, gas, price *big.Int) *Closure {
c := &Closure{callee: callee, object: object, Script: script, State: state, Args: nil} c := &Closure{callee: callee, object: object, Script: script, State: state, Args: nil}
// In most cases gas, price and value are pointers to transaction objects // In most cases gas, price and value are pointers to transaction objects
...@@ -118,7 +118,7 @@ func (c *Closure) Object() *StateObject { ...@@ -118,7 +118,7 @@ func (c *Closure) Object() *StateObject {
return c.object return c.object
} }
func (c *Closure) Callee() *StateObject { func (c *Closure) Callee() ClosureRef {
return c.callee return c.callee
} }
......
...@@ -326,9 +326,15 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro ...@@ -326,9 +326,15 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
case CALLDATALOAD: case CALLDATALOAD:
require(1) require(1)
offset := stack.Pop().Int64() offset := stack.Pop().Int64()
val := closure.Args[offset : offset+32]
stack.Push(ethutil.BigD(val)) var data []byte
if len(closure.Args) >= int(offset+32) {
data = closure.Args[offset : offset+32]
} else {
data = []byte{0}
}
stack.Push(ethutil.BigD(data))
case CALLDATASIZE: case CALLDATASIZE:
stack.Push(big.NewInt(int64(len(closure.Args)))) stack.Push(big.NewInt(int64(len(closure.Args))))
case GASPRICE: case GASPRICE:
...@@ -498,7 +504,7 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro ...@@ -498,7 +504,7 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
contract.AddAmount(value) contract.AddAmount(value)
// Create a new callable closure // Create a new callable closure
closure := NewClosure(closure.Object(), contract, contract.script, vm.state, gas, closure.Price) closure := NewClosure(closure, contract, contract.script, vm.state, gas, closure.Price)
// Executer the closure and get the return value (if any) // Executer the closure and get the return value (if any)
ret, _, err := closure.Call(vm, args, hook) ret, _, err := closure.Call(vm, args, hook)
if err != nil { if err != nil {
......
...@@ -4,6 +4,7 @@ import ( ...@@ -4,6 +4,7 @@ import (
"encoding/hex" "encoding/hex"
"github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethutil"
"strings"
) )
type PEthereum struct { type PEthereum struct {
...@@ -161,7 +162,17 @@ func (lib *PEthereum) createTx(key, recipient, valueStr, gasStr, gasPriceStr, sc ...@@ -161,7 +162,17 @@ func (lib *PEthereum) createTx(key, recipient, valueStr, gasStr, gasPriceStr, sc
if len(scriptStr) > 0 && scriptStr[0:2] == "0x" { if len(scriptStr) > 0 && scriptStr[0:2] == "0x" {
scriptStr = scriptStr[2:len(scriptStr)] scriptStr = scriptStr[2:len(scriptStr)]
} }
tx = ethchain.NewTransactionMessage(hash, value, gas, gasPrice, ethutil.FromHex(scriptStr))
data := ethutil.StringToByteFunc(scriptStr, func(s string) (ret []byte) {
slice := strings.Split(s, "\n")
for _, dataItem := range slice {
d := ethutil.FormatData(dataItem)
ret = append(ret, d...)
}
return
})
tx = ethchain.NewTransactionMessage(hash, value, gas, gasPrice, data)
} }
acc := lib.stateManager.TransState().GetStateObject(keyPair.Address()) acc := lib.stateManager.TransState().GetStateObject(keyPair.Address())
......
...@@ -4,6 +4,7 @@ import ( ...@@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"encoding/binary" "encoding/binary"
"fmt" "fmt"
"math/big"
) )
// Number to bytes // Number to bytes
...@@ -98,3 +99,20 @@ func StringToByteFunc(str string, cb func(str string) []byte) (ret []byte) { ...@@ -98,3 +99,20 @@ func StringToByteFunc(str string, cb func(str string) []byte) (ret []byte) {
return return
} }
func FormatData(data string) []byte {
if len(data) == 0 {
return nil
}
// Simple stupid
d := new(big.Int)
if data[0:1] == "\"" && data[len(data)-1:] == "\"" {
d.SetBytes([]byte(data[1 : len(data)-1]))
} else if len(data) > 1 && data[:2] == "0x" {
d.SetBytes(FromHex(data[2:]))
} else {
d.SetString(data, 0)
}
return BigToBytes(d, 256)
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment