mirror of
https://github.com/ElementsProject/lightning.git
synced 2024-11-19 09:54:16 +01:00
wallet: add channel_type field to db.
This was always the intent, but now we have to reconstruct from the disparate fields. This means `option_anchor_outputs` is now redundant. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
355aa8f497
commit
7acaccfb36
@ -6,6 +6,7 @@
|
|||||||
#include <ccan/tal/str/str.h>
|
#include <ccan/tal/str/str.h>
|
||||||
#include <ccan/tal/tal.h>
|
#include <ccan/tal/tal.h>
|
||||||
#include <common/channel_id.h>
|
#include <common/channel_id.h>
|
||||||
|
#include <common/channel_type.h>
|
||||||
#include <common/htlc_state.h>
|
#include <common/htlc_state.h>
|
||||||
#include <common/node_id.h>
|
#include <common/node_id.h>
|
||||||
#include <common/onionreply.h>
|
#include <common/onionreply.h>
|
||||||
@ -131,6 +132,11 @@ void db_bind_channel_id(struct db_stmt *stmt, int pos, const struct channel_id *
|
|||||||
db_bind_blob(stmt, pos, id->id, sizeof(id->id));
|
db_bind_blob(stmt, pos, id->id, sizeof(id->id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void db_bind_channel_type(struct db_stmt *stmt, int pos, const struct channel_type *type)
|
||||||
|
{
|
||||||
|
db_bind_talarr(stmt, pos, type->features);
|
||||||
|
}
|
||||||
|
|
||||||
void db_bind_node_id(struct db_stmt *stmt, int pos, const struct node_id *id)
|
void db_bind_node_id(struct db_stmt *stmt, int pos, const struct node_id *id)
|
||||||
{
|
{
|
||||||
db_bind_blob(stmt, pos, id->k, sizeof(id->k));
|
db_bind_blob(stmt, pos, id->k, sizeof(id->k));
|
||||||
@ -447,6 +453,12 @@ struct bitcoin_tx *db_col_psbt_to_tx(const tal_t *ctx, struct db_stmt *stmt, con
|
|||||||
return bitcoin_tx_with_psbt(ctx, psbt);
|
return bitcoin_tx_with_psbt(ctx, psbt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct channel_type *db_col_channel_type(const tal_t *ctx, struct db_stmt *stmt,
|
||||||
|
const char *colname)
|
||||||
|
{
|
||||||
|
return channel_type_from(ctx, take(db_col_arr(NULL, stmt, colname, u8)));
|
||||||
|
}
|
||||||
|
|
||||||
void *db_col_arr_(const tal_t *ctx, struct db_stmt *stmt, const char *colname,
|
void *db_col_arr_(const tal_t *ctx, struct db_stmt *stmt, const char *colname,
|
||||||
size_t bytes, const char *label, const char *caller)
|
size_t bytes, const char *label, const char *caller)
|
||||||
{
|
{
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include <ccan/time/time.h>
|
#include <ccan/time/time.h>
|
||||||
|
|
||||||
struct channel_id;
|
struct channel_id;
|
||||||
|
struct channel_type;
|
||||||
struct db_stmt;
|
struct db_stmt;
|
||||||
struct node_id;
|
struct node_id;
|
||||||
struct onionreply;
|
struct onionreply;
|
||||||
@ -33,6 +34,7 @@ void db_bind_secret(struct db_stmt *stmt, int pos, const struct secret *s);
|
|||||||
void db_bind_secret_arr(struct db_stmt *stmt, int col, const struct secret *s);
|
void db_bind_secret_arr(struct db_stmt *stmt, int col, const struct secret *s);
|
||||||
void db_bind_txid(struct db_stmt *stmt, int pos, const struct bitcoin_txid *t);
|
void db_bind_txid(struct db_stmt *stmt, int pos, const struct bitcoin_txid *t);
|
||||||
void db_bind_channel_id(struct db_stmt *stmt, int pos, const struct channel_id *id);
|
void db_bind_channel_id(struct db_stmt *stmt, int pos, const struct channel_id *id);
|
||||||
|
void db_bind_channel_type(struct db_stmt *stmt, int pos, const struct channel_type *type);
|
||||||
void db_bind_node_id(struct db_stmt *stmt, int pos, const struct node_id *ni);
|
void db_bind_node_id(struct db_stmt *stmt, int pos, const struct node_id *ni);
|
||||||
void db_bind_node_id_arr(struct db_stmt *stmt, int col,
|
void db_bind_node_id_arr(struct db_stmt *stmt, int col,
|
||||||
const struct node_id *ids);
|
const struct node_id *ids);
|
||||||
@ -78,6 +80,8 @@ struct secret *db_col_secret_arr(const tal_t *ctx, struct db_stmt *stmt,
|
|||||||
const char *colname);
|
const char *colname);
|
||||||
void db_col_txid(struct db_stmt *stmt, const char *colname, struct bitcoin_txid *t);
|
void db_col_txid(struct db_stmt *stmt, const char *colname, struct bitcoin_txid *t);
|
||||||
void db_col_channel_id(struct db_stmt *stmt, const char *colname, struct channel_id *dest);
|
void db_col_channel_id(struct db_stmt *stmt, const char *colname, struct channel_id *dest);
|
||||||
|
struct channel_type *db_col_channel_type(const tal_t *ctx, struct db_stmt *stmt,
|
||||||
|
const char *colname);
|
||||||
void db_col_node_id(struct db_stmt *stmt, const char *colname, struct node_id *ni);
|
void db_col_node_id(struct db_stmt *stmt, const char *colname, struct node_id *ni);
|
||||||
struct node_id *db_col_node_id_arr(const tal_t *ctx, struct db_stmt *stmt,
|
struct node_id *db_col_node_id_arr(const tal_t *ctx, struct db_stmt *stmt,
|
||||||
const char *colname);
|
const char *colname);
|
||||||
|
@ -37,7 +37,7 @@ PLUGIN_ALL_HEADER += $(BOOKKEEPER_HEADER)
|
|||||||
C_PLUGINS += plugins/bookkeeper
|
C_PLUGINS += plugins/bookkeeper
|
||||||
PLUGINS += plugins/bookkeeper
|
PLUGINS += plugins/bookkeeper
|
||||||
|
|
||||||
plugins/bookkeeper: common/bolt12.o common/bolt12_merkle.o $(BOOKKEEPER_OBJS) $(PLUGIN_LIB_OBJS) $(JSMN_OBJTS) $(PLUGIN_COMMON_OBJS) $(WIRE_OBJS) $(WIRE_BOLT12_OBJS) $(DB_OBJS)
|
plugins/bookkeeper: common/bolt12.o common/bolt12_merkle.o common/channel_type.o $(BOOKKEEPER_OBJS) $(PLUGIN_LIB_OBJS) $(JSMN_OBJTS) $(PLUGIN_COMMON_OBJS) $(WIRE_OBJS) $(WIRE_BOLT12_OBJS) $(DB_OBJS)
|
||||||
|
|
||||||
# The following files contain SQL-annotated statements that we need to extact
|
# The following files contain SQL-annotated statements that we need to extact
|
||||||
BOOKKEEPER_SQL_FILES := \
|
BOOKKEEPER_SQL_FILES := \
|
||||||
|
49
wallet/db.c
49
wallet/db.c
@ -17,6 +17,7 @@
|
|||||||
#include <lightningd/plugin_hook.h>
|
#include <lightningd/plugin_hook.h>
|
||||||
#include <wallet/db.h>
|
#include <wallet/db.h>
|
||||||
#include <wallet/psbt_fixup.h>
|
#include <wallet/psbt_fixup.h>
|
||||||
|
#include <wire/peer_wire.h>
|
||||||
#include <wire/wire_sync.h>
|
#include <wire/wire_sync.h>
|
||||||
|
|
||||||
struct migration {
|
struct migration {
|
||||||
@ -58,6 +59,9 @@ static void fillin_missing_lease_satoshi(struct lightningd *ld,
|
|||||||
static void migrate_invalid_last_tx_psbts(struct lightningd *ld,
|
static void migrate_invalid_last_tx_psbts(struct lightningd *ld,
|
||||||
struct db *db);
|
struct db *db);
|
||||||
|
|
||||||
|
static void migrate_fill_in_channel_type(struct lightningd *ld,
|
||||||
|
struct db *db);
|
||||||
|
|
||||||
/* Do not reorder or remove elements from this array, it is used to
|
/* Do not reorder or remove elements from this array, it is used to
|
||||||
* migrate existing databases from a previous state, based on the
|
* migrate existing databases from a previous state, based on the
|
||||||
* string indices */
|
* string indices */
|
||||||
@ -943,6 +947,8 @@ static struct migration dbmigrations[] = {
|
|||||||
{SQL("ALTER TABLE channels ADD require_confirm_inputs_local INTEGER DEFAULT 0;"), NULL},
|
{SQL("ALTER TABLE channels ADD require_confirm_inputs_local INTEGER DEFAULT 0;"), NULL},
|
||||||
{NULL, fillin_missing_lease_satoshi},
|
{NULL, fillin_missing_lease_satoshi},
|
||||||
{NULL, migrate_invalid_last_tx_psbts},
|
{NULL, migrate_invalid_last_tx_psbts},
|
||||||
|
{SQL("ALTER TABLE channels ADD channel_type BLOB DEFAULT NULL;"), NULL},
|
||||||
|
{NULL, migrate_fill_in_channel_type},
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1567,6 +1573,49 @@ static void fillin_missing_lease_satoshi(struct lightningd *ld,
|
|||||||
tal_free(stmt);
|
tal_free(stmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void migrate_fill_in_channel_type(struct lightningd *ld,
|
||||||
|
struct db *db)
|
||||||
|
{
|
||||||
|
struct db_stmt *stmt;
|
||||||
|
|
||||||
|
stmt = db_prepare_v2(db, SQL("SELECT id, local_static_remotekey_start, option_anchor_outputs, channel_flags, alias_remote, minimum_depth FROM channels"));
|
||||||
|
db_query_prepared(stmt);
|
||||||
|
while (db_step(stmt)) {
|
||||||
|
struct db_stmt *update_stmt;
|
||||||
|
struct channel_type *type;
|
||||||
|
u64 id = db_col_u64(stmt, "id");
|
||||||
|
int channel_flags = db_col_int(stmt, "channel_flags");
|
||||||
|
|
||||||
|
if (db_col_int(stmt, "option_anchor_outputs")) {
|
||||||
|
db_col_ignore(stmt, "local_static_remotekey_start");
|
||||||
|
type = channel_type_anchor_outputs(tmpctx);
|
||||||
|
} else if (db_col_u64(stmt, "local_static_remotekey_start") != 0x7FFFFFFFFFFFFFFFULL)
|
||||||
|
type = channel_type_static_remotekey(tmpctx);
|
||||||
|
else
|
||||||
|
type = channel_type_none(tmpctx);
|
||||||
|
|
||||||
|
/* We didn't keep type in db, so assume all private
|
||||||
|
* channels which support aliases don't want us to fwd
|
||||||
|
* unless using alias, which is how we behaved
|
||||||
|
* before. */
|
||||||
|
if (!db_col_is_null(stmt, "alias_remote")
|
||||||
|
&& !(channel_flags & CHANNEL_FLAGS_ANNOUNCE_CHANNEL))
|
||||||
|
channel_type_set_scid_alias(type);
|
||||||
|
|
||||||
|
if (db_col_int(stmt, "minimum_depth") == 0)
|
||||||
|
channel_type_set_zeroconf(type);
|
||||||
|
|
||||||
|
update_stmt = db_prepare_v2(db, SQL("UPDATE channels SET"
|
||||||
|
" channel_type = ?"
|
||||||
|
" WHERE id = ?"));
|
||||||
|
db_bind_channel_type(update_stmt, 0, type);
|
||||||
|
db_bind_u64(update_stmt, 1, id);
|
||||||
|
db_exec_prepared_v2(update_stmt);
|
||||||
|
tal_free(update_stmt);
|
||||||
|
}
|
||||||
|
tal_free(stmt);
|
||||||
|
}
|
||||||
|
|
||||||
static void complain_unfixed(struct lightningd *ld,
|
static void complain_unfixed(struct lightningd *ld,
|
||||||
enum channel_state state,
|
enum channel_state state,
|
||||||
u64 id,
|
u64 id,
|
||||||
|
@ -1480,12 +1480,7 @@ static struct channel *wallet_stmt2channel(struct wallet *w, struct db_stmt *stm
|
|||||||
lease_chan_max_ppt = 0;
|
lease_chan_max_ppt = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (db_col_int(stmt, "option_anchor_outputs"))
|
type = db_col_channel_type(NULL, stmt, "channel_type");
|
||||||
type = channel_type_anchor_outputs(NULL);
|
|
||||||
else if (db_col_u64(stmt, "local_static_remotekey_start") != 0x7FFFFFFFFFFFFFFFULL)
|
|
||||||
type = channel_type_static_remotekey(NULL);
|
|
||||||
else
|
|
||||||
type = channel_type_none(NULL);
|
|
||||||
|
|
||||||
/* last_tx is null for stub channels used for recovering funds through
|
/* last_tx is null for stub channels used for recovering funds through
|
||||||
* Static channel backups. */
|
* Static channel backups. */
|
||||||
@ -1529,7 +1524,8 @@ static struct channel *wallet_stmt2channel(struct wallet *w, struct db_stmt *stm
|
|||||||
&last_sig,
|
&last_sig,
|
||||||
wallet_htlc_sigs_load(tmpctx, w,
|
wallet_htlc_sigs_load(tmpctx, w,
|
||||||
db_col_u64(stmt, "id"),
|
db_col_u64(stmt, "id"),
|
||||||
db_col_int(stmt, "option_anchor_outputs")),
|
channel_type_has(type, OPT_ANCHOR_OUTPUTS)
|
||||||
|
|| channel_type_has(type, OPT_ANCHORS_ZERO_FEE_HTLC_TX)),
|
||||||
&channel_info,
|
&channel_info,
|
||||||
take(fee_states),
|
take(fee_states),
|
||||||
remote_shutdown_scriptpubkey,
|
remote_shutdown_scriptpubkey,
|
||||||
@ -1601,13 +1597,7 @@ static struct closed_channel *wallet_stmt2closed_channel(const tal_t *ctx,
|
|||||||
else
|
else
|
||||||
cc->last_tx = NULL;
|
cc->last_tx = NULL;
|
||||||
|
|
||||||
if (db_col_int(stmt, "option_anchor_outputs")) {
|
cc->type = db_col_channel_type(cc, stmt, "channel_type");
|
||||||
cc->type = channel_type_anchor_outputs(cc);
|
|
||||||
db_col_ignore(stmt, "local_static_remotekey_start");
|
|
||||||
} else if (db_col_u64(stmt, "local_static_remotekey_start") != 0x7FFFFFFFFFFFFFFFULL)
|
|
||||||
cc->type = channel_type_static_remotekey(cc);
|
|
||||||
else
|
|
||||||
cc->type = channel_type_none(cc);
|
|
||||||
cc->state_change_cause
|
cc->state_change_cause
|
||||||
= state_change_in_db(db_col_int(stmt, "state_change_reason"));
|
= state_change_in_db(db_col_int(stmt, "state_change_reason"));
|
||||||
cc->leased = !db_col_is_null(stmt, "lease_commit_sig");
|
cc->leased = !db_col_is_null(stmt, "lease_commit_sig");
|
||||||
@ -1642,8 +1632,7 @@ struct closed_channel **wallet_load_closed_channels(const tal_t *ctx,
|
|||||||
", msatoshi_to_us_min"
|
", msatoshi_to_us_min"
|
||||||
", msatoshi_to_us_max"
|
", msatoshi_to_us_max"
|
||||||
", last_tx"
|
", last_tx"
|
||||||
", option_anchor_outputs"
|
", channel_type"
|
||||||
", local_static_remotekey_start"
|
|
||||||
", state_change_reason"
|
", state_change_reason"
|
||||||
", lease_commit_sig"
|
", lease_commit_sig"
|
||||||
" FROM channels"
|
" FROM channels"
|
||||||
@ -1732,7 +1721,7 @@ static bool wallet_channels_load_active(struct wallet *w)
|
|||||||
", remote_upfront_shutdown_script"
|
", remote_upfront_shutdown_script"
|
||||||
", local_static_remotekey_start"
|
", local_static_remotekey_start"
|
||||||
", remote_static_remotekey_start"
|
", remote_static_remotekey_start"
|
||||||
", option_anchor_outputs"
|
", channel_type"
|
||||||
", shutdown_scriptpubkey_local"
|
", shutdown_scriptpubkey_local"
|
||||||
", closer"
|
", closer"
|
||||||
", state_change_reason"
|
", state_change_reason"
|
||||||
@ -2021,7 +2010,7 @@ void wallet_channel_save(struct wallet *w, struct channel *chan)
|
|||||||
" remote_upfront_shutdown_script=?," // 29
|
" remote_upfront_shutdown_script=?," // 29
|
||||||
" local_static_remotekey_start=?," // 30
|
" local_static_remotekey_start=?," // 30
|
||||||
" remote_static_remotekey_start=?," // 31
|
" remote_static_remotekey_start=?," // 31
|
||||||
" option_anchor_outputs=?," // 32
|
" channel_type=?," // 32
|
||||||
" shutdown_scriptpubkey_local=?," // 33
|
" shutdown_scriptpubkey_local=?," // 33
|
||||||
" closer=?," // 34
|
" closer=?," // 34
|
||||||
" state_change_reason=?," // 35
|
" state_change_reason=?," // 35
|
||||||
@ -2079,7 +2068,7 @@ void wallet_channel_save(struct wallet *w, struct channel *chan)
|
|||||||
db_bind_talarr(stmt, 29, chan->remote_upfront_shutdown_script);
|
db_bind_talarr(stmt, 29, chan->remote_upfront_shutdown_script);
|
||||||
db_bind_u64(stmt, 30, chan->static_remotekey_start[LOCAL]);
|
db_bind_u64(stmt, 30, chan->static_remotekey_start[LOCAL]);
|
||||||
db_bind_u64(stmt, 31, chan->static_remotekey_start[REMOTE]);
|
db_bind_u64(stmt, 31, chan->static_remotekey_start[REMOTE]);
|
||||||
db_bind_int(stmt, 32, channel_has(chan, OPT_ANCHOR_OUTPUTS));
|
db_bind_channel_type(stmt, 32, chan->type);
|
||||||
db_bind_talarr(stmt, 33, chan->shutdown_scriptpubkey[LOCAL]);
|
db_bind_talarr(stmt, 33, chan->shutdown_scriptpubkey[LOCAL]);
|
||||||
db_bind_int(stmt, 34, chan->closer);
|
db_bind_int(stmt, 34, chan->closer);
|
||||||
db_bind_int(stmt, 35, state_change_in_db(chan->state_change_cause));
|
db_bind_int(stmt, 35, state_change_in_db(chan->state_change_cause));
|
||||||
|
Loading…
Reference in New Issue
Block a user