Merge pull request #167 from fjl/feature/split-tx-event

Split TxEvent type for tx pre/post
This commit is contained in:
Jeffrey Wilcke 2014-10-29 21:10:04 +01:00
commit fa890c8c01
5 changed files with 53 additions and 61 deletions

View File

@ -408,7 +408,8 @@ func (gui *Gui) update() {
eth.ChainSyncEvent{}, eth.ChainSyncEvent{},
eth.PeerListEvent{}, eth.PeerListEvent{},
ethchain.NewBlockEvent{}, ethchain.NewBlockEvent{},
ethchain.TxEvent{}, ethchain.TxPreEvent{},
ethchain.TxPostEvent{},
ethminer.Event{}, ethminer.Event{},
) )
@ -430,40 +431,38 @@ func (gui *Gui) update() {
gui.setWalletValue(gui.eth.StateManager().CurrentState().GetAccount(gui.address()).Balance(), nil) gui.setWalletValue(gui.eth.StateManager().CurrentState().GetAccount(gui.address()).Balance(), nil)
} }
case ethchain.TxEvent: case ethchain.TxPreEvent:
tx := ev.Tx tx := ev.Tx
if ev.Type == ethchain.TxPre { object := state.GetAccount(gui.address())
object := state.GetAccount(gui.address())
if bytes.Compare(tx.Sender(), gui.address()) == 0 { if bytes.Compare(tx.Sender(), gui.address()) == 0 {
unconfirmedFunds.Sub(unconfirmedFunds, tx.Value) unconfirmedFunds.Sub(unconfirmedFunds, tx.Value)
} else if bytes.Compare(tx.Recipient, gui.address()) == 0 { } else if bytes.Compare(tx.Recipient, gui.address()) == 0 {
unconfirmedFunds.Add(unconfirmedFunds, tx.Value) unconfirmedFunds.Add(unconfirmedFunds, tx.Value)
}
gui.setWalletValue(object.Balance(), unconfirmedFunds)
gui.insertTransaction("pre", tx)
} else if ev.Type == ethchain.TxPost {
object := state.GetAccount(gui.address())
if bytes.Compare(tx.Sender(), gui.address()) == 0 {
object.SubAmount(tx.Value)
//gui.getObjectByName("transactionView").Call("addTx", ethpipe.NewJSTx(tx), "send")
gui.txDb.Put(tx.Hash(), tx.RlpEncode())
} else if bytes.Compare(tx.Recipient, gui.address()) == 0 {
object.AddAmount(tx.Value)
//gui.getObjectByName("transactionView").Call("addTx", ethpipe.NewJSTx(tx), "recv")
gui.txDb.Put(tx.Hash(), tx.RlpEncode())
}
gui.setWalletValue(object.Balance(), nil)
state.UpdateStateObject(object)
} }
gui.setWalletValue(object.Balance(), unconfirmedFunds)
gui.insertTransaction("pre", tx)
case ethchain.TxPostEvent:
tx := ev.Tx
object := state.GetAccount(gui.address())
if bytes.Compare(tx.Sender(), gui.address()) == 0 {
object.SubAmount(tx.Value)
//gui.getObjectByName("transactionView").Call("addTx", ethpipe.NewJSTx(tx), "send")
gui.txDb.Put(tx.Hash(), tx.RlpEncode())
} else if bytes.Compare(tx.Recipient, gui.address()) == 0 {
object.AddAmount(tx.Value)
//gui.getObjectByName("transactionView").Call("addTx", ethpipe.NewJSTx(tx), "recv")
gui.txDb.Put(tx.Hash(), tx.RlpEncode())
}
gui.setWalletValue(object.Balance(), nil)
state.UpdateStateObject(object)
// case object: // case object:
// gui.loadAddressBook() // gui.loadAddressBook()

View File

@ -1,10 +1,10 @@
package ethchain package ethchain
type TxEvent struct { // TxPreEvent is posted when a transaction enters the transaction pool.
Type int // TxPre || TxPost type TxPreEvent struct{ Tx *Transaction }
Tx *Transaction
}
type NewBlockEvent struct { // TxPostEvent is posted when a transaction has been processed.
Block *Block type TxPostEvent struct{ Tx *Transaction }
}
// NewBlockEvent is posted when a block has been imported.
type NewBlockEvent struct{ Block *Block }

View File

@ -191,7 +191,7 @@ done:
} }
// Notify all subscribers // Notify all subscribers
self.eth.EventMux().Post(TxEvent{TxPost, tx}) self.eth.EventMux().Post(TxPostEvent{tx})
receipts = append(receipts, receipt) receipts = append(receipts, receipt)
handled = append(handled, tx) handled = append(handled, tx)

View File

@ -14,17 +14,12 @@ import (
var txplogger = ethlog.NewLogger("TXP") var txplogger = ethlog.NewLogger("TXP")
const ( const txPoolQueueSize = 50
txPoolQueueSize = 50
)
type TxPoolHook chan *Transaction type TxPoolHook chan *Transaction
type TxMsgTy byte type TxMsgTy byte
const ( const (
TxPre = iota
TxPost
minGasPrice = 1000000 minGasPrice = 1000000
) )
@ -169,7 +164,7 @@ out:
txplogger.Debugf("(t) %x => %x (%v) %x\n", tx.Sender()[:4], tmp, tx.Value, tx.Hash()) txplogger.Debugf("(t) %x => %x (%v) %x\n", tx.Sender()[:4], tmp, tx.Value, tx.Hash())
// Notify the subscribers // Notify the subscribers
pool.Ethereum.EventMux().Post(TxEvent{TxPre, tx}) pool.Ethereum.EventMux().Post(TxPreEvent{tx})
} }
case <-pool.quit: case <-pool.quit:
break out break out

View File

@ -64,7 +64,7 @@ func (miner *Miner) Start() {
miner.block = miner.ethereum.ChainManager().NewBlock(miner.coinbase) miner.block = miner.ethereum.ChainManager().NewBlock(miner.coinbase)
mux := miner.ethereum.EventMux() mux := miner.ethereum.EventMux()
miner.events = mux.Subscribe(ethchain.NewBlockEvent{}, ethchain.TxEvent{}) miner.events = mux.Subscribe(ethchain.NewBlockEvent{}, ethchain.TxPreEvent{})
// Prepare inital block // Prepare inital block
//miner.ethereum.StateManager().Prepare(miner.block.State(), miner.block.State()) //miner.ethereum.StateManager().Prepare(miner.block.State(), miner.block.State())
@ -118,25 +118,23 @@ func (miner *Miner) listener() {
} }
miner.startMining() miner.startMining()
case ethchain.TxEvent: case ethchain.TxPreEvent:
if event.Type == ethchain.TxPre { miner.stopMining()
miner.stopMining()
found := false found := false
for _, ctx := range miner.txs { for _, ctx := range miner.txs {
if found = bytes.Compare(ctx.Hash(), event.Tx.Hash()) == 0; found { if found = bytes.Compare(ctx.Hash(), event.Tx.Hash()) == 0; found {
break break
}
}
if found == false {
// Undo all previous commits
miner.block.Undo()
// Apply new transactions
miner.txs = append(miner.txs, event.Tx)
} }
miner.startMining() miner.startMining()
} }
if found == false {
// Undo all previous commits
miner.block.Undo()
// Apply new transactions
miner.txs = append(miner.txs, event.Tx)
}
} }
case <-miner.powDone: case <-miner.powDone: