From bab5cabd90b0d0091bcc4e6da23650a041067918 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Tue, 11 Feb 2025 19:56:25 +0100 Subject: [PATCH 1/3] lnrpc+rpcserver: add custom channel data for closed channels This commit adds the custom channel data for closed channels which represents the initial funding state as well as the final balances at closing time. --- lnrpc/lightning.pb.go | 17 +++++++++++++++-- lnrpc/lightning.proto | 4 ++++ lnrpc/lightning.swagger.json | 5 +++++ rpcserver.go | 25 +++++++++++++++++++++---- 4 files changed, 45 insertions(+), 6 deletions(-) diff --git a/lnrpc/lightning.pb.go b/lnrpc/lightning.pb.go index c2ff05f3e..e270cc34f 100644 --- a/lnrpc/lightning.pb.go +++ b/lnrpc/lightning.pb.go @@ -5414,6 +5414,9 @@ type ChannelCloseSummary struct { AliasScids []uint64 `protobuf:"varint,14,rep,packed,name=alias_scids,json=aliasScids,proto3" json:"alias_scids,omitempty"` // The confirmed SCID for a zero-conf channel. ZeroConfConfirmedScid uint64 `protobuf:"varint,15,opt,name=zero_conf_confirmed_scid,json=zeroConfConfirmedScid,proto3" json:"zero_conf_confirmed_scid,omitempty"` + // The TLV encoded custom channel data records for this output, which might + // be set for custom channels. + CustomChannelData []byte `protobuf:"bytes,16,opt,name=custom_channel_data,json=customChannelData,proto3" json:"custom_channel_data,omitempty"` } func (x *ChannelCloseSummary) Reset() { @@ -5553,6 +5556,13 @@ func (x *ChannelCloseSummary) GetZeroConfConfirmedScid() uint64 { return 0 } +func (x *ChannelCloseSummary) GetCustomChannelData() []byte { + if x != nil { + return x.CustomChannelData + } + return nil +} + type Resolution struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -19127,7 +19137,7 @@ var file_lightning_proto_rawDesc = []byte{ 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x0a, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x5f, 0x6d, 0x61, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6c, 0x6e, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x4d, 0x61, 0x70, - 0x52, 0x09, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x4d, 0x61, 0x70, 0x73, 0x22, 0xb6, 0x06, 0x0a, 0x13, + 0x52, 0x09, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x4d, 0x61, 0x70, 0x73, 0x22, 0xe6, 0x06, 0x0a, 0x13, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x6e, @@ -19170,7 +19180,10 @@ var file_lightning_proto_rawDesc = []byte{ 0x72, 0x6f, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x69, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x15, 0x7a, 0x65, 0x72, 0x6f, 0x43, 0x6f, 0x6e, 0x66, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, - 0x6d, 0x65, 0x64, 0x53, 0x63, 0x69, 0x64, 0x22, 0x8a, 0x01, 0x0a, 0x0b, 0x43, 0x6c, 0x6f, 0x73, + 0x6d, 0x65, 0x64, 0x53, 0x63, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x22, 0x8a, 0x01, 0x0a, 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x4f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x43, 0x4c, diff --git a/lnrpc/lightning.proto b/lnrpc/lightning.proto index ca40e4b4c..fbf02129a 100644 --- a/lnrpc/lightning.proto +++ b/lnrpc/lightning.proto @@ -1758,6 +1758,10 @@ message ChannelCloseSummary { // The confirmed SCID for a zero-conf channel. uint64 zero_conf_confirmed_scid = 15 [jstype = JS_STRING]; + + // The TLV encoded custom channel data records for this output, which might + // be set for custom channels. + bytes custom_channel_data = 16; } enum ResolutionType { diff --git a/lnrpc/lightning.swagger.json b/lnrpc/lightning.swagger.json index 69478fc94..5298b9f7d 100644 --- a/lnrpc/lightning.swagger.json +++ b/lnrpc/lightning.swagger.json @@ -4182,6 +4182,11 @@ "type": "string", "format": "uint64", "description": "The confirmed SCID for a zero-conf channel." + }, + "custom_channel_data": { + "type": "string", + "format": "byte", + "description": "The TLV encoded custom channel data records for this output, which might\nbe set for custom channels." } } }, diff --git a/rpcserver.go b/rpcserver.go index ad0c3392a..41f84ff8a 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -4517,6 +4517,16 @@ func (r *rpcServer) ClosedChannels(ctx context.Context, resp.Channels = append(resp.Channels, channel) } + err = fn.MapOptionZ( + r.server.implCfg.AuxDataParser, + func(parser AuxDataParser) error { + return parser.InlineParseCustomData(resp) + }, + ) + if err != nil { + return nil, fmt.Errorf("error parsing custom data: %w", err) + } + return resp, nil } @@ -4990,7 +5000,8 @@ func createRPCOpenChannel(r *rpcServer, dbChannel *channeldb.OpenChannel, // createRPCClosedChannel creates an *lnrpc.ClosedChannelSummary from a // *channeldb.ChannelCloseSummary. func (r *rpcServer) createRPCClosedChannel( - dbChannel *channeldb.ChannelCloseSummary) (*lnrpc.ChannelCloseSummary, error) { + dbChannel *channeldb.ChannelCloseSummary) (*lnrpc.ChannelCloseSummary, + error) { nodePub := dbChannel.RemotePub nodeID := hex.EncodeToString(nodePub.SerializeCompressed()) @@ -5004,9 +5015,7 @@ func (r *rpcServer) createRPCClosedChannel( // Lookup local and remote cooperative initiators. If these values // are not known they will just return unknown. - openInit, closeInitiator, err = r.getInitiators( - &dbChannel.ChanPoint, - ) + openInit, closeInitiator, err = r.getInitiators(&dbChannel.ChanPoint) if err != nil { return nil, err } @@ -5073,6 +5082,14 @@ func (r *rpcServer) createRPCClosedChannel( channel.ZeroConfConfirmedScid = confirmedScid } + // Finally we'll attempt to encode the custom channel data if + // any exists. + channel.CustomChannelData, err = encodeCustomChanData(histChan) + if err != nil { + return nil, fmt.Errorf("unable to encode open chan "+ + "data: %w", err) + } + // Non-nil error not due to older versions of lnd. default: return nil, err From 82b7891e2dcfb7108af0f5e56d8f33c0fd1bb5ec Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 13 Mar 2025 14:26:06 -0500 Subject: [PATCH 2/3] rpcserver: add custom channel data to pending channels The pending force close and pending waiting close channels didn't have their custom channel data populated yet. --- rpcserver.go | 48 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/rpcserver.go b/rpcserver.go index 41f84ff8a..07b6bc60c 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -4028,6 +4028,13 @@ func (r *rpcServer) fetchPendingForceCloseChannels() (pendingForceClose, historical.LocalCommitment.RemoteBalance.ToSatoshis(), ) + customChanBytes, err := encodeCustomChanData(historical) + if err != nil { + return nil, 0, fmt.Errorf("unable to encode "+ + "open chan data: %w", err) + } + channel.CustomChannelData = customChanBytes + channel.Private = isPrivate(historical) channel.Memo = string(historical.Memo) @@ -4218,20 +4225,41 @@ func (r *rpcServer) fetchWaitingCloseChannels( return nil, 0, err } + customChanBytes, err := encodeCustomChanData(waitingClose) + if err != nil { + return nil, 0, fmt.Errorf("unable to encode "+ + "open chan data: %w", err) + } + + localCommit := waitingClose.LocalCommitment + chanStatus := waitingClose.ChanStatus() channel := &lnrpc.PendingChannelsResponse_PendingChannel{ - RemoteNodePub: hex.EncodeToString(pub), - ChannelPoint: chanPoint.String(), - Capacity: int64(waitingClose.Capacity), - LocalBalance: int64(waitingClose.LocalCommitment.LocalBalance.ToSatoshis()), - RemoteBalance: int64(waitingClose.LocalCommitment.RemoteBalance.ToSatoshis()), - LocalChanReserveSat: int64(waitingClose.LocalChanCfg.ChanReserve), - RemoteChanReserveSat: int64(waitingClose.RemoteChanCfg.ChanReserve), - Initiator: rpcInitiator(waitingClose.IsInitiator), - CommitmentType: rpcCommitmentType(waitingClose.ChanType), + RemoteNodePub: hex.EncodeToString(pub), + ChannelPoint: chanPoint.String(), + Capacity: int64(waitingClose.Capacity), + LocalBalance: int64( + localCommit.LocalBalance.ToSatoshis(), + ), + RemoteBalance: int64( + localCommit.RemoteBalance.ToSatoshis(), + ), + LocalChanReserveSat: int64( + waitingClose.LocalChanCfg.ChanReserve, + ), + RemoteChanReserveSat: int64( + waitingClose.RemoteChanCfg.ChanReserve, + ), + Initiator: rpcInitiator( + waitingClose.IsInitiator, + ), + CommitmentType: rpcCommitmentType( + waitingClose.ChanType, + ), NumForwardingPackages: int64(len(fwdPkgs)), - ChanStatusFlags: waitingClose.ChanStatus().String(), + ChanStatusFlags: chanStatus.String(), Private: isPrivate(waitingClose), Memo: string(waitingClose.Memo), + CustomChannelData: customChanBytes, } var closingTxid, closingTxHex string From 177bbd2721766d0d9eced649329759ebc404b390 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Tue, 11 Feb 2025 19:59:01 +0100 Subject: [PATCH 3/3] docs: add release notes --- docs/release-notes/release-notes-0.19.0.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/release-notes/release-notes-0.19.0.md b/docs/release-notes/release-notes-0.19.0.md index 2f0f994aa..6493b5675 100644 --- a/docs/release-notes/release-notes-0.19.0.md +++ b/docs/release-notes/release-notes-0.19.0.md @@ -189,6 +189,9 @@ close transaction. RPC method now applies a default timeout of 60 seconds when the `timeout_seconds` field is not set or is explicitly set to 0. +* [`lnrpc.ClosedChannels` now also includes the `custom_channel_data` used by + custom channels](https://github.com/lightningnetwork/lnd/pull/9504). + ## lncli Additions * [A pre-generated macaroon root key can now be specified in `lncli create` and