aboutsummaryrefslogtreecommitdiffstats
path: root/eth/handler.go
diff options
context:
space:
mode:
authorrjl493456442 <garyrong0905@gmail.com>2018-05-10 15:04:45 +0800
committerPéter Szilágyi <peterke@gmail.com>2018-05-18 16:46:44 +0800
commita2e43d28d01ef9642c7f6992b78b86bd0696c847 (patch)
tree2f5d3444071125e84155321db6fd79d941cfee0b /eth/handler.go
parent6286c255f16a914b39ffd3389cba154a53e66a13 (diff)
downloaddexon-a2e43d28d01ef9642c7f6992b78b86bd0696c847.tar.gz
dexon-a2e43d28d01ef9642c7f6992b78b86bd0696c847.tar.zst
dexon-a2e43d28d01ef9642c7f6992b78b86bd0696c847.zip
all: collate new transaction events together
Diffstat (limited to 'eth/handler.go')
-rw-r--r--eth/handler.go41
1 files changed, 24 insertions, 17 deletions
diff --git a/eth/handler.go b/eth/handler.go
index c8f7e13f1..7ef8e957a 100644
--- a/eth/handler.go
+++ b/eth/handler.go
@@ -46,7 +46,7 @@ const (
softResponseLimit = 2 * 1024 * 1024 // Target maximum size of returned blocks, headers or node data.
estHeaderRlpSize = 500 // Approximate size of an RLP encoded block header
- // txChanSize is the size of channel listening to TxPreEvent.
+ // txChanSize is the size of channel listening to TxsPreEvent.
// The number is referenced from the size of tx pool.
txChanSize = 4096
)
@@ -81,8 +81,8 @@ type ProtocolManager struct {
SubProtocols []p2p.Protocol
eventMux *event.TypeMux
- txCh chan core.TxPreEvent
- txSub event.Subscription
+ txsCh chan core.TxsPreEvent
+ txsSub event.Subscription
minedBlockSub *event.TypeMuxSubscription
// channels for fetcher, syncer, txsyncLoop
@@ -204,8 +204,8 @@ func (pm *ProtocolManager) Start(maxPeers int) {
pm.maxPeers = maxPeers
// broadcast transactions
- pm.txCh = make(chan core.TxPreEvent, txChanSize)
- pm.txSub = pm.txpool.SubscribeTxPreEvent(pm.txCh)
+ pm.txsCh = make(chan core.TxsPreEvent, txChanSize)
+ pm.txsSub = pm.txpool.SubscribeTxPreEvent(pm.txsCh)
go pm.txBroadcastLoop()
// broadcast mined blocks
@@ -220,7 +220,7 @@ func (pm *ProtocolManager) Start(maxPeers int) {
func (pm *ProtocolManager) Stop() {
log.Info("Stopping Ethereum protocol")
- pm.txSub.Unsubscribe() // quits txBroadcastLoop
+ pm.txsSub.Unsubscribe() // quits txBroadcastLoop
pm.minedBlockSub.Unsubscribe() // quits blockBroadcastLoop
// Quit the sync loop.
@@ -712,16 +712,23 @@ func (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool) {
}
}
-// BroadcastTx will propagate a transaction to all peers which are not known to
+// BroadcastTxs will propagate a batch of transactions to all peers which are not known to
// already have the given transaction.
-func (pm *ProtocolManager) BroadcastTx(hash common.Hash, tx *types.Transaction) {
- // Broadcast transaction to a batch of peers not knowing about it
- peers := pm.peers.PeersWithoutTx(hash)
- //FIXME include this again: peers = peers[:int(math.Sqrt(float64(len(peers))))]
- for _, peer := range peers {
- peer.SendTransactions(types.Transactions{tx})
+func (pm *ProtocolManager) BroadcastTxs(txs types.Transactions) {
+ var txset = make(map[*peer]types.Transactions)
+
+ // Broadcast transactions to a batch of peers not knowing about it
+ for _, tx := range txs {
+ peers := pm.peers.PeersWithoutTx(tx.Hash())
+ for _, peer := range peers {
+ txset[peer] = append(txset[peer], tx)
+ }
+ log.Trace("Broadcast transaction", "hash", tx.Hash(), "recipients", len(peers))
+ }
+ // FIXME include this again: peers = peers[:int(math.Sqrt(float64(len(peers))))]
+ for peer, txs := range txset {
+ peer.SendTransactions(txs)
}
- log.Trace("Broadcast transaction", "hash", hash, "recipients", len(peers))
}
// Mined broadcast loop
@@ -739,11 +746,11 @@ func (pm *ProtocolManager) minedBroadcastLoop() {
func (pm *ProtocolManager) txBroadcastLoop() {
for {
select {
- case event := <-pm.txCh:
- pm.BroadcastTx(event.Tx.Hash(), event.Tx)
+ case event := <-pm.txsCh:
+ pm.BroadcastTxs(event.Txs)
// Err() channel will be closed when unsubscribing.
- case <-pm.txSub.Err():
+ case <-pm.txsSub.Err():
return
}
}