mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-01-18 21:35:11 +01:00
wallet: use last_processed_block to determine scan start.
With fallback depending on chainparams: this means the first upgrade will be slow, but after that it'll be fast. Fixes: #990 Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
21849329dd
commit
6620305606
@ -12,6 +12,8 @@ const struct chainparams networks[] = {
|
||||
.cli = "bitcoin-cli",
|
||||
.cli_args = NULL,
|
||||
.dust_limit = 546,
|
||||
/* "Lightning Charge Powers Developers & Blockstream Store" */
|
||||
.when_lightning_became_cool = 504500,
|
||||
.testnet = false},
|
||||
{.index = 1,
|
||||
.network_name = "regtest",
|
||||
@ -21,6 +23,7 @@ const struct chainparams networks[] = {
|
||||
.cli = "bitcoin-cli",
|
||||
.cli_args = "-regtest",
|
||||
.dust_limit = 546,
|
||||
.when_lightning_became_cool = 1,
|
||||
.testnet = true},
|
||||
{.index = 2,
|
||||
.network_name = "testnet",
|
||||
@ -39,6 +42,7 @@ const struct chainparams networks[] = {
|
||||
.cli = "litecoin-cli",
|
||||
.cli_args = NULL,
|
||||
.dust_limit = 100000,
|
||||
.when_lightning_became_cool = 1,
|
||||
.testnet = false},
|
||||
{.index = 4,
|
||||
.network_name = "litecoin-testnet",
|
||||
@ -48,6 +52,7 @@ const struct chainparams networks[] = {
|
||||
.cli = "litecoin-cli",
|
||||
.cli_args = "-testnet",
|
||||
.dust_limit = 100000,
|
||||
.when_lightning_became_cool = 1,
|
||||
.testnet = true}
|
||||
};
|
||||
|
||||
|
@ -15,6 +15,7 @@ struct chainparams {
|
||||
const char *cli;
|
||||
const char *cli_args;
|
||||
const u64 dust_limit;
|
||||
const u32 when_lightning_became_cool;
|
||||
|
||||
/* Whether this is a test network or not */
|
||||
const bool testnet;
|
||||
|
@ -470,17 +470,17 @@ static void get_init_block(struct bitcoind *bitcoind,
|
||||
static void get_init_blockhash(struct bitcoind *bitcoind, u32 blockcount,
|
||||
struct chain_topology *topo)
|
||||
{
|
||||
/* FIXME: Because we don't handle our root disappearing, we go
|
||||
* 100 blocks back */
|
||||
if (blockcount < 100)
|
||||
blockcount = 0;
|
||||
else
|
||||
blockcount -= 100;
|
||||
|
||||
/* This happens if first_blocknum is UINTMAX-1 */
|
||||
if (blockcount < topo->first_blocknum)
|
||||
topo->first_blocknum = blockcount;
|
||||
|
||||
/* FIXME: Because we don't handle our root disappearing, we go
|
||||
* 100 blocks back */
|
||||
if (topo->first_blocknum < 100)
|
||||
topo->first_blocknum = 0;
|
||||
else
|
||||
topo->first_blocknum -= 100;
|
||||
|
||||
/* Get up to speed with topology. */
|
||||
bitcoind_getblockhash(bitcoind, topo->first_blocknum,
|
||||
get_init_block, topo);
|
||||
@ -714,14 +714,14 @@ struct chain_topology *new_topology(struct lightningd *ld, struct log *log)
|
||||
|
||||
void setup_topology(struct chain_topology *topo,
|
||||
struct timers *timers,
|
||||
struct timerel poll_time, u32 first_channel_block)
|
||||
struct timerel poll_time, u32 first_blocknum)
|
||||
{
|
||||
memset(&topo->feerate, 0, sizeof(topo->feerate));
|
||||
topo->timers = timers;
|
||||
topo->poll_time = poll_time;
|
||||
/* Start one before the block we are interested in (as we won't
|
||||
* get notifications on txs in that block). */
|
||||
topo->first_blocknum = first_channel_block - 1;
|
||||
topo->first_blocknum = first_blocknum - 1;
|
||||
|
||||
/* Make sure bitcoind is started, and ready */
|
||||
wait_for_bitcoind(topo->bitcoind);
|
||||
|
@ -256,7 +256,7 @@ int main(int argc, char *argv[])
|
||||
struct log_book *log_book;
|
||||
struct lightningd *ld;
|
||||
bool newdir;
|
||||
u32 peer_first_blocknum;
|
||||
u32 first_blocknum;
|
||||
|
||||
err_set_progname(argv[0]);
|
||||
|
||||
@ -336,7 +336,10 @@ int main(int argc, char *argv[])
|
||||
if (!wallet_htlcs_reconnect(ld->wallet, &ld->htlcs_in, &ld->htlcs_out))
|
||||
fatal("could not reconnect htlcs loaded from wallet, wallet may be inconsistent.");
|
||||
|
||||
peer_first_blocknum = wallet_channels_first_blocknum(ld->wallet);
|
||||
/* Worst case, scan back to the first lightning deployment */
|
||||
first_blocknum = wallet_first_blocknum(ld->wallet,
|
||||
get_chainparams(ld)
|
||||
->when_lightning_became_cool);
|
||||
|
||||
db_commit_transaction(ld->wallet->db);
|
||||
|
||||
@ -344,7 +347,7 @@ int main(int argc, char *argv[])
|
||||
setup_topology(ld->topology,
|
||||
&ld->timers,
|
||||
ld->config.poll_time,
|
||||
peer_first_blocknum);
|
||||
first_blocknum);
|
||||
|
||||
/* Create RPC socket (if any) */
|
||||
setup_jsonrpc(ld, ld->rpc_filename);
|
||||
|
@ -87,12 +87,12 @@ struct txfilter *txfilter_new(const tal_t *ctx UNNEEDED)
|
||||
/* Generated stub for version */
|
||||
const char *version(void)
|
||||
{ fprintf(stderr, "version called!\n"); abort(); }
|
||||
/* Generated stub for wallet_channels_first_blocknum */
|
||||
u32 wallet_channels_first_blocknum(struct wallet *w UNNEEDED)
|
||||
{ fprintf(stderr, "wallet_channels_first_blocknum called!\n"); abort(); }
|
||||
/* Generated stub for wallet_channels_load_active */
|
||||
bool wallet_channels_load_active(const tal_t *ctx UNNEEDED, struct wallet *w UNNEEDED)
|
||||
{ fprintf(stderr, "wallet_channels_load_active called!\n"); abort(); }
|
||||
/* Generated stub for wallet_first_blocknum */
|
||||
u32 wallet_first_blocknum(struct wallet *w UNNEEDED, u32 first_possible UNNEEDED)
|
||||
{ fprintf(stderr, "wallet_first_blocknum called!\n"); abort(); }
|
||||
/* Generated stub for wallet_htlcs_load_for_channel */
|
||||
bool wallet_htlcs_load_for_channel(struct wallet *wallet UNNEEDED,
|
||||
struct channel *chan UNNEEDED,
|
||||
|
@ -667,22 +667,28 @@ bool wallet_channels_load_active(const tal_t *ctx, struct wallet *w)
|
||||
return ok;
|
||||
}
|
||||
|
||||
u32 wallet_channels_first_blocknum(struct wallet *w)
|
||||
u32 wallet_first_blocknum(struct wallet *w, u32 first_possible)
|
||||
{
|
||||
int err;
|
||||
u32 first_blocknum;
|
||||
u32 first_channel, first_utxo;
|
||||
sqlite3_stmt *stmt =
|
||||
db_query(__func__, w->db,
|
||||
"SELECT MIN(first_blocknum) FROM channels;");
|
||||
|
||||
err = sqlite3_step(stmt);
|
||||
if (err == SQLITE_ROW && sqlite3_column_type(stmt, 0) != SQLITE_NULL)
|
||||
first_blocknum = sqlite3_column_int(stmt, 0);
|
||||
first_channel = sqlite3_column_int(stmt, 0);
|
||||
else
|
||||
first_blocknum = UINT32_MAX;
|
||||
|
||||
first_channel = UINT32_MAX;
|
||||
sqlite3_finalize(stmt);
|
||||
return first_blocknum;
|
||||
|
||||
/* If it's an old database, go back to before c-lightning was cool */
|
||||
first_utxo = db_get_intvar(w->db, "last_processed_block",
|
||||
first_possible);
|
||||
if (first_utxo < first_channel)
|
||||
return first_utxo;
|
||||
else
|
||||
return first_channel;
|
||||
}
|
||||
|
||||
void wallet_channel_config_save(struct wallet *w, struct channel_config *cc)
|
||||
|
@ -260,13 +260,12 @@ bool wallet_peer_by_nodeid(struct wallet *w, const struct pubkey *nodeid,
|
||||
bool wallet_channels_load_active(const tal_t *ctx, struct wallet *w);
|
||||
|
||||
/**
|
||||
* wallet_channels_first_blocknum - get first block we're interested in.
|
||||
* wallet_first_blocknum - get first block we're interested in.
|
||||
*
|
||||
* @w: wallet to load from.
|
||||
*
|
||||
* Returns UINT32_MAX if nothing interesting.
|
||||
* @first_possible: when c-lightning may have been active from
|
||||
*/
|
||||
u32 wallet_channels_first_blocknum(struct wallet *w);
|
||||
u32 wallet_first_blocknum(struct wallet *w, u32 first_possible);
|
||||
|
||||
/**
|
||||
* wallet_extract_owned_outputs - given a tx, extract all of our outputs
|
||||
|
Loading…
Reference in New Issue
Block a user