Browse Source

lightningd/hsm: use funding_tx helper to sign funding transaction.

DRY.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ppa-0.6.1
Rusty Russell 8 years ago
parent
commit
2874e46c69
  1. 2
      lightningd/hsm/Makefile
  2. 36
      lightningd/hsm/hsm.c

2
lightningd/hsm/Makefile

@ -41,7 +41,7 @@ $(LIGHTNINGD_HSM_OBJS): $(CORE_TX_HEADERS)
lightningd/hsm-all: lightningd/lightningd_hsm $(LIGHTNINGD_HSM_CLIENT_OBJS)
lightningd/lightningd_hsm: $(LIGHTNINGD_HSM_OBJS) $(CORE_OBJS) $(CORE_TX_OBJS) $(BITCOIN_OBJS) $(WIRE_OBJS) $(CCAN_OBJS) $(LIBBASE58_OBJS) lightningd/utxo.o libsecp256k1.a libsodium.a libwallycore.a
lightningd/lightningd_hsm: $(LIGHTNINGD_HSM_OBJS) $(LIGHTNINGD_OLD_LIB_OBJS) $(LIGHTNINGD_LIB_OBJS) $(CORE_OBJS) $(CORE_TX_OBJS) $(BITCOIN_OBJS) $(WIRE_OBJS) $(CCAN_OBJS) $(LIBBASE58_OBJS) lightningd/utxo.o libsecp256k1.a libsodium.a libwallycore.a
$(CC) $(CFLAGS) -o $@ $^ $(LDLIBS)
lightningd/hsm/gen_hsm_client_wire.h: $(WIRE_GEN) lightningd/hsm/hsm_client_wire_csv

36
lightningd/hsm/hsm.c

@ -15,6 +15,7 @@
#include <errno.h>
#include <fcntl.h>
#include <inttypes.h>
#include <lightningd/funding_tx.h>
#include <lightningd/hsm/client.h>
#include <lightningd/hsm/gen_hsm_client_wire.h>
#include <lightningd/hsm/gen_hsm_control_wire.h>
@ -360,11 +361,13 @@ static u8 *sign_funding_tx(const tal_t *ctx, const u8 *data)
u32 change_keyindex;
struct pubkey local_pubkey, remote_pubkey;
struct utxo *inputs;
const struct utxo **utxomap;
struct bitcoin_tx *tx;
u8 *wscript, *msg_out;
secp256k1_ecdsa_signature *sig;
const void **inmap;
u32 outnum;
size_t i;
struct pubkey changekey;
/* FIXME: Check fee is "reasonable" */
if (!fromwire_hsmctl_sign_funding(tmpctx, data, NULL,
@ -373,35 +376,24 @@ static u8 *sign_funding_tx(const tal_t *ctx, const u8 *data)
&remote_pubkey, &inputs))
status_failed(WIRE_HSMSTATUS_BAD_REQUEST, "Bad SIGN_FUNDING");
tx = bitcoin_tx(tmpctx, tal_count(inputs), 1 + !!change_out);
inmap = tal_arr(tmpctx, const void *, tal_count(inputs));
for (i = 0; i < tal_count(inputs); i++) {
tx->input[i].txid = inputs[i].txid;
tx->input[i].index = inputs[i].outnum;
tx->input[i].amount = tal_dup(tx->input, u64, &inputs[i].amount);
inmap[i] = int2ptr(i);
}
tx->output[0].amount = satoshi_out;
wscript = bitcoin_redeem_2of2(tx, &local_pubkey, &remote_pubkey);
tx->output[0].script = scriptpubkey_p2wsh(tx, wscript);
if (change_out) {
struct pubkey changekey;
bitcoin_pubkey(&changekey, change_keyindex);
/* FIXME: unmarshall gives array, not array of pointers. */
utxomap = tal_arr(tmpctx, const struct utxo *, tal_count(inputs));
for (i = 0; i < tal_count(inputs); i++)
utxomap[i] = &inputs[i];
tx->output[1].amount = change_out;
tx->output[1].script = scriptpubkey_p2wpkh(tx, &changekey);
}
if (change_out)
bitcoin_pubkey(&changekey, change_keyindex);
/* Now permute. */
permute_outputs(tx->output, tal_count(tx->output), NULL);
permute_inputs(tx->input, tal_count(tx->input), inmap);
tx = funding_tx(tmpctx, &outnum, utxomap,
satoshi_out, &local_pubkey, &remote_pubkey,
change_out, &changekey);
/* Now generate signatures. */
sig = tal_arr(tmpctx, secp256k1_ecdsa_signature, tal_count(inputs));
for (i = 0; i < tal_count(inputs); i++) {
struct pubkey inkey;
struct privkey inprivkey;
const struct utxo *in = &inputs[ptr2int(inmap[i])];
const struct utxo *in = utxomap[i];
u8 *subscript;
bitcoin_keypair(&inprivkey, &inkey, in->keyindex);

Loading…
Cancel
Save