Browse Source

wally: Migrate onchaind to use the wally tx and the helpers

Weaning `onchaind` off its use of the internal bitcoin_tx input and output
fields, since we're going to remove them soon, I promise.

Signed-off-by: Christian Decker <decker.christian@gmail.com>
pr-2587
Christian Decker 6 years ago
committed by Rusty Russell
parent
commit
50ade7349f
  1. 189
      onchaind/onchaind.c

189
onchaind/onchaind.c

@ -157,7 +157,7 @@ static bool set_htlc_timeout_fee(struct bitcoin_tx *tx,
const u8 *wscript) const u8 *wscript)
{ {
static struct amount_sat fee = AMOUNT_SAT_INIT(UINT64_MAX); static struct amount_sat fee = AMOUNT_SAT_INIT(UINT64_MAX);
struct amount_sat amount = tx->output[0].amount; struct amount_sat amount = bitcoin_tx_output_get_amount(tx, 0);
/* BOLT #3: /* BOLT #3:
* *
@ -184,7 +184,7 @@ static void set_htlc_success_fee(struct bitcoin_tx *tx,
const struct bitcoin_signature *remotesig, const struct bitcoin_signature *remotesig,
const u8 *wscript) const u8 *wscript)
{ {
static struct amount_sat fee = AMOUNT_SAT_INIT(UINT64_MAX); static struct amount_sat amt, fee = AMOUNT_SAT_INIT(UINT64_MAX);
/* BOLT #3: /* BOLT #3:
* *
@ -207,11 +207,14 @@ static void set_htlc_success_fee(struct bitcoin_tx *tx,
return; return;
} }
if (!amount_sat_sub(&tx->output[0].amount, tx->output[0].amount, fee)) amt = bitcoin_tx_output_get_amount(tx, 0);
if (!amount_sat_sub(&amt, amt, fee))
status_failed(STATUS_FAIL_INTERNAL_ERROR, status_failed(STATUS_FAIL_INTERNAL_ERROR,
"Cannot deduct htlc-success fee %s from tx %s", "Cannot deduct htlc-success fee %s from tx %s",
type_to_string(tmpctx, struct amount_sat, &fee), type_to_string(tmpctx, struct amount_sat, &fee),
type_to_string(tmpctx, struct bitcoin_tx, tx)); type_to_string(tmpctx, struct bitcoin_tx, tx));
bitcoin_tx_output_set_amount(tx, 0, &amt);
if (check_tx_sig(tx, 0, NULL, wscript, if (check_tx_sig(tx, 0, NULL, wscript,
&keyset->other_htlc_key, remotesig)) &keyset->other_htlc_key, remotesig))
@ -307,7 +310,7 @@ static struct bitcoin_tx *tx_to_us(const tal_t *ctx,
&out->sat, NULL); &out->sat, NULL);
bitcoin_tx_add_output( bitcoin_tx_add_output(
tx, scriptpubkey_p2wpkh(tx->output, &our_wallet_pubkey), &out->sat); tx, scriptpubkey_p2wpkh(tx, &our_wallet_pubkey), &out->sat);
/* Worst-case sig is 73 bytes */ /* Worst-case sig is 73 bytes */
weight = measure_tx_weight(tx) + 1 + 3 + 73 + 0 + tal_count(wscript); weight = measure_tx_weight(tx) + 1 + 3 + 73 + 0 + tal_count(wscript);
@ -340,7 +343,7 @@ static struct bitcoin_tx *tx_to_us(const tal_t *ctx,
"; setting output to %s", "; setting output to %s",
tx_type_name(*tx_type), tx_type_name(*tx_type),
type_to_string(tmpctx, struct amount_sat, type_to_string(tmpctx, struct amount_sat,
&tx->output[0].amount)); &amt));
} }
bitcoin_tx_output_set_amount(tx, 0, &amt); bitcoin_tx_output_set_amount(tx, 0, &amt);
@ -353,7 +356,7 @@ static struct bitcoin_tx *tx_to_us(const tal_t *ctx,
tal_hex(tmpctx, msg)); tal_hex(tmpctx, msg));
} }
witness = bitcoin_witness_sig_and_element(tx->input, &sig, elem, witness = bitcoin_witness_sig_and_element(tx, &sig, elem,
elemsize, wscript); elemsize, wscript);
bitcoin_tx_input_set_witness(tx, 0, witness); bitcoin_tx_input_set_witness(tx, 0, witness);
return tx; return tx;
@ -524,10 +527,12 @@ static bool is_valid_sig(const u8 *e)
} }
/* We ignore things which look like signatures. */ /* We ignore things which look like signatures. */
static bool input_similar(const struct bitcoin_tx_input *i1, static bool input_similar(const struct wally_tx_input *i1,
const struct bitcoin_tx_input *i2) const struct wally_tx_input *i2)
{ {
if (!bitcoin_txid_eq(&i1->txid, &i2->txid)) u8 *s1, *s2;
if (!memeq(i1->txhash, WALLY_TXHASH_LEN, i2->txhash, WALLY_TXHASH_LEN))
return false; return false;
if (i1->index != i2->index) if (i1->index != i2->index)
@ -536,17 +541,24 @@ static bool input_similar(const struct bitcoin_tx_input *i1,
if (!scripteq(i1->script, i2->script)) if (!scripteq(i1->script, i2->script))
return false; return false;
if (i1->sequence_number != i2->sequence_number) if (i1->sequence != i2->sequence)
return false; return false;
if (tal_count(i1->witness) != tal_count(i2->witness)) if (i1->witness->num_items != i2->witness->num_items)
return false; return false;
for (size_t i = 0; i < tal_count(i1->witness); i++) { for (size_t i = 0; i < i1->witness->num_items; i++) {
if (scripteq(i1->witness[i], i2->witness[i])) /* Need to wrap these in `tal_arr`s since the primitives
* except to be able to call tal_bytelen on them */
s1 = tal_dup_arr(tmpctx, u8, i1->witness->items[i].witness,
i1->witness->items[i].witness_len, 0);
s2 = tal_dup_arr(tmpctx, u8, i2->witness->items[i].witness,
i2->witness->items[i].witness_len, 0);
if (scripteq(s1, s2))
continue; continue;
if (is_valid_sig(i1->witness[i]) && is_valid_sig(i2->witness[i])) if (is_valid_sig(s1) && is_valid_sig(s2))
continue; continue;
return false; return false;
} }
@ -570,11 +582,11 @@ static bool resolved_by_proposal(struct tracked_output *out,
* FIXME: Better would be to compare outputs, but they weren't * FIXME: Better would be to compare outputs, but they weren't
* saved to db correctly until now. (COMPAT_V052) * saved to db correctly until now. (COMPAT_V052)
*/ */
if (tal_count(tx->input) != tal_count(out->proposal->tx->input)) if (tx->wtx->num_inputs != out->proposal->tx->wtx->num_inputs)
return false; return false;
for (size_t i = 0; i < tal_count(tx->input); i++) { for (size_t i = 0; i < tx->wtx->num_inputs; i++) {
if (!input_similar(tx->input + i, out->proposal->tx->input + i)) if (!input_similar(&tx->wtx->inputs[i], &out->proposal->tx->wtx->inputs[i]))
return false; return false;
} }
@ -649,7 +661,7 @@ static u64 unmask_commit_number(const struct bitcoin_tx *tx,
* * `txin[0]` sequence: upper 8 bits are 0x80, lower 24 bits are upper 24 bits of the obscured commitment number * * `txin[0]` sequence: upper 8 bits are 0x80, lower 24 bits are upper 24 bits of the obscured commitment number
*/ */
return ((tx->wtx->locktime & 0x00FFFFFF) return ((tx->wtx->locktime & 0x00FFFFFF)
| (tx->input[0].sequence_number & (u64)0x00FFFFFF) << 24) | (tx->wtx->inputs[0].sequence & (u64)0x00FFFFFF) << 24)
^ obscurer; ^ obscurer;
} }
@ -660,12 +672,13 @@ static bool is_mutual_close(const struct bitcoin_tx *tx,
size_t i; size_t i;
bool local_matched = false, remote_matched = false; bool local_matched = false, remote_matched = false;
for (i = 0; i < tal_count(tx->output); i++) { for (i = 0; i < tx->wtx->num_outputs; i++) {
const u8 *script = bitcoin_tx_output_get_script(tmpctx, tx, i);
/* To be paranoid, we only let each one match once. */ /* To be paranoid, we only let each one match once. */
if (scripteq(tx->output[i].script, local_scriptpubkey) if (scripteq(script, local_scriptpubkey)
&& !local_matched) && !local_matched)
local_matched = true; local_matched = true;
else if (scripteq(tx->output[i].script, remote_scriptpubkey) else if (scripteq(script, remote_scriptpubkey)
&& !remote_matched) && !remote_matched)
remote_matched = true; remote_matched = true;
else else
@ -795,14 +808,15 @@ static void handle_htlc_onchain_fulfill(struct tracked_output *out,
* ... `txin[0]` witness stack: `0 <remotehtlcsig> <localhtlcsig> * ... `txin[0]` witness stack: `0 <remotehtlcsig> <localhtlcsig>
* <payment_preimage>` for HTLC-success * <payment_preimage>` for HTLC-success
*/ */
if (tal_count(tx->input[0].witness) != 5) /* +1 for wscript */ if (tx->wtx->inputs[0].witness->num_items != 5) /* +1 for wscript */
status_failed(STATUS_FAIL_INTERNAL_ERROR, status_failed(STATUS_FAIL_INTERNAL_ERROR,
"%s/%s spent with weird witness %zu", "%s/%s spent with weird witness %zu",
tx_type_name(out->tx_type), tx_type_name(out->tx_type),
output_type_name(out->output_type), output_type_name(out->output_type),
tal_count(tx->input[0].witness)); tx->wtx->inputs[0].witness->num_items);
witness_preimage = tx->input[0].witness[3]; witness_preimage =
bitcoin_tx_input_get_witness(tmpctx, tx, 0, 3);
} else if (out->tx_type == OUR_UNILATERAL) { } else if (out->tx_type == OUR_UNILATERAL) {
/* BOLT #3: /* BOLT #3:
* *
@ -810,14 +824,15 @@ static void handle_htlc_onchain_fulfill(struct tracked_output *out,
* *
* <remotehtlcsig> <payment_preimage> * <remotehtlcsig> <payment_preimage>
*/ */
if (tal_count(tx->input[0].witness) != 3) /* +1 for wscript */ if (tx->wtx->inputs[0].witness->num_items != 3) /* +1 for wscript */
status_failed(STATUS_FAIL_INTERNAL_ERROR, status_failed(STATUS_FAIL_INTERNAL_ERROR,
"%s/%s spent with weird witness %zu", "%s/%s spent with weird witness %zu",
tx_type_name(out->tx_type), tx_type_name(out->tx_type),
output_type_name(out->output_type), output_type_name(out->output_type),
tal_count(tx->input[0].witness)); tx->wtx->inputs[0].witness->num_items);
witness_preimage = tx->input[0].witness[1]; witness_preimage =
bitcoin_tx_input_get_witness(tmpctx, tx, 0, 1);
} else } else
status_failed(STATUS_FAIL_INTERNAL_ERROR, status_failed(STATUS_FAIL_INTERNAL_ERROR,
"onchain_fulfill for %s/%s?", "onchain_fulfill for %s/%s?",
@ -861,6 +876,7 @@ static void resolve_htlc_tx(struct tracked_output ***outs,
{ {
struct tracked_output *out; struct tracked_output *out;
struct bitcoin_tx *tx; struct bitcoin_tx *tx;
struct amount_sat amt;
enum tx_type tx_type = OUR_DELAYED_RETURN_TO_WALLET; enum tx_type tx_type = OUR_DELAYED_RETURN_TO_WALLET;
u8 *wscript = bitcoin_wscript_htlc_tx(htlc_tx, to_self_delay[LOCAL], u8 *wscript = bitcoin_wscript_htlc_tx(htlc_tx, to_self_delay[LOCAL],
&keyset->self_revocation_key, &keyset->self_revocation_key,
@ -876,9 +892,10 @@ static void resolve_htlc_tx(struct tracked_output ***outs,
* `to_self_delay` field) before spending that HTLC-timeout * `to_self_delay` field) before spending that HTLC-timeout
* output. * output.
*/ */
amt = bitcoin_tx_output_get_amount(htlc_tx, 0);
out = new_tracked_output(outs, htlc_txid, tx_blockheight, out = new_tracked_output(outs, htlc_txid, tx_blockheight,
(*outs)[out_index]->resolved->tx_type, (*outs)[out_index]->resolved->tx_type,
0, htlc_tx->output[0].amount, 0, amt,
DELAYED_OUTPUT_TO_US, DELAYED_OUTPUT_TO_US,
NULL, NULL, NULL); NULL, NULL, NULL);
@ -931,7 +948,7 @@ static void output_spent(struct tracked_output ***outs,
u32 input_num, u32 input_num,
u32 tx_blockheight) u32 tx_blockheight)
{ {
struct bitcoin_txid txid; struct bitcoin_txid txid, tmptxid;
bitcoin_txid(tx, &txid); bitcoin_txid(tx, &txid);
@ -940,9 +957,11 @@ static void output_spent(struct tracked_output ***outs,
if (out->resolved) if (out->resolved)
continue; continue;
if (tx->input[input_num].index != out->outnum) if (tx->wtx->inputs[input_num].index != out->outnum)
continue; continue;
if (!bitcoin_txid_eq(&tx->input[input_num].txid, &out->txid))
bitcoin_tx_input_get_txid(tx, input_num, &tmptxid);
if (!bitcoin_txid_eq(&tmptxid, &out->txid))
continue; continue;
/* Was this our resolution? */ /* Was this our resolution? */
@ -1019,11 +1038,11 @@ static void output_spent(struct tracked_output ***outs,
return; return;
} }
bitcoin_tx_input_get_txid(tx, input_num, &txid);
/* Not interesting to us, so unwatch the tx and all its outputs */ /* Not interesting to us, so unwatch the tx and all its outputs */
status_trace("Notified about tx %s output %u spend, but we don't care", status_trace("Notified about tx %s output %u spend, but we don't care",
type_to_string(tmpctx, struct bitcoin_txid, type_to_string(tmpctx, struct bitcoin_txid, &txid),
&tx->input[input_num].txid), tx->wtx->inputs[input_num].index);
tx->input[input_num].index);
unwatch_tx(tx); unwatch_tx(tx);
} }
@ -1194,7 +1213,7 @@ static void handle_preimage(struct tracked_output **outs,
outs[i]->wscript); outs[i]->wscript);
hsm_sign_local_htlc_tx(tx, outs[i]->wscript, &sig); hsm_sign_local_htlc_tx(tx, outs[i]->wscript, &sig);
witness = bitcoin_witness_htlc_success_tx( witness = bitcoin_witness_htlc_success_tx(
tx->input, &sig, outs[i]->remote_htlc_sig, preimage, tx, &sig, outs[i]->remote_htlc_sig, preimage,
outs[i]->wscript); outs[i]->wscript);
bitcoin_tx_input_set_witness(tx, 0, witness); bitcoin_tx_input_set_witness(tx, 0, witness);
propose_resolution(outs[i], tx, 0, OUR_HTLC_SUCCESS_TX); propose_resolution(outs[i], tx, 0, OUR_HTLC_SUCCESS_TX);
@ -1439,7 +1458,7 @@ static size_t resolve_our_htlc_ourcommit(struct tracked_output *out,
hsm_sign_local_htlc_tx(tx, htlc_scripts[matches[i]], &localsig); hsm_sign_local_htlc_tx(tx, htlc_scripts[matches[i]], &localsig);
witness = bitcoin_witness_htlc_timeout_tx(tx->input, &localsig, witness = bitcoin_witness_htlc_timeout_tx(tx, &localsig,
out->remote_htlc_sig, out->remote_htlc_sig,
htlc_scripts[matches[i]]); htlc_scripts[matches[i]]);
@ -1548,9 +1567,10 @@ static const size_t *match_htlc_output(const tal_t *ctx,
u8 **htlc_scripts) u8 **htlc_scripts)
{ {
size_t *matches = tal_arr(ctx, size_t, 0); size_t *matches = tal_arr(ctx, size_t, 0);
const u8 *script = bitcoin_tx_output_get_script(tmpctx, tx, outnum);
/* Must be a p2wsh output */ /* Must be a p2wsh output */
if (!is_p2wsh(tx->output[outnum].script, NULL)) if (!is_p2wsh(script, NULL))
return matches; return matches;
for (size_t i = 0; i < tal_count(htlc_scripts); i++) { for (size_t i = 0; i < tal_count(htlc_scripts); i++) {
@ -1559,9 +1579,7 @@ static const size_t *match_htlc_output(const tal_t *ctx,
continue; continue;
sha256(&sha, htlc_scripts[i], tal_count(htlc_scripts[i])); sha256(&sha, htlc_scripts[i], tal_count(htlc_scripts[i]));
if (memeq(tx->output[outnum].script + 2, if (memeq(script + 2, tal_count(script) - 2, &sha, sizeof(sha)))
tal_count(tx->output[outnum].script) - 2,
&sha, sizeof(sha)))
tal_arr_expand(&matches, i); tal_arr_expand(&matches, i);
} }
return matches; return matches;
@ -1682,18 +1700,21 @@ static void handle_our_unilateral(const struct bitcoin_tx *tx,
status_trace("Script to-them: %s", status_trace("Script to-them: %s",
tal_hex(tmpctx, script[REMOTE])); tal_hex(tmpctx, script[REMOTE]));
for (i = 0; i < tal_count(tx->output); i++) { for (i = 0; i < tx->wtx->num_outputs; i++) {
status_trace("Output %zu: %s", status_trace("Output %zu: %s", i,
i, tal_hex(tmpctx, tx->output[i].script)); tal_hex(tmpctx, bitcoin_tx_output_get_script(
tmpctx, tx, i)));
} }
for (i = 0; i < tal_count(tx->output); i++) { for (i = 0; i < tx->wtx->num_outputs; i++) {
struct tracked_output *out; struct tracked_output *out;
const size_t *matches; const size_t *matches;
size_t which_htlc; size_t which_htlc;
const u8 *oscript = bitcoin_tx_output_get_script(tmpctx, tx, i);
struct amount_sat amt = bitcoin_tx_output_get_amount(tx, i);
if (script[LOCAL] if (script[LOCAL]
&& scripteq(tx->output[i].script, script[LOCAL])) { && scripteq(oscript, script[LOCAL])) {
struct bitcoin_tx *to_us; struct bitcoin_tx *to_us;
enum tx_type tx_type = OUR_DELAYED_RETURN_TO_WALLET; enum tx_type tx_type = OUR_DELAYED_RETURN_TO_WALLET;
@ -1711,7 +1732,7 @@ static void handle_our_unilateral(const struct bitcoin_tx *tx,
*/ */
out = new_tracked_output(&outs, txid, tx_blockheight, out = new_tracked_output(&outs, txid, tx_blockheight,
OUR_UNILATERAL, i, OUR_UNILATERAL, i,
tx->output[i].amount, amt,
DELAYED_OUTPUT_TO_US, DELAYED_OUTPUT_TO_US,
NULL, NULL, NULL); NULL, NULL, NULL);
/* BOLT #3: /* BOLT #3:
@ -1741,7 +1762,7 @@ static void handle_our_unilateral(const struct bitcoin_tx *tx,
continue; continue;
} }
if (script[REMOTE] if (script[REMOTE]
&& scripteq(tx->output[i].script, script[REMOTE])) { && scripteq(oscript, script[REMOTE])) {
/* BOLT #5: /* BOLT #5:
* *
* - MAY ignore the `to_remote` output. * - MAY ignore the `to_remote` output.
@ -1751,7 +1772,7 @@ static void handle_our_unilateral(const struct bitcoin_tx *tx,
*/ */
out = new_tracked_output(&outs, txid, tx_blockheight, out = new_tracked_output(&outs, txid, tx_blockheight,
OUR_UNILATERAL, i, OUR_UNILATERAL, i,
tx->output[i].amount, amt,
OUTPUT_TO_THEM, OUTPUT_TO_THEM,
NULL, NULL, NULL); NULL, NULL, NULL);
ignore_output(out); ignore_output(out);
@ -1776,7 +1797,7 @@ static void handle_our_unilateral(const struct bitcoin_tx *tx,
out = new_tracked_output(&outs, txid, out = new_tracked_output(&outs, txid,
tx_blockheight, tx_blockheight,
OUR_UNILATERAL, i, OUR_UNILATERAL, i,
tx->output[i].amount, amt,
OUR_HTLC, OUR_HTLC,
NULL, NULL, NULL, NULL,
remote_htlc_sigs); remote_htlc_sigs);
@ -1788,7 +1809,7 @@ static void handle_our_unilateral(const struct bitcoin_tx *tx,
out = new_tracked_output(&outs, txid, out = new_tracked_output(&outs, txid,
tx_blockheight, tx_blockheight,
OUR_UNILATERAL, i, OUR_UNILATERAL, i,
tx->output[i].amount, amt,
THEIR_HTLC, THEIR_HTLC,
NULL, NULL, NULL, NULL,
remote_htlc_sigs); remote_htlc_sigs);
@ -1990,18 +2011,21 @@ static void handle_their_cheat(const struct bitcoin_tx *tx,
status_trace("Script to-me: %s", status_trace("Script to-me: %s",
tal_hex(tmpctx, script[LOCAL])); tal_hex(tmpctx, script[LOCAL]));
for (i = 0; i < tal_count(tx->output); i++) { for (i = 0; i < tx->wtx->num_outputs; i++) {
status_trace("Output %zu: %s", status_trace("Output %zu: %s", i,
i, tal_hex(tmpctx, tx->output[i].script)); tal_hex(tmpctx, bitcoin_tx_output_get_script(
tmpctx, tx, i)));
} }
for (i = 0; i < tal_count(tx->output); i++) { for (i = 0; i < tx->wtx->num_outputs; i++) {
struct tracked_output *out; struct tracked_output *out;
const size_t *matches; const size_t *matches;
size_t which_htlc; size_t which_htlc;
const u8 *oscript = bitcoin_tx_output_get_script(tmpctx, tx, i);
struct amount_sat amt = bitcoin_tx_output_get_amount(tx, i);
if (script[LOCAL] if (script[LOCAL]
&& scripteq(tx->output[i].script, script[LOCAL])) { && scripteq(oscript, script[LOCAL])) {
/* BOLT #5: /* BOLT #5:
* *
* - MAY take no action regarding the _local node's * - MAY take no action regarding the _local node's
@ -2012,7 +2036,7 @@ static void handle_their_cheat(const struct bitcoin_tx *tx,
*/ */
out = new_tracked_output(&outs, txid, tx_blockheight, out = new_tracked_output(&outs, txid, tx_blockheight,
THEIR_REVOKED_UNILATERAL, THEIR_REVOKED_UNILATERAL,
i, tx->output[i].amount, i, amt,
OUTPUT_TO_US, NULL, NULL, NULL); OUTPUT_TO_US, NULL, NULL, NULL);
ignore_output(out); ignore_output(out);
@ -2021,14 +2045,14 @@ static void handle_their_cheat(const struct bitcoin_tx *tx,
wire_sync_write(REQ_FD, towire_onchain_add_utxo( wire_sync_write(REQ_FD, towire_onchain_add_utxo(
tmpctx, txid, i, tmpctx, txid, i,
remote_per_commitment_point, remote_per_commitment_point,
tx->output[i].amount, amt,
tx_blockheight, tx_blockheight,
script[LOCAL])); script[LOCAL]));
script[LOCAL] = NULL; script[LOCAL] = NULL;
continue; continue;
} }
if (script[REMOTE] if (script[REMOTE]
&& scripteq(tx->output[i].script, script[REMOTE])) { && scripteq(oscript, script[REMOTE])) {
/* BOLT #5: /* BOLT #5:
* *
* - MUST *resolve* the _remote node's main output_ by * - MUST *resolve* the _remote node's main output_ by
@ -2036,7 +2060,7 @@ static void handle_their_cheat(const struct bitcoin_tx *tx,
*/ */
out = new_tracked_output(&outs, txid, tx_blockheight, out = new_tracked_output(&outs, txid, tx_blockheight,
THEIR_REVOKED_UNILATERAL, i, THEIR_REVOKED_UNILATERAL, i,
tx->output[i].amount, amt,
DELAYED_OUTPUT_TO_THEM, DELAYED_OUTPUT_TO_THEM,
NULL, NULL, NULL); NULL, NULL, NULL);
steal_to_them_output(out); steal_to_them_output(out);
@ -2064,7 +2088,7 @@ static void handle_their_cheat(const struct bitcoin_tx *tx,
out = new_tracked_output(&outs, txid, out = new_tracked_output(&outs, txid,
tx_blockheight, tx_blockheight,
THEIR_REVOKED_UNILATERAL, i, THEIR_REVOKED_UNILATERAL, i,
tx->output[i].amount, amt,
OUR_HTLC, OUR_HTLC,
&htlcs[which_htlc], &htlcs[which_htlc],
htlc_scripts[which_htlc], htlc_scripts[which_htlc],
@ -2074,7 +2098,7 @@ static void handle_their_cheat(const struct bitcoin_tx *tx,
out = new_tracked_output(&outs, txid, out = new_tracked_output(&outs, txid,
tx_blockheight, tx_blockheight,
THEIR_REVOKED_UNILATERAL, i, THEIR_REVOKED_UNILATERAL, i,
tx->output[i].amount, amt,
THEIR_HTLC, THEIR_HTLC,
&htlcs[which_htlc], &htlcs[which_htlc],
htlc_scripts[which_htlc], htlc_scripts[which_htlc],
@ -2203,18 +2227,20 @@ static void handle_their_unilateral(const struct bitcoin_tx *tx,
status_trace("Script to-me: %s", status_trace("Script to-me: %s",
tal_hex(tmpctx, script[LOCAL])); tal_hex(tmpctx, script[LOCAL]));
for (i = 0; i < tal_count(tx->output); i++) { for (i = 0; i < tx->wtx->num_outputs; i++) {
status_trace("Output %zu: %s", status_trace("Output %zu: %s", i,
i, tal_hex(tmpctx, tx->output[i].script)); tal_hex(tmpctx, bitcoin_tx_output_get_script(
tmpctx, tx, i)));
} }
for (i = 0; i < tal_count(tx->output); i++) { for (i = 0; i < tx->wtx->num_outputs; i++) {
struct tracked_output *out; struct tracked_output *out;
const size_t *matches; const size_t *matches;
size_t which_htlc; size_t which_htlc;
const u8 *oscript = bitcoin_tx_output_get_script(tmpctx, tx, i);
struct amount_sat amt = bitcoin_tx_output_get_amount(tx, i);
if (script[LOCAL] if (script[LOCAL] && scripteq(oscript, script[LOCAL])) {
&& scripteq(tx->output[i].script, script[LOCAL])) {
/* BOLT #5: /* BOLT #5:
* *
* - MAY take no action in regard to the associated * - MAY take no action in regard to the associated
@ -2225,7 +2251,7 @@ static void handle_their_unilateral(const struct bitcoin_tx *tx,
*/ */
out = new_tracked_output(&outs, txid, tx_blockheight, out = new_tracked_output(&outs, txid, tx_blockheight,
THEIR_UNILATERAL, THEIR_UNILATERAL,
i, tx->output[i].amount, i, amt,
OUTPUT_TO_US, NULL, NULL, NULL); OUTPUT_TO_US, NULL, NULL, NULL);
ignore_output(out); ignore_output(out);
@ -2234,14 +2260,14 @@ static void handle_their_unilateral(const struct bitcoin_tx *tx,
wire_sync_write(REQ_FD, towire_onchain_add_utxo( wire_sync_write(REQ_FD, towire_onchain_add_utxo(
tmpctx, txid, i, tmpctx, txid, i,
remote_per_commitment_point, remote_per_commitment_point,
tx->output[i].amount, amt,
tx_blockheight, tx_blockheight,
script[LOCAL])); script[LOCAL]));
script[LOCAL] = NULL; script[LOCAL] = NULL;
continue; continue;
} }
if (script[REMOTE] if (script[REMOTE]
&& scripteq(tx->output[i].script, script[REMOTE])) { && scripteq(oscript, script[REMOTE])) {
/* BOLT #5: /* BOLT #5:
* *
* - MAY take no action in regard to the associated * - MAY take no action in regard to the associated
@ -2252,7 +2278,7 @@ static void handle_their_unilateral(const struct bitcoin_tx *tx,
*/ */
out = new_tracked_output(&outs, txid, tx_blockheight, out = new_tracked_output(&outs, txid, tx_blockheight,
THEIR_UNILATERAL, i, THEIR_UNILATERAL, i,
tx->output[i].amount, amt,
DELAYED_OUTPUT_TO_THEM, DELAYED_OUTPUT_TO_THEM,
NULL, NULL, NULL); NULL, NULL, NULL);
ignore_output(out); ignore_output(out);
@ -2275,7 +2301,7 @@ static void handle_their_unilateral(const struct bitcoin_tx *tx,
out = new_tracked_output(&outs, txid, out = new_tracked_output(&outs, txid,
tx_blockheight, tx_blockheight,
THEIR_UNILATERAL, i, THEIR_UNILATERAL, i,
tx->output[i].amount, amt,
OUR_HTLC, OUR_HTLC,
NULL, NULL, NULL, NULL,
NULL); NULL);
@ -2287,7 +2313,7 @@ static void handle_their_unilateral(const struct bitcoin_tx *tx,
out = new_tracked_output(&outs, txid, out = new_tracked_output(&outs, txid,
tx_blockheight, tx_blockheight,
THEIR_UNILATERAL, i, THEIR_UNILATERAL, i,
tx->output[i].amount, amt,
THEIR_HTLC, THEIR_HTLC,
NULL, NULL, NULL, NULL,
NULL); NULL);
@ -2340,11 +2366,13 @@ static void handle_unknown_commitment(const struct bitcoin_tx *tx,
possible_remote_per_commitment_point)); possible_remote_per_commitment_point));
local_script = scriptpubkey_p2wpkh(tmpctx, &keyset->other_payment_key); local_script = scriptpubkey_p2wpkh(tmpctx, &keyset->other_payment_key);
for (size_t i = 0; i < tal_count(tx->output); i++) { for (size_t i = 0; i < tx->wtx->num_outputs; i++) {
struct tracked_output *out; struct tracked_output *out;
const u8 *oscript = bitcoin_tx_output_get_script(tmpctx, tx, i);
struct amount_sat amt = bitcoin_tx_output_get_amount(tx, i);
if (local_script if (local_script
&& scripteq(tx->output[i].script, local_script)) { && scripteq(oscript, local_script)) {
/* BOLT #5: /* BOLT #5:
* *
* - MAY take no action in regard to the associated * - MAY take no action in regard to the associated
@ -2355,7 +2383,7 @@ static void handle_unknown_commitment(const struct bitcoin_tx *tx,
*/ */
out = new_tracked_output(&outs, txid, tx_blockheight, out = new_tracked_output(&outs, txid, tx_blockheight,
UNKNOWN_UNILATERAL, UNKNOWN_UNILATERAL,
i, tx->output[i].amount, i, amt,
OUTPUT_TO_US, NULL, NULL, NULL); OUTPUT_TO_US, NULL, NULL, NULL);
ignore_output(out); ignore_output(out);
@ -2364,7 +2392,7 @@ static void handle_unknown_commitment(const struct bitcoin_tx *tx,
wire_sync_write(REQ_FD, towire_onchain_add_utxo( wire_sync_write(REQ_FD, towire_onchain_add_utxo(
tmpctx, txid, i, tmpctx, txid, i,
possible_remote_per_commitment_point, possible_remote_per_commitment_point,
tx->output[i].amount, amt,
tx_blockheight, tx_blockheight,
local_script)); local_script));
local_script = NULL; local_script = NULL;
@ -2410,7 +2438,7 @@ int main(int argc, char *argv[])
struct shachain shachain; struct shachain shachain;
struct bitcoin_tx *tx; struct bitcoin_tx *tx;
struct tracked_output **outs; struct tracked_output **outs;
struct bitcoin_txid our_broadcast_txid, txid; struct bitcoin_txid our_broadcast_txid, txid, tmptxid;
secp256k1_ecdsa_signature *remote_htlc_sigs; secp256k1_ecdsa_signature *remote_htlc_sigs;
struct amount_sat funding; struct amount_sat funding;
u64 num_htlcs; u64 num_htlcs;
@ -2476,10 +2504,11 @@ int main(int argc, char *argv[])
} }
outs = tal_arr(ctx, struct tracked_output *, 0); outs = tal_arr(ctx, struct tracked_output *, 0);
new_tracked_output(&outs, &tx->input[0].txid, bitcoin_tx_input_get_txid(tx, 0, &tmptxid);
new_tracked_output(&outs, &tmptxid,
0, /* We don't care about funding blockheight */ 0, /* We don't care about funding blockheight */
FUNDING_TRANSACTION, FUNDING_TRANSACTION,
tx->input[0].index, tx->wtx->inputs[0].index,
funding, funding,
FUNDING_OUTPUT, NULL, NULL, NULL); FUNDING_OUTPUT, NULL, NULL, NULL);

Loading…
Cancel
Save