mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-03-26 20:30:59 +01:00
txs: Move commit tx generation out of the signature computation
We need the txs around, so don't throw them away after generating them.
This commit is contained in:
parent
667a763659
commit
eb8eabcc3c
13 changed files with 108 additions and 45 deletions
|
@ -820,21 +820,17 @@ static u8 *master_wait_sync_reply(const tal_t *ctx,
|
|||
/* Returns HTLC sigs, sets commit_sig */
|
||||
static secp256k1_ecdsa_signature *calc_commitsigs(const tal_t *ctx,
|
||||
const struct peer *peer,
|
||||
struct bitcoin_tx **txs,
|
||||
const u8 *funding_wscript,
|
||||
const struct htlc **htlc_map,
|
||||
u64 commit_index,
|
||||
struct bitcoin_signature *commit_sig)
|
||||
{
|
||||
size_t i;
|
||||
struct bitcoin_tx **txs;
|
||||
const u8 *funding_wscript;
|
||||
const struct htlc **htlc_map;
|
||||
struct pubkey local_htlckey;
|
||||
const u8 *msg;
|
||||
secp256k1_ecdsa_signature *htlc_sigs;
|
||||
|
||||
txs = channel_txs(tmpctx, &htlc_map,
|
||||
&funding_wscript, peer->channel, &peer->remote_per_commit,
|
||||
commit_index, REMOTE);
|
||||
|
||||
msg = towire_hsm_sign_remote_commitment_tx(NULL, txs[0],
|
||||
&peer->channel->funding_pubkey[REMOTE],
|
||||
*txs[0]->input_amounts[0],
|
||||
|
@ -930,6 +926,10 @@ static void send_commit(struct peer *peer)
|
|||
const struct htlc **changed_htlcs;
|
||||
struct bitcoin_signature commit_sig;
|
||||
secp256k1_ecdsa_signature *htlc_sigs;
|
||||
struct bitcoin_tx **txs;
|
||||
const u8 *funding_wscript;
|
||||
const struct htlc **htlc_map;
|
||||
struct wally_tx_output *direct_outputs[NUM_SIDES];
|
||||
|
||||
#if DEVELOPER
|
||||
/* Hack to suppress all commit sends if dev_disconnect says to */
|
||||
|
@ -1020,8 +1020,13 @@ static void send_commit(struct peer *peer)
|
|||
return;
|
||||
}
|
||||
|
||||
htlc_sigs = calc_commitsigs(tmpctx, peer, peer->next_index[REMOTE],
|
||||
&commit_sig);
|
||||
txs = channel_txs(tmpctx, &htlc_map, direct_outputs,
|
||||
&funding_wscript, peer->channel, &peer->remote_per_commit,
|
||||
peer->next_index[REMOTE], REMOTE);
|
||||
|
||||
htlc_sigs =
|
||||
calc_commitsigs(tmpctx, peer, txs, funding_wscript, htlc_map,
|
||||
peer->next_index[REMOTE], &commit_sig);
|
||||
|
||||
status_debug("Telling master we're about to commit...");
|
||||
/* Tell master to save this next commit to database, then wait. */
|
||||
|
@ -1261,7 +1266,7 @@ static void handle_peer_commit_sig(struct peer *peer, const u8 *msg)
|
|||
commit_sig.sighash_type = SIGHASH_ALL;
|
||||
|
||||
txs =
|
||||
channel_txs(tmpctx, &htlc_map,
|
||||
channel_txs(tmpctx, &htlc_map, NULL,
|
||||
&funding_wscript, peer->channel, &peer->next_local_per_commit,
|
||||
peer->next_index[LOCAL], LOCAL);
|
||||
|
||||
|
@ -2018,6 +2023,10 @@ static void resend_commitment(struct peer *peer, const struct changed_htlc *last
|
|||
struct bitcoin_signature commit_sig;
|
||||
secp256k1_ecdsa_signature *htlc_sigs;
|
||||
u8 *msg;
|
||||
struct bitcoin_tx **txs;
|
||||
const u8 *funding_wscript;
|
||||
const struct htlc **htlc_map;
|
||||
struct wally_tx_output *direct_outputs[NUM_SIDES];
|
||||
|
||||
status_debug("Retransmitting commitment, feerate LOCAL=%u REMOTE=%u",
|
||||
channel_feerate(peer->channel, LOCAL),
|
||||
|
@ -2101,7 +2110,11 @@ static void resend_commitment(struct peer *peer, const struct changed_htlc *last
|
|||
}
|
||||
|
||||
/* Re-send the commitment_signed itself. */
|
||||
htlc_sigs = calc_commitsigs(tmpctx, peer, peer->next_index[REMOTE]-1,
|
||||
txs = channel_txs(tmpctx, &htlc_map, direct_outputs,
|
||||
&funding_wscript, peer->channel, &peer->remote_per_commit,
|
||||
peer->next_index[REMOTE]-1, REMOTE);
|
||||
|
||||
htlc_sigs = calc_commitsigs(tmpctx, peer, txs, funding_wscript, htlc_map, peer->next_index[REMOTE]-1,
|
||||
&commit_sig);
|
||||
msg = towire_commitment_signed(NULL, &peer->channel_id,
|
||||
&commit_sig.s, htlc_sigs);
|
||||
|
|
|
@ -94,6 +94,7 @@ struct bitcoin_tx *commit_tx(const tal_t *ctx,
|
|||
struct amount_msat other_pay,
|
||||
const struct htlc **htlcs,
|
||||
const struct htlc ***htlcmap,
|
||||
struct wally_tx_output *direct_outputs[NUM_SIDES],
|
||||
u64 obscured_commitment_number,
|
||||
enum side side)
|
||||
{
|
||||
|
@ -102,7 +103,8 @@ struct bitcoin_tx *commit_tx(const tal_t *ctx,
|
|||
struct bitcoin_tx *tx;
|
||||
size_t i, n, untrimmed;
|
||||
u32 *cltvs;
|
||||
|
||||
struct htlc *dummy_to_local = (struct htlc *)0x01,
|
||||
*dummy_to_remote = (struct htlc *)0x02;
|
||||
if (!amount_msat_add(&total_pay, self_pay, other_pay))
|
||||
abort();
|
||||
assert(!amount_msat_greater_sat(total_pay, funding));
|
||||
|
@ -215,7 +217,8 @@ struct bitcoin_tx *commit_tx(const tal_t *ctx,
|
|||
struct amount_sat amount = amount_msat_to_sat_round_down(self_pay);
|
||||
|
||||
bitcoin_tx_add_output(tx, p2wsh, amount);
|
||||
(*htlcmap)[n] = NULL;
|
||||
/* Add a dummy entry to the htlcmap so we can recognize it later */
|
||||
(*htlcmap)[n] = direct_outputs ? dummy_to_local : NULL;
|
||||
/* We don't assign cltvs[n]: if we use it, order doesn't matter.
|
||||
* However, valgrind will warn us something wierd is happening */
|
||||
SUPERVERBOSE("# to-local amount %s wscript %s\n",
|
||||
|
@ -248,7 +251,7 @@ struct bitcoin_tx *commit_tx(const tal_t *ctx,
|
|||
*/
|
||||
int pos = bitcoin_tx_add_output(tx, p2wpkh, amount);
|
||||
assert(pos == n);
|
||||
(*htlcmap)[n] = NULL;
|
||||
(*htlcmap)[n] = direct_outputs ? dummy_to_remote : NULL;
|
||||
/* We don't assign cltvs[n]: if we use it, order doesn't matter.
|
||||
* However, valgrind will warn us something wierd is happening */
|
||||
SUPERVERBOSE("# to-remote amount %s P2WPKH(%s)\n",
|
||||
|
@ -305,6 +308,20 @@ struct bitcoin_tx *commit_tx(const tal_t *ctx,
|
|||
u32 sequence = (0x80000000 | ((obscured_commitment_number>>24) & 0xFFFFFF));
|
||||
bitcoin_tx_add_input(tx, funding_txid, funding_txout, sequence, funding, NULL);
|
||||
|
||||
/* Identify the direct outputs (to_us, to_them). */
|
||||
if (direct_outputs != NULL) {
|
||||
direct_outputs[LOCAL] = direct_outputs[REMOTE] = NULL;
|
||||
for (size_t i = 0; i < tx->wtx->num_outputs; i++) {
|
||||
if ((*htlcmap)[i] == dummy_to_local) {
|
||||
(*htlcmap)[i] = NULL;
|
||||
direct_outputs[LOCAL] = tx->wtx->outputs + i;
|
||||
} else if ((*htlcmap)[i] == dummy_to_remote) {
|
||||
(*htlcmap)[i] = NULL;
|
||||
direct_outputs[REMOTE] = tx->wtx->outputs + i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bitcoin_tx_finalize(tx);
|
||||
assert(bitcoin_tx_check(tx));
|
||||
|
||||
|
|
|
@ -37,6 +37,7 @@ size_t commit_tx_num_untrimmed(const struct htlc **htlcs,
|
|||
* @htlcs: tal_arr of htlcs committed by transaction (some may be trimmed)
|
||||
* @htlc_map: outputed map of outnum->HTLC (NULL for direct outputs).
|
||||
* @obscured_commitment_number: number to encode in commitment transaction
|
||||
* @direct_outputs: If non-NULL, fill with pointers to the direct (non-HTLC) outputs (or NULL if none).
|
||||
* @side: side to generate commitment transaction for.
|
||||
*
|
||||
* We need to be able to generate the remote side's tx to create signatures,
|
||||
|
@ -56,6 +57,7 @@ struct bitcoin_tx *commit_tx(const tal_t *ctx,
|
|||
struct amount_msat other_pay,
|
||||
const struct htlc **htlcs,
|
||||
const struct htlc ***htlcmap,
|
||||
struct wally_tx_output *direct_outputs[NUM_SIDES],
|
||||
u64 obscured_commitment_number,
|
||||
enum side side);
|
||||
|
||||
|
|
|
@ -272,6 +272,7 @@ static void add_htlcs(struct bitcoin_tx ***txs,
|
|||
/* FIXME: We could cache these. */
|
||||
struct bitcoin_tx **channel_txs(const tal_t *ctx,
|
||||
const struct htlc ***htlcmap,
|
||||
struct wally_tx_output *direct_outputs[NUM_SIDES],
|
||||
const u8 **funding_wscript,
|
||||
const struct channel *channel,
|
||||
const struct pubkey *per_commitment_point,
|
||||
|
@ -299,8 +300,9 @@ struct bitcoin_tx **channel_txs(const tal_t *ctx,
|
|||
channel->config[!side].to_self_delay, &keyset,
|
||||
channel_feerate(channel, side),
|
||||
channel->config[side].dust_limit, channel->view[side].owed[side],
|
||||
channel->view[side].owed[!side], committed, htlcmap,
|
||||
commitment_number ^ channel->commitment_number_obscurer, side);
|
||||
channel->view[side].owed[!side], committed, htlcmap, direct_outputs,
|
||||
commitment_number ^ channel->commitment_number_obscurer,
|
||||
side);
|
||||
|
||||
/* Generating and saving witness script required to spend
|
||||
* the funding output */
|
||||
|
|
|
@ -50,6 +50,7 @@ struct channel *new_full_channel(const tal_t *ctx,
|
|||
* @ctx: tal context to allocate return value from.
|
||||
* @channel: The channel to evaluate
|
||||
* @htlc_map: Pointer to htlcs for each tx output (allocated off @ctx).
|
||||
* @direct_outputs: If non-NULL, fill with pointers to the direct (non-HTLC) outputs (or NULL if none).
|
||||
* @funding_wscript: Pointer to wscript for the funding tx output
|
||||
* @per_commitment_point: Per-commitment point to determine keys
|
||||
* @commitment_number: The index of this commitment.
|
||||
|
@ -61,6 +62,7 @@ struct channel *new_full_channel(const tal_t *ctx,
|
|||
*/
|
||||
struct bitcoin_tx **channel_txs(const tal_t *ctx,
|
||||
const struct htlc ***htlcmap,
|
||||
struct wally_tx_output *direct_outputs[NUM_SIDES],
|
||||
const u8 **funding_wscript,
|
||||
const struct channel *channel,
|
||||
const struct pubkey *per_commitment_point,
|
||||
|
|
|
@ -732,7 +732,7 @@ int main(void)
|
|||
dust_limit,
|
||||
to_local,
|
||||
to_remote,
|
||||
NULL, &htlc_map, commitment_number ^ cn_obscurer,
|
||||
NULL, &htlc_map, NULL, commitment_number ^ cn_obscurer,
|
||||
LOCAL);
|
||||
print_superverbose = false;
|
||||
tx2 = commit_tx(tmpctx,
|
||||
|
@ -744,7 +744,7 @@ int main(void)
|
|||
dust_limit,
|
||||
to_local,
|
||||
to_remote,
|
||||
NULL, &htlc_map2, commitment_number ^ cn_obscurer,
|
||||
NULL, &htlc_map2, NULL, commitment_number ^ cn_obscurer,
|
||||
REMOTE);
|
||||
tx_must_be_eq(tx, tx2);
|
||||
report(tx, wscript, &x_remote_funding_privkey, &remote_funding_pubkey,
|
||||
|
@ -788,7 +788,7 @@ int main(void)
|
|||
dust_limit,
|
||||
to_local,
|
||||
to_remote,
|
||||
htlcs, &htlc_map, commitment_number ^ cn_obscurer,
|
||||
htlcs, &htlc_map, NULL, commitment_number ^ cn_obscurer,
|
||||
LOCAL);
|
||||
print_superverbose = false;
|
||||
tx2 = commit_tx(tmpctx,
|
||||
|
@ -800,7 +800,7 @@ int main(void)
|
|||
dust_limit,
|
||||
to_local,
|
||||
to_remote,
|
||||
inv_htlcs, &htlc_map2,
|
||||
inv_htlcs, &htlc_map2, NULL,
|
||||
commitment_number ^ cn_obscurer,
|
||||
REMOTE);
|
||||
tx_must_be_eq(tx, tx2);
|
||||
|
@ -832,7 +832,7 @@ int main(void)
|
|||
dust_limit,
|
||||
to_local,
|
||||
to_remote,
|
||||
htlcs, &htlc_map,
|
||||
htlcs, &htlc_map, NULL,
|
||||
commitment_number ^ cn_obscurer,
|
||||
LOCAL);
|
||||
/* This is what it would look like for peer generating it! */
|
||||
|
@ -845,7 +845,7 @@ int main(void)
|
|||
dust_limit,
|
||||
to_local,
|
||||
to_remote,
|
||||
inv_htlcs, &htlc_map2,
|
||||
inv_htlcs, &htlc_map2, NULL,
|
||||
commitment_number ^ cn_obscurer,
|
||||
REMOTE);
|
||||
tx_must_be_eq(newtx, tx2);
|
||||
|
@ -877,7 +877,7 @@ int main(void)
|
|||
dust_limit,
|
||||
to_local,
|
||||
to_remote,
|
||||
htlcs, &htlc_map,
|
||||
htlcs, &htlc_map, NULL,
|
||||
commitment_number ^ cn_obscurer,
|
||||
LOCAL);
|
||||
report(tx, wscript,
|
||||
|
@ -914,7 +914,7 @@ int main(void)
|
|||
dust_limit,
|
||||
to_local,
|
||||
to_remote,
|
||||
htlcs, &htlc_map,
|
||||
htlcs, &htlc_map, NULL,
|
||||
commitment_number ^ cn_obscurer,
|
||||
LOCAL);
|
||||
report(newtx, wscript,
|
||||
|
@ -973,7 +973,7 @@ int main(void)
|
|||
dust_limit,
|
||||
to_local,
|
||||
to_remote,
|
||||
htlcs, &htlc_map,
|
||||
htlcs, &htlc_map, NULL,
|
||||
commitment_number ^ cn_obscurer,
|
||||
LOCAL);
|
||||
report(tx, wscript,
|
||||
|
|
|
@ -519,10 +519,10 @@ int main(void)
|
|||
local_config->dust_limit,
|
||||
to_local,
|
||||
to_remote,
|
||||
NULL, &htlc_map, 0x2bb038521914 ^ 42, LOCAL);
|
||||
NULL, &htlc_map, NULL, 0x2bb038521914 ^ 42, LOCAL);
|
||||
|
||||
txs = channel_txs(tmpctx,
|
||||
&htlc_map, &funding_wscript_alt,
|
||||
&htlc_map, NULL, &funding_wscript_alt,
|
||||
lchannel, &local_per_commitment_point, 42, LOCAL);
|
||||
assert(tal_count(txs) == 1);
|
||||
assert(tal_count(htlc_map) == 2);
|
||||
|
@ -530,7 +530,7 @@ int main(void)
|
|||
tx_must_be_eq(txs[0], raw_tx);
|
||||
|
||||
txs2 = channel_txs(tmpctx,
|
||||
&htlc_map, &funding_wscript,
|
||||
&htlc_map, NULL, &funding_wscript,
|
||||
rchannel, &local_per_commitment_point, 42, REMOTE);
|
||||
txs_must_be_eq(txs, txs2);
|
||||
|
||||
|
@ -557,10 +557,10 @@ int main(void)
|
|||
assert(lchannel->view[REMOTE].owed[REMOTE].millisatoshis
|
||||
== rchannel->view[LOCAL].owed[LOCAL].millisatoshis);
|
||||
|
||||
txs = channel_txs(tmpctx, &htlc_map, &funding_wscript,
|
||||
txs = channel_txs(tmpctx, &htlc_map, NULL, &funding_wscript,
|
||||
lchannel, &local_per_commitment_point, 42, LOCAL);
|
||||
assert(tal_count(txs) == 1);
|
||||
txs2 = channel_txs(tmpctx, &htlc_map, &funding_wscript,
|
||||
txs2 = channel_txs(tmpctx, &htlc_map, NULL, &funding_wscript,
|
||||
rchannel, &local_per_commitment_point, 42, REMOTE);
|
||||
txs_must_be_eq(txs, txs2);
|
||||
|
||||
|
@ -575,10 +575,10 @@ int main(void)
|
|||
assert(lchannel->view[REMOTE].owed[REMOTE].millisatoshis
|
||||
== rchannel->view[LOCAL].owed[LOCAL].millisatoshis);
|
||||
|
||||
txs = channel_txs(tmpctx, &htlc_map, &funding_wscript,
|
||||
txs = channel_txs(tmpctx, &htlc_map, NULL, &funding_wscript,
|
||||
lchannel, &local_per_commitment_point, 42, LOCAL);
|
||||
assert(tal_count(txs) == 6);
|
||||
txs2 = channel_txs(tmpctx, &htlc_map, &funding_wscript,
|
||||
txs2 = channel_txs(tmpctx, &htlc_map, NULL, &funding_wscript,
|
||||
rchannel, &local_per_commitment_point, 42, REMOTE);
|
||||
txs_must_be_eq(txs, txs2);
|
||||
|
||||
|
@ -641,15 +641,15 @@ int main(void)
|
|||
tmpctx, &funding_txid, funding_output_index,
|
||||
funding_amount, LOCAL, remote_config->to_self_delay,
|
||||
&keyset, feerate_per_kw[LOCAL], local_config->dust_limit,
|
||||
to_local, to_remote, htlcs, &htlc_map, 0x2bb038521914 ^ 42,
|
||||
LOCAL);
|
||||
to_local, to_remote, htlcs, &htlc_map, NULL,
|
||||
0x2bb038521914 ^ 42, LOCAL);
|
||||
|
||||
txs = channel_txs(tmpctx, &htlc_map, &funding_wscript,
|
||||
txs = channel_txs(tmpctx, &htlc_map, NULL, &funding_wscript,
|
||||
lchannel, &local_per_commitment_point, 42,
|
||||
LOCAL);
|
||||
tx_must_be_eq(txs[0], raw_tx);
|
||||
|
||||
txs2 = channel_txs(tmpctx, &htlc_map, &funding_wscript,
|
||||
txs2 = channel_txs(tmpctx, &htlc_map, NULL, &funding_wscript,
|
||||
rchannel, &local_per_commitment_point,
|
||||
42, REMOTE);
|
||||
txs_must_be_eq(txs, txs2);
|
||||
|
|
|
@ -71,6 +71,7 @@ struct bitcoin_tx *initial_channel_tx(const tal_t *ctx,
|
|||
const struct channel *channel,
|
||||
const struct pubkey *per_commitment_point,
|
||||
enum side side,
|
||||
struct wally_tx_output *direct_outputs[NUM_SIDES],
|
||||
char** err_reason)
|
||||
{
|
||||
struct keyset keyset;
|
||||
|
@ -105,6 +106,7 @@ struct bitcoin_tx *initial_channel_tx(const tal_t *ctx,
|
|||
channel->view[side].owed[!side],
|
||||
channel->config[!side].channel_reserve,
|
||||
0 ^ channel->commitment_number_obscurer,
|
||||
direct_outputs,
|
||||
side,
|
||||
err_reason);
|
||||
}
|
||||
|
|
|
@ -106,6 +106,7 @@ struct channel *new_initial_channel(const tal_t *ctx,
|
|||
* @channel: The channel to evaluate
|
||||
* @per_commitment_point: Per-commitment point to determine keys
|
||||
* @side: which side to get the commitment transaction for
|
||||
* @direct_outputs: If non-NULL, fill with pointers to the direct (non-HTLC) outputs (or NULL if none).
|
||||
* @err_reason: When NULL is returned, this will point to a human readable reason.
|
||||
*
|
||||
* Returns the unsigned initial commitment transaction for @side, or NULL
|
||||
|
@ -116,6 +117,7 @@ struct bitcoin_tx *initial_channel_tx(const tal_t *ctx,
|
|||
const struct channel *channel,
|
||||
const struct pubkey *per_commitment_point,
|
||||
enum side side,
|
||||
struct wally_tx_output *direct_outputs[NUM_SIDES],
|
||||
char** err_reason);
|
||||
|
||||
/**
|
||||
|
|
|
@ -71,6 +71,7 @@ struct bitcoin_tx *initial_commit_tx(const tal_t *ctx,
|
|||
struct amount_msat other_pay,
|
||||
struct amount_sat self_reserve,
|
||||
u64 obscured_commitment_number,
|
||||
struct wally_tx_output *direct_outputs[NUM_SIDES],
|
||||
enum side side,
|
||||
char** err_reason)
|
||||
{
|
||||
|
@ -80,6 +81,8 @@ struct bitcoin_tx *initial_commit_tx(const tal_t *ctx,
|
|||
struct amount_msat total_pay;
|
||||
struct amount_sat amount;
|
||||
u32 sequence;
|
||||
void *dummy_local = (void *)LOCAL, *dummy_remote = (void *)REMOTE;
|
||||
const void *output_order[NUM_SIDES];
|
||||
|
||||
if (!amount_msat_add(&total_pay, self_pay, other_pay))
|
||||
abort();
|
||||
|
@ -180,6 +183,7 @@ struct bitcoin_tx *initial_commit_tx(const tal_t *ctx,
|
|||
tx->output_witscripts[n]->ptr =
|
||||
tal_dup_arr(tx->output_witscripts[n], u8,
|
||||
wscript, tal_count(wscript), 0);
|
||||
output_order[n] = dummy_local;
|
||||
n++;
|
||||
}
|
||||
|
||||
|
@ -202,6 +206,7 @@ struct bitcoin_tx *initial_commit_tx(const tal_t *ctx,
|
|||
tx, scriptpubkey_p2wpkh(tx, &keyset->other_payment_key),
|
||||
amount);
|
||||
assert(pos == n);
|
||||
output_order[n] = dummy_remote;
|
||||
n++;
|
||||
}
|
||||
|
||||
|
@ -212,7 +217,7 @@ struct bitcoin_tx *initial_commit_tx(const tal_t *ctx,
|
|||
* 7. Sort the outputs into [BIP 69+CLTV
|
||||
* order](#transaction-input-and-output-ordering)
|
||||
*/
|
||||
permute_outputs(tx, NULL, NULL);
|
||||
permute_outputs(tx, NULL, output_order);
|
||||
|
||||
/* BOLT #3:
|
||||
*
|
||||
|
@ -241,7 +246,19 @@ struct bitcoin_tx *initial_commit_tx(const tal_t *ctx,
|
|||
sequence = (0x80000000 | ((obscured_commitment_number>>24) & 0xFFFFFF));
|
||||
bitcoin_tx_add_input(tx, funding_txid, funding_txout, sequence, funding, NULL);
|
||||
|
||||
if (direct_outputs != NULL) {
|
||||
direct_outputs[LOCAL] = direct_outputs[REMOTE] = NULL;
|
||||
for (size_t i = 0; i < tx->wtx->num_outputs; i++) {
|
||||
if (output_order[i] == dummy_local)
|
||||
direct_outputs[LOCAL] = &tx->wtx->outputs[i];
|
||||
else if (output_order[i] == dummy_remote)
|
||||
direct_outputs[REMOTE] = &tx->wtx->outputs[i];
|
||||
}
|
||||
}
|
||||
|
||||
/* This doesn't reorder outputs, so we can do this after mapping outputs. */
|
||||
bitcoin_tx_finalize(tx);
|
||||
|
||||
assert(bitcoin_tx_check(tx));
|
||||
|
||||
return tx;
|
||||
|
|
|
@ -84,6 +84,7 @@ static inline struct amount_sat commit_tx_base_fee(u32 feerate_per_kw,
|
|||
* @other_pay: amount to pay directly to the other side
|
||||
* @self_reserve: reserve the other side insisted we have
|
||||
* @obscured_commitment_number: number to encode in commitment transaction
|
||||
* @direct_outputs: If non-NULL, fill with pointers to the direct (non-HTLC) outputs (or NULL if none).
|
||||
* @side: side to generate commitment transaction for.
|
||||
* @err_reason: When NULL is returned, this will point to a human readable reason.
|
||||
*
|
||||
|
@ -104,6 +105,7 @@ struct bitcoin_tx *initial_commit_tx(const tal_t *ctx,
|
|||
struct amount_msat other_pay,
|
||||
struct amount_sat self_reserve,
|
||||
u64 obscured_commitment_number,
|
||||
struct wally_tx_output *direct_outputs[NUM_SIDES],
|
||||
enum side side,
|
||||
char** err_reason);
|
||||
|
||||
|
|
|
@ -397,8 +397,9 @@ int main(int argc, char *argv[])
|
|||
if (!per_commit_point(&localseed, &local_per_commit_point, commitnum))
|
||||
errx(1, "Bad deriving local per-commitment-point");
|
||||
|
||||
local_txs = channel_txs(NULL, &htlcmap, &funding_wscript, channel,
|
||||
&local_per_commit_point, commitnum, LOCAL);
|
||||
local_txs = channel_txs(NULL, &htlcmap, NULL, &funding_wscript, channel,
|
||||
&local_per_commit_point, commitnum,
|
||||
LOCAL);
|
||||
|
||||
printf("## local_commitment\n"
|
||||
"# input amount %s, funding_wscript %s, pubkey %s\n",
|
||||
|
@ -511,8 +512,9 @@ int main(int argc, char *argv[])
|
|||
/* Create the remote commitment tx */
|
||||
if (!per_commit_point(&remoteseed, &remote_per_commit_point, commitnum))
|
||||
errx(1, "Bad deriving remote per-commitment-point");
|
||||
remote_txs = channel_txs(NULL, &htlcmap, &funding_wscript, channel,
|
||||
&remote_per_commit_point, commitnum, REMOTE);
|
||||
remote_txs = channel_txs(NULL, &htlcmap, NULL, &funding_wscript, channel,
|
||||
&remote_per_commit_point, commitnum,
|
||||
REMOTE);
|
||||
remote_txs[0]->input_amounts[0]
|
||||
= tal_dup(remote_txs[0], struct amount_sat, &funding_amount);
|
||||
|
||||
|
|
|
@ -665,6 +665,7 @@ static bool funder_finalize_channel_setup(struct state *state,
|
|||
struct channel_id id_in;
|
||||
const u8 *wscript;
|
||||
char *err_reason;
|
||||
struct wally_tx_output *direct_outputs[NUM_SIDES];
|
||||
|
||||
/*~ Now we can initialize the `struct channel`. This represents
|
||||
* the current channel state and is how we can generate the current
|
||||
|
@ -710,7 +711,7 @@ static bool funder_finalize_channel_setup(struct state *state,
|
|||
/* This gives us their first commitment transaction. */
|
||||
*tx = initial_channel_tx(state, &wscript, state->channel,
|
||||
&state->first_per_commitment_point[REMOTE],
|
||||
REMOTE, &err_reason);
|
||||
REMOTE, direct_outputs, &err_reason);
|
||||
if (!*tx) {
|
||||
/* This should not happen: we should never create channels we
|
||||
* can't afford the fees for after reserve. */
|
||||
|
@ -820,7 +821,7 @@ static bool funder_finalize_channel_setup(struct state *state,
|
|||
* signature they sent against that. */
|
||||
*tx = initial_channel_tx(state, &wscript, state->channel,
|
||||
&state->first_per_commitment_point[LOCAL],
|
||||
LOCAL, &err_reason);
|
||||
LOCAL, direct_outputs, &err_reason);
|
||||
if (!*tx) {
|
||||
negotiation_failed(state, true,
|
||||
"Could not meet our fees and reserve: %s", err_reason);
|
||||
|
@ -903,6 +904,7 @@ static u8 *fundee_channel(struct state *state, const u8 *open_channel_msg)
|
|||
const u8 *wscript;
|
||||
u8 channel_flags;
|
||||
char* err_reason;
|
||||
struct wally_tx_output *direct_outputs[NUM_SIDES];
|
||||
|
||||
/* BOLT #2:
|
||||
*
|
||||
|
@ -1185,7 +1187,7 @@ static u8 *fundee_channel(struct state *state, const u8 *open_channel_msg)
|
|||
*/
|
||||
local_commit = initial_channel_tx(state, &wscript, state->channel,
|
||||
&state->first_per_commitment_point[LOCAL],
|
||||
LOCAL, &err_reason);
|
||||
LOCAL, NULL, &err_reason);
|
||||
/* This shouldn't happen either, AFAICT. */
|
||||
if (!local_commit) {
|
||||
negotiation_failed(state, false,
|
||||
|
@ -1245,7 +1247,7 @@ static u8 *fundee_channel(struct state *state, const u8 *open_channel_msg)
|
|||
*/
|
||||
remote_commit = initial_channel_tx(state, &wscript, state->channel,
|
||||
&state->first_per_commitment_point[REMOTE],
|
||||
REMOTE, &err_reason);
|
||||
REMOTE, direct_outputs, &err_reason);
|
||||
if (!remote_commit) {
|
||||
negotiation_failed(state, false,
|
||||
"Could not meet their fees and reserve: %s", err_reason);
|
||||
|
|
Loading…
Add table
Reference in a new issue