diff --git a/chainntnfs/neutrinonotify/neutrino.go b/chainntnfs/neutrinonotify/neutrino.go index 7d4dc5d0..c81bfc3d 100644 --- a/chainntnfs/neutrinonotify/neutrino.go +++ b/chainntnfs/neutrinonotify/neutrino.go @@ -339,7 +339,7 @@ func (n *NeutrinoNotifier) notificationDispatcher() { // filter so we can be notified of its // future initial confirmation. rescanUpdate := []neutrino.UpdateOption{ - neutrino.AddTxIDs(*msg.TxID), + neutrino.AddAddrs(addrs...), neutrino.Rewind(currentHeight), } err = n.chainView.Update(rescanUpdate...) @@ -410,9 +410,11 @@ func (n *NeutrinoNotifier) notificationDispatcher() { } } -// historicalConfDetails looks up whether a transaction is already included in a -// block in the active chain and, if so, returns details about the confirmation. +// historicalConfDetails looks up whether a transaction is already included in +// a block in the active chain and, if so, returns details about the +// confirmation. func (n *NeutrinoNotifier) historicalConfDetails(targetHash *chainhash.Hash, + pkScript []byte, currentHeight, heightHint uint32) (*chainntnfs.TxConfirmation, error) { // Starting from the height hint, we'll walk forwards in the chain to @@ -437,14 +439,15 @@ func (n *NeutrinoNotifier) historicalConfDetails(targetHash *chainhash.Hash, // With the hash computed, we can now fetch the basic filter // for this height. - regFilter, err := n.p2pNode.GetCFilter(blockHash, - wire.GCSFilterRegular) + regFilter, err := n.p2pNode.GetCFilter( + blockHash, wire.GCSFilterRegular, + ) if err != nil { return nil, fmt.Errorf("unable to retrieve regular filter for "+ "height=%v: %v", scanHeight, err) } - // If the block has no transactions other than the coinbase + // If the block has no transactions other than the Coinbase // transaction, then the filter may be nil, so we'll continue // forward int that case. if regFilter == nil { @@ -452,9 +455,9 @@ func (n *NeutrinoNotifier) historicalConfDetails(targetHash *chainhash.Hash, } // In the case that the filter exists, we'll attempt to see if - // any element in it match our target txid. + // any element in it matches our target public key script. key := builder.DeriveKey(&blockHash) - match, err := regFilter.Match(key, targetHash[:]) + match, err := regFilter.Match(key, pkScript) if err != nil { return nil, fmt.Errorf("unable to query filter: %v", err) } @@ -504,16 +507,15 @@ func (n *NeutrinoNotifier) handleBlockConnected(newBlock *filteredBlock) error { for i, txIn := range mtx.TxIn { prevOut := txIn.PreviousOutPoint - // If this transaction indeed does spend an output which we have a - // registered notification for, then create a spend summary, finally - // sending off the details to the notification subscriber. + // If this transaction indeed does spend an output + // which we have a registered notification for, then + // create a spend summary, finally sending off the + // details to the notification subscriber. clients, ok := n.spendNotifications[prevOut] if !ok { continue } - // TODO(roasbeef): many integration tests expect spend to be - // notified within the mempool. spendDetails := &chainntnfs.SpendDetail{ SpentOutPoint: &prevOut, SpenderTxHash: &txSha, @@ -523,13 +525,16 @@ func (n *NeutrinoNotifier) handleBlockConnected(newBlock *filteredBlock) error { } for _, ntfn := range clients { - chainntnfs.Log.Infof("Dispatching spend notification for "+ - "outpoint=%v", ntfn.targetOutpoint) + chainntnfs.Log.Infof("Dispatching spend "+ + "notification for outpoint=%v", + ntfn.targetOutpoint) + ntfn.spendChan <- spendDetails - // Close spendChan to ensure that any calls to Cancel will not - // block. This is safe to do since the channel is buffered, and - // the message can still be read by the receiver. + // Close spendChan to ensure that any calls to + // Cancel will not block. This is safe to do + // since the channel is buffered, and the + // message can still be read by the receiver. close(ntfn.spendChan) } @@ -537,10 +542,12 @@ func (n *NeutrinoNotifier) handleBlockConnected(newBlock *filteredBlock) error { } } - // A new block has been connected to the main chain. - // Send out any N confirmation notifications which may - // have been triggered by this new block. - n.txConfNotifier.ConnectTip(&newBlock.hash, newBlock.height, newBlock.txns) + // A new block has been connected to the main chain. Send out any N + // confirmation notifications which may have been triggered by this new + // block. + n.txConfNotifier.ConnectTip( + &newBlock.hash, newBlock.height, newBlock.txns, + ) return nil } @@ -712,12 +719,14 @@ func (n *NeutrinoNotifier) RegisterSpendNtfn(outpoint *wire.OutPoint, type confirmationsNotification struct { chainntnfs.ConfNtfn heightHint uint32 + pkScript []byte } // RegisterConfirmationsNtfn registers a notification with NeutrinoNotifier // which will be triggered once the txid reaches numConfs number of // confirmations. func (n *NeutrinoNotifier) RegisterConfirmationsNtfn(txid *chainhash.Hash, + pkScript []byte, numConfs, heightHint uint32) (*chainntnfs.ConfirmationEvent, error) { ntfn := &confirmationsNotification{ @@ -728,6 +737,7 @@ func (n *NeutrinoNotifier) RegisterConfirmationsNtfn(txid *chainhash.Hash, Event: chainntnfs.NewConfirmationEvent(numConfs), }, heightHint: heightHint, + pkScript: pkScript, } if err := n.txConfNotifier.Register(&ntfn.ConfNtfn); err != nil {