df: add notification for receiving peer's funding tx sigs

This will allow us to build complex, multi-peer transactions, with
easeTM!

Changelog-Added: EXPERIMENTAL, Plugins: `openchannel_peer_sigs` notification, which contains a peer's signatures for the funding transaction (`opt_dual_fund`)
This commit is contained in:
niftynei 2020-10-08 17:21:20 -05:00 committed by Rusty Russell
parent f9aab50ee8
commit daa55d1221
4 changed files with 55 additions and 0 deletions

View File

@ -653,6 +653,22 @@ at the time lightningd broadcasts the notification.
`coin_type` is the BIP173 name for the coin which moved.
### `openchannel_peer_sigs`
When opening a channel with a peer using the collaborative transaction protocol
(`opt_dual_fund`), this notification is fired when the peer sends us their funding
transaction signatures, `tx_signatures`. We update the in-progress PSBT and return it
here, with the peer's signatures attached.
```json
{
"openchannel_peer_sigs": {
"channel_id": "<hex of a channel id (note, v2 format)>",
"signed_psbt": "<Base64 serialized PSBT of funding transaction,
with peer's sigs>"
}
}
```
## Hooks

View File

@ -25,6 +25,7 @@
#include <lightningd/jsonrpc.h>
#include <lightningd/lightningd.h>
#include <lightningd/log.h>
#include <lightningd/notification.h>
#include <lightningd/onion_message.h>
#include <lightningd/peer_control.h>
#include <lightningd/subd.h>
@ -449,6 +450,10 @@ static void peer_tx_sigs_msg(struct channel *channel, const u8 *msg)
}
wallet_channel_save(ld->wallet, channel);
/* Send notification with peer's signed PSBT */
notify_openchannel_peer_sigs(ld, &channel->cid,
channel->psbt);
}
void forget_channel(struct channel *channel, const char *why)

View File

@ -467,3 +467,31 @@ void notify_coin_mvt(struct lightningd *ld,
jsonrpc_notification_end(n);
plugins_notify(ld->plugins, take(n));
}
static void openchannel_peer_sigs_serialize(struct json_stream *stream,
const struct channel_id *cid,
const struct wally_psbt *psbt)
{
json_object_start(stream, "openchannel_peer_sigs");
json_add_channel_id(stream, "channel_id", cid);
json_add_psbt(stream, "signed_psbt", psbt);
json_object_end(stream);
}
REGISTER_NOTIFICATION(openchannel_peer_sigs,
openchannel_peer_sigs_serialize);
void notify_openchannel_peer_sigs(struct lightningd *ld,
const struct channel_id *cid,
const struct wally_psbt *psbt)
{
void (*serialize)(struct json_stream *,
const struct channel_id *cid,
const struct wally_psbt *) = openchannel_peer_sigs_notification_gen.serialize;
struct jsonrpc_notification *n =
jsonrpc_notification_start(NULL, "openchannel_peer_sigs");
serialize(n->stream, cid, psbt);
jsonrpc_notification_end(n);
plugins_notify(ld->plugins, take(n));
}

View File

@ -19,9 +19,11 @@
#include <lightningd/pay.h>
#include <lightningd/plugin.h>
#include <wallet/wallet.h>
#include <wally_psbt.h>
#include <wire/onion_wire.h>
struct onionreply;
struct wally_psbt;
bool notifications_have_topic(const char *topic);
@ -86,4 +88,8 @@ void notify_sendpay_failure(struct lightningd *ld,
void notify_coin_mvt(struct lightningd *ld,
const struct coin_mvt *mvt);
void notify_openchannel_peer_sigs(struct lightningd *ld,
const struct channel_id *cid,
const struct wally_psbt *psbt);
#endif /* LIGHTNING_LIGHTNINGD_NOTIFICATION_H */