diff --git a/daemon/packets.c b/daemon/packets.c index bc6ee73b0..fcfb5d46d 100644 --- a/daemon/packets.c +++ b/daemon/packets.c @@ -276,7 +276,7 @@ void queue_pkt_close_signature(struct peer *peer) struct signature our_close_sig; close_signature__init(c); - close_tx = peer_create_close_tx(peer, peer->closing.our_fee); + close_tx = peer_create_close_tx(c, peer, peer->closing.our_fee); peer_sign_mutual_close(peer, close_tx, &our_close_sig); c->sig = signature_to_proto(c, peer->dstate->secpctx, &our_close_sig); diff --git a/daemon/peer.c b/daemon/peer.c index c2dc8456a..d889171c0 100644 --- a/daemon/peer.c +++ b/daemon/peer.c @@ -76,12 +76,13 @@ void peer_add_their_commit(struct peer *peer, } /* Create a bitcoin close tx, using last signature they sent. */ -static const struct bitcoin_tx *bitcoin_close(struct peer *peer) +static const struct bitcoin_tx *mk_bitcoin_close(const tal_t *ctx, + struct peer *peer) { struct bitcoin_tx *close_tx; struct bitcoin_signature our_close_sig; - close_tx = peer_create_close_tx(peer, peer->closing.their_fee); + close_tx = peer_create_close_tx(ctx, peer, peer->closing.their_fee); our_close_sig.stype = SIGHASH_ALL; peer_sign_mutual_close(peer, close_tx, &our_close_sig.sig); @@ -155,8 +156,8 @@ static const struct bitcoin_tx *bitcoin_spend_ours(struct peer *peer) return tx; } -/* Sign and return our commit tx */ -static const struct bitcoin_tx *bitcoin_commit(struct peer *peer) +/* Sign and local commit tx */ +static void sign_commit_tx(struct peer *peer) { struct bitcoin_signature sig; @@ -174,8 +175,6 @@ static const struct bitcoin_tx *bitcoin_commit(struct peer *peer) &sig, &peer->remote.commitkey, &peer->local.commitkey); - - return peer->local.commit->tx; } static u64 commit_tx_fee(const struct bitcoin_tx *commit, u64 anchor_satoshis) @@ -341,13 +340,16 @@ static void peer_breakdown(struct peer *peer) /* If we have a closing tx, use it. */ if (peer->closing.their_sig) { + const struct bitcoin_tx *close = mk_bitcoin_close(peer, peer); log_unusual(peer->log, "Peer breakdown: sending close tx"); - broadcast_tx(peer, bitcoin_close(peer), NULL); + broadcast_tx(peer, close, NULL); + tal_free(close); /* If we have a signed commit tx (maybe not if we just offered * anchor, or they supplied anchor, or no outputs to us). */ } else if (peer->local.commit && peer->local.commit->sig) { log_unusual(peer->log, "Peer breakdown: sending commit tx"); - broadcast_tx(peer, bitcoin_commit(peer), NULL); + sign_commit_tx(peer); + broadcast_tx(peer, peer->local.commit->tx, NULL); } else { log_info(peer->log, "Peer breakdown: nothing to do"); /* We close immediately. */ @@ -902,7 +904,7 @@ static bool closing_pkt_in(struct peer *peer, const Pkt *pkt) return peer_comms_err(peer, pkt_err(peer, "Invalid signature format")); - close_tx = peer_create_close_tx(peer, c->close_fee); + close_tx = peer_create_close_tx(c, peer, c->close_fee); if (!check_tx_sig(peer->dstate->secpctx, close_tx, 0, NULL, 0, peer->anchor.witnessscript, @@ -956,6 +958,7 @@ static bool closing_pkt_in(struct peer *peer, const Pkt *pkt) /* Note corner case: we may *now* agree with them! */ if (peer->closing.our_fee == peer->closing.their_fee) { + const struct bitcoin_tx *close; log_info(peer->log, "accept_pkt_close_sig: we agree"); /* BOLT #2: * @@ -963,7 +966,9 @@ static bool closing_pkt_in(struct peer *peer, const Pkt *pkt) * matching `close_fee` it SHOULD close the connection and * SHOULD sign and broadcast the final closing transaction. */ - broadcast_tx(peer, bitcoin_close(peer), NULL); + close = mk_bitcoin_close(peer, peer); + broadcast_tx(peer, close, NULL); + tal_free(close); return false; } @@ -3995,7 +4000,8 @@ void peer_watch_anchor(struct peer *peer, anchor_timeout, peer); } -struct bitcoin_tx *peer_create_close_tx(struct peer *peer, u64 fee) +struct bitcoin_tx *peer_create_close_tx(const tal_t *ctx, + struct peer *peer, u64 fee) { struct channel_state cstate; @@ -4016,7 +4022,7 @@ struct bitcoin_tx *peer_create_close_tx(struct peer *peer, u64 fee) log_add_struct(peer->log, "%s", struct pubkey, &peer->local.finalkey); log_add_struct(peer->log, "/%s", struct pubkey, &peer->remote.finalkey); - return create_close_tx(peer->dstate->secpctx, peer, + return create_close_tx(peer->dstate->secpctx, ctx, peer->closing.our_script, peer->closing.their_script, &peer->anchor.txid, @@ -4855,7 +4861,6 @@ static void json_signcommit(struct command *cmd, struct peer *peer; jsmntok_t *peeridtok; u8 *linear; - const struct bitcoin_tx *tx; struct json_result *response = new_json_result(cmd); if (!json_get_params(buffer, params, @@ -4876,11 +4881,12 @@ static void json_signcommit(struct command *cmd, return; } - tx = bitcoin_commit(peer); - linear = linearize_tx(cmd, tx); + sign_commit_tx(peer); + linear = linearize_tx(cmd, peer->local.commit->tx); /* Clear witness for potential future uses. */ - tx->input[0].witness = tal_free(tx->input[0].witness); + peer->local.commit->tx->input[0].witness + = tal_free(peer->local.commit->tx->input[0].witness); json_object_start(response, NULL); json_add_string(response, "tx", diff --git a/daemon/peer.h b/daemon/peer.h index aca7d0e06..d51080dbf 100644 --- a/daemon/peer.h +++ b/daemon/peer.h @@ -286,7 +286,8 @@ void peer_fail(struct peer *peer, const char *caller); /* Peer has completed open, or problem (if non-NULL). */ void peer_open_complete(struct peer *peer, const char *problem); -struct bitcoin_tx *peer_create_close_tx(struct peer *peer, u64 fee); +struct bitcoin_tx *peer_create_close_tx(const tal_t *ctx, + struct peer *peer, u64 fee); void debug_dump_peers(struct lightningd_state *dstate);