script: change htlc output scripts if option_anchor_outputs.

For the moment, everyone passes "false".

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell
2020-08-14 03:12:02 +09:30
parent edf60b4f9e
commit 05c3a9bf12
10 changed files with 164 additions and 59 deletions

View File

@@ -516,11 +516,32 @@ u8 *bitcoin_wscript_to_local(const tal_t *ctx, u16 to_self_delay,
* OP_ENDIF * OP_ENDIF
* OP_ENDIF * OP_ENDIF
*/ */
/* BOLT-a12da24dd0102c170365124782b46d9710950ac1 #3:
* Or, with `option_anchor_outputs`:
*
* # To remote node with revocation key
* OP_DUP OP_HASH160 <RIPEMD160(SHA256(revocationpubkey))> OP_EQUAL
* OP_IF
* OP_CHECKSIG
* OP_ELSE
* <remote_htlcpubkey> OP_SWAP OP_SIZE 32 OP_EQUAL
* OP_NOTIF
* # To local node via HTLC-timeout transaction (timelocked).
* OP_DROP 2 OP_SWAP <local_htlcpubkey> 2 OP_CHECKMULTISIG
* OP_ELSE
* # To remote node with preimage.
* OP_HASH160 <RIPEMD160(payment_hash)> OP_EQUALVERIFY
* OP_CHECKSIG
* OP_ENDIF
* 1 OP_CHECKSEQUENCEVERIFY OP_DROP
* OP_ENDIF
*/
u8 *bitcoin_wscript_htlc_offer_ripemd160(const tal_t *ctx, u8 *bitcoin_wscript_htlc_offer_ripemd160(const tal_t *ctx,
const struct pubkey *localhtlckey, const struct pubkey *localhtlckey,
const struct pubkey *remotehtlckey, const struct pubkey *remotehtlckey,
const struct ripemd160 *payment_ripemd, const struct ripemd160 *payment_ripemd,
const struct pubkey *revocationkey) const struct pubkey *revocationkey,
bool option_anchor_outputs)
{ {
u8 *script = tal_arr(ctx, u8, 0); u8 *script = tal_arr(ctx, u8, 0);
struct ripemd160 ripemd; struct ripemd160 ripemd;
@@ -552,6 +573,11 @@ u8 *bitcoin_wscript_htlc_offer_ripemd160(const tal_t *ctx,
add_op(&script, OP_EQUALVERIFY); add_op(&script, OP_EQUALVERIFY);
add_op(&script, OP_CHECKSIG); add_op(&script, OP_CHECKSIG);
add_op(&script, OP_ENDIF); add_op(&script, OP_ENDIF);
if (option_anchor_outputs) {
add_number(&script, 1);
add_op(&script, OP_CHECKSEQUENCEVERIFY);
add_op(&script, OP_DROP);
}
add_op(&script, OP_ENDIF); add_op(&script, OP_ENDIF);
return script; return script;
@@ -561,14 +587,16 @@ u8 *bitcoin_wscript_htlc_offer(const tal_t *ctx,
const struct pubkey *localhtlckey, const struct pubkey *localhtlckey,
const struct pubkey *remotehtlckey, const struct pubkey *remotehtlckey,
const struct sha256 *payment_hash, const struct sha256 *payment_hash,
const struct pubkey *revocationkey) const struct pubkey *revocationkey,
bool option_anchor_outputs)
{ {
struct ripemd160 ripemd; struct ripemd160 ripemd;
ripemd160(&ripemd, payment_hash->u.u8, sizeof(payment_hash->u)); ripemd160(&ripemd, payment_hash->u.u8, sizeof(payment_hash->u));
return bitcoin_wscript_htlc_offer_ripemd160(ctx, localhtlckey, return bitcoin_wscript_htlc_offer_ripemd160(ctx, localhtlckey,
remotehtlckey, remotehtlckey,
&ripemd, revocationkey); &ripemd, revocationkey,
option_anchor_outputs);
} }
/* BOLT #3: /* BOLT #3:
@@ -597,12 +625,34 @@ u8 *bitcoin_wscript_htlc_offer(const tal_t *ctx,
* OP_ENDIF * OP_ENDIF
* OP_ENDIF * OP_ENDIF
*/ */
/* BOLT-a12da24dd0102c170365124782b46d9710950ac1 #3:
* Or, with `option_anchor_outputs`:
*
* # To remote node with revocation key
* OP_DUP OP_HASH160 <RIPEMD160(SHA256(revocationpubkey))> OP_EQUAL
* OP_IF
* OP_CHECKSIG
* OP_ELSE
* <remote_htlcpubkey> OP_SWAP OP_SIZE 32 OP_EQUAL
* OP_IF
* # To local node via HTLC-success transaction.
* OP_HASH160 <RIPEMD160(payment_hash)> OP_EQUALVERIFY
* 2 OP_SWAP <local_htlcpubkey> 2 OP_CHECKMULTISIG
* OP_ELSE
* # To remote node after timeout.
* OP_DROP <cltv_expiry> OP_CHECKLOCKTIMEVERIFY OP_DROP
* OP_CHECKSIG
* OP_ENDIF
* 1 OP_CHECKSEQUENCEVERIFY OP_DROP
* OP_ENDIF
*/
u8 *bitcoin_wscript_htlc_receive_ripemd(const tal_t *ctx, u8 *bitcoin_wscript_htlc_receive_ripemd(const tal_t *ctx,
const struct abs_locktime *htlc_abstimeout, const struct abs_locktime *htlc_abstimeout,
const struct pubkey *localhtlckey, const struct pubkey *localhtlckey,
const struct pubkey *remotehtlckey, const struct pubkey *remotehtlckey,
const struct ripemd160 *payment_ripemd, const struct ripemd160 *payment_ripemd,
const struct pubkey *revocationkey) const struct pubkey *revocationkey,
bool option_anchor_outputs)
{ {
u8 *script = tal_arr(ctx, u8, 0); u8 *script = tal_arr(ctx, u8, 0);
struct ripemd160 ripemd; struct ripemd160 ripemd;
@@ -637,6 +687,11 @@ u8 *bitcoin_wscript_htlc_receive_ripemd(const tal_t *ctx,
add_op(&script, OP_DROP); add_op(&script, OP_DROP);
add_op(&script, OP_CHECKSIG); add_op(&script, OP_CHECKSIG);
add_op(&script, OP_ENDIF); add_op(&script, OP_ENDIF);
if (option_anchor_outputs) {
add_number(&script, 1);
add_op(&script, OP_CHECKSEQUENCEVERIFY);
add_op(&script, OP_DROP);
}
add_op(&script, OP_ENDIF); add_op(&script, OP_ENDIF);
return script; return script;
@@ -647,14 +702,16 @@ u8 *bitcoin_wscript_htlc_receive(const tal_t *ctx,
const struct pubkey *localhtlckey, const struct pubkey *localhtlckey,
const struct pubkey *remotehtlckey, const struct pubkey *remotehtlckey,
const struct sha256 *payment_hash, const struct sha256 *payment_hash,
const struct pubkey *revocationkey) const struct pubkey *revocationkey,
bool option_anchor_outputs)
{ {
struct ripemd160 ripemd; struct ripemd160 ripemd;
ripemd160(&ripemd, payment_hash->u.u8, sizeof(payment_hash->u)); ripemd160(&ripemd, payment_hash->u.u8, sizeof(payment_hash->u));
return bitcoin_wscript_htlc_receive_ripemd(ctx, htlc_abstimeout, return bitcoin_wscript_htlc_receive_ripemd(ctx, htlc_abstimeout,
localhtlckey, remotehtlckey, localhtlckey, remotehtlckey,
&ripemd, revocationkey); &ripemd, revocationkey,
option_anchor_outputs);
} }
/* BOLT #3: /* BOLT #3:

View File

@@ -86,7 +86,8 @@ u8 *bitcoin_wscript_htlc_offer(const tal_t *ctx,
const struct pubkey *localhtlckey, const struct pubkey *localhtlckey,
const struct pubkey *remotehtlckey, const struct pubkey *remotehtlckey,
const struct sha256 *payment_hash, const struct sha256 *payment_hash,
const struct pubkey *revocationkey); const struct pubkey *revocationkey,
bool option_anchor_outputs);
u8 **bitcoin_witness_htlc_timeout_tx(const tal_t *ctx, u8 **bitcoin_witness_htlc_timeout_tx(const tal_t *ctx,
const struct bitcoin_signature *localsig, const struct bitcoin_signature *localsig,
const struct bitcoin_signature *remotesig, const struct bitcoin_signature *remotesig,
@@ -96,7 +97,8 @@ u8 *bitcoin_wscript_htlc_receive(const tal_t *ctx,
const struct pubkey *localkey, const struct pubkey *localkey,
const struct pubkey *remotekey, const struct pubkey *remotekey,
const struct sha256 *payment_hash, const struct sha256 *payment_hash,
const struct pubkey *revocationkey); const struct pubkey *revocationkey,
bool option_anchor_outputs);
u8 **bitcoin_witness_htlc_success_tx(const tal_t *ctx, u8 **bitcoin_witness_htlc_success_tx(const tal_t *ctx,
const struct bitcoin_signature *localsig, const struct bitcoin_signature *localsig,
const struct bitcoin_signature *remotesig, const struct bitcoin_signature *remotesig,
@@ -108,13 +110,15 @@ u8 *bitcoin_wscript_htlc_offer_ripemd160(const tal_t *ctx,
const struct pubkey *localhtlckey, const struct pubkey *localhtlckey,
const struct pubkey *remotehtlckey, const struct pubkey *remotehtlckey,
const struct ripemd160 *payment_ripemd, const struct ripemd160 *payment_ripemd,
const struct pubkey *revocationkey); const struct pubkey *revocationkey,
bool option_anchor_outputs);
u8 *bitcoin_wscript_htlc_receive_ripemd(const tal_t *ctx, u8 *bitcoin_wscript_htlc_receive_ripemd(const tal_t *ctx,
const struct abs_locktime *htlc_abstimeout, const struct abs_locktime *htlc_abstimeout,
const struct pubkey *localkey, const struct pubkey *localkey,
const struct pubkey *remotekey, const struct pubkey *remotekey,
const struct ripemd160 *payment_ripemd, const struct ripemd160 *payment_ripemd,
const struct pubkey *revocationkey); const struct pubkey *revocationkey,
bool option_anchor_outputs);
/* BOLT #3 HTLC-success/HTLC-timeout output */ /* BOLT #3 HTLC-success/HTLC-timeout output */
u8 *bitcoin_wscript_htlc_tx(const tal_t *ctx, u8 *bitcoin_wscript_htlc_tx(const tal_t *ctx,

View File

@@ -43,7 +43,7 @@ static void add_offered_htlc_out(struct bitcoin_tx *tx, size_t n,
struct amount_sat amount = amount_msat_to_sat_round_down(htlc->amount); struct amount_sat amount = amount_msat_to_sat_round_down(htlc->amount);
ripemd160(&ripemd, htlc->rhash.u.u8, sizeof(htlc->rhash.u.u8)); ripemd160(&ripemd, htlc->rhash.u.u8, sizeof(htlc->rhash.u.u8));
wscript = htlc_offered_wscript(tx, &ripemd, keyset); wscript = htlc_offered_wscript(tx, &ripemd, keyset, false /* FIXME-anchor */);
p2wsh = scriptpubkey_p2wsh(tx, wscript); p2wsh = scriptpubkey_p2wsh(tx, wscript);
bitcoin_tx_add_output(tx, p2wsh, wscript, amount); bitcoin_tx_add_output(tx, p2wsh, wscript, amount);
SUPERVERBOSE("# HTLC %" PRIu64 " offered %s wscript %s\n", htlc->id, SUPERVERBOSE("# HTLC %" PRIu64 " offered %s wscript %s\n", htlc->id,
@@ -61,7 +61,7 @@ static void add_received_htlc_out(struct bitcoin_tx *tx, size_t n,
struct amount_sat amount; struct amount_sat amount;
ripemd160(&ripemd, htlc->rhash.u.u8, sizeof(htlc->rhash.u.u8)); ripemd160(&ripemd, htlc->rhash.u.u8, sizeof(htlc->rhash.u.u8));
wscript = htlc_received_wscript(tx, &ripemd, &htlc->expiry, keyset); wscript = htlc_received_wscript(tx, &ripemd, &htlc->expiry, keyset, false /* FIXME-anchor */);
p2wsh = scriptpubkey_p2wsh(tx, wscript); p2wsh = scriptpubkey_p2wsh(tx, wscript);
amount = amount_msat_to_sat_round_down(htlc->amount); amount = amount_msat_to_sat_round_down(htlc->amount);

View File

@@ -247,23 +247,23 @@ static void add_htlcs(struct bitcoin_tx ***txs,
if (htlc_owner(htlc) == side) { if (htlc_owner(htlc) == side) {
ripemd160(&ripemd, htlc->rhash.u.u8, sizeof(htlc->rhash.u.u8)); ripemd160(&ripemd, htlc->rhash.u.u8, sizeof(htlc->rhash.u.u8));
wscript = htlc_offered_wscript(tmpctx, &ripemd, keyset); wscript = htlc_offered_wscript(tmpctx, &ripemd, keyset, false /* FIXME-anchor */);
tx = htlc_timeout_tx(*txs, chainparams, &txid, i, tx = htlc_timeout_tx(*txs, chainparams, &txid, i,
wscript, wscript,
htlc->amount, htlc->amount,
htlc->expiry.locktime, htlc->expiry.locktime,
channel->config[!side].to_self_delay, channel->config[!side].to_self_delay,
feerate_per_kw, feerate_per_kw,
keyset); keyset, false /* FIXME-anchor */);
} else { } else {
ripemd160(&ripemd, htlc->rhash.u.u8, sizeof(htlc->rhash.u.u8)); ripemd160(&ripemd, htlc->rhash.u.u8, sizeof(htlc->rhash.u.u8));
wscript = htlc_received_wscript(tmpctx, &ripemd, &htlc->expiry, keyset); wscript = htlc_received_wscript(tmpctx, &ripemd, &htlc->expiry, keyset, false /* FIXME-anchor */);
tx = htlc_success_tx(*txs, chainparams, &txid, i, tx = htlc_success_tx(*txs, chainparams, &txid, i,
wscript, wscript,
htlc->amount, htlc->amount,
channel->config[!side].to_self_delay, channel->config[!side].to_self_delay,
feerate_per_kw, feerate_per_kw,
keyset); keyset, false /* FIXME-anchor */);
} }
/* Append to array. */ /* Append to array. */

View File

@@ -206,7 +206,8 @@ static void report_htlcs(const struct bitcoin_tx *tx,
const struct pubkey *remotekey, const struct pubkey *remotekey,
const struct pubkey *remote_htlckey, const struct pubkey *remote_htlckey,
const struct pubkey *remote_revocation_key, const struct pubkey *remote_revocation_key,
u32 feerate_per_kw) u32 feerate_per_kw,
bool option_anchor_outputs)
{ {
size_t i, n; size_t i, n;
struct bitcoin_txid txid; struct bitcoin_txid txid;
@@ -249,27 +250,30 @@ static void report_htlcs(const struct bitcoin_tx *tx,
local_htlckey, local_htlckey,
remote_htlckey, remote_htlckey,
&htlc->rhash, &htlc->rhash,
remote_revocation_key); remote_revocation_key,
option_anchor_outputs);
htlc_tx[i] = htlc_timeout_tx(htlc_tx, tx->chainparams, htlc_tx[i] = htlc_timeout_tx(htlc_tx, tx->chainparams,
&txid, i, wscript[i], &txid, i, wscript[i],
htlc->amount, htlc->amount,
htlc->expiry.locktime, htlc->expiry.locktime,
to_self_delay, to_self_delay,
feerate_per_kw, feerate_per_kw,
&keyset); &keyset, option_anchor_outputs);
} else { } else {
wscript[i] = bitcoin_wscript_htlc_receive(tmpctx, wscript[i] = bitcoin_wscript_htlc_receive(tmpctx,
&htlc->expiry, &htlc->expiry,
local_htlckey, local_htlckey,
remote_htlckey, remote_htlckey,
&htlc->rhash, &htlc->rhash,
remote_revocation_key); remote_revocation_key,
option_anchor_outputs);
htlc_tx[i] = htlc_success_tx(htlc_tx, tx->chainparams, htlc_tx[i] = htlc_success_tx(htlc_tx, tx->chainparams,
&txid, i, wscript[i], &txid, i, wscript[i],
htlc->amount, htlc->amount,
to_self_delay, to_self_delay,
feerate_per_kw, feerate_per_kw,
&keyset); &keyset,
option_anchor_outputs);
} }
sign_tx_input(htlc_tx[i], 0, sign_tx_input(htlc_tx[i], 0,
NULL, NULL,
@@ -307,7 +311,8 @@ static void report_htlcs(const struct bitcoin_tx *tx,
&htlc->rhash, &htlc->rhash,
remote_revocation_key, remote_revocation_key,
&localhtlcsig, &localhtlcsig,
&remotehtlcsig[i]); &remotehtlcsig[i],
option_anchor_outputs);
} else { } else {
htlc_success_tx_add_witness(htlc_tx[i], htlc_success_tx_add_witness(htlc_tx[i],
&htlc->expiry, &htlc->expiry,
@@ -316,7 +321,8 @@ static void report_htlcs(const struct bitcoin_tx *tx,
&localhtlcsig, &localhtlcsig,
&remotehtlcsig[i], &remotehtlcsig[i],
htlc->r, htlc->r,
remote_revocation_key); remote_revocation_key,
option_anchor_outputs);
} }
printf("output htlc_%s_tx %"PRIu64": %s\n", printf("output htlc_%s_tx %"PRIu64": %s\n",
htlc_owner(htlc) == LOCAL ? "timeout" : "success", htlc_owner(htlc) == LOCAL ? "timeout" : "success",
@@ -341,6 +347,7 @@ static void report(struct bitcoin_tx *tx,
const struct pubkey *remote_htlckey, const struct pubkey *remote_htlckey,
const struct pubkey *remote_revocation_key, const struct pubkey *remote_revocation_key,
u32 feerate_per_kw, u32 feerate_per_kw,
bool option_anchor_outputs,
const struct htlc **htlc_map) const struct htlc **htlc_map)
{ {
char *txhex; char *txhex;
@@ -377,7 +384,8 @@ static void report(struct bitcoin_tx *tx,
x_remote_htlcsecretkey, x_remote_htlcsecretkey,
remotekey, remote_htlckey, remotekey, remote_htlckey,
remote_revocation_key, remote_revocation_key,
feerate_per_kw); feerate_per_kw,
option_anchor_outputs);
} }
#ifdef DEBUG #ifdef DEBUG
@@ -482,6 +490,7 @@ int main(int argc, const char *argv[])
u64 commitment_number, cn_obscurer; u64 commitment_number, cn_obscurer;
struct amount_msat to_local, to_remote; struct amount_msat to_local, to_remote;
const struct htlc **htlcs, **htlc_map, **htlc_map2, **inv_htlcs; const struct htlc **htlcs, **htlc_map, **htlc_map2, **inv_htlcs;
bool option_anchor_outputs = false;
chainparams = chainparams_for_network("bitcoin"); chainparams = chainparams_for_network("bitcoin");
@@ -771,6 +780,7 @@ int main(int argc, const char *argv[])
&remote_htlckey, &remote_htlckey,
&remote_revocation_key, &remote_revocation_key,
feerate_per_kw, feerate_per_kw,
option_anchor_outputs,
htlc_map); htlc_map);
/* BOLT #3: /* BOLT #3:
@@ -828,6 +838,7 @@ int main(int argc, const char *argv[])
&remote_htlckey, &remote_htlckey,
&remote_revocation_key, &remote_revocation_key,
feerate_per_kw, feerate_per_kw,
option_anchor_outputs,
htlc_map); htlc_map);
do { do {
@@ -905,6 +916,7 @@ int main(int argc, const char *argv[])
&remote_htlckey, &remote_htlckey,
&remote_revocation_key, &remote_revocation_key,
feerate_per_kw-1, feerate_per_kw-1,
option_anchor_outputs,
htlc_map); htlc_map);
printf("\n" printf("\n"
@@ -942,6 +954,7 @@ int main(int argc, const char *argv[])
&remote_htlckey, &remote_htlckey,
&remote_revocation_key, &remote_revocation_key,
feerate_per_kw, feerate_per_kw,
option_anchor_outputs,
htlc_map); htlc_map);
assert(newtx->wtx->num_outputs != tx->wtx->num_outputs); assert(newtx->wtx->num_outputs != tx->wtx->num_outputs);
@@ -1001,6 +1014,7 @@ int main(int argc, const char *argv[])
&remote_htlckey, &remote_htlckey,
&remote_revocation_key, &remote_revocation_key,
feerate_per_kw, feerate_per_kw,
option_anchor_outputs,
htlc_map); htlc_map);
break; break;
} }

View File

@@ -14,7 +14,8 @@ static struct bitcoin_tx *htlc_tx(const tal_t *ctx,
const struct pubkey *revocation_pubkey, const struct pubkey *revocation_pubkey,
const struct pubkey *local_delayedkey, const struct pubkey *local_delayedkey,
struct amount_sat htlc_fee, struct amount_sat htlc_fee,
u32 locktime) u32 locktime,
bool option_anchor_outputs)
{ {
/* BOLT #3: /* BOLT #3:
* * locktime: `0` for HTLC-success, `cltv_expiry` for HTLC-timeout * * locktime: `0` for HTLC-success, `cltv_expiry` for HTLC-timeout
@@ -38,15 +39,16 @@ static struct bitcoin_tx *htlc_tx(const tal_t *ctx,
*/ */
assert(tx->wtx->version == 2); assert(tx->wtx->version == 2);
/* BOLT #3: /* BOLT-a12da24dd0102c170365124782b46d9710950ac1 #3:
* * txin count: 1 * * txin count: 1
* * `txin[0]` outpoint: `txid` of the commitment transaction and * * `txin[0]` outpoint: `txid` of the commitment transaction and
* `output_index` of the matching HTLC output for the HTLC * `output_index` of the matching HTLC output for the HTLC
* transaction * transaction
* * `txin[0]` sequence: `0` * * `txin[0]` sequence: `0` (set to `1` for `option_anchor_outputs`)
*/ */
amount = amount_msat_to_sat_round_down(msat); amount = amount_msat_to_sat_round_down(msat);
bitcoin_tx_add_input(tx, commit_txid, commit_output_number, 0, bitcoin_tx_add_input(tx, commit_txid, commit_output_number,
option_anchor_outputs ? 1 : 0,
NULL, amount, NULL, commit_wscript); NULL, amount, NULL, commit_wscript);
/* BOLT #3: /* BOLT #3:
@@ -80,7 +82,8 @@ struct bitcoin_tx *htlc_success_tx(const tal_t *ctx,
struct amount_msat htlc_msatoshi, struct amount_msat htlc_msatoshi,
u16 to_self_delay, u16 to_self_delay,
u32 feerate_per_kw, u32 feerate_per_kw,
const struct keyset *keyset) const struct keyset *keyset,
bool option_anchor_outputs)
{ {
/* BOLT #3: /* BOLT #3:
* * locktime: `0` for HTLC-success, `cltv_expiry` for HTLC-timeout * * locktime: `0` for HTLC-success, `cltv_expiry` for HTLC-timeout
@@ -90,7 +93,9 @@ struct bitcoin_tx *htlc_success_tx(const tal_t *ctx,
to_self_delay, to_self_delay,
&keyset->self_revocation_key, &keyset->self_revocation_key,
&keyset->self_delayed_payment_key, &keyset->self_delayed_payment_key,
htlc_success_fee(feerate_per_kw), 0); htlc_success_fee(feerate_per_kw),
0,
option_anchor_outputs);
} }
/* Fill in the witness for HTLC-success tx produced above. */ /* Fill in the witness for HTLC-success tx produced above. */
@@ -101,7 +106,8 @@ void htlc_success_tx_add_witness(struct bitcoin_tx *htlc_success,
const struct bitcoin_signature *localhtlcsig, const struct bitcoin_signature *localhtlcsig,
const struct bitcoin_signature *remotehtlcsig, const struct bitcoin_signature *remotehtlcsig,
const struct preimage *payment_preimage, const struct preimage *payment_preimage,
const struct pubkey *revocationkey) const struct pubkey *revocationkey,
bool option_anchor_outputs)
{ {
struct sha256 hash; struct sha256 hash;
u8 *wscript, **witness; u8 *wscript, **witness;
@@ -110,7 +116,8 @@ void htlc_success_tx_add_witness(struct bitcoin_tx *htlc_success,
wscript = bitcoin_wscript_htlc_receive(htlc_success, wscript = bitcoin_wscript_htlc_receive(htlc_success,
htlc_abstimeout, htlc_abstimeout,
localhtlckey, remotehtlckey, localhtlckey, remotehtlckey,
&hash, revocationkey); &hash, revocationkey,
option_anchor_outputs);
witness = bitcoin_witness_htlc_success_tx(htlc_success, witness = bitcoin_witness_htlc_success_tx(htlc_success,
localhtlcsig, remotehtlcsig, localhtlcsig, remotehtlcsig,
@@ -128,7 +135,8 @@ struct bitcoin_tx *htlc_timeout_tx(const tal_t *ctx,
u32 cltv_expiry, u32 cltv_expiry,
u16 to_self_delay, u16 to_self_delay,
u32 feerate_per_kw, u32 feerate_per_kw,
const struct keyset *keyset) const struct keyset *keyset,
bool option_anchor_outputs)
{ {
/* BOLT #3: /* BOLT #3:
* * locktime: `0` for HTLC-success, `cltv_expiry` for HTLC-timeout * * locktime: `0` for HTLC-success, `cltv_expiry` for HTLC-timeout
@@ -137,7 +145,9 @@ struct bitcoin_tx *htlc_timeout_tx(const tal_t *ctx,
commit_wscript, htlc_msatoshi, to_self_delay, commit_wscript, htlc_msatoshi, to_self_delay,
&keyset->self_revocation_key, &keyset->self_revocation_key,
&keyset->self_delayed_payment_key, &keyset->self_delayed_payment_key,
htlc_timeout_fee(feerate_per_kw), cltv_expiry); htlc_timeout_fee(feerate_per_kw),
cltv_expiry,
option_anchor_outputs);
} }
/* Fill in the witness for HTLC-timeout tx produced above. */ /* Fill in the witness for HTLC-timeout tx produced above. */
@@ -147,12 +157,14 @@ void htlc_timeout_tx_add_witness(struct bitcoin_tx *htlc_timeout,
const struct sha256 *payment_hash, const struct sha256 *payment_hash,
const struct pubkey *revocationkey, const struct pubkey *revocationkey,
const struct bitcoin_signature *localhtlcsig, const struct bitcoin_signature *localhtlcsig,
const struct bitcoin_signature *remotehtlcsig) const struct bitcoin_signature *remotehtlcsig,
bool option_anchor_outputs)
{ {
u8 **witness; u8 **witness;
u8 *wscript = bitcoin_wscript_htlc_offer(htlc_timeout, u8 *wscript = bitcoin_wscript_htlc_offer(htlc_timeout,
localhtlckey, remotehtlckey, localhtlckey, remotehtlckey,
payment_hash, revocationkey); payment_hash, revocationkey,
option_anchor_outputs);
witness = bitcoin_witness_htlc_timeout_tx(htlc_timeout, localhtlcsig, witness = bitcoin_witness_htlc_timeout_tx(htlc_timeout, localhtlcsig,
remotehtlcsig, wscript); remotehtlcsig, wscript);
@@ -162,24 +174,28 @@ void htlc_timeout_tx_add_witness(struct bitcoin_tx *htlc_timeout,
u8 *htlc_offered_wscript(const tal_t *ctx, u8 *htlc_offered_wscript(const tal_t *ctx,
const struct ripemd160 *ripemd, const struct ripemd160 *ripemd,
const struct keyset *keyset) const struct keyset *keyset,
bool option_anchor_outputs)
{ {
return bitcoin_wscript_htlc_offer_ripemd160(ctx, return bitcoin_wscript_htlc_offer_ripemd160(ctx,
&keyset->self_htlc_key, &keyset->self_htlc_key,
&keyset->other_htlc_key, &keyset->other_htlc_key,
ripemd, ripemd,
&keyset->self_revocation_key); &keyset->self_revocation_key,
option_anchor_outputs);
} }
u8 *htlc_received_wscript(const tal_t *ctx, u8 *htlc_received_wscript(const tal_t *ctx,
const struct ripemd160 *ripemd, const struct ripemd160 *ripemd,
const struct abs_locktime *expiry, const struct abs_locktime *expiry,
const struct keyset *keyset) const struct keyset *keyset,
bool option_anchor_outputs)
{ {
return bitcoin_wscript_htlc_receive_ripemd(ctx, return bitcoin_wscript_htlc_receive_ripemd(ctx,
expiry, expiry,
&keyset->self_htlc_key, &keyset->self_htlc_key,
&keyset->other_htlc_key, &keyset->other_htlc_key,
ripemd, ripemd,
&keyset->self_revocation_key); &keyset->self_revocation_key,
option_anchor_outputs);
} }

View File

@@ -73,7 +73,8 @@ struct bitcoin_tx *htlc_success_tx(const tal_t *ctx,
struct amount_msat htlc_msatoshi, struct amount_msat htlc_msatoshi,
u16 to_self_delay, u16 to_self_delay,
u32 feerate_per_kw, u32 feerate_per_kw,
const struct keyset *keyset); const struct keyset *keyset,
bool option_anchor_outputs);
/* Fill in the witness for HTLC-success tx produced above. */ /* Fill in the witness for HTLC-success tx produced above. */
void htlc_success_tx_add_witness(struct bitcoin_tx *htlc_success, void htlc_success_tx_add_witness(struct bitcoin_tx *htlc_success,
@@ -83,7 +84,8 @@ void htlc_success_tx_add_witness(struct bitcoin_tx *htlc_success,
const struct bitcoin_signature *localsig, const struct bitcoin_signature *localsig,
const struct bitcoin_signature *remotesig, const struct bitcoin_signature *remotesig,
const struct preimage *payment_preimage, const struct preimage *payment_preimage,
const struct pubkey *revocationkey); const struct pubkey *revocationkey,
bool option_anchor_outputs);
/* Create HTLC-timeout tx to spend an offered HTLC commitment tx /* Create HTLC-timeout tx to spend an offered HTLC commitment tx
* output; doesn't fill in input witness. */ * output; doesn't fill in input witness. */
@@ -96,7 +98,8 @@ struct bitcoin_tx *htlc_timeout_tx(const tal_t *ctx,
u32 cltv_expiry, u32 cltv_expiry,
u16 to_self_delay, u16 to_self_delay,
u32 feerate_per_kw, u32 feerate_per_kw,
const struct keyset *keyset); const struct keyset *keyset,
bool option_anchor_outputs);
/* Fill in the witness for HTLC-timeout tx produced above. */ /* Fill in the witness for HTLC-timeout tx produced above. */
void htlc_timeout_tx_add_witness(struct bitcoin_tx *htlc_timeout, void htlc_timeout_tx_add_witness(struct bitcoin_tx *htlc_timeout,
@@ -105,7 +108,8 @@ void htlc_timeout_tx_add_witness(struct bitcoin_tx *htlc_timeout,
const struct sha256 *payment_hash, const struct sha256 *payment_hash,
const struct pubkey *revocationkey, const struct pubkey *revocationkey,
const struct bitcoin_signature *localsig, const struct bitcoin_signature *localsig,
const struct bitcoin_signature *remotesig); const struct bitcoin_signature *remotesig,
bool option_anchor_outputs);
/* Generate the witness script for an HTLC the other side offered: /* Generate the witness script for an HTLC the other side offered:
@@ -113,12 +117,14 @@ void htlc_timeout_tx_add_witness(struct bitcoin_tx *htlc_timeout,
u8 *htlc_received_wscript(const tal_t *ctx, u8 *htlc_received_wscript(const tal_t *ctx,
const struct ripemd160 *ripemd, const struct ripemd160 *ripemd,
const struct abs_locktime *expiry, const struct abs_locktime *expiry,
const struct keyset *keyset); const struct keyset *keyset,
bool option_anchor_outputs);
/* Generate the witness script for an HTLC this side offered: /* Generate the witness script for an HTLC this side offered:
* scriptpubkey_p2wsh(ctx, wscript) gives the scriptpubkey */ * scriptpubkey_p2wsh(ctx, wscript) gives the scriptpubkey */
u8 *htlc_offered_wscript(const tal_t *ctx, u8 *htlc_offered_wscript(const tal_t *ctx,
const struct ripemd160 *ripemd, const struct ripemd160 *ripemd,
const struct keyset *keyset); const struct keyset *keyset,
bool option_anchor_outputs);
#endif /* LIGHTNING_COMMON_HTLC_TX_H */ #endif /* LIGHTNING_COMMON_HTLC_TX_H */

View File

@@ -1686,7 +1686,7 @@ static void handle_preimage(struct tracked_output **outs,
htlc_amount, htlc_amount,
to_self_delay[LOCAL], to_self_delay[LOCAL],
0, 0,
keyset); keyset, false /* FIXME-anchor */);
set_htlc_success_fee(tx, outs[i]->remote_htlc_sig, set_htlc_success_fee(tx, outs[i]->remote_htlc_sig,
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);
@@ -1875,7 +1875,7 @@ static u8 **derive_htlc_scripts(const struct htlc_stub *htlcs, enum side side)
if (htlcs[i].owner == side) if (htlcs[i].owner == side)
htlc_scripts[i] = htlc_offered_wscript(htlc_scripts, htlc_scripts[i] = htlc_offered_wscript(htlc_scripts,
&htlcs[i].ripemd, &htlcs[i].ripemd,
keyset); keyset, false /* FIXME-anchor */);
else { else {
/* FIXME: remove abs_locktime */ /* FIXME: remove abs_locktime */
struct abs_locktime ltime; struct abs_locktime ltime;
@@ -1887,7 +1887,7 @@ static u8 **derive_htlc_scripts(const struct htlc_stub *htlcs, enum side side)
htlc_scripts[i] = htlc_received_wscript(htlc_scripts, htlc_scripts[i] = htlc_received_wscript(htlc_scripts,
&htlcs[i].ripemd, &htlcs[i].ripemd,
&ltime, &ltime,
keyset); keyset, false /* FIXME-anchor */);
} }
} }
return htlc_scripts; return htlc_scripts;
@@ -1929,7 +1929,7 @@ static size_t resolve_our_htlc_ourcommit(struct tracked_output *out,
&out->txid, out->outnum, &out->txid, out->outnum,
htlc_scripts[matches[i]], htlc_amount, htlc_scripts[matches[i]], htlc_amount,
htlcs[matches[i]].cltv_expiry, htlcs[matches[i]].cltv_expiry,
to_self_delay[LOCAL], 0, keyset); to_self_delay[LOCAL], 0, keyset, false /* FIXME-anchor */);
if (set_htlc_timeout_fee(tx, out->remote_htlc_sig, if (set_htlc_timeout_fee(tx, out->remote_htlc_sig,
htlc_scripts[matches[i]])) htlc_scripts[matches[i]]))

View File

@@ -87,13 +87,15 @@ u8 fromwire_u8(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
/* Generated stub for htlc_offered_wscript */ /* Generated stub for htlc_offered_wscript */
u8 *htlc_offered_wscript(const tal_t *ctx UNNEEDED, u8 *htlc_offered_wscript(const tal_t *ctx UNNEEDED,
const struct ripemd160 *ripemd UNNEEDED, const struct ripemd160 *ripemd UNNEEDED,
const struct keyset *keyset UNNEEDED) const struct keyset *keyset UNNEEDED,
bool option_anchor_outputs UNNEEDED)
{ fprintf(stderr, "htlc_offered_wscript called!\n"); abort(); } { fprintf(stderr, "htlc_offered_wscript called!\n"); abort(); }
/* Generated stub for htlc_received_wscript */ /* Generated stub for htlc_received_wscript */
u8 *htlc_received_wscript(const tal_t *ctx UNNEEDED, u8 *htlc_received_wscript(const tal_t *ctx UNNEEDED,
const struct ripemd160 *ripemd UNNEEDED, const struct ripemd160 *ripemd UNNEEDED,
const struct abs_locktime *expiry UNNEEDED, const struct abs_locktime *expiry UNNEEDED,
const struct keyset *keyset UNNEEDED) const struct keyset *keyset UNNEEDED,
bool option_anchor_outputs UNNEEDED)
{ fprintf(stderr, "htlc_received_wscript called!\n"); abort(); } { fprintf(stderr, "htlc_received_wscript called!\n"); abort(); }
/* Generated stub for htlc_success_tx */ /* Generated stub for htlc_success_tx */
struct bitcoin_tx *htlc_success_tx(const tal_t *ctx UNNEEDED, struct bitcoin_tx *htlc_success_tx(const tal_t *ctx UNNEEDED,
@@ -104,7 +106,8 @@ struct bitcoin_tx *htlc_success_tx(const tal_t *ctx UNNEEDED,
struct amount_msat htlc_msatoshi UNNEEDED, struct amount_msat htlc_msatoshi UNNEEDED,
u16 to_self_delay UNNEEDED, u16 to_self_delay UNNEEDED,
u32 feerate_per_kw UNNEEDED, u32 feerate_per_kw UNNEEDED,
const struct keyset *keyset UNNEEDED) const struct keyset *keyset UNNEEDED,
bool option_anchor_outputs UNNEEDED)
{ fprintf(stderr, "htlc_success_tx called!\n"); abort(); } { fprintf(stderr, "htlc_success_tx called!\n"); abort(); }
/* Generated stub for master_badmsg */ /* Generated stub for master_badmsg */
void master_badmsg(u32 type_expected UNNEEDED, const u8 *msg) void master_badmsg(u32 type_expected UNNEEDED, const u8 *msg)
@@ -344,9 +347,10 @@ struct bitcoin_tx *htlc_timeout_tx(const tal_t *ctx,
u32 cltv_expiry, u32 cltv_expiry,
u16 to_self_delay UNNEEDED, u16 to_self_delay UNNEEDED,
u32 feerate_per_kw UNNEEDED, u32 feerate_per_kw UNNEEDED,
const struct keyset *keyset UNNEEDED) const struct keyset *keyset UNNEEDED,
bool option_anchor_outputs)
{ {
struct bitcoin_tx *tx; struct bitcoin_tx *tx;
struct amount_sat in_amount; struct amount_sat in_amount;
tx = bitcoin_tx_from_hex(ctx, "0200000001a02a38c6ec5541963704a2a035b3094b18d69cc25cc7419d75e02894618329720000000000000000000191ea3000000000002200208bfadb3554f41cc06f00de0ec2e2f91e36ee45b5006a1f606146784755356ba532f10800", tx = bitcoin_tx_from_hex(ctx, "0200000001a02a38c6ec5541963704a2a035b3094b18d69cc25cc7419d75e02894618329720000000000000000000191ea3000000000002200208bfadb3554f41cc06f00de0ec2e2f91e36ee45b5006a1f606146784755356ba532f10800",

View File

@@ -88,13 +88,15 @@ u8 fromwire_u8(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
/* Generated stub for htlc_offered_wscript */ /* Generated stub for htlc_offered_wscript */
u8 *htlc_offered_wscript(const tal_t *ctx UNNEEDED, u8 *htlc_offered_wscript(const tal_t *ctx UNNEEDED,
const struct ripemd160 *ripemd UNNEEDED, const struct ripemd160 *ripemd UNNEEDED,
const struct keyset *keyset UNNEEDED) const struct keyset *keyset UNNEEDED,
bool option_anchor_outputs UNNEEDED)
{ fprintf(stderr, "htlc_offered_wscript called!\n"); abort(); } { fprintf(stderr, "htlc_offered_wscript called!\n"); abort(); }
/* Generated stub for htlc_received_wscript */ /* Generated stub for htlc_received_wscript */
u8 *htlc_received_wscript(const tal_t *ctx UNNEEDED, u8 *htlc_received_wscript(const tal_t *ctx UNNEEDED,
const struct ripemd160 *ripemd UNNEEDED, const struct ripemd160 *ripemd UNNEEDED,
const struct abs_locktime *expiry UNNEEDED, const struct abs_locktime *expiry UNNEEDED,
const struct keyset *keyset UNNEEDED) const struct keyset *keyset UNNEEDED,
bool option_anchor_outputs UNNEEDED)
{ fprintf(stderr, "htlc_received_wscript called!\n"); abort(); } { fprintf(stderr, "htlc_received_wscript called!\n"); abort(); }
/* Generated stub for htlc_success_tx */ /* Generated stub for htlc_success_tx */
struct bitcoin_tx *htlc_success_tx(const tal_t *ctx UNNEEDED, struct bitcoin_tx *htlc_success_tx(const tal_t *ctx UNNEEDED,
@@ -105,7 +107,8 @@ struct bitcoin_tx *htlc_success_tx(const tal_t *ctx UNNEEDED,
struct amount_msat htlc_msatoshi UNNEEDED, struct amount_msat htlc_msatoshi UNNEEDED,
u16 to_self_delay UNNEEDED, u16 to_self_delay UNNEEDED,
u32 feerate_per_kw UNNEEDED, u32 feerate_per_kw UNNEEDED,
const struct keyset *keyset UNNEEDED) const struct keyset *keyset UNNEEDED,
bool option_anchor_outputs UNNEEDED)
{ fprintf(stderr, "htlc_success_tx called!\n"); abort(); } { fprintf(stderr, "htlc_success_tx called!\n"); abort(); }
/* Generated stub for htlc_timeout_tx */ /* Generated stub for htlc_timeout_tx */
struct bitcoin_tx *htlc_timeout_tx(const tal_t *ctx UNNEEDED, struct bitcoin_tx *htlc_timeout_tx(const tal_t *ctx UNNEEDED,
@@ -117,7 +120,8 @@ struct bitcoin_tx *htlc_timeout_tx(const tal_t *ctx UNNEEDED,
u32 cltv_expiry UNNEEDED, u32 cltv_expiry UNNEEDED,
u16 to_self_delay UNNEEDED, u16 to_self_delay UNNEEDED,
u32 feerate_per_kw UNNEEDED, u32 feerate_per_kw UNNEEDED,
const struct keyset *keyset UNNEEDED) const struct keyset *keyset UNNEEDED,
bool option_anchor_outputs UNNEEDED)
{ fprintf(stderr, "htlc_timeout_tx called!\n"); abort(); } { fprintf(stderr, "htlc_timeout_tx called!\n"); abort(); }
/* Generated stub for master_badmsg */ /* Generated stub for master_badmsg */
void master_badmsg(u32 type_expected UNNEEDED, const u8 *msg) void master_badmsg(u32 type_expected UNNEEDED, const u8 *msg)