From b913bda47212fb20b896302cb77d8b238da11a12 Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Tue, 16 Feb 2016 14:44:49 -0800 Subject: [PATCH] chainntfs: expand ChainNotifier interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * The `NotificationTrigger` struct has been dropped. Instead we know simply employ a non-blocking send over a chan struct. This moves the responsibility of triggering callbacks a level above to the registering client. * Confirmation notifications also now have a counter part in order to notify a caller of the scenario wherein a funding transaction drops out of the chain due to a re-org. A “neagtiveConf” value will be sent to the client over a channel in this case. This will allow a caller to re-register for another confirmation notification. Note that due to this scenario, callers should also register for notifications concerning spends of the counterparty’s inputs to the funding transaction. If a second spend (other than the funding) is detected, the channel should be closed immediately. * Notifications concerning spends now also include the spending transaction, hash, and the input on the spending transaction at which the outpoint is spent. --- chainntfs/chainntfs.go | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/chainntfs/chainntfs.go b/chainntfs/chainntfs.go index bc06445a8..a7489f759 100644 --- a/chainntfs/chainntfs.go +++ b/chainntfs/chainntfs.go @@ -2,6 +2,7 @@ package chainntnfs import "github.com/btcsuite/btcd/wire" +// ChainNotifier ... // TODO(roasbeef): finish // * multiple backends for interface // * btcd - websockets @@ -12,14 +13,39 @@ import "github.com/btcsuite/btcd/wire" // * SPV bloomfilter // * other stuff maybe... type ChainNotifier interface { - RegisterConfirmationsNotification(txid *wire.ShaHash, numConfs uint32, trigger *NotificationTrigger) error - RegisterSpendNotification(outpoint *wire.OutPoint, trigger *NotificationTrigger) error + RegisterConfirmationsNtfn(txid *wire.ShaHash, numConfs uint32) (*ConfirmationEvent, error) + RegisterSpendNtfn(outpoint *wire.OutPoint) (*SpendEvent, error) Start() error Stop() error } -type NotificationTrigger struct { - TriggerChan chan struct{} - Callback func() +// TODO(roasbeef): ln channels should request spend ntfns for counterparty's +// inputs to funding tx also, consider channel closed if funding tx re-org'd +// out and inputs double spent. + +// ConfirmationEvent ... +type ConfirmationEvent struct { + Confirmed chan struct{} // MUST be buffered. + + // TODO(roasbeef): all goroutines on ln channel updates should also + // have a struct chan that's closed if funding gets re-org out. Need + // to sync, to request another confirmation event ntfn, then re-open + // channel after confs. + + NegativeConf chan uint32 // MUST be buffered. +} + +// SpendDetail ... +type SpendDetail struct { + SpentOutPoint *wire.OutPoint + + SpendingTx *wire.MsgTx + SpenderTxHash *wire.ShaHash + SpenderInputIndex uint32 +} + +// SpendEvent ... +type SpendEvent struct { + Spend chan *SpendDetail // MUST be buffered. }