Skip to content

Commit

Permalink
wallet: use last_processed_block to determine scan start.
Browse files Browse the repository at this point in the history
With fallback depending on chainparams: this means the first upgrade
will be slow, but after that it'll be fast.

Fixes: ElementsProject#990
Signed-off-by: Rusty Russell <[email protected]>
  • Loading branch information
rustyrussell authored and cdecker committed Feb 16, 2018
1 parent 2184932 commit 6620305
Show file tree
Hide file tree
Showing 7 changed files with 39 additions and 25 deletions.
5 changes: 5 additions & 0 deletions bitcoin/chainparams.c
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand All @@ -48,6 +52,7 @@ const struct chainparams networks[] = {
.cli = "litecoin-cli",
.cli_args = "-testnet",
.dust_limit = 100000,
.when_lightning_became_cool = 1,
.testnet = true}
};

Expand Down
1 change: 1 addition & 0 deletions bitcoin/chainparams.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
18 changes: 9 additions & 9 deletions lightningd/chaintopology.c
Original file line number Diff line number Diff line change
Expand Up @@ -470,16 +470,16 @@ static void get_init_block(struct bitcoind *bitcoind,
static void get_init_blockhash(struct bitcoind *bitcoind, u32 blockcount,
struct chain_topology *topo)
{
/* 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;
if (blockcount < 100)
blockcount = 0;
else
topo->first_blocknum -= 100;
blockcount -= 100;

/* This happens if first_blocknum is UINTMAX-1 */
if (blockcount < topo->first_blocknum)
topo->first_blocknum = blockcount;

/* Get up to speed with topology. */
bitcoind_getblockhash(bitcoind, topo->first_blocknum,
Expand Down Expand Up @@ -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);
Expand Down
9 changes: 6 additions & 3 deletions lightningd/lightningd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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]);

Expand Down Expand Up @@ -336,15 +336,18 @@ 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);

/* Initialize block topology (does its own transaction) */
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);
Expand Down
6 changes: 3 additions & 3 deletions lightningd/test/run-find_my_path.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
18 changes: 12 additions & 6 deletions wallet/wallet.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
7 changes: 3 additions & 4 deletions wallet/wallet.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 6620305

Please sign in to comment.