Fixed state object gas return
This commit is contained in:
parent
73a42d34a5
commit
4d98762486
|
@ -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 {
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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 {
|
||||||
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
|
||||||
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
|
||||||
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 (
|
||||||
"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
|
||||||
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 (
|
||||||
"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) {
|
||||||
|
|
||||||
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)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue