mirror of
https://github.com/ElementsProject/lightning.git
synced 2024-11-19 18:11:28 +01:00
ec3344ce6e
And use this to resolve old transactions by comparing outputs with HTLCs. Rather than remembering the output ordering for every one of their previous commitment transactions, we just remember the commitment number for each commitment txid, and when we see it, derive all the HTLC scriptpubkeys and the to-us and to-them scriptpubkeys, and figure out which is which. This avoids us having to save information on disk, except for the txid->commitment-number mapping (and the shachain). Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
80 lines
1.9 KiB
C
80 lines
1.9 KiB
C
#include "commit_tx.h"
|
|
#include "output_to_htlc.h"
|
|
#include "peer.h"
|
|
|
|
/* FIXME: Array makes this O(n^2). Use a hash table. */
|
|
struct wscript_by_wpkh {
|
|
struct htlc *h;
|
|
const u8 *wscript;
|
|
struct sha256 hash;
|
|
};
|
|
|
|
struct htlc_output_map {
|
|
struct wscript_by_wpkh *wpkh;
|
|
};
|
|
|
|
struct htlc_output_map *get_htlc_output_map(const tal_t *ctx,
|
|
const struct peer *peer,
|
|
const struct sha256 *rhash,
|
|
enum htlc_side side,
|
|
unsigned int commit_num)
|
|
{
|
|
struct htlc_map_iter it;
|
|
struct htlc *h;
|
|
size_t i;
|
|
struct htlc_output_map *omap = tal(ctx, struct htlc_output_map);
|
|
|
|
/* FIXME: use commit_num to filter htlcs. */
|
|
if (side == LOCAL)
|
|
assert(commit_num <= peer->local.commit->commit_num);
|
|
else
|
|
assert(commit_num <= peer->remote.commit->commit_num);
|
|
|
|
omap->wpkh = tal_arr(omap, struct wscript_by_wpkh,
|
|
htlc_map_count(&peer->htlcs));
|
|
|
|
for (i = 0, h = htlc_map_first(&peer->htlcs, &it);
|
|
h;
|
|
h = htlc_map_next(&peer->htlcs, &it)) {
|
|
omap->wpkh[i].h = h;
|
|
omap->wpkh[i].wscript = wscript_for_htlc(omap, peer, h, rhash,
|
|
side);
|
|
sha256(&omap->wpkh[i].hash,
|
|
omap->wpkh[i].wscript,
|
|
tal_count(omap->wpkh[i].wscript));
|
|
i++;
|
|
}
|
|
tal_resize(&omap->wpkh, i);
|
|
return omap;
|
|
}
|
|
|
|
static struct wscript_by_wpkh *get_wpkh(struct htlc_output_map *omap,
|
|
const u8 *script, size_t script_len)
|
|
{
|
|
size_t i;
|
|
|
|
if (!is_p2wsh(script, script_len))
|
|
return NULL;
|
|
|
|
for (i = 0; i < tal_count(omap->wpkh); i++) {
|
|
if (!memcmp(script + 2, omap->wpkh[i].hash.u.u8,
|
|
sizeof(omap->wpkh[i].hash)))
|
|
return &omap->wpkh[i];
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
/* Which wscript does this pay to? */
|
|
struct htlc *txout_get_htlc(struct htlc_output_map *omap,
|
|
const u8 *script, size_t script_len,
|
|
const u8 **wscript)
|
|
{
|
|
struct wscript_by_wpkh *wpkh = get_wpkh(omap, script, script_len);
|
|
|
|
if (wpkh) {
|
|
*wscript = wpkh->wscript;
|
|
return wpkh->h;
|
|
}
|
|
return NULL;
|
|
}
|