Browse Source

commit_tx: expose wscript and scriptpubkey for to_us/to_them payments.

This is useful for locating them given a random on-chain transaction.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ppa-0.6.1
Rusty Russell 9 years ago
parent
commit
1f99268633
  1. 88
      daemon/commit_tx.c
  2. 14
      daemon/commit_tx.h

88
daemon/commit_tx.c

@ -57,6 +57,60 @@ static size_t count_htlcs(const struct htlc_map *htlcs, int flag)
return n;
}
u8 *commit_output_to_us(const tal_t *ctx,
const struct peer *peer,
const struct sha256 *rhash,
enum htlc_side side,
u8 **wscript)
{
u8 *tmp;
if (!wscript)
wscript = &tmp;
/* Our output to ourself is encumbered by delay. */
if (side == LOCAL) {
*wscript = bitcoin_redeem_secret_or_delay(ctx,
peer->dstate->secpctx,
&peer->local.finalkey,
&peer->remote.locktime,
&peer->remote.finalkey,
rhash);
return scriptpubkey_p2wsh(ctx, *wscript);
} else {
/* Their output to us is a simple p2wpkh */
*wscript = NULL;
return scriptpubkey_p2wpkh(ctx, peer->dstate->secpctx,
&peer->local.finalkey);
}
}
u8 *commit_output_to_them(const tal_t *ctx,
const struct peer *peer,
const struct sha256 *rhash,
enum htlc_side side,
u8 **wscript)
{
u8 *tmp;
if (!wscript)
wscript = &tmp;
/* Their output to themselves is encumbered by delay. */
if (side == REMOTE) {
*wscript = bitcoin_redeem_secret_or_delay(ctx,
peer->dstate->secpctx,
&peer->remote.finalkey,
&peer->local.locktime,
&peer->local.finalkey,
rhash);
return scriptpubkey_p2wsh(ctx, *wscript);
} else {
/* Our output to them is a simple p2wpkh */
*wscript = NULL;
return scriptpubkey_p2wpkh(ctx, peer->dstate->secpctx,
&peer->remote.finalkey);
}
}
struct bitcoin_tx *create_commit_tx(const tal_t *ctx,
struct peer *peer,
const struct sha256 *rhash,
@ -65,14 +119,10 @@ struct bitcoin_tx *create_commit_tx(const tal_t *ctx,
int **map)
{
struct bitcoin_tx *tx;
const u8 *redeemscript;
size_t num;
uint64_t total;
const struct pubkey *self, *other;
const struct rel_locktime *locktime;
struct htlc_map_iter it;
struct htlc *h;
enum channel_side channel_side;
int committed_flag = HTLC_FLAG(side,HTLC_F_COMMITTED);
/* Now create commitment tx: one input, two outputs (plus htlcs) */
@ -83,35 +133,13 @@ struct bitcoin_tx *create_commit_tx(const tal_t *ctx,
tx->input[0].index = peer->anchor.index;
tx->input[0].amount = tal_dup(tx->input, u64, &peer->anchor.satoshis);
/* For our commit tx, our payment is delayed by amount they said */
if (side == LOCAL) {
channel_side = OURS;
self = &peer->local.finalkey;
other = &peer->remote.finalkey;
locktime = &peer->remote.locktime;
} else {
channel_side = THEIRS;
self = &peer->remote.finalkey;
other = &peer->local.finalkey;
locktime = &peer->local.locktime;
}
/* First output is a P2WSH to a complex redeem script
* (usu. for this side) */
redeemscript = bitcoin_redeem_secret_or_delay(tx, peer->dstate->secpctx,
self,
locktime,
other,
rhash);
tx->output[0].script = scriptpubkey_p2wsh(tx, redeemscript);
tx->output[0].script = commit_output_to_us(tx, peer, rhash, side, NULL);
tx->output[0].script_length = tal_count(tx->output[0].script);
tx->output[0].amount = cstate->side[channel_side].pay_msat / 1000;
tx->output[0].amount = cstate->side[OURS].pay_msat / 1000;
/* Second output is a P2WPKH payment to other side. */
tx->output[1].script = scriptpubkey_p2wpkh(tx, peer->dstate->secpctx,
other);
tx->output[1].script = commit_output_to_them(tx, peer, rhash, side,NULL);
tx->output[1].script_length = tal_count(tx->output[1].script);
tx->output[1].amount = cstate->side[!channel_side].pay_msat / 1000;
tx->output[1].amount = cstate->side[THEIRS].pay_msat / 1000;
/* First two outputs done, now for the HTLCs. */
total = tx->output[0].amount + tx->output[1].amount;

14
daemon/commit_tx.h

@ -14,6 +14,20 @@ u8 *wscript_for_htlc(const tal_t *ctx,
const struct sha256 *rhash,
enum htlc_side side);
/* Returns scriptpubkey: *wscript is NULL if it's a direct p2wpkh. */
u8 *commit_output_to_us(const tal_t *ctx,
const struct peer *peer,
const struct sha256 *rhash,
enum htlc_side side,
u8 **wscript);
/* Returns scriptpubkey: *wscript is NULL if it's a direct p2wpkh. */
u8 *commit_output_to_them(const tal_t *ctx,
const struct peer *peer,
const struct sha256 *rhash,
enum htlc_side side,
u8 **wscript);
/* Create commitment tx to spend the anchor tx output; doesn't fill in
* input scriptsig. */
struct bitcoin_tx *create_commit_tx(const tal_t *ctx,

Loading…
Cancel
Save