From 6ef64cd52b498eaa91aa2582a8c8635e097b7464 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Sat, 16 Sep 2017 09:09:06 +0930 Subject: [PATCH] script: make "sig_and_empty" more generic, make htlc tx witness fns clearer. For non-delayed HTLC success spends, we have a similar pattern (" ") so a we want to use the same function. The other routines don't say "witness" in them, and should. Signed-off-by: Rusty Russell --- bitcoin/script.c | 28 ++++++++++++++-------------- bitcoin/script.h | 27 ++++++++++++++------------- common/htlc_tx.c | 14 +++++++------- onchaind/onchain.c | 14 ++++++++------ 4 files changed, 43 insertions(+), 40 deletions(-) diff --git a/bitcoin/script.c b/bitcoin/script.c index e2905e891..397aab536 100644 --- a/bitcoin/script.c +++ b/bitcoin/script.c @@ -422,14 +422,15 @@ bool is_p2wpkh(const u8 *script) return true; } -u8 **bitcoin_witness_sig_and_empty(const tal_t *ctx, - const secp256k1_ecdsa_signature *sig, - const u8 *witnessscript) +u8 **bitcoin_witness_sig_and_element(const tal_t *ctx, + const secp256k1_ecdsa_signature *sig, + const void *elem, size_t elemsize, + const u8 *witnessscript) { u8 **witness = tal_arr(ctx, u8 *, 3); witness[0] = stack_sig(witness, sig); - witness[1] = NULL; + witness[1] = tal_dup_arr(witness, u8, elem, elemsize, 0); witness[2] = tal_dup_arr(witness, u8, witnessscript, tal_count(witnessscript), 0); @@ -662,10 +663,10 @@ u8 *bitcoin_wscript_htlc_receive(const tal_t *ctx, *... * * `txin[0]` witness stack: `0 ` for HTLC-Success, `0 0` for HTLC-Timeout. */ -u8 **bitcoin_htlc_offer_spend_timeout(const tal_t *ctx, - const secp256k1_ecdsa_signature *localsig, - const secp256k1_ecdsa_signature *remotesig, - const u8 *wscript) +u8 **bitcoin_witness_htlc_timeout_tx(const tal_t *ctx, + const secp256k1_ecdsa_signature *localsig, + const secp256k1_ecdsa_signature *remotesig, + const u8 *wscript) { u8 **witness = tal_arr(ctx, u8 *, 5); @@ -678,11 +679,11 @@ u8 **bitcoin_htlc_offer_spend_timeout(const tal_t *ctx, return witness; } -u8 **bitcoin_htlc_receive_spend_preimage(const tal_t *ctx, - const secp256k1_ecdsa_signature *localsig, - const secp256k1_ecdsa_signature *remotesig, - const struct preimage *preimage, - const u8 *wscript) +u8 **bitcoin_witness_htlc_success_tx(const tal_t *ctx, + const secp256k1_ecdsa_signature *localsig, + const secp256k1_ecdsa_signature *remotesig, + const struct preimage *preimage, + const u8 *wscript) { u8 **witness = tal_arr(ctx, u8 *, 5); @@ -694,7 +695,6 @@ u8 **bitcoin_htlc_receive_spend_preimage(const tal_t *ctx, return witness; } - u8 *bitcoin_wscript_htlc_tx(const tal_t *ctx, u16 to_self_delay, const struct pubkey *revocation_pubkey, diff --git a/bitcoin/script.h b/bitcoin/script.h index d01a1a616..8a11783d8 100644 --- a/bitcoin/script.h +++ b/bitcoin/script.h @@ -66,10 +66,11 @@ u8 **bitcoin_witness_p2wpkh(const tal_t *ctx, const secp256k1_ecdsa_signature *sig, const struct pubkey *key); -/* Create a witness which contains sig, an empty entry, and the witnessscript */ -u8 **bitcoin_witness_sig_and_empty(const tal_t *ctx, - const secp256k1_ecdsa_signature *sig, - const u8 *witnessscript); +/* Create a witness which contains sig, another entry, and the witnessscript */ +u8 **bitcoin_witness_sig_and_element(const tal_t *ctx, + const secp256k1_ecdsa_signature *sig, + const void *elem, size_t elemsize, + const u8 *witnessscript); /* BOLT #3 to-local output */ u8 *bitcoin_wscript_to_local(const tal_t *ctx, @@ -86,21 +87,21 @@ u8 *bitcoin_wscript_htlc_offer(const tal_t *ctx, const struct pubkey *remotekey, const struct sha256 *payment_hash, const struct pubkey *revocationkey); -u8 **bitcoin_htlc_offer_spend_timeout(const tal_t *ctx, - const secp256k1_ecdsa_signature *localsig, - const secp256k1_ecdsa_signature *remotesig, - const u8 *wscript); +u8 **bitcoin_witness_htlc_timeout_tx(const tal_t *ctx, + const secp256k1_ecdsa_signature *localsig, + const secp256k1_ecdsa_signature *remotesig, + const u8 *wscript); u8 *bitcoin_wscript_htlc_receive(const tal_t *ctx, const struct abs_locktime *htlc_abstimeout, const struct pubkey *localkey, const struct pubkey *remotekey, const struct sha256 *payment_hash, const struct pubkey *revocationkey); -u8 **bitcoin_htlc_receive_spend_preimage(const tal_t *ctx, - const secp256k1_ecdsa_signature *localsig, - const secp256k1_ecdsa_signature *remotesig, - const struct preimage *preimage, - const u8 *wscript); +u8 **bitcoin_witness_htlc_success_tx(const tal_t *ctx, + const secp256k1_ecdsa_signature *localsig, + const secp256k1_ecdsa_signature *remotesig, + const struct preimage *preimage, + const u8 *wscript); /* Underlying functions for penalties, where we only keep ripemd160 */ u8 *bitcoin_wscript_htlc_offer_ripemd160(const tal_t *ctx, diff --git a/common/htlc_tx.c b/common/htlc_tx.c index 295ee647e..ec8e6898a 100644 --- a/common/htlc_tx.c +++ b/common/htlc_tx.c @@ -109,10 +109,10 @@ void htlc_success_tx_add_witness(struct bitcoin_tx *htlc_success, &hash, revocationkey); htlc_success->input[0].witness - = bitcoin_htlc_receive_spend_preimage(htlc_success->input, - localsig, remotesig, - payment_preimage, - wscript); + = bitcoin_witness_htlc_success_tx(htlc_success->input, + localsig, remotesig, + payment_preimage, + wscript); tal_free(wscript); } @@ -150,9 +150,9 @@ void htlc_timeout_tx_add_witness(struct bitcoin_tx *htlc_timeout, payment_hash, revocationkey); htlc_timeout->input[0].witness - = bitcoin_htlc_offer_spend_timeout(htlc_timeout->input, - localsig, remotesig, - wscript); + = bitcoin_witness_htlc_timeout_tx(htlc_timeout->input, + localsig, remotesig, + wscript); tal_free(wscript); } diff --git a/onchaind/onchain.c b/onchaind/onchain.c index a53da1ecc..547dd26fd 100644 --- a/onchaind/onchain.c +++ b/onchaind/onchain.c @@ -659,8 +659,10 @@ static struct bitcoin_tx *tx_to_us(const tal_t *ctx, tx->output[0].amount -= fee; sign_tx_input(tx, 0, NULL, wscript, privkey, pubkey, &sig); - tx->input[0].witness = bitcoin_witness_sig_and_empty(tx->input, - &sig, wscript); + tx->input[0].witness = bitcoin_witness_sig_and_element(tx->input, + &sig, + NULL, 0, + wscript); return tx; } @@ -711,10 +713,10 @@ static void resolve_our_htlc_ourcommit(struct tracked_output *out, &keyset->self_payment_key, &localsig); tx->input[0].witness - = bitcoin_htlc_offer_spend_timeout(tx->input, - &localsig, - remotesig, - wscript); + = bitcoin_witness_htlc_timeout_tx(tx->input, + &localsig, + remotesig, + wscript); propose_resolution_at_block(out, tx, htlc->cltv_expiry, OUR_HTLC_TIMEOUT_TO_US);