Browse Source

channel: reserve a bip32 index as soon as channel is opened.

This simplifies things, and means it's always in the database.  Our
previous approach to creating it on the fly had holes when it was
created for onchaind, causing us to use another every time we
restarted.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ppa-0.6.1
Rusty Russell 7 years ago
committed by Christian Decker
parent
commit
6c1233de44
  1. 43
      channeld/channel.c
  2. 9
      channeld/channel_wire.csv
  3. 11
      lightningd/channel.c
  4. 7
      lightningd/channel.h
  5. 53
      lightningd/channel_control.c
  6. 24
      lightningd/closing_control.c
  7. 41
      lightningd/onchain_control.c
  8. 21
      lightningd/opening_control.c
  9. 22
      lightningd/peer_control.c
  10. 1
      wallet/test/Makefile
  11. 40
      wallet/test/run-wallet.c
  12. 13
      wallet/wallet.c

43
channeld/channel.c

@ -146,9 +146,12 @@ struct peer {
/* We save calculated commit sigs while waiting for master approval */
struct commit_sigs *next_commit_sigs;
/* If master told us to shut down, this contains scriptpubkey until
* we're ready to send it. */
u8 *unsent_shutdown_scriptpubkey;
/* The scriptpubkey to use for shutting down. */
u8 *final_scriptpubkey;
/* If master told us to shut down */
bool send_shutdown;
/* Has shutdown been sent by each side? */
bool shutdown_sent[NUM_SIDES];
/* Information used for reestablishment. */
@ -769,7 +772,7 @@ static void maybe_send_shutdown(struct peer *peer)
{
u8 *msg;
if (!peer->unsent_shutdown_scriptpubkey)
if (!peer->send_shutdown)
return;
/* Send a disable channel_update so others don't try to route
@ -778,11 +781,9 @@ static void maybe_send_shutdown(struct peer *peer)
wire_sync_write(GOSSIP_FD, msg);
enqueue_peer_msg(peer, take(msg));
msg = towire_shutdown(peer, &peer->channel_id,
peer->unsent_shutdown_scriptpubkey);
msg = towire_shutdown(peer, &peer->channel_id, peer->final_scriptpubkey);
enqueue_peer_msg(peer, take(msg));
peer->unsent_shutdown_scriptpubkey
= tal_free(peer->unsent_shutdown_scriptpubkey);
peer->send_shutdown = false;
peer->shutdown_sent[LOCAL] = true;
billboard_update(peer);
}
@ -1589,11 +1590,24 @@ static void handle_peer_shutdown(struct peer *peer, const u8 *shutdown)
&peer->channel_id,
"Bad shutdown %s", tal_hex(peer, shutdown));
/* Tell master, it will tell us what to send (if any). */
/* Tell master: we don't have to wait because on reconnect other end
* will re-send anyway. */
wire_sync_write(MASTER_FD,
take(towire_channel_got_shutdown(peer, scriptpubkey)));
peer->shutdown_sent[REMOTE] = true;
/* BOLT #2:
*
* A receiving node:
* ...
* - once there are no outstanding updates on the peer, UNLESS
* it has already sent a `shutdown`:
* - MUST reply to a `shutdown` message with a `shutdown`
*/
if (!peer->shutdown_sent[LOCAL]) {
peer->send_shutdown = true;
start_commit_timer(peer);
}
billboard_update(peer);
}
@ -2377,13 +2391,11 @@ static void handle_ping_cmd(struct peer *peer, const u8 *inmsg)
static void handle_shutdown_cmd(struct peer *peer, const u8 *inmsg)
{
u8 *scriptpubkey;
if (!fromwire_channel_send_shutdown(peer, inmsg, &scriptpubkey))
if (!fromwire_channel_send_shutdown(inmsg))
master_badmsg(WIRE_CHANNEL_SEND_SHUTDOWN, inmsg);
/* We can't send this until commit (if any) is done, so start timer<. */
peer->unsent_shutdown_scriptpubkey = scriptpubkey;
/* We can't send this until commit (if any) is done, so start timer. */
peer->send_shutdown = true;
start_commit_timer(peer);
}
@ -2537,8 +2549,9 @@ static void init_channel(struct peer *peer)
&peer->funding_locked[REMOTE],
&peer->short_channel_ids[LOCAL],
&reconnected,
&peer->unsent_shutdown_scriptpubkey,
&peer->send_shutdown,
&peer->shutdown_sent[REMOTE],
&peer->final_scriptpubkey,
&peer->channel_flags,
&funding_signed))
master_badmsg(WIRE_CHANNEL_INIT, msg);

9
channeld/channel_wire.csv

@ -55,9 +55,10 @@ channel_init,,local_funding_locked,bool
channel_init,,remote_funding_locked,bool
channel_init,,funding_short_id,struct short_channel_id
channel_init,,reestablish,bool
channel_init,,shutdown_scriptpubkey_len,u16
channel_init,,shutdown_scriptpubkey,shutdown_scriptpubkey_len*u8
channel_init,,send_shutdown,bool
channel_init,,remote_shutdown_received,bool
channel_init,,final_scriptpubkey_len,u16
channel_init,,final_scriptpubkey,final_scriptpubkey_len*u8
channel_init,,flags,u8
channel_init,,init_peer_pkt_len,u16
channel_init,,init_peer_pkt,init_peer_pkt_len*u8
@ -164,10 +165,8 @@ channel_got_revoke,,changed,num_changed*struct changed_htlc
# (eg. if we sent another commitment_signed, that would implicitly ack).
channel_got_revoke_reply,1122
# Tell peer that channel is shutting down
# Tell peer to shut down channel.
channel_send_shutdown,1023
channel_send_shutdown,,scriptpubkey_len,u16
channel_send_shutdown,,scriptpubkey,scriptpubkey_len*u8
# Peer told us that channel is shutting down
channel_got_shutdown,1024

Can't render this file because it has a wrong number of fields in line 2.

11
lightningd/channel.c

@ -1,3 +1,4 @@
#include <bitcoin/script.h>
#include <ccan/crypto/hkdf_sha256/hkdf_sha256.h>
#include <ccan/tal/str/str.h>
#include <gossipd/gen_gossip_wire.h>
@ -145,8 +146,7 @@ struct channel *new_channel(struct peer *peer, u64 dbid,
const struct channel_info *channel_info,
/* NULL or stolen */
u8 *remote_shutdown_scriptpubkey,
/* (-1 if not chosen yet) */
s64 local_shutdown_idx,
u64 final_key_idx,
bool last_was_revoke,
/* NULL or stolen */
struct changed_htlc *last_sent_commit,
@ -199,7 +199,7 @@ struct channel *new_channel(struct peer *peer, u64 dbid,
channel->channel_info = *channel_info;
channel->remote_shutdown_scriptpubkey
= tal_steal(channel, remote_shutdown_scriptpubkey);
channel->local_shutdown_idx = local_shutdown_idx;
channel->final_key_idx = final_key_idx;
channel->last_was_revoke = last_was_revoke;
channel->last_sent_commit = tal_steal(channel, last_sent_commit);
channel->first_blocknum = first_blocknum;
@ -208,6 +208,11 @@ struct channel *new_channel(struct peer *peer, u64 dbid,
list_add_tail(&peer->channels, &channel->list);
tal_add_destructor(channel, destroy_channel);
/* Make sure we see any spends using this key */
txfilter_add_scriptpubkey(peer->ld->owned_txfilter,
take(p2wpkh_for_keyidx(NULL, peer->ld,
channel->final_key_idx)));
return channel;
}

7
lightningd/channel.h

@ -80,8 +80,8 @@ struct channel {
/* Their scriptpubkey if they sent shutdown. */
u8 *remote_shutdown_scriptpubkey;
/* Our key for shutdown (-1 if not chosen yet) */
s64 local_shutdown_idx;
/* Address for any final outputs */
u64 final_key_idx;
/* Reestablishment stuff: last sent commit and revocation details. */
bool last_was_revoke;
@ -122,8 +122,7 @@ struct channel *new_channel(struct peer *peer, u64 dbid,
const struct channel_info *channel_info,
/* NULL or stolen */
u8 *remote_shutdown_scriptpubkey,
/* (-1 if not chosen yet) */
s64 local_shutdown_idx,
u64 final_key_idx,
bool last_was_revoke,
/* NULL or stolen */
struct changed_htlc *last_sent_commit,

53
lightningd/channel_control.c

@ -76,48 +76,11 @@ static void peer_got_shutdown(struct channel *channel, const u8 *msg)
return;
}
if (channel->local_shutdown_idx == -1) {
u8 *scriptpubkey;
channel->local_shutdown_idx = wallet_get_newindex(ld);
if (channel->local_shutdown_idx == -1) {
channel_internal_error(channel,
"Can't get local shutdown index");
return;
}
/* If we weren't already shutting down, we are now */
if (channel->state == CHANNELD_NORMAL)
channel_set_state(channel,
CHANNELD_NORMAL, CHANNELD_SHUTTING_DOWN);
/* BOLT #2:
*
* A sending node MUST set `scriptpubkey` to one of the
* following forms:
*
* ...3. `OP_0` `20` 20-bytes (version 0 pay to witness pubkey),
*/
scriptpubkey = p2wpkh_for_keyidx(msg, ld,
channel->local_shutdown_idx);
if (!scriptpubkey) {
channel_internal_error(channel,
"Can't get shutdown script %"PRIu64,
channel->local_shutdown_idx);
return;
}
txfilter_add_scriptpubkey(ld->owned_txfilter, scriptpubkey);
/* BOLT #2:
*
* A receiving node MUST reply to a `shutdown` message with a
* `shutdown` once there are no outstanding updates on the
* peer, unless it has already sent a `shutdown`.
*/
subd_send_msg(channel->owner,
take(towire_channel_send_shutdown(channel,
scriptpubkey)));
}
/* TODO(cdecker) Selectively save updated fields to DB */
wallet_channel_save(ld->wallet, channel);
}
@ -215,7 +178,6 @@ bool peer_start_channeld(struct channel *channel,
const struct failed_htlc **failed_htlcs;
enum side *failed_sides;
struct short_channel_id funding_channel_id;
const u8 *shutdown_scriptpubkey;
u64 num_revocations;
struct lightningd *ld = channel->peer->ld;
const struct config *cfg = &ld->config;
@ -262,13 +224,6 @@ bool peer_start_channeld(struct channel *channel,
memset(&funding_channel_id, 0, sizeof(funding_channel_id));
}
if (channel->local_shutdown_idx != -1) {
shutdown_scriptpubkey
= p2wpkh_for_keyidx(tmpctx, ld,
channel->local_shutdown_idx);
} else
shutdown_scriptpubkey = NULL;
num_revocations = revocations_received(&channel->their_shachain.chain);
/* Warn once. */
@ -316,8 +271,10 @@ bool peer_start_channeld(struct channel *channel,
channel->remote_funding_locked,
&funding_channel_id,
reconnected,
shutdown_scriptpubkey,
channel->state == CHANNELD_SHUTTING_DOWN,
channel->remote_shutdown_scriptpubkey != NULL,
p2wpkh_for_keyidx(tmpctx, ld,
channel->final_key_idx),
channel->channel_flags,
funding_signed);

24
lightningd/closing_control.c

@ -1,3 +1,4 @@
#include <bitcoin/script.h>
#include <closingd/gen_closing_wire.h>
#include <common/close_tx.h>
#include <common/initial_commit_tx.h>
@ -140,20 +141,15 @@ void peer_start_closingd(struct channel *channel,
bool reconnected)
{
const tal_t *tmpctx = tal_tmpctx(channel);
u8 *initmsg, *local_scriptpubkey;
u8 *initmsg;
u64 minfee, startfee, feelimit;
u64 num_revocations;
u64 funding_msatoshi, our_msatoshi, their_msatoshi;
struct lightningd *ld = channel->peer->ld;
if (channel->local_shutdown_idx == -1
|| !channel->remote_shutdown_scriptpubkey) {
if (!channel->remote_shutdown_scriptpubkey) {
channel_internal_error(channel,
"Can't start closing: local %s remote %s",
channel->local_shutdown_idx == -1
? "not shutdown" : "shutdown",
channel->remote_shutdown_scriptpubkey
? "shutdown" : "not shutdown");
"Can't start closing: no remote info");
tal_free(tmpctx);
return;
}
@ -174,15 +170,6 @@ void peer_start_closingd(struct channel *channel,
return;
}
local_scriptpubkey = p2wpkh_for_keyidx(tmpctx, ld,
channel->local_shutdown_idx);
if (!local_scriptpubkey) {
channel_internal_error(channel,
"Can't generate local shutdown scriptpubkey");
tal_free(tmpctx);
return;
}
/* BOLT #2:
*
* A sending node MUST set `fee_satoshis` lower than or equal
@ -227,7 +214,8 @@ void peer_start_closingd(struct channel *channel,
their_msatoshi / 1000, /* Rounds down */
channel->our_config.dust_limit_satoshis,
minfee, feelimit, startfee,
local_scriptpubkey,
p2wpkh_for_keyidx(tmpctx, ld,
channel->final_key_idx),
channel->remote_shutdown_scriptpubkey,
reconnected,
channel->next_index[LOCAL],

41
lightningd/onchain_control.c

@ -1,3 +1,4 @@
#include <bitcoin/script.h>
#include <common/key_derive.h>
#include <errno.h>
#include <inttypes.h>
@ -343,13 +344,12 @@ enum watch_result funding_spent(struct channel *channel,
size_t input_num,
const struct block *block)
{
u8 *msg, *scriptpubkey;
u8 *msg;
struct bitcoin_txid our_last_txid;
s64 keyindex;
struct pubkey ourkey;
struct htlc_stub *stubs;
const tal_t *tmpctx = tal_tmpctx(channel);
struct lightningd *ld = channel->peer->ld;
struct pubkey final_key;
channel_fail_permanent(channel, "Funding transaction spent");
@ -380,35 +380,13 @@ enum watch_result funding_spent(struct channel *channel,
return KEEP_WATCHING;
}
/* We re-use this key to send other outputs to. */
if (channel->local_shutdown_idx >= 0)
keyindex = channel->local_shutdown_idx;
else {
keyindex = wallet_get_newindex(ld);
if (keyindex < 0) {
log_broken(channel->log, "Could not get keyindex");
if (!bip32_pubkey(ld->wallet->bip32_base, &final_key,
channel->final_key_idx)) {
log_broken(channel->log, "Could not derive onchain key %"PRIu64,
channel->final_key_idx);
tal_free(tmpctx);
return KEEP_WATCHING;
}
}
scriptpubkey = p2wpkh_for_keyidx(tmpctx, ld, keyindex);
if (!scriptpubkey) {
channel_internal_error(channel,
"Can't get shutdown script %"PRIu64,
keyindex);
tal_free(tmpctx);
return DELETE_WATCH;
}
txfilter_add_scriptpubkey(ld->owned_txfilter, scriptpubkey);
if (!bip32_pubkey(ld->wallet->bip32_base, &ourkey, keyindex)) {
channel_internal_error(channel,
"Can't get shutdown key %"PRIu64,
keyindex);
tal_free(tmpctx);
return DELETE_WATCH;
}
/* This could be a mutual close, but it doesn't matter. */
bitcoin_txid(channel->last_tx, &our_last_txid);
@ -429,9 +407,10 @@ enum watch_result funding_spent(struct channel *channel,
channel->our_config.dust_limit_satoshis,
&channel->channel_info.theirbase.revocation,
&our_last_txid,
scriptpubkey,
p2wpkh_for_keyidx(tmpctx, ld,
channel->final_key_idx),
channel->remote_shutdown_scriptpubkey,
&ourkey,
&final_key,
channel->funder,
&channel->channel_info.theirbase.payment,
&channel->channel_info.theirbase.htlc,

21
lightningd/opening_control.c

@ -146,7 +146,8 @@ void json_add_uncommitted_channel(struct json_result *response,
json_object_end(response);
}
/* Steals fields from uncommitted_channel */
/* Steals fields from uncommitted_channel: returns NULL if can't generate a
* key for this channel (shouldn't happen!). */
static struct channel *
wallet_commit_channel(struct lightningd *ld,
struct uncommitted_channel *uc,
@ -162,6 +163,14 @@ wallet_commit_channel(struct lightningd *ld,
{
struct channel *channel;
u64 our_msatoshi;
s64 final_key_idx;
/* Get a key to use for closing outputs from this tx */
final_key_idx = wallet_get_newindex(ld);
if (final_key_idx == -1) {
log_broken(uc->log, "Can't get final key index");
return NULL;
}
if (uc->fc)
our_msatoshi = funding_satoshi * 1000 - push_msat;
@ -198,7 +207,7 @@ wallet_commit_channel(struct lightningd *ld,
NULL, /* No HTLC sigs yet */
channel_info,
NULL, /* No remote_shutdown_scriptpubkey yet */
-1, false,
final_key_idx, false,
NULL, /* No commit sent yet */
uc->first_blocknum);
@ -335,6 +344,10 @@ static void opening_funder_finished(struct subd *openingd, const u8 *resp,
fc->channel_flags,
&channel_info,
feerate);
if (!channel) {
command_fail(fc->cmd, "Key generation failure");
goto failed;
}
/* Get HSM to sign the funding tx. */
log_debug(channel->log, "Getting HSM to sign funding tx");
@ -450,6 +463,10 @@ static void opening_fundee_finished(struct subd *openingd,
channel_flags,
&channel_info,
feerate);
if (!channel) {
tal_free(uc);
return;
}
log_debug(channel->log, "Watching funding tx %s",
type_to_string(reply, struct bitcoin_txid,

22
lightningd/peer_control.c

@ -808,28 +808,12 @@ static void json_close(struct command *cmd,
/* Normal case. */
if (channel->state == CHANNELD_NORMAL) {
u8 *shutdown_scriptpubkey;
channel->local_shutdown_idx = wallet_get_newindex(cmd->ld);
if (channel->local_shutdown_idx == -1) {
command_fail(cmd, "Failed to get new key for shutdown");
return;
}
shutdown_scriptpubkey = p2wpkh_for_keyidx(cmd, cmd->ld,
channel->local_shutdown_idx);
if (!shutdown_scriptpubkey) {
command_fail(cmd, "Failed to get script for shutdown");
return;
}
channel_set_state(channel, CHANNELD_NORMAL, CHANNELD_SHUTTING_DOWN);
txfilter_add_scriptpubkey(cmd->ld->owned_txfilter, shutdown_scriptpubkey);
channel_set_state(channel,
CHANNELD_NORMAL, CHANNELD_SHUTTING_DOWN);
if (channel->owner)
subd_send_msg(channel->owner,
take(towire_channel_send_shutdown(channel,
shutdown_scriptpubkey)));
take(towire_channel_send_shutdown(channel)));
command_success(cmd, null_response(cmd));
} else

1
wallet/test/Makefile

@ -6,6 +6,7 @@ WALLET_TEST_COMMON_OBJS := \
common/htlc_state.o \
common/type_to_string.o \
common/memleak.o \
common/key_derive.o \
common/pseudorand.o \
common/timeout.o \
common/utils.o \

40
wallet/test/run-wallet.c

@ -28,10 +28,6 @@ static void db_log_(struct log *log UNUSED, enum log_level level UNUSED, const c
bool deprecated_apis = true;
/* AUTOGENERATED MOCKS START */
/* Generated stub for bip32_pubkey */
bool bip32_pubkey(const struct ext_key *bip32_base UNNEEDED,
struct pubkey *pubkey UNNEEDED, u32 index UNNEEDED)
{ fprintf(stderr, "bip32_pubkey called!\n"); abort(); }
/* Generated stub for bitcoind_gettxout */
void bitcoind_gettxout(struct bitcoind *bitcoind UNNEEDED,
const struct bitcoin_txid *txid UNNEEDED, const u32 outnum UNNEEDED,
@ -332,7 +328,7 @@ u8 *towire_channel_funding_announce_depth(const tal_t *ctx UNNEEDED)
u8 *towire_channel_funding_locked(const tal_t *ctx UNNEEDED, const struct short_channel_id *short_channel_id UNNEEDED)
{ fprintf(stderr, "towire_channel_funding_locked called!\n"); abort(); }
/* Generated stub for towire_channel_send_shutdown */
u8 *towire_channel_send_shutdown(const tal_t *ctx UNNEEDED, const u8 *scriptpubkey UNNEEDED)
u8 *towire_channel_send_shutdown(const tal_t *ctx UNNEEDED)
{ fprintf(stderr, "towire_channel_send_shutdown called!\n"); abort(); }
/* Generated stub for towire_error */
u8 *towire_error(const tal_t *ctx UNNEEDED, const struct channel_id *channel_id UNNEEDED, const u8 *data UNNEEDED)
@ -360,9 +356,6 @@ u8 *towire_gossip_disable_channel(const tal_t *ctx UNNEEDED, const struct short_
/* Generated stub for towire_gossip_getpeers_request */
u8 *towire_gossip_getpeers_request(const tal_t *ctx UNNEEDED, const struct pubkey *id UNNEEDED)
{ fprintf(stderr, "towire_gossip_getpeers_request called!\n"); abort(); }
/* Generated stub for txfilter_add_scriptpubkey */
void txfilter_add_scriptpubkey(struct txfilter *filter UNNEEDED, const u8 *script TAKES UNNEEDED)
{ fprintf(stderr, "txfilter_add_scriptpubkey called!\n"); abort(); }
/* Generated stub for unsupported_features */
bool unsupported_features(const u8 *gfeatures UNNEEDED, const u8 *lfeatures UNNEEDED)
{ fprintf(stderr, "unsupported_features called!\n"); abort(); }
@ -445,6 +438,12 @@ const char *log_prefix(const struct log *log UNNEEDED)
return "";
}
void txfilter_add_scriptpubkey(struct txfilter *filter UNNEEDED, const u8 *script TAKES)
{
if (taken(script))
tal_free(script);
}
/**
* mempat -- Set the memory to a pattern
*
@ -464,6 +463,7 @@ static struct wallet *create_test_wallet(struct lightningd *ld, const tal_t *ctx
char filename[] = "/tmp/ldb-XXXXXX";
int fd = mkstemp(filename);
struct wallet *w = tal(ctx, struct wallet);
static unsigned char badseed[BIP32_ENTROPY_LEN_128];
CHECK_MSG(fd != -1, "Unable to generate temp filename");
close(fd);
@ -472,6 +472,12 @@ static struct wallet *create_test_wallet(struct lightningd *ld, const tal_t *ctx
ltmp = tal_tmpctx(ctx);
list_head_init(&w->unstored_payments);
w->ld = ld;
ld->wallet = w;
w->bip32_base = tal(w, struct ext_key);
CHECK(bip32_key_from_seed(badseed, sizeof(badseed),
BIP32_VER_TEST_PRIVATE, 0,
w->bip32_base) == WALLY_OK);
CHECK_MSG(w->db, "Failed opening the db");
db_migrate(w->db, w->log);
@ -668,10 +674,11 @@ static bool channelseq(struct channel *c1, struct channel *c2)
CHECK(memeq(&c1->last_sig, sizeof(c1->last_sig),
&c2->last_sig, sizeof(c2->last_sig)));
if (c1->remote_shutdown_scriptpubkey) {
CHECK(c2->remote_shutdown_scriptpubkey);
CHECK(c1->local_shutdown_idx == c2->local_shutdown_idx);
}
CHECK(c1->final_key_idx == c2->final_key_idx);
CHECK(memeq(c1->remote_shutdown_scriptpubkey,
tal_len(c1->remote_shutdown_scriptpubkey),
c2->remote_shutdown_scriptpubkey,
tal_len(c2->remote_shutdown_scriptpubkey)));
CHECK(c1->last_was_revoke == c2->last_was_revoke);
@ -717,6 +724,7 @@ static bool test_channel_crud(struct lightningd *ld, const tal_t *ctx)
ci->feerate_per_kw[LOCAL] = ci->feerate_per_kw[REMOTE] = 31337;
mempat(scriptpubkey, tal_len(scriptpubkey));
c1.first_blocknum = 1;
c1.final_key_idx = 1337;
p = new_peer(ld, 0, &pk, NULL);
c1.peer = p;
c1.dbid = wallet_get_channel_dbid(w);
@ -782,7 +790,6 @@ static bool test_channel_crud(struct lightningd *ld, const tal_t *ctx)
/* Variant 4: update and add remote_shutdown_scriptpubkey */
c1.remote_shutdown_scriptpubkey = scriptpubkey;
c1.local_shutdown_idx = 1337;
wallet_channel_save(w, &c1);
CHECK_MSG(!wallet_err, tal_fmt(w, "Insert into DB: %s", wallet_err));
CHECK_MSG(c2 = wallet_channel_load(w, c1.dbid), tal_fmt(w, "Load from DB"));
@ -972,6 +979,13 @@ int main(void)
ok &= test_htlc_crud(ld, tmpctx);
ok &= test_payment_crud(ld, tmpctx);
take_cleanup();
tal_free(tmpctx);
/* FIXME! https://github.com/ElementsProject/libwally-core/issues/26 */
{
secp256k1_context *secp_ctx(void);
secp256k1_context_destroy(secp_ctx());
}
return !ok;
}

13
wallet/wallet.c

@ -4,6 +4,7 @@
#include <bitcoin/script.h>
#include <ccan/structeq/structeq.h>
#include <ccan/tal/str/str.h>
#include <common/key_derive.h>
#include <common/wireaddr.h>
#include <inttypes.h>
#include <lightningd/invoice.h>
@ -584,6 +585,7 @@ static struct channel *wallet_stmt2channel(const tal_t *ctx, struct wallet *w, s
u8 *remote_shutdown_scriptpubkey;
struct changed_htlc *last_sent_commit;
const tal_t *tmpctx = tal_tmpctx(ctx);
s64 final_key_idx;
peer_dbid = sqlite3_column_int64(stmt, 1);
peer = find_peer_by_dbid(w->ld, peer_dbid);
@ -640,6 +642,12 @@ static struct channel *wallet_stmt2channel(const tal_t *ctx, struct wallet *w, s
return NULL;
}
final_key_idx = sqlite3_column_int64(stmt, 29);
if (final_key_idx < 0) {
log_broken(w->log, "%s: Final key < 0", __func__);
tal_free(tmpctx);
return NULL;
}
chan = new_channel(peer, sqlite3_column_int64(stmt, 0),
&wshachain,
sqlite3_column_int(stmt, 5),
@ -665,8 +673,7 @@ static struct channel *wallet_stmt2channel(const tal_t *ctx, struct wallet *w, s
sqlite3_column_int64(stmt, 0)),
&channel_info,
remote_shutdown_scriptpubkey,
remote_shutdown_scriptpubkey
? sqlite3_column_int64(stmt, 29) : -1,
final_key_idx,
sqlite3_column_int(stmt, 34) != 0,
last_sent_commit,
sqlite3_column_int64(stmt, 35));
@ -909,7 +916,7 @@ void wallet_channel_save(struct wallet *w, struct channel *chan)
tal_len(chan->remote_shutdown_scriptpubkey),
SQLITE_TRANSIENT);
sqlite3_bind_int64(stmt, 17, chan->local_shutdown_idx);
sqlite3_bind_int64(stmt, 17, chan->final_key_idx);
sqlite3_bind_int64(stmt, 18, chan->our_config.id);
sqlite3_bind_tx(stmt, 19, chan->last_tx);
sqlite3_bind_signature(stmt, 20, &chan->last_sig);

Loading…
Cancel
Save