lightningd: actually unwatch txs when onchaind says we should.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2018-01-29 12:51:18 +10:30 committed by Christian Decker
parent 6d0fd84c63
commit c6ce352404
3 changed files with 36 additions and 1 deletions

View File

@ -1193,7 +1193,20 @@ static void handle_onchain_broadcast_tx(struct peer *peer, const u8 *msg)
static void handle_onchain_unwatch_tx(struct peer *peer, const u8 *msg)
{
/* FIXME: unwatch tx and children here. */
struct bitcoin_txid txid;
struct txwatch *txw;
if (!fromwire_onchain_unwatch_tx(msg, NULL, &txid)) {
peer_internal_error(peer, "Invalid onchain_unwatch_tx");
return;
}
/* Frees the txo watches, too: see watch_tx_and_outputs() */
txw = find_txwatch(peer->ld->topology, &txid, peer);
if (!txw)
log_unusual(peer->log, "Can't unwatch txid %s",
type_to_string(ltmp, struct bitcoin_txid, &txid));
tal_free(txw);
}
static void handle_extracted_preimage(struct peer *peer, const u8 *msg)

View File

@ -112,6 +112,24 @@ struct txwatch *watch_txid_(const tal_t *ctx,
return w;
}
struct txwatch *find_txwatch(struct chain_topology *topo,
const struct bitcoin_txid *txid,
const struct peer *peer)
{
struct txwatch_hash_iter i;
struct txwatch *w;
/* We could have more than one peer watching same txid, though we
* don't for onchaind. */
for (w = txwatch_hash_getfirst(&topo->txwatches, txid, &i);
w;
w = txwatch_hash_getnext(&topo->txwatches, txid, &i)) {
if (w->peer == peer)
break;
}
return w;
}
bool watching_txid(const struct chain_topology *topo,
const struct bitcoin_txid *txid)
{

View File

@ -134,6 +134,10 @@ struct txowatch *watch_txo_(const tal_t *ctx,
const struct block *block), \
(cbdata))
struct txwatch *find_txwatch(struct chain_topology *topo,
const struct bitcoin_txid *txid,
const struct peer *peer);
void txwatch_fire(struct chain_topology *topo,
const struct bitcoin_tx *tx,
unsigned int depth);