Skip to content

Commit 1ac3a46

Browse files
committed
lightningd: save shachain for closed channels.
We'll need this to send reestablish, and it is only small (max 47 sha256 per channel). Signed-off-by: Rusty Russell <[email protected]>
1 parent aa117f7 commit 1ac3a46

File tree

2 files changed

+28
-12
lines changed

2 files changed

+28
-12
lines changed

lightningd/closed_channel.h

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ struct closed_channel {
2828
enum state_change state_change_cause;
2929
bool leased;
3030
u64 last_stable_connection;
31+
/* NULL for older closed channels */
32+
const struct shachain *their_shachain;
3133
};
3234

3335
static inline const struct channel_id *keyof_closed_channel(const struct closed_channel *cc)

wallet/wallet.c

+26-12
Original file line numberDiff line numberDiff line change
@@ -1763,7 +1763,7 @@ static struct channel *wallet_stmt2channel(struct wallet *w, struct db_stmt *stm
17631763
alias[LOCAL] = db_col_optional_scid(tmpctx, stmt, "alias_local");
17641764
alias[REMOTE] = db_col_optional_scid(tmpctx, stmt, "alias_remote");
17651765

1766-
ok &= wallet_shachain_load(w, db_col_u64(stmt, "shachain_remote_id"),
1766+
ok &= wallet_shachain_load(w, db_col_u64(stmt, "shachain_remote_id"),
17671767
&wshachain);
17681768

17691769
remote_shutdown_scriptpubkey = db_col_arr(tmpctx, stmt,
@@ -2033,6 +2033,7 @@ static struct closed_channel *wallet_stmt2closed_channel(const tal_t *ctx,
20332033
struct db_stmt *stmt)
20342034
{
20352035
struct closed_channel *cc = tal(ctx, struct closed_channel);
2036+
struct wallet_shachain wshachain;
20362037

20372038
/* Can be missing in older dbs! */
20382039
cc->peer_id = db_col_optional(cc, stmt, "p.node_id", node_id);
@@ -2065,6 +2066,11 @@ static struct closed_channel *wallet_stmt2closed_channel(const tal_t *ctx,
20652066
cc->state_change_cause
20662067
= state_change_in_db(db_col_int(stmt, "state_change_reason"));
20672068
cc->leased = !db_col_is_null(stmt, "lease_commit_sig");
2069+
/* This was deleted on channel closure for older dbs! */
2070+
if (wallet_shachain_load(w, db_col_u64(stmt, "shachain_remote_id"), &wshachain))
2071+
cc->their_shachain = tal_dup(cc, struct shachain, &wshachain.chain);
2072+
else
2073+
cc->their_shachain = NULL;
20682074

20692075
return cc;
20702076
}
@@ -2099,6 +2105,7 @@ void wallet_load_closed_channels(struct wallet *w,
20992105
", state_change_reason"
21002106
", lease_commit_sig"
21012107
", last_stable_connection"
2108+
", shachain_remote_id"
21022109
" FROM channels"
21032110
" LEFT JOIN peers p ON p.id = peer_id"
21042111
" WHERE state = ?;"));
@@ -2143,6 +2150,7 @@ void wallet_load_one_closed_channel(struct wallet *w,
21432150
", state_change_reason"
21442151
", lease_commit_sig"
21452152
", last_stable_connection"
2153+
", shachain_remote_id"
21462154
" FROM channels"
21472155
" LEFT JOIN peers p ON p.id = peer_id"
21482156
" WHERE channels.id = ?;"));
@@ -2855,7 +2863,10 @@ void wallet_channel_close(struct wallet *w,
28552863
const struct channel *chan)
28562864
{
28572865
/* We keep the entry in the channel_configs table, since that might
2858-
* help us debug some issues, and it is rather limited in size. */
2866+
* help us debug some issues, and it is rather limited in size. We
2867+
* also keep shachains: it's limited and we can use it for sending
2868+
* reestablish messages with enough information for nodes with lost
2869+
* dbs to recover. */
28592870
struct db_stmt *stmt;
28602871

28612872
/* Delete entries from `channel_htlcs` */
@@ -2887,16 +2898,6 @@ void wallet_channel_close(struct wallet *w,
28872898
db_bind_u64(stmt, chan->dbid);
28882899
db_exec_prepared_v2(take(stmt));
28892900

2890-
/* Delete shachains */
2891-
stmt = db_prepare_v2(w->db, SQL("DELETE FROM shachains "
2892-
"WHERE id IN ("
2893-
" SELECT shachain_remote_id "
2894-
" FROM channels "
2895-
" WHERE channels.id=?"
2896-
")"));
2897-
db_bind_u64(stmt, chan->dbid);
2898-
db_exec_prepared_v2(take(stmt));
2899-
29002901
/* Delete transaction annotations */
29012902
stmt = db_prepare_v2(w->db, SQL("DELETE FROM transaction_annotations "
29022903
"WHERE channel=?"));
@@ -2939,6 +2940,19 @@ void wallet_channel_delete(struct wallet *w, const struct channel *channel)
29392940
assert(db_count_changes(stmt) == 2);
29402941
tal_free(stmt);
29412942

2943+
/* Delete shachains */
2944+
stmt = db_prepare_v2(w->db, SQL("DELETE FROM shachains "
2945+
"WHERE id IN ("
2946+
" SELECT shachain_remote_id "
2947+
" FROM channels "
2948+
" WHERE channels.id=?"
2949+
")"));
2950+
db_bind_u64(stmt, channel->dbid);
2951+
db_exec_prepared_v2(stmt);
2952+
2953+
assert(db_count_changes(stmt) == 1);
2954+
tal_free(stmt);
2955+
29422956
stmt = db_prepare_v2(w->db, SQL("DELETE FROM channels"
29432957
" WHERE state = ?"
29442958
" AND id=?"));

0 commit comments

Comments
 (0)