Skip to content

Commit

Permalink
wallet: remove edgecase around transaction checks
Browse files Browse the repository at this point in the history
we don't populate the tx item when we're running a transaction check
from deep chain (prior to a chain replay)
  • Loading branch information
niftynei authored and cdecker committed Jan 2, 2020
1 parent b2c4d5e commit 700b766
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 2 deletions.
2 changes: 1 addition & 1 deletion lightningd/peer_control.c
Original file line number Diff line number Diff line change
Expand Up @@ -990,7 +990,7 @@ static enum watch_result funding_depth_cb(struct lightningd *ld,
struct short_channel_id scid;

/* Sanity check */
if (tx && !check_funding_tx(tx, channel)) {
if (!check_funding_tx(tx, channel)) {
channel_internal_error(channel, "Bad tx %s: %s",
type_to_string(tmpctx,
struct bitcoin_txid, txid),
Expand Down
6 changes: 5 additions & 1 deletion lightningd/watch.c
Original file line number Diff line number Diff line change
Expand Up @@ -300,8 +300,12 @@ void watch_topology_changed(struct chain_topology *topo)
u32 depth;

depth = get_tx_depth(topo, &w->txid);
if (depth)
if (depth) {
if (!w->tx)
w->tx = wallet_transaction_get(w, topo->ld->wallet,
&w->txid);
needs_rerun |= txw_fire(w, &w->txid, depth);
}
}
} while (needs_rerun);
}
Expand Down
23 changes: 23 additions & 0 deletions wallet/wallet.c
Original file line number Diff line number Diff line change
Expand Up @@ -3127,6 +3127,29 @@ bool wallet_transaction_type(struct wallet *w, const struct bitcoin_txid *txid,
return true;
}

struct bitcoin_tx *wallet_transaction_get(const tal_t *ctx, struct wallet *w,
const struct bitcoin_txid *txid)
{
struct bitcoin_tx *tx;
struct db_stmt *stmt = db_prepare_v2(
w->db, SQL("SELECT rawtx FROM transactions WHERE id=?"));
db_bind_txid(stmt, 0, txid);
db_query_prepared(stmt);

if (!db_step(stmt)) {
tal_free(stmt);
return NULL;
}

if (!db_column_is_null(stmt, 0))
tx = db_column_tx(ctx, stmt, 0);
else
tx = NULL;

tal_free(stmt);
return tx;
}

u32 wallet_transaction_height(struct wallet *w, const struct bitcoin_txid *txid)
{
u32 blockheight;
Expand Down
9 changes: 9 additions & 0 deletions wallet/wallet.h
Original file line number Diff line number Diff line change
Expand Up @@ -1121,6 +1121,15 @@ void wallet_transaction_annotate(struct wallet *w,
bool wallet_transaction_type(struct wallet *w, const struct bitcoin_txid *txid,
enum wallet_tx_type *type);

/**
* Get the transaction from the database
*
* Looks up a transaction we have in the database and returns it, or NULL if
* not found.
*/
struct bitcoin_tx *wallet_transaction_get(const tal_t *ctx, struct wallet *w,
const struct bitcoin_txid *txid);

/**
* Get the confirmation height of a transaction we are watching by its
* txid. Returns 0 if the transaction was not part of any block.
Expand Down

0 comments on commit 700b766

Please sign in to comment.