From 90b393ca1a0a9bc8c99672a00946eec2cf749371 Mon Sep 17 00:00:00 2001 From: niftynei Date: Tue, 28 Jul 2020 21:03:03 -0500 Subject: [PATCH] hsmd/db: backfill pubkey information so that psbts signing works the way we use PSBTs to sign things requires that we have the scriptpubkey available on the utxo so we can populate the witness-utxo field with it. this causes problems if we don't already have the scriptpubkey cached in the database, as in *some* cases we require a round trip to the HSM to populate them to get over this hump, we backfill any and all missing scriptpubkey information for the utxo's that we hold in our wallet. this will allow us to clean up the NULL handling of missing scriptpubkeys. --- hsmd/hsm_wire.csv | 10 ++ hsmd/hsmd.c | 31 ++++++ tests/data/pubkey_regen.sqlite.xz | Bin 0 -> 18016 bytes .../pubkey_regen_commitment_point.sqlite3.xz | Bin 0 -> 18044 bytes tests/test_db.py | 70 ++++++++++++++ wallet/db.c | 88 ++++++++++++++++++ wallet/test/run-db.c | 12 +++ wallet/test/run-wallet.c | 6 ++ 8 files changed, 217 insertions(+) create mode 100644 tests/data/pubkey_regen.sqlite.xz create mode 100644 tests/data/pubkey_regen_commitment_point.sqlite3.xz diff --git a/hsmd/hsm_wire.csv b/hsmd/hsm_wire.csv index 194d9a926..2317ce922 100644 --- a/hsmd/hsm_wire.csv +++ b/hsmd/hsm_wire.csv @@ -185,3 +185,13 @@ msgdata,hsm_sign_message,msg,u8,len msgtype,hsm_sign_message_reply,123 msgdata,hsm_sign_message_reply,sig,secp256k1_ecdsa_recoverable_signature, + +# lightningd needs to get a scriptPubkey for a utxo with closeinfo +msgtype,hsm_get_output_scriptpubkey,24 +msgdata,hsm_get_output_scriptpubkey,channel_id,u64, +msgdata,hsm_get_output_scriptpubkey,peer_id,node_id, +msgdata,hsm_get_output_scriptpubkey,commitment_point,?pubkey, + +msgtype,hsm_get_output_scriptpubkey_reply,124 +msgdata,hsm_get_output_scriptpubkey_reply,script_len,u16, +msgdata,hsm_get_output_scriptpubkey_reply,script,u8,script_len diff --git a/hsmd/hsmd.c b/hsmd/hsmd.c index b4e04705a..1cae47f25 100644 --- a/hsmd/hsmd.c +++ b/hsmd/hsmd.c @@ -1571,6 +1571,31 @@ static struct io_plan *handle_sign_withdrawal_tx(struct io_conn *conn, take(towire_hsm_sign_withdrawal_reply(NULL, psbt))); } +static struct io_plan *handle_get_output_scriptpubkey(struct io_conn *conn, + struct client *c, + const u8 *msg_in) +{ + struct pubkey pubkey; + struct privkey privkey; + struct unilateral_close_info info; + u8 *scriptPubkey; + + info.commitment_point = NULL; + if (!fromwire_hsm_get_output_scriptpubkey(tmpctx, msg_in, + &info.channel_id, + &info.peer_id, + &info.commitment_point)) + return bad_req(conn, c, msg_in); + + hsm_unilateral_close_privkey(&privkey, &info); + pubkey_from_privkey(&privkey, &pubkey); + scriptPubkey = scriptpubkey_p2wpkh(tmpctx, &pubkey); + + return req_reply(conn, c, + take(towire_hsm_get_output_scriptpubkey_reply(NULL, + scriptPubkey))); +} + /*~ Lightning invoices, defined by BOLT 11, are signed. This has been * surprisingly controversial; it means a node needs to be online to create * invoices. However, it seems clear to me that in a world without @@ -1799,6 +1824,7 @@ static bool check_client_capabilities(struct client *client, case WIRE_HSM_GET_CHANNEL_BASEPOINTS: case WIRE_HSM_DEV_MEMLEAK: case WIRE_HSM_SIGN_MESSAGE: + case WIRE_HSM_GET_OUTPUT_SCRIPTPUBKEY: return (client->capabilities & HSM_CAP_MASTER) != 0; /*~ These are messages sent by the HSM so we should never receive them. */ @@ -1820,6 +1846,7 @@ static bool check_client_capabilities(struct client *client, case WIRE_HSM_GET_CHANNEL_BASEPOINTS_REPLY: case WIRE_HSM_DEV_MEMLEAK_REPLY: case WIRE_HSM_SIGN_MESSAGE_REPLY: + case WIRE_HSM_GET_OUTPUT_SCRIPTPUBKEY_REPLY: break; } return false; @@ -1849,6 +1876,9 @@ static struct io_plan *handle_client(struct io_conn *conn, struct client *c) case WIRE_HSM_GET_CHANNEL_BASEPOINTS: return handle_get_channel_basepoints(conn, c, c->msg_in); + case WIRE_HSM_GET_OUTPUT_SCRIPTPUBKEY: + return handle_get_output_scriptpubkey(conn, c, c->msg_in); + case WIRE_HSM_ECDH_REQ: return handle_ecdh(conn, c, c->msg_in); @@ -1921,6 +1951,7 @@ static struct io_plan *handle_client(struct io_conn *conn, struct client *c) case WIRE_HSM_GET_CHANNEL_BASEPOINTS_REPLY: case WIRE_HSM_DEV_MEMLEAK_REPLY: case WIRE_HSM_SIGN_MESSAGE_REPLY: + case WIRE_HSM_GET_OUTPUT_SCRIPTPUBKEY_REPLY: break; } diff --git a/tests/data/pubkey_regen.sqlite.xz b/tests/data/pubkey_regen.sqlite.xz new file mode 100644 index 0000000000000000000000000000000000000000..fe9997ede0e3e32185a51ff66dbf2105120775ee GIT binary patch literal 18016 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�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 n*3`ZLUk4vxv}vSRMV(;C8Tck-h>j-y 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 #include #include +#include #include #include #include +#include #include #include #include #include #include #include +#include #include +#include #define NSEC_IN_SEC 1000000000 @@ -33,6 +37,8 @@ static void migrate_our_funding(struct lightningd *ld, struct db *db, static void migrate_last_tx_to_psbt(struct lightningd *ld, struct db *db, const struct ext_key *bip32_base); +static void fillin_missing_scriptpubkeys(struct lightningd *ld, struct db *db, + const struct ext_key *bip32_base); /* Do not reorder or remove elements from this array, it is used to * migrate existing databases from a previous state, based on the @@ -626,6 +632,7 @@ static struct migration dbmigrations[] = { {SQL("INSERT INTO vars (name, intval) VALUES ('coin_moves_count', 0);"), NULL}, {NULL, migrate_last_tx_to_psbt}, {SQL("ALTER TABLE outputs ADD reserved_til INTEGER DEFAULT NULL;"), NULL}, + {NULL, fillin_missing_scriptpubkeys}, }; /* Leak tracking. */ @@ -1128,6 +1135,87 @@ static void migrate_our_funding(struct lightningd *ld, struct db *db, tal_free(stmt); } +void fillin_missing_scriptpubkeys(struct lightningd *ld, struct db *db, + const struct ext_key *bip32_base) +{ + struct db_stmt *stmt; + + stmt = db_prepare_v2(db, SQL("SELECT" + " type" + ", keyindex" + ", prev_out_tx" + ", prev_out_index" + ", channel_id" + ", peer_id" + ", commitment_point" + " FROM outputs" + " WHERE scriptpubkey IS NULL;")); + + db_query_prepared(stmt); + while (db_step(stmt)) { + int type; + u8 *scriptPubkey; + struct bitcoin_txid txid; + u32 outnum, keyindex; + struct pubkey key; + struct db_stmt *update_stmt; + + type = db_column_int(stmt, 0); + keyindex = db_column_int(stmt, 1); + db_column_txid(stmt, 2, &txid); + outnum = db_column_int(stmt, 3); + + /* This indiciates whether or not we have 'close_info' */ + if (!db_column_is_null(stmt, 4)) { + struct pubkey *commitment_point; + struct node_id peer_id; + u64 channel_id; + u8 *msg; + + channel_id = db_column_u64(stmt, 4); + db_column_node_id(stmt, 5, &peer_id); + if (!db_column_is_null(stmt, 6)) { + commitment_point = tal(stmt, struct pubkey); + db_column_pubkey(stmt, 6, commitment_point); + } else + commitment_point = NULL; + + /* Have to go ask the HSM to derive the pubkey for us */ + msg = towire_hsm_get_output_scriptpubkey(NULL, + channel_id, + &peer_id, + commitment_point); + if (!wire_sync_write(ld->hsm_fd, take(msg))) + fatal("Could not write to HSM: %s", strerror(errno)); + msg = wire_sync_read(stmt, ld->hsm_fd); + if (!fromwire_hsm_get_output_scriptpubkey_reply(stmt, msg, + &scriptPubkey)) + fatal("HSM gave bad hsm_get_output_scriptpubkey_reply %s", + tal_hex(msg, msg)); + } else { + /* Build from bip32_base */ + bip32_pubkey(bip32_base, &key, keyindex); + if (type == p2sh_wpkh) { + u8 *redeemscript = bitcoin_redeem_p2sh_p2wpkh(stmt, &key); + scriptPubkey = scriptpubkey_p2sh(tmpctx, redeemscript); + } else + scriptPubkey = scriptpubkey_p2wpkh(stmt, &key); + } + + update_stmt = db_prepare_v2(db, SQL("UPDATE outputs" + " SET scriptpubkey = ?" + " WHERE prev_out_tx = ? " + " AND prev_out_index = ?")); + db_bind_blob(update_stmt, 0, scriptPubkey, tal_bytelen(scriptPubkey)); + db_bind_txid(update_stmt, 1, &txid); + db_bind_int(update_stmt, 2, outnum); + db_exec_prepared_v2(update_stmt); + tal_free(update_stmt); + } + + tal_free(stmt); +} + /* We're moving everything over to PSBTs from tx's, particularly our last_tx's * which are commitment transactions for channels. * This migration loads all of the last_tx's and 're-formats' them into psbts, diff --git a/wallet/test/run-db.c b/wallet/test/run-db.c index d133563c7..665286123 100644 --- a/wallet/test/run-db.c +++ b/wallet/test/run-db.c @@ -21,6 +21,9 @@ static void db_log_(struct log *log UNUSED, enum log_level level UNUSED, const s /* Generated stub for fatal */ void fatal(const char *fmt UNNEEDED, ...) { fprintf(stderr, "fatal called!\n"); abort(); } +/* Generated stub for fromwire_hsm_get_output_scriptpubkey_reply */ +bool fromwire_hsm_get_output_scriptpubkey_reply(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, u8 **script UNNEEDED) +{ fprintf(stderr, "fromwire_hsm_get_output_scriptpubkey_reply called!\n"); abort(); } /* Generated stub for get_channel_basepoints */ void get_channel_basepoints(struct lightningd *ld UNNEEDED, const struct node_id *peer_id UNNEEDED, @@ -33,6 +36,15 @@ struct log *new_log(const tal_t *ctx UNNEEDED, struct log_book *record UNNEEDED, const struct node_id *default_node_id UNNEEDED, const char *fmt UNNEEDED, ...) { fprintf(stderr, "new_log called!\n"); abort(); } +/* Generated stub for towire_hsm_get_output_scriptpubkey */ +u8 *towire_hsm_get_output_scriptpubkey(const tal_t *ctx UNNEEDED, u64 channel_id UNNEEDED, const struct node_id *peer_id UNNEEDED, const struct pubkey *commitment_point UNNEEDED) +{ fprintf(stderr, "towire_hsm_get_output_scriptpubkey called!\n"); abort(); } +/* Generated stub for wire_sync_read */ +u8 *wire_sync_read(const tal_t *ctx UNNEEDED, int fd UNNEEDED) +{ fprintf(stderr, "wire_sync_read called!\n"); abort(); } +/* Generated stub for wire_sync_write */ +bool wire_sync_write(int fd UNNEEDED, const void *msg TAKES UNNEEDED) +{ fprintf(stderr, "wire_sync_write called!\n"); abort(); } /* AUTOGENERATED MOCKS END */ static char *db_err; diff --git a/wallet/test/run-wallet.c b/wallet/test/run-wallet.c index 2f1d7a174..ef8e18bbe 100644 --- a/wallet/test/run-wallet.c +++ b/wallet/test/run-wallet.c @@ -135,6 +135,9 @@ bool fromwire_custommsg_in(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, u8 /* Generated stub for fromwire_gossip_get_stripped_cupdate_reply */ bool fromwire_gossip_get_stripped_cupdate_reply(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, u8 **stripped_update UNNEEDED) { fprintf(stderr, "fromwire_gossip_get_stripped_cupdate_reply called!\n"); abort(); } +/* Generated stub for fromwire_hsm_get_output_scriptpubkey_reply */ +bool fromwire_hsm_get_output_scriptpubkey_reply(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, u8 **script UNNEEDED) +{ fprintf(stderr, "fromwire_hsm_get_output_scriptpubkey_reply called!\n"); abort(); } /* Generated stub for fromwire_hsm_sign_commitment_tx_reply */ bool fromwire_hsm_sign_commitment_tx_reply(const void *p UNNEEDED, struct bitcoin_signature *sig UNNEEDED) { fprintf(stderr, "fromwire_hsm_sign_commitment_tx_reply called!\n"); abort(); } @@ -692,6 +695,9 @@ u8 *towire_final_incorrect_htlc_amount(const tal_t *ctx UNNEEDED, struct amount_ /* Generated stub for towire_gossip_get_stripped_cupdate */ u8 *towire_gossip_get_stripped_cupdate(const tal_t *ctx UNNEEDED, const struct short_channel_id *channel_id UNNEEDED) { fprintf(stderr, "towire_gossip_get_stripped_cupdate called!\n"); abort(); } +/* Generated stub for towire_hsm_get_output_scriptpubkey */ +u8 *towire_hsm_get_output_scriptpubkey(const tal_t *ctx UNNEEDED, u64 channel_id UNNEEDED, const struct node_id *peer_id UNNEEDED, const struct pubkey *commitment_point UNNEEDED) +{ fprintf(stderr, "towire_hsm_get_output_scriptpubkey called!\n"); abort(); } /* Generated stub for towire_hsm_sign_commitment_tx */ u8 *towire_hsm_sign_commitment_tx(const tal_t *ctx UNNEEDED, const struct node_id *peer_id UNNEEDED, u64 channel_dbid UNNEEDED, const struct bitcoin_tx *tx UNNEEDED, const struct pubkey *remote_funding_key UNNEEDED) { fprintf(stderr, "towire_hsm_sign_commitment_tx called!\n"); abort(); }