aboutsummaryrefslogtreecommitdiffstats
path: root/xeth
diff options
context:
space:
mode:
Diffstat (limited to 'xeth')
-rw-r--r--xeth/types.go35
-rw-r--r--xeth/xeth.go61
2 files changed, 35 insertions, 61 deletions
diff --git a/xeth/types.go b/xeth/types.go
index 34caf5cbc..5b2d16018 100644
--- a/xeth/types.go
+++ b/xeth/types.go
@@ -60,7 +60,6 @@ func (self *Object) Storage() (storage map[string]string) {
rlp.Decode(bytes.NewReader(it.Value), &data)
storage[toHex(it.Key)] = toHex(data)
}
- self.StateObject.Trie().PrintRoot()
return
}
@@ -151,7 +150,7 @@ type Transaction struct {
func NewTx(tx *types.Transaction) *Transaction {
hash := toHex(tx.Hash())
receiver := toHex(tx.To())
- if receiver == "0000000000000000000000000000000000000000" {
+ if len(receiver) == 0 {
receiver = toHex(core.AddressFromMessage(tx))
}
sender := toHex(tx.From())
@@ -215,7 +214,7 @@ func NewPeer(peer *p2p.Peer) *Peer {
return &Peer{
ref: peer,
Ip: fmt.Sprintf("%v", peer.RemoteAddr()),
- Version: fmt.Sprintf("%v", peer.Identity()),
+ Version: fmt.Sprintf("%v", peer.ID()),
Caps: fmt.Sprintf("%v", caps),
}
}
@@ -235,33 +234,3 @@ func NewReciept(contractCreation bool, creationAddress, hash, address []byte) *R
toHex(address),
}
}
-
-type Message struct {
- To string `json:"to"`
- From string `json:"from"`
- Input string `json:"input"`
- Output string `json:"output"`
- Path int32 `json:"path"`
- Origin string `json:"origin"`
- Timestamp int32 `json:"timestamp"`
- Coinbase string `json:"coinbase"`
- Block string `json:"block"`
- Number int32 `json:"number"`
- Value string `json:"value"`
-}
-
-func NewMessage(message *state.Message) Message {
- return Message{
- To: toHex(message.To),
- From: toHex(message.From),
- Input: toHex(message.Input),
- Output: toHex(message.Output),
- Path: int32(message.Path),
- Origin: toHex(message.Origin),
- Timestamp: int32(message.Timestamp),
- Coinbase: toHex(message.Origin),
- Block: toHex(message.Block),
- Number: int32(message.Number.Int64()),
- Value: message.Value.String(),
- }
-}
diff --git a/xeth/xeth.go b/xeth/xeth.go
index 0e71a0ed9..5907a8329 100644
--- a/xeth/xeth.go
+++ b/xeth/xeth.go
@@ -7,6 +7,7 @@ package xeth
import (
"bytes"
"encoding/json"
+ "fmt"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
@@ -14,8 +15,8 @@ import (
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/event"
"github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/miner"
"github.com/ethereum/go-ethereum/p2p"
- "github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/whisper"
)
@@ -27,14 +28,13 @@ type Backend interface {
ChainManager() *core.ChainManager
TxPool() *core.TxPool
PeerCount() int
- IsMining() bool
IsListening() bool
Peers() []*p2p.Peer
KeyManager() *crypto.KeyManager
- ClientIdentity() p2p.ClientIdentity
Db() ethutil.Database
EventMux() *event.TypeMux
Whisper() *whisper.Whisper
+ Miner() *miner.Miner
}
type XEth struct {
@@ -43,6 +43,7 @@ type XEth struct {
chainManager *core.ChainManager
state *State
whisper *Whisper
+ miner *miner.Miner
}
func New(eth Backend) *XEth {
@@ -51,15 +52,17 @@ func New(eth Backend) *XEth {
blockProcessor: eth.BlockProcessor(),
chainManager: eth.ChainManager(),
whisper: NewWhisper(eth.Whisper()),
+ miner: eth.Miner(),
}
xeth.state = NewState(xeth)
return xeth
}
-func (self *XEth) Backend() Backend { return self.eth }
-func (self *XEth) State() *State { return self.state }
-func (self *XEth) Whisper() *Whisper { return self.whisper }
+func (self *XEth) Backend() Backend { return self.eth }
+func (self *XEth) State() *State { return self.state }
+func (self *XEth) Whisper() *Whisper { return self.whisper }
+func (self *XEth) Miner() *miner.Miner { return self.miner }
func (self *XEth) BlockByHash(strHash string) *Block {
hash := fromHex(strHash)
@@ -97,7 +100,18 @@ func (self *XEth) PeerCount() int {
}
func (self *XEth) IsMining() bool {
- return self.eth.IsMining()
+ return self.miner.Mining()
+}
+
+func (self *XEth) SetMining(shouldmine bool) bool {
+ ismining := self.miner.Mining()
+ if shouldmine && !ismining {
+ self.miner.Start()
+ }
+ if ismining && !shouldmine {
+ self.miner.Stop()
+ }
+ return self.miner.Mining()
}
func (self *XEth) IsListening() bool {
@@ -125,15 +139,15 @@ func (self *XEth) BalanceAt(addr string) string {
}
func (self *XEth) TxCountAt(address string) int {
- return int(self.State().SafeGet(address).Nonce)
+ return int(self.State().SafeGet(address).Nonce())
}
func (self *XEth) CodeAt(address string) string {
- return toHex(self.State().SafeGet(address).Code)
+ return toHex(self.State().SafeGet(address).Code())
}
func (self *XEth) IsContract(address string) bool {
- return len(self.State().SafeGet(address).Code) > 0
+ return len(self.State().SafeGet(address).Code()) > 0
}
func (self *XEth) SecretToAddress(key string) string {
@@ -192,15 +206,6 @@ func (self *XEth) FromNumber(str string) string {
return ethutil.BigD(fromHex(str)).String()
}
-func ToMessages(messages state.Messages) *ethutil.List {
- var msgs []Message
- for _, m := range messages {
- msgs = append(msgs, NewMessage(m))
- }
-
- return ethutil.NewList(msgs)
-}
-
func (self *XEth) PushTx(encodedTx string) (string, error) {
tx := types.NewTransactionFromBytes(fromHex(encodedTx))
err := self.eth.TxPool().Add(tx)
@@ -226,7 +231,7 @@ func (self *XEth) Call(toStr, valueStr, gasStr, gasPriceStr, dataStr string) (st
var (
statedb = self.chainManager.TransState()
key = self.eth.KeyManager().KeyPair()
- from = state.NewStateObject(key.Address(), self.eth.Db())
+ from = statedb.GetOrNewStateObject(key.Address())
block = self.chainManager.CurrentBlock()
to = statedb.GetOrNewStateObject(fromHex(toStr))
data = fromHex(dataStr)
@@ -248,7 +253,6 @@ func (self *XEth) Call(toStr, valueStr, gasStr, gasPriceStr, dataStr string) (st
}
func (self *XEth) Transact(toStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, error) {
-
var (
to []byte
value = ethutil.NewValue(valueStr)
@@ -272,29 +276,30 @@ func (self *XEth) Transact(toStr, valueStr, gasStr, gasPriceStr, codeStr string)
tx = types.NewTransactionMessage(to, value.BigInt(), gas.BigInt(), price.BigInt(), data)
}
- state := self.chainManager.TransState()
+ var err error
+ state := self.eth.ChainManager().TransState()
+ if balance := state.GetBalance(key.Address()); balance.Cmp(tx.Value()) < 0 {
+ return "", fmt.Errorf("insufficient balance. balance=%v tx=%v", balance, tx.Value())
+ }
nonce := state.GetNonce(key.Address())
tx.SetNonce(nonce)
tx.Sign(key.PrivateKey)
+ //fmt.Printf("create tx: %x %v\n", tx.Hash()[:4], tx.Nonce())
+
// Do some pre processing for our "pre" events and hooks
block := self.chainManager.NewBlock(key.Address())
coinbase := state.GetOrNewStateObject(key.Address())
coinbase.SetGasPool(block.GasLimit())
self.blockProcessor.ApplyTransactions(coinbase, state, block, types.Transactions{tx}, true)
- err := self.eth.TxPool().Add(tx)
+ err = self.eth.TxPool().Add(tx)
if err != nil {
return "", err
}
state.SetNonce(key.Address(), nonce+1)
- if contractCreation {
- addr := core.AddressFromMessage(tx)
- pipelogger.Infof("Contract addr %x\n", addr)
- }
-
if types.IsContractAddr(to) {
return toHex(core.AddressFromMessage(tx)), nil
}