Skip to content

Commit 00e4645

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 <rusty@rustcorp.com.au>
1 parent 223402d commit 00e4645

2 files changed

Lines changed: 28 additions & 12 deletions

File tree

lightningd/closed_channel.h

Lines changed: 2 additions & 0 deletions
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

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1745,7 +1745,7 @@ static struct channel *wallet_stmt2channel(struct wallet *w, struct db_stmt *stm
17451745
alias[LOCAL] = db_col_optional_scid(tmpctx, stmt, "alias_local");
17461746
alias[REMOTE] = db_col_optional_scid(tmpctx, stmt, "alias_remote");
17471747

1748-
ok &= wallet_shachain_load(w, db_col_u64(stmt, "shachain_remote_id"),
1748+
ok &= wallet_shachain_load(w, db_col_u64(stmt, "shachain_remote_id"),
17491749
&wshachain);
17501750

17511751
remote_shutdown_scriptpubkey = db_col_arr(tmpctx, stmt,
@@ -2015,6 +2015,7 @@ static struct closed_channel *wallet_stmt2closed_channel(const tal_t *ctx,
20152015
struct db_stmt *stmt)
20162016
{
20172017
struct closed_channel *cc = tal(ctx, struct closed_channel);
2018+
struct wallet_shachain wshachain;
20182019

20192020
/* Can be missing in older dbs! */
20202021
cc->peer_id = db_col_optional(cc, stmt, "p.node_id", node_id);
@@ -2047,6 +2048,11 @@ static struct closed_channel *wallet_stmt2closed_channel(const tal_t *ctx,
20472048
cc->state_change_cause
20482049
= state_change_in_db(db_col_int(stmt, "state_change_reason"));
20492050
cc->leased = !db_col_is_null(stmt, "lease_commit_sig");
2051+
/* This was deleted on channel closure for older dbs! */
2052+
if (wallet_shachain_load(w, db_col_u64(stmt, "shachain_remote_id"), &wshachain))
2053+
cc->their_shachain = tal_dup(cc, struct shachain, &wshachain.chain);
2054+
else
2055+
cc->their_shachain = NULL;
20502056

20512057
return cc;
20522058
}
@@ -2081,6 +2087,7 @@ void wallet_load_closed_channels(struct wallet *w,
20812087
", state_change_reason"
20822088
", lease_commit_sig"
20832089
", last_stable_connection"
2090+
", shachain_remote_id"
20842091
" FROM channels"
20852092
" LEFT JOIN peers p ON p.id = peer_id"
20862093
" WHERE state = ?;"));
@@ -2125,6 +2132,7 @@ void wallet_load_one_closed_channel(struct wallet *w,
21252132
", state_change_reason"
21262133
", lease_commit_sig"
21272134
", last_stable_connection"
2135+
", shachain_remote_id"
21282136
" FROM channels"
21292137
" LEFT JOIN peers p ON p.id = peer_id"
21302138
" WHERE channels.id = ?;"));
@@ -2836,7 +2844,10 @@ void wallet_channel_insert(struct wallet *w, struct channel *chan)
28362844
void wallet_channel_close(struct wallet *w, u64 wallet_id)
28372845
{
28382846
/* We keep the entry in the channel_configs table, since that might
2839-
* help us debug some issues, and it is rather limited in size. */
2847+
* help us debug some issues, and it is rather limited in size. We
2848+
* also keep shachains: it's limited and we can use it for sending
2849+
* reestablish messages with enough information for nodes with lost
2850+
* dbs to recover. */
28402851
struct db_stmt *stmt;
28412852

28422853
/* Delete entries from `channel_htlcs` */
@@ -2864,16 +2875,6 @@ void wallet_channel_close(struct wallet *w, u64 wallet_id)
28642875
db_bind_u64(stmt, wallet_id);
28652876
db_exec_prepared_v2(take(stmt));
28662877

2867-
/* Delete shachains */
2868-
stmt = db_prepare_v2(w->db, SQL("DELETE FROM shachains "
2869-
"WHERE id IN ("
2870-
" SELECT shachain_remote_id "
2871-
" FROM channels "
2872-
" WHERE channels.id=?"
2873-
")"));
2874-
db_bind_u64(stmt, wallet_id);
2875-
db_exec_prepared_v2(take(stmt));
2876-
28772878
/* Delete transaction annotations */
28782879
stmt = db_prepare_v2(w->db, SQL("DELETE FROM transaction_annotations "
28792880
"WHERE channel=?"));
@@ -2916,6 +2917,19 @@ void wallet_channel_delete(struct wallet *w, const struct channel *channel)
29162917
assert(db_count_changes(stmt) == 2);
29172918
tal_free(stmt);
29182919

2920+
/* Delete shachains */
2921+
stmt = db_prepare_v2(w->db, SQL("DELETE FROM shachains "
2922+
"WHERE id IN ("
2923+
" SELECT shachain_remote_id "
2924+
" FROM channels "
2925+
" WHERE channels.id=?"
2926+
")"));
2927+
db_bind_u64(stmt, channel->dbid);
2928+
db_exec_prepared_v2(stmt);
2929+
2930+
assert(db_count_changes(stmt) == 1);
2931+
tal_free(stmt);
2932+
29192933
stmt = db_prepare_v2(w->db, SQL("DELETE FROM channels"
29202934
" WHERE state = ?"
29212935
" AND id=?"));

0 commit comments

Comments
 (0)