rpc+cli: add general ListAliases function to dump all aliases

This commit is contained in:
eugene 2022-07-14 13:51:48 -04:00
parent 48f270fe20
commit aa576adecc
No known key found for this signature in database
GPG Key ID: 118759E83439A9B1
11 changed files with 1574 additions and 1084 deletions

View File

@ -399,6 +399,23 @@ func (m *Manager) RequestAlias() (lnwire.ShortChannelID, error) {
return nextAlias, nil return nextAlias, nil
} }
// ListAliases returns a carbon copy of baseToSet. This is used by the rpc
// layer.
func (m *Manager) ListAliases() map[lnwire.ShortChannelID][]lnwire.ShortChannelID {
m.RLock()
defer m.RUnlock()
baseCopy := make(map[lnwire.ShortChannelID][]lnwire.ShortChannelID)
for k, v := range m.baseToSet {
setCopy := make([]lnwire.ShortChannelID, len(v))
copy(setCopy, v)
baseCopy[k] = setCopy
}
return baseCopy
}
// getNextScid is a utility function that returns the next SCID for a given // getNextScid is a utility function that returns the next SCID for a given
// alias SCID. The BlockHeight ranges from [16000000, 16250000], the TxIndex // alias SCID. The BlockHeight ranges from [16000000, 16250000], the TxIndex
// ranges from [1, 16777215], and the TxPosition ranges from [1, 65535]. // ranges from [1, 16777215], and the TxPosition ranges from [1, 65535].

View File

@ -1419,6 +1419,31 @@ var listChannelsCommand = cli.Command{
Action: actionDecorator(listChannels), Action: actionDecorator(listChannels),
} }
var listAliasesCommand = cli.Command{
Name: "listaliases",
Category: "Channels",
Usage: "List all aliases.",
Flags: []cli.Flag{},
Action: actionDecorator(listaliases),
}
func listaliases(ctx *cli.Context) error {
ctxc := getContext()
client, cleanUp := getClient(ctx)
defer cleanUp()
req := &lnrpc.ListAliasesRequest{}
resp, err := client.ListAliases(ctxc, req)
if err != nil {
return err
}
printRespJSON(resp)
return nil
}
func listChannels(ctx *cli.Context) error { func listChannels(ctx *cli.Context) error {
ctxc := getContext() ctxc := getContext()
client, cleanUp := getClient(ctx) client, cleanUp := getClient(ctx)

View File

@ -414,6 +414,7 @@ func main() {
sendCustomCommand, sendCustomCommand,
subscribeCustomCommand, subscribeCustomCommand,
fishCompletionCommand, fishCompletionCommand,
listAliasesCommand,
} }
// Add any extra commands determined by build flags. // Add any extra commands determined by build flags.

File diff suppressed because it is too large Load Diff

View File

@ -2354,6 +2354,24 @@ func request_Lightning_SubscribeCustomMessages_0(ctx context.Context, marshaler
} }
func request_Lightning_ListAliases_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq ListAliasesRequest
var metadata runtime.ServerMetadata
msg, err := client.ListAliases(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_Lightning_ListAliases_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq ListAliasesRequest
var metadata runtime.ServerMetadata
msg, err := server.ListAliases(ctx, &protoReq)
return msg, metadata, err
}
// RegisterLightningHandlerServer registers the http handlers for service Lightning to "mux". // RegisterLightningHandlerServer registers the http handlers for service Lightning to "mux".
// UnaryRPC :call LightningServer directly. // UnaryRPC :call LightningServer directly.
// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
@ -3640,6 +3658,29 @@ func RegisterLightningHandlerServer(ctx context.Context, mux *runtime.ServeMux,
return return
}) })
mux.Handle("GET", pattern_Lightning_ListAliases_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
var stream runtime.ServerTransportStream
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/lnrpc.Lightning/ListAliases", runtime.WithHTTPPathPattern("/v1/aliases/list"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_Lightning_ListAliases_0(rctx, inboundMarshaler, server, req, pathParams)
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_Lightning_ListAliases_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil return nil
} }
@ -4961,6 +5002,26 @@ func RegisterLightningHandlerClient(ctx context.Context, mux *runtime.ServeMux,
}) })
mux.Handle("GET", pattern_Lightning_ListAliases_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateContext(ctx, mux, req, "/lnrpc.Lightning/ListAliases", runtime.WithHTTPPathPattern("/v1/aliases/list"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_Lightning_ListAliases_0(rctx, inboundMarshaler, client, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_Lightning_ListAliases_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil return nil
} }
@ -5092,6 +5153,8 @@ var (
pattern_Lightning_SendCustomMessage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "custommessage"}, "")) pattern_Lightning_SendCustomMessage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "custommessage"}, ""))
pattern_Lightning_SubscribeCustomMessages_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "custommessage", "subscribe"}, "")) pattern_Lightning_SubscribeCustomMessages_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "custommessage", "subscribe"}, ""))
pattern_Lightning_ListAliases_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "aliases", "list"}, ""))
) )
var ( var (
@ -5222,4 +5285,6 @@ var (
forward_Lightning_SendCustomMessage_0 = runtime.ForwardResponseMessage forward_Lightning_SendCustomMessage_0 = runtime.ForwardResponseMessage
forward_Lightning_SubscribeCustomMessages_0 = runtime.ForwardResponseStream forward_Lightning_SubscribeCustomMessages_0 = runtime.ForwardResponseStream
forward_Lightning_ListAliases_0 = runtime.ForwardResponseMessage
) )

View File

@ -1700,4 +1700,29 @@ func RegisterLightningJSONCallbacks(registry map[string]func(ctx context.Context
} }
}() }()
} }
registry["lnrpc.Lightning.ListAliases"] = func(ctx context.Context,
conn *grpc.ClientConn, reqJSON string, callback func(string, error)) {
req := &ListAliasesRequest{}
err := marshaler.Unmarshal([]byte(reqJSON), req)
if err != nil {
callback("", err)
return
}
client := NewLightningClient(conn)
resp, err := client.ListAliases(ctx, req)
if err != nil {
callback("", err)
return
}
respBytes, err := marshaler.Marshal(resp)
if err != nil {
callback("", err)
return
}
callback(string(respBytes), nil)
}
} }

View File

@ -570,6 +570,13 @@ service Lightning {
*/ */
rpc SubscribeCustomMessages (SubscribeCustomMessagesRequest) rpc SubscribeCustomMessages (SubscribeCustomMessagesRequest)
returns (stream CustomMessage); returns (stream CustomMessage);
/* lncli: `listaliases`
ListAliases returns the set of all aliases that have ever existed with
their confirmed SCID (if it exists) and/or the base SCID (in the case of
zero conf).
*/
rpc ListAliases (ListAliasesRequest) returns (ListAliasesResponse);
} }
message SubscribeCustomMessagesRequest { message SubscribeCustomMessagesRequest {
@ -1513,6 +1520,22 @@ message ListChannelsResponse {
repeated Channel channels = 11; repeated Channel channels = 11;
} }
message AliasMap {
/*
For non-zero-conf channels, this is the confirmed SCID. Otherwise, this is
the first assigned "base" alias.
*/
uint64 base_scid = 1;
// The set of all aliases stored for the base SCID.
repeated uint64 aliases = 2;
}
message ListAliasesRequest {
}
message ListAliasesResponse {
repeated AliasMap alias_maps = 1;
}
enum Initiator { enum Initiator {
INITIATOR_UNKNOWN = 0; INITIATOR_UNKNOWN = 0;
INITIATOR_LOCAL = 1; INITIATOR_LOCAL = 1;

View File

@ -16,6 +16,29 @@
"application/json" "application/json"
], ],
"paths": { "paths": {
"/v1/aliases/list": {
"get": {
"summary": "lncli: `listaliases`\nListAliases returns the set of all aliases that have ever existed with\ntheir confirmed SCID (if it exists) and/or the base SCID (in the case of\nzero conf).",
"operationId": "Lightning_ListAliases",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/lnrpcListAliasesResponse"
}
},
"default": {
"description": "An unexpected error response.",
"schema": {
"$ref": "#/definitions/rpcStatus"
}
}
},
"tags": [
"Lightning"
]
}
},
"/v1/balance/blockchain": { "/v1/balance/blockchain": {
"get": { "get": {
"summary": "lncli: `walletbalance`\nWalletBalance returns total unspent outputs(confirmed and unconfirmed), all\nconfirmed unspent outputs and all unconfirmed unspent outputs under control\nof the wallet.", "summary": "lncli: `walletbalance`\nWalletBalance returns total unspent outputs(confirmed and unconfirmed), all\nconfirmed unspent outputs and all unconfirmed unspent outputs under control\nof the wallet.",
@ -2951,6 +2974,24 @@
"description": "- `p2wkh`: Pay to witness key hash (`WITNESS_PUBKEY_HASH` = 0)\n- `np2wkh`: Pay to nested witness key hash (`NESTED_PUBKEY_HASH` = 1)\n- `p2tr`: Pay to taproot pubkey (`TAPROOT_PUBKEY` = 4)", "description": "- `p2wkh`: Pay to witness key hash (`WITNESS_PUBKEY_HASH` = 0)\n- `np2wkh`: Pay to nested witness key hash (`NESTED_PUBKEY_HASH` = 1)\n- `p2tr`: Pay to taproot pubkey (`TAPROOT_PUBKEY` = 4)",
"title": "`AddressType` has to be one of:" "title": "`AddressType` has to be one of:"
}, },
"lnrpcAliasMap": {
"type": "object",
"properties": {
"base_scid": {
"type": "string",
"format": "uint64",
"description": "For non-zero-conf channels, this is the confirmed SCID. Otherwise, this is\nthe first assigned \"base\" alias."
},
"aliases": {
"type": "array",
"items": {
"type": "string",
"format": "uint64"
},
"description": "The set of all aliases stored for the base SCID."
}
}
},
"lnrpcAmount": { "lnrpcAmount": {
"type": "object", "type": "object",
"properties": { "properties": {
@ -5017,6 +5058,17 @@
}, },
"description": "An individual vertex/node within the channel graph. A node is\nconnected to other nodes by one or more channel edges emanating from it. As the\ngraph is directed, a node will also have an incoming edge attached to it for\neach outgoing edge." "description": "An individual vertex/node within the channel graph. A node is\nconnected to other nodes by one or more channel edges emanating from it. As the\ngraph is directed, a node will also have an incoming edge attached to it for\neach outgoing edge."
}, },
"lnrpcListAliasesResponse": {
"type": "object",
"properties": {
"alias_maps": {
"type": "array",
"items": {
"$ref": "#/definitions/lnrpcAliasMap"
}
}
}
},
"lnrpcListChannelsResponse": { "lnrpcListChannelsResponse": {
"type": "object", "type": "object",
"properties": { "properties": {

View File

@ -160,3 +160,5 @@ http:
body: "*" body: "*"
- selector: lnrpc.Lightning.SubscribeCustomMessages - selector: lnrpc.Lightning.SubscribeCustomMessages
get: "/v1/custommessage/subscribe" get: "/v1/custommessage/subscribe"
- selector: lnrpc.Lightning.ListAliases
get: "/v1/aliases/list"

View File

@ -410,6 +410,11 @@ type LightningClient interface {
//SubscribeCustomMessages subscribes to a stream of incoming custom peer //SubscribeCustomMessages subscribes to a stream of incoming custom peer
//messages. //messages.
SubscribeCustomMessages(ctx context.Context, in *SubscribeCustomMessagesRequest, opts ...grpc.CallOption) (Lightning_SubscribeCustomMessagesClient, error) SubscribeCustomMessages(ctx context.Context, in *SubscribeCustomMessagesRequest, opts ...grpc.CallOption) (Lightning_SubscribeCustomMessagesClient, error)
// lncli: `listaliases`
//ListAliases returns the set of all aliases that have ever existed with
//their confirmed SCID (if it exists) and/or the base SCID (in the case of
//zero conf).
ListAliases(ctx context.Context, in *ListAliasesRequest, opts ...grpc.CallOption) (*ListAliasesResponse, error)
} }
type lightningClient struct { type lightningClient struct {
@ -1302,6 +1307,15 @@ func (x *lightningSubscribeCustomMessagesClient) Recv() (*CustomMessage, error)
return m, nil return m, nil
} }
func (c *lightningClient) ListAliases(ctx context.Context, in *ListAliasesRequest, opts ...grpc.CallOption) (*ListAliasesResponse, error) {
out := new(ListAliasesResponse)
err := c.cc.Invoke(ctx, "/lnrpc.Lightning/ListAliases", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// LightningServer is the server API for Lightning service. // LightningServer is the server API for Lightning service.
// All implementations must embed UnimplementedLightningServer // All implementations must embed UnimplementedLightningServer
// for forward compatibility // for forward compatibility
@ -1698,6 +1712,11 @@ type LightningServer interface {
//SubscribeCustomMessages subscribes to a stream of incoming custom peer //SubscribeCustomMessages subscribes to a stream of incoming custom peer
//messages. //messages.
SubscribeCustomMessages(*SubscribeCustomMessagesRequest, Lightning_SubscribeCustomMessagesServer) error SubscribeCustomMessages(*SubscribeCustomMessagesRequest, Lightning_SubscribeCustomMessagesServer) error
// lncli: `listaliases`
//ListAliases returns the set of all aliases that have ever existed with
//their confirmed SCID (if it exists) and/or the base SCID (in the case of
//zero conf).
ListAliases(context.Context, *ListAliasesRequest) (*ListAliasesResponse, error)
mustEmbedUnimplementedLightningServer() mustEmbedUnimplementedLightningServer()
} }
@ -1900,6 +1919,9 @@ func (UnimplementedLightningServer) SendCustomMessage(context.Context, *SendCust
func (UnimplementedLightningServer) SubscribeCustomMessages(*SubscribeCustomMessagesRequest, Lightning_SubscribeCustomMessagesServer) error { func (UnimplementedLightningServer) SubscribeCustomMessages(*SubscribeCustomMessagesRequest, Lightning_SubscribeCustomMessagesServer) error {
return status.Errorf(codes.Unimplemented, "method SubscribeCustomMessages not implemented") return status.Errorf(codes.Unimplemented, "method SubscribeCustomMessages not implemented")
} }
func (UnimplementedLightningServer) ListAliases(context.Context, *ListAliasesRequest) (*ListAliasesResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method ListAliases not implemented")
}
func (UnimplementedLightningServer) mustEmbedUnimplementedLightningServer() {} func (UnimplementedLightningServer) mustEmbedUnimplementedLightningServer() {}
// UnsafeLightningServer may be embedded to opt out of forward compatibility for this service. // UnsafeLightningServer may be embedded to opt out of forward compatibility for this service.
@ -3142,6 +3164,24 @@ func (x *lightningSubscribeCustomMessagesServer) Send(m *CustomMessage) error {
return x.ServerStream.SendMsg(m) return x.ServerStream.SendMsg(m)
} }
func _Lightning_ListAliases_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ListAliasesRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(LightningServer).ListAliases(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/lnrpc.Lightning/ListAliases",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(LightningServer).ListAliases(ctx, req.(*ListAliasesRequest))
}
return interceptor(ctx, in, info, handler)
}
// Lightning_ServiceDesc is the grpc.ServiceDesc for Lightning service. // Lightning_ServiceDesc is the grpc.ServiceDesc for Lightning service.
// It's only intended for direct use with grpc.RegisterService, // It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy) // and not to be introspected or modified (even as a copy)
@ -3357,6 +3397,10 @@ var Lightning_ServiceDesc = grpc.ServiceDesc{
MethodName: "SendCustomMessage", MethodName: "SendCustomMessage",
Handler: _Lightning_SendCustomMessage_Handler, Handler: _Lightning_SendCustomMessage_Handler,
}, },
{
MethodName: "ListAliases",
Handler: _Lightning_ListAliases_Handler,
},
}, },
Streams: []grpc.StreamDesc{ Streams: []grpc.StreamDesc{
{ {

View File

@ -576,6 +576,10 @@ func MainRPCServerPermissions() map[string][]bakery.Op {
Entity: "offchain", Entity: "offchain",
Action: "read", Action: "read",
}}, }},
"/lnrpc.Lightning/ListAliases": {{
Entity: "offchain",
Action: "read",
}},
} }
} }
@ -7728,6 +7732,37 @@ func (r *rpcServer) SubscribeCustomMessages(req *lnrpc.SubscribeCustomMessagesRe
} }
} }
// ListAliases returns the set of all aliases we have ever allocated along with
// their base SCID's and possibly a separate confirmed SCID in the case of
// zero-conf.
func (r *rpcServer) ListAliases(ctx context.Context,
in *lnrpc.ListAliasesRequest) (*lnrpc.ListAliasesResponse, error) {
// Fetch the map of all aliases.
mapAliases := r.server.aliasMgr.ListAliases()
// Fill out the response. This does not include the zero-conf confirmed
// SCID. Doing so would require more database lookups and it can be
// cross-referenced with the output of listchannels/closedchannels.
resp := &lnrpc.ListAliasesResponse{
AliasMaps: make([]*lnrpc.AliasMap, 0),
}
for base, set := range mapAliases {
rpcMap := &lnrpc.AliasMap{
BaseScid: base.ToUint64(),
}
for _, alias := range set {
rpcMap.Aliases = append(
rpcMap.Aliases, alias.ToUint64(),
)
}
resp.AliasMaps = append(resp.AliasMaps, rpcMap)
}
return resp, nil
}
// rpcInitiator returns the correct lnrpc initiator for channels where we have // rpcInitiator returns the correct lnrpc initiator for channels where we have
// a record of the opening channel. // a record of the opening channel.
func rpcInitiator(isInitiator bool) lnrpc.Initiator { func rpcInitiator(isInitiator bool) lnrpc.Initiator {