Browse Source

lightningd: get funding signature from HSM synchronously.

This means there's no GETTING_SIG_FROM_HSM state at all any more.  We
temporarily play games with the hsm fd; those will go away once we're
done.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ppa-0.6.1
Rusty Russell 7 years ago
parent
commit
77620ea06f
  1. 80
      lightningd/peer_control.c
  2. 2
      lightningd/peer_control.h
  3. 3
      lightningd/peer_state.h

80
lightningd/peer_control.c

@ -14,6 +14,7 @@
#include <daemon/log.h>
#include <daemon/timeout.h>
#include <errno.h>
#include <fcntl.h>
#include <inttypes.h>
#include <lightningd/build_utxos.h>
#include <lightningd/channel.h>
@ -26,13 +27,28 @@
#include <lightningd/new_connection.h>
#include <lightningd/opening/gen_opening_wire.h>
#include <lightningd/peer_htlcs.h>
#include <lightningd/status.h>
#include <netinet/in.h>
#include <overflows.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <wally_bip32.h>
#include <wire/gen_onion_wire.h>
#include <wire/gen_peer_wire.h>
#include <wire/wire_sync.h>
static void set_blocking(int fd, bool block)
{
int flags = fcntl(fd, F_GETFL);
if (block)
flags &= ~O_NONBLOCK;
else
flags |= O_NONBLOCK;
fcntl(fd, F_SETFL, flags);
}
static void destroy_peer(struct peer *peer)
{
@ -43,6 +59,22 @@ static void destroy_peer(struct peer *peer)
close(peer->gossip_client_fd);
}
static u8 *hsm_sync_read(const tal_t *ctx, struct lightningd *ld)
{
for (;;) {
u8 *msg = wire_sync_read(ctx, io_conn_fd(ld->hsm->conn));
if (!msg)
fatal("Could not write from HSM: %s", strerror(errno));
if (fromwire_peektype(msg) != STATUS_TRACE)
return msg;
log_debug(ld->hsm->log, "TRACE: %.*s",
(int)(tal_len(msg) - sizeof(be16)),
(char *)msg + sizeof(be16));
tal_free(msg);
}
}
/* Mutual recursion, sets timer. */
static void peer_reconnect(struct peer *peer);
@ -244,19 +276,6 @@ static bool peer_reconnected(struct lightningd *ld,
/* A fresh start. */
return false;
case GETTING_SIG_FROM_HSM:
/* BOLT #2:
*
* On disconnection, the funder MUST remember the channel for
* reconnection if it has broadcast the funding transaction,
* otherwise it SHOULD NOT.
*/
/* Free peer, which will discard HSM response. */
tal_free(peer);
/* Start afresh */
return false;
case GETTING_HSMFD:
/* Simply substitute old fd for new one. */
assert(peer->fd != -1);
@ -804,12 +823,10 @@ static enum watch_result funding_lockin_cb(struct peer *peer,
}
/* FIXME: Reshuffle. */
static void peer_start_channeld(struct peer *peer, enum peer_state oldstate,
const u8 *funding_signed);
static void peer_start_channeld(struct peer *peer, const u8 *funding_signed);
static bool opening_got_hsm_funding_sig(struct subd *hsm, const u8 *resp,
const int *fds,
struct funding_channel *fc)
static void opening_got_hsm_funding_sig(struct funding_channel *fc,
const u8 *resp)
{
secp256k1_ecdsa_signature *sigs;
struct bitcoin_tx *tx = fc->funding_tx;
@ -838,7 +855,7 @@ static bool opening_got_hsm_funding_sig(struct subd *hsm, const u8 *resp,
}
/* Send it out and watch for confirms. */
broadcast_tx(hsm->ld->topology, fc->peer, tx, funding_broadcast_failed);
broadcast_tx(fc->peer->ld->topology, fc->peer, tx, funding_broadcast_failed);
watch_tx(fc->peer, fc->peer->ld->topology, fc->peer, tx,
funding_lockin_cb, NULL);
@ -848,11 +865,10 @@ static bool opening_got_hsm_funding_sig(struct subd *hsm, const u8 *resp,
command_success(fc->cmd, null_response(fc->cmd));
/* Start normal channel daemon. */
peer_start_channeld(fc->peer, GETTING_SIG_FROM_HSM, NULL);
peer_start_channeld(fc->peer, NULL);
wallet_confirm_utxos(fc->peer->ld->wallet, fc->utxomap);
tal_free(fc);
return true;
}
/* Create a node_announcement with the given signature. It may be NULL
@ -1104,8 +1120,7 @@ static bool peer_start_channeld_hsmfd(struct subd *hsm, const u8 *resp,
}
/* opening is done, start lightningd_channel for peer. */
static void peer_start_channeld(struct peer *peer, enum peer_state oldstate,
const u8 *funding_signed)
static void peer_start_channeld(struct peer *peer, const u8 *funding_signed)
{
/* Unowned: back to being owned by main daemon. */
peer->owner = NULL;
@ -1120,7 +1135,7 @@ static void peer_start_channeld(struct peer *peer, enum peer_state oldstate,
else
*peer->balance = peer->push_msat;
peer_set_condition(peer, oldstate, GETTING_HSMFD);
peer_set_condition(peer, OPENINGD, GETTING_HSMFD);
/* Save this for when we get HSM fd. */
peer->funding_signed = funding_signed;
@ -1227,9 +1242,17 @@ static bool opening_funder_finished(struct subd *opening, const u8 *resp,
tal_free(utxos);
fc->peer->owner = NULL;
peer_set_condition(fc->peer, OPENINGD, GETTING_SIG_FROM_HSM);
subd_req(fc, fc->peer->ld->hsm, take(msg), -1, 0,
opening_got_hsm_funding_sig, fc);
/* FIXME: don't use hsm->conn */
set_blocking(io_conn_fd(fc->peer->ld->hsm->conn), true);
if (!wire_sync_write(io_conn_fd(fc->peer->ld->hsm->conn),
take(msg)))
fatal("Could not write to HSM: %s", strerror(errno));
msg = hsm_sync_read(fc, fc->peer->ld);
set_blocking(io_conn_fd(fc->peer->ld->hsm->conn), false);
opening_got_hsm_funding_sig(fc, msg);
/* Tell opening daemon to exit. */
return false;
@ -1282,8 +1305,7 @@ static bool opening_fundee_finished(struct subd *opening,
funding_lockin_cb, NULL);
/* On to normal operation! */
peer->owner = NULL;
peer_start_channeld(peer, OPENINGD, funding_signed);
peer_start_channeld(peer, funding_signed);
/* Tell opening daemon to exit. */
return false;

2
lightningd/peer_control.h

@ -130,7 +130,7 @@ static inline bool peer_on_chain(const struct peer *peer)
*/
static inline bool peer_persists(const struct peer *peer)
{
return peer->state > GETTING_SIG_FROM_HSM;
return peer->state >= CHANNELD_AWAITING_LOCKIN;
}
struct peer *peer_by_unique_id(struct lightningd *ld, u64 unique_id);

3
lightningd/peer_state.h

@ -11,9 +11,6 @@ enum peer_state {
/* Negotiating channel opening: in opening daemon */
OPENINGD,
/* Getting signature from HSM for funding tx (funder only). */
GETTING_SIG_FROM_HSM,
/* Getting HSM fd for channeld. */
GETTING_HSMFD,

Loading…
Cancel
Save