ソースを参照

Listen to tx pre event and trigger 'pending'

obscuren 10 年 前
コミット
55fdf3e462
3 ファイル変更20 行追加16 行削除
  1. 1 1
      core/filter.go
  2. 4 3
      event/filter/eth_filter.go
  3. 15 12
      rpc/api.go

+ 1 - 1
core/filter.go

@@ -34,7 +34,7 @@ type Filter struct {
 	topics   [][][]byte
 
 	BlockCallback   func(*types.Block, state.Logs)
-	PendingCallback func(*types.Block, state.Logs)
+	PendingCallback func(*types.Transaction)
 	LogsCallback    func(state.Logs)
 }
 

+ 4 - 3
event/filter/eth_filter.go

@@ -62,8 +62,9 @@ func (self *FilterManager) GetFilter(id int) *core.Filter {
 func (self *FilterManager) filterLoop() {
 	// Subscribe to events
 	events := self.eventMux.Subscribe(
-		core.PendingBlockEvent{},
+		//core.PendingBlockEvent{},
 		core.ChainEvent{},
+		core.TxPreEvent{},
 		state.Logs(nil))
 
 out:
@@ -82,11 +83,11 @@ out:
 				}
 				self.filterMu.RUnlock()
 
-			case core.PendingBlockEvent:
+			case core.TxPreEvent:
 				self.filterMu.RLock()
 				for _, filter := range self.filters {
 					if filter.PendingCallback != nil {
-						filter.PendingCallback(event.Block, event.Logs)
+						filter.PendingCallback(event.Tx)
 					}
 				}
 				self.filterMu.RUnlock()

+ 15 - 12
rpc/api.go

@@ -180,21 +180,24 @@ func (self *EthereumApi) NewFilterString(args *FilterStringArgs, reply *interfac
 	var id int
 	filter := core.NewFilter(self.xeth().Backend())
 
-	callback := func(block *types.Block, logs state.Logs) {
-		self.logMut.Lock()
-		defer self.logMut.Unlock()
-
-		for _, log := range logs {
-			self.logs[id].add(log)
-		}
-		self.logs[id].add(&state.StateLog{})
-	}
-
 	switch args.Word {
 	case "pending":
-		filter.PendingCallback = callback
+		filter.PendingCallback = func(tx *types.Transaction) {
+			self.logMut.Lock()
+			defer self.logMut.Unlock()
+
+			self.logs[id].add(&state.StateLog{})
+		}
 	case "latest":
-		filter.BlockCallback = callback
+		filter.BlockCallback = func(block *types.Block, logs state.Logs) {
+			self.logMut.Lock()
+			defer self.logMut.Unlock()
+
+			for _, log := range logs {
+				self.logs[id].add(log)
+			}
+			self.logs[id].add(&state.StateLog{})
+		}
 	default:
 		return NewValidationError("Word", "Must be `latest` or `pending`")
 	}