Merge branch 'develop'

This commit is contained in:
obscuren 2014-05-28 23:23:40 +02:00
commit 2ef3a98929
4 changed files with 43 additions and 8 deletions

@ -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)
}