diff options
author | Ethan Buchman <ethan@coinculture.info> | 2015-02-27 06:54:57 +0800 |
---|---|---|
committer | Ethan Buchman <ethan@coinculture.info> | 2015-02-27 06:54:57 +0800 |
commit | 5a827417d9cef0d2a765df11e747b1755bf04898 (patch) | |
tree | cd3764686dcb59f5b1b9faf16c9f29dcc5efd593 /xeth | |
parent | 9446489cf3f2eb4b5237b9355b3975fde2886508 (diff) | |
parent | cc5c8a444dbc23501ba1a131eb2334f4b5e1ce9f (diff) | |
download | dexon-5a827417d9cef0d2a765df11e747b1755bf04898.tar dexon-5a827417d9cef0d2a765df11e747b1755bf04898.tar.gz dexon-5a827417d9cef0d2a765df11e747b1755bf04898.tar.bz2 dexon-5a827417d9cef0d2a765df11e747b1755bf04898.tar.lz dexon-5a827417d9cef0d2a765df11e747b1755bf04898.tar.xz dexon-5a827417d9cef0d2a765df11e747b1755bf04898.tar.zst dexon-5a827417d9cef0d2a765df11e747b1755bf04898.zip |
Merge branch 'develop' of https://github.com/ethereum/go-ethereum into develop
Diffstat (limited to 'xeth')
-rw-r--r-- | xeth/state.go (renamed from xeth/world.go) | 13 | ||||
-rw-r--r-- | xeth/types.go | 2 | ||||
-rw-r--r-- | xeth/xeth.go | 64 |
3 files changed, 53 insertions, 26 deletions
diff --git a/xeth/world.go b/xeth/state.go index 9cbdd9461..e2562613c 100644 --- a/xeth/world.go +++ b/xeth/state.go @@ -3,19 +3,20 @@ package xeth import "github.com/ethereum/go-ethereum/state" type State struct { - xeth *XEth + xeth *XEth + state *state.StateDB } -func NewState(xeth *XEth) *State { - return &State{xeth} +func NewState(xeth *XEth, statedb *state.StateDB) *State { + return &State{xeth, statedb} } func (self *State) State() *state.StateDB { - return self.xeth.chainManager.TransState() + return self.state } func (self *State) Get(addr string) *Object { - return &Object{self.State().GetStateObject(fromHex(addr))} + return &Object{self.state.GetStateObject(fromHex(addr))} } func (self *State) SafeGet(addr string) *Object { @@ -23,7 +24,7 @@ func (self *State) SafeGet(addr string) *Object { } func (self *State) safeGet(addr string) *state.StateObject { - object := self.State().GetStateObject(fromHex(addr)) + object := self.state.GetStateObject(fromHex(addr)) if object == nil { object = state.NewStateObject(fromHex(addr), self.xeth.eth.Db()) } diff --git a/xeth/types.go b/xeth/types.go index a903fccbb..5b2d16018 100644 --- a/xeth/types.go +++ b/xeth/types.go @@ -150,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()) diff --git a/xeth/xeth.go b/xeth/xeth.go index f005105bb..d4c188fec 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" @@ -16,6 +17,7 @@ import ( "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" ) @@ -53,13 +55,26 @@ func New(eth Backend) *XEth { whisper: NewWhisper(eth.Whisper()), miner: eth.Miner(), } - xeth.state = NewState(xeth) + xeth.state = NewState(xeth, xeth.chainManager.TransState()) return xeth } -func (self *XEth) Backend() Backend { return self.eth } -func (self *XEth) State() *State { return self.state } +func (self *XEth) Backend() Backend { return self.eth } +func (self *XEth) UseState(statedb *state.StateDB) *XEth { + xeth := &XEth{ + eth: self.eth, + blockProcessor: self.blockProcessor, + chainManager: self.chainManager, + whisper: self.whisper, + miner: self.miner, + } + + xeth.state = NewState(xeth, statedb) + return xeth +} +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 } @@ -102,6 +117,17 @@ func (self *XEth) IsMining() bool { 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 { return self.eth.IsListening() } @@ -127,15 +153,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 { @@ -217,7 +243,7 @@ func (self *XEth) Call(toStr, valueStr, gasStr, gasPriceStr, dataStr string) (st } var ( - statedb = self.chainManager.TransState() + statedb = self.State().State() //self.chainManager.TransState() key = self.eth.KeyManager().KeyPair() from = statedb.GetOrNewStateObject(key.Address()) block = self.chainManager.CurrentBlock() @@ -241,7 +267,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) @@ -265,29 +290,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().TxState() + 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) + //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 } |