core-lightning/lightningd/htlc_end.h
Rusty Russell 4a161b710d channeld: pass htlcs to master daemon in batches.
When adding their HTLCs, it needs all the information.  When failing,
it needs the id as key and the failure reason.  When fulfilling, it
needs the id and payment preimage.

It also needs to know when we have received an revoke_and_ack or a
commitment_signed, to place in the database.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
2017-06-23 09:29:42 +09:30

74 lines
2 KiB
C

#ifndef LIGHTNING_LIGHTNINGD_HTLC_END_H
#define LIGHTNING_LIGHTNINGD_HTLC_END_H
#include "config.h"
#include <ccan/htable/htable_type.h>
#include <ccan/short_types/short_types.h>
#include <daemon/htlc_state.h>
#include <lightningd/sphinx.h>
/* A HTLC has a source and destination: if other is NULL, it's this node.
*
* The main daemon simply shuffles them back and forth.
*/
enum htlc_end_type { HTLC_SRC, HTLC_DST };
struct htlc_end {
enum htlc_end_type which_end;
struct peer *peer;
u64 htlc_id;
u64 msatoshis;
struct htlc_end *other_end;
/* If this is driven by a command. */
struct pay_command *pay_command;
/* FIXME: We really only need this in the database. */
enum htlc_state hstate;
/* Temporary information, while we resolve the next hop */
u8 *next_onion;
struct short_channel_id next_channel;
u64 amt_to_forward;
u32 outgoing_cltv_value;
u32 cltv_expiry;
struct sha256 payment_hash;
/* If they failed HTLC, here's the message. */
const u8 *fail_msg;
/* If they succeeded, here's the preimage. */
struct sha256 *preimage;
/* If we are forwarding, remember the shared secret for an
* eventual reply */
struct secret *shared_secret;
/* If we are the origin, remember all shared secrets, so we
* can unwrap an eventual reply */
struct secret *path_secrets;
};
static inline const struct htlc_end *keyof_htlc_end(const struct htlc_end *e)
{
return e;
}
size_t hash_htlc_end(const struct htlc_end *e);
static inline bool htlc_end_eq(const struct htlc_end *a,
const struct htlc_end *b)
{
return a->peer == b->peer
&& a->htlc_id == b->htlc_id
&& a->which_end == b->which_end;
}
HTABLE_DEFINE_TYPE(struct htlc_end, keyof_htlc_end, hash_htlc_end, htlc_end_eq,
htlc_end_map);
struct htlc_end *find_htlc_end(const struct htlc_end_map *map,
const struct peer *peer,
u64 htlc_id,
enum htlc_end_type which_end);
void connect_htlc_end(struct htlc_end_map *map, struct htlc_end *hend);
#endif /* LIGHTNING_LIGHTNINGD_HTLC_END_H */