rpcserver: add helper functions to format open and closed RPC channels.
`createRPCChannel` is used by the `listchannels` RPC call and will be used by `subscribechannels` as well. `createRPCClosedChannel` is used by the `closedchannels` RPC call and will also be used by `subscribechannels`. This is used by the `listchannels` RPC call and will be used by `subscribechannels` as well. Its purpose is to mitigate code duplication between the two RPC calls.
This commit is contained in:
parent
5181f100ed
commit
b0b6151cc1
213
rpcserver.go
213
rpcserver.go
@ -2254,56 +2254,34 @@ func (r *rpcServer) ClosedChannels(ctx context.Context,
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
nodePub := dbChannel.RemotePub
|
|
||||||
nodeID := hex.EncodeToString(nodePub.SerializeCompressed())
|
|
||||||
|
|
||||||
var closeType lnrpc.ChannelCloseSummary_ClosureType
|
|
||||||
switch dbChannel.CloseType {
|
switch dbChannel.CloseType {
|
||||||
case channeldb.CooperativeClose:
|
case channeldb.CooperativeClose:
|
||||||
if filterResults && !in.Cooperative {
|
if filterResults && !in.Cooperative {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
closeType = lnrpc.ChannelCloseSummary_COOPERATIVE_CLOSE
|
|
||||||
case channeldb.LocalForceClose:
|
case channeldb.LocalForceClose:
|
||||||
if filterResults && !in.LocalForce {
|
if filterResults && !in.LocalForce {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
closeType = lnrpc.ChannelCloseSummary_LOCAL_FORCE_CLOSE
|
|
||||||
case channeldb.RemoteForceClose:
|
case channeldb.RemoteForceClose:
|
||||||
if filterResults && !in.RemoteForce {
|
if filterResults && !in.RemoteForce {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
closeType = lnrpc.ChannelCloseSummary_REMOTE_FORCE_CLOSE
|
|
||||||
case channeldb.BreachClose:
|
case channeldb.BreachClose:
|
||||||
if filterResults && !in.Breach {
|
if filterResults && !in.Breach {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
closeType = lnrpc.ChannelCloseSummary_BREACH_CLOSE
|
|
||||||
case channeldb.FundingCanceled:
|
case channeldb.FundingCanceled:
|
||||||
if filterResults && !in.FundingCanceled {
|
if filterResults && !in.FundingCanceled {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
closeType = lnrpc.ChannelCloseSummary_FUNDING_CANCELED
|
|
||||||
case channeldb.Abandoned:
|
case channeldb.Abandoned:
|
||||||
if filterResults && !in.Abandoned {
|
if filterResults && !in.Abandoned {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
closeType = lnrpc.ChannelCloseSummary_ABANDONED
|
|
||||||
}
|
|
||||||
|
|
||||||
channel := &lnrpc.ChannelCloseSummary{
|
|
||||||
Capacity: int64(dbChannel.Capacity),
|
|
||||||
RemotePubkey: nodeID,
|
|
||||||
CloseHeight: dbChannel.CloseHeight,
|
|
||||||
CloseType: closeType,
|
|
||||||
ChannelPoint: dbChannel.ChanPoint.String(),
|
|
||||||
ChanId: dbChannel.ShortChanID.ToUint64(),
|
|
||||||
SettledBalance: int64(dbChannel.SettledBalance),
|
|
||||||
TimeLockedBalance: int64(dbChannel.TimeLockedBalance),
|
|
||||||
ChainHash: dbChannel.ChainHash.String(),
|
|
||||||
ClosingTxHash: dbChannel.ClosingTXID.String(),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
channel := createRPCClosedChannel(dbChannel)
|
||||||
resp.Channels = append(resp.Channels, channel)
|
resp.Channels = append(resp.Channels, channel)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2339,14 +2317,8 @@ func (r *rpcServer) ListChannels(ctx context.Context,
|
|||||||
|
|
||||||
for _, dbChannel := range dbChannels {
|
for _, dbChannel := range dbChannels {
|
||||||
nodePub := dbChannel.IdentityPub
|
nodePub := dbChannel.IdentityPub
|
||||||
nodeID := hex.EncodeToString(nodePub.SerializeCompressed())
|
|
||||||
chanPoint := dbChannel.FundingOutpoint
|
chanPoint := dbChannel.FundingOutpoint
|
||||||
|
|
||||||
// With the channel point known, retrieve the network channel
|
|
||||||
// ID from the database.
|
|
||||||
var chanID uint64
|
|
||||||
chanID, _ = graph.ChannelID(&chanPoint)
|
|
||||||
|
|
||||||
var peerOnline bool
|
var peerOnline bool
|
||||||
if _, err := r.server.FindPeer(nodePub); err == nil {
|
if _, err := r.server.FindPeer(nodePub); err == nil {
|
||||||
peerOnline = true
|
peerOnline = true
|
||||||
@ -2364,7 +2336,7 @@ func (r *rpcServer) ListChannels(ctx context.Context,
|
|||||||
// Next, we'll determine whether we should add this channel to
|
// Next, we'll determine whether we should add this channel to
|
||||||
// our list depending on the type of channels requested to us.
|
// our list depending on the type of channels requested to us.
|
||||||
isActive := peerOnline && linkActive
|
isActive := peerOnline && linkActive
|
||||||
isPublic := dbChannel.ChannelFlags&lnwire.FFAnnounceChannel != 0
|
channel := createRPCOpenChannel(r, graph, dbChannel, isActive)
|
||||||
|
|
||||||
// We'll only skip returning this channel if we were requested
|
// We'll only skip returning this channel if we were requested
|
||||||
// for a specific kind and this channel doesn't satisfy it.
|
// for a specific kind and this channel doesn't satisfy it.
|
||||||
@ -2373,78 +2345,135 @@ func (r *rpcServer) ListChannels(ctx context.Context,
|
|||||||
continue
|
continue
|
||||||
case in.InactiveOnly && isActive:
|
case in.InactiveOnly && isActive:
|
||||||
continue
|
continue
|
||||||
case in.PublicOnly && !isPublic:
|
case in.PublicOnly && channel.Private:
|
||||||
continue
|
continue
|
||||||
case in.PrivateOnly && isPublic:
|
case in.PrivateOnly && !channel.Private:
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// As this is required for display purposes, we'll calculate
|
|
||||||
// the weight of the commitment transaction. We also add on the
|
|
||||||
// estimated weight of the witness to calculate the weight of
|
|
||||||
// the transaction if it were to be immediately unilaterally
|
|
||||||
// broadcast.
|
|
||||||
localCommit := dbChannel.LocalCommitment
|
|
||||||
utx := btcutil.NewTx(localCommit.CommitTx)
|
|
||||||
commitBaseWeight := blockchain.GetTransactionWeight(utx)
|
|
||||||
commitWeight := commitBaseWeight + input.WitnessCommitmentTxWeight
|
|
||||||
|
|
||||||
localBalance := localCommit.LocalBalance
|
|
||||||
remoteBalance := localCommit.RemoteBalance
|
|
||||||
|
|
||||||
// As an artifact of our usage of mSAT internally, either party
|
|
||||||
// may end up in a state where they're holding a fractional
|
|
||||||
// amount of satoshis which can't be expressed within the
|
|
||||||
// actual commitment output. Since we round down when going
|
|
||||||
// from mSAT -> SAT, we may at any point be adding an
|
|
||||||
// additional SAT to miners fees. As a result, we display a
|
|
||||||
// commitment fee that accounts for this externally.
|
|
||||||
var sumOutputs btcutil.Amount
|
|
||||||
for _, txOut := range localCommit.CommitTx.TxOut {
|
|
||||||
sumOutputs += btcutil.Amount(txOut.Value)
|
|
||||||
}
|
|
||||||
externalCommitFee := dbChannel.Capacity - sumOutputs
|
|
||||||
|
|
||||||
channel := &lnrpc.Channel{
|
|
||||||
Active: isActive,
|
|
||||||
Private: !isPublic,
|
|
||||||
RemotePubkey: nodeID,
|
|
||||||
ChannelPoint: chanPoint.String(),
|
|
||||||
ChanId: chanID,
|
|
||||||
Capacity: int64(dbChannel.Capacity),
|
|
||||||
LocalBalance: int64(localBalance.ToSatoshis()),
|
|
||||||
RemoteBalance: int64(remoteBalance.ToSatoshis()),
|
|
||||||
CommitFee: int64(externalCommitFee),
|
|
||||||
CommitWeight: commitWeight,
|
|
||||||
FeePerKw: int64(localCommit.FeePerKw),
|
|
||||||
TotalSatoshisSent: int64(dbChannel.TotalMSatSent.ToSatoshis()),
|
|
||||||
TotalSatoshisReceived: int64(dbChannel.TotalMSatReceived.ToSatoshis()),
|
|
||||||
NumUpdates: localCommit.CommitHeight,
|
|
||||||
PendingHtlcs: make([]*lnrpc.HTLC, len(localCommit.Htlcs)),
|
|
||||||
CsvDelay: uint32(dbChannel.LocalChanCfg.CsvDelay),
|
|
||||||
Initiator: dbChannel.IsInitiator,
|
|
||||||
}
|
|
||||||
|
|
||||||
for i, htlc := range localCommit.Htlcs {
|
|
||||||
var rHash [32]byte
|
|
||||||
copy(rHash[:], htlc.RHash[:])
|
|
||||||
channel.PendingHtlcs[i] = &lnrpc.HTLC{
|
|
||||||
Incoming: htlc.Incoming,
|
|
||||||
Amount: int64(htlc.Amt.ToSatoshis()),
|
|
||||||
HashLock: rHash[:],
|
|
||||||
ExpirationHeight: htlc.RefundTimeout,
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the Pending Htlc Amount to UnsettledBalance field.
|
|
||||||
channel.UnsettledBalance += channel.PendingHtlcs[i].Amount
|
|
||||||
}
|
|
||||||
|
|
||||||
resp.Channels = append(resp.Channels, channel)
|
resp.Channels = append(resp.Channels, channel)
|
||||||
}
|
}
|
||||||
|
|
||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// createRPCOpenChannel creates an *lnrpc.Channel from the *channeldb.Channel.
|
||||||
|
func createRPCOpenChannel(r *rpcServer, graph *channeldb.ChannelGraph,
|
||||||
|
dbChannel *channeldb.OpenChannel, isActive bool) *lnrpc.Channel {
|
||||||
|
|
||||||
|
nodePub := dbChannel.IdentityPub
|
||||||
|
nodeID := hex.EncodeToString(nodePub.SerializeCompressed())
|
||||||
|
chanPoint := dbChannel.FundingOutpoint
|
||||||
|
|
||||||
|
// With the channel point known, retrieve the network channel
|
||||||
|
// ID from the database.
|
||||||
|
var chanID uint64
|
||||||
|
chanID, _ = graph.ChannelID(&chanPoint)
|
||||||
|
|
||||||
|
// Next, we'll determine whether the channel is public or not.
|
||||||
|
isPublic := dbChannel.ChannelFlags&lnwire.FFAnnounceChannel != 0
|
||||||
|
|
||||||
|
// As this is required for display purposes, we'll calculate
|
||||||
|
// the weight of the commitment transaction. We also add on the
|
||||||
|
// estimated weight of the witness to calculate the weight of
|
||||||
|
// the transaction if it were to be immediately unilaterally
|
||||||
|
// broadcast.
|
||||||
|
localCommit := dbChannel.LocalCommitment
|
||||||
|
utx := btcutil.NewTx(localCommit.CommitTx)
|
||||||
|
commitBaseWeight := blockchain.GetTransactionWeight(utx)
|
||||||
|
commitWeight := commitBaseWeight + input.WitnessCommitmentTxWeight
|
||||||
|
|
||||||
|
localBalance := localCommit.LocalBalance
|
||||||
|
remoteBalance := localCommit.RemoteBalance
|
||||||
|
|
||||||
|
// As an artifact of our usage of mSAT internally, either party
|
||||||
|
// may end up in a state where they're holding a fractional
|
||||||
|
// amount of satoshis which can't be expressed within the
|
||||||
|
// actual commitment output. Since we round down when going
|
||||||
|
// from mSAT -> SAT, we may at any point be adding an
|
||||||
|
// additional SAT to miners fees. As a result, we display a
|
||||||
|
// commitment fee that accounts for this externally.
|
||||||
|
var sumOutputs btcutil.Amount
|
||||||
|
for _, txOut := range localCommit.CommitTx.TxOut {
|
||||||
|
sumOutputs += btcutil.Amount(txOut.Value)
|
||||||
|
}
|
||||||
|
externalCommitFee := dbChannel.Capacity - sumOutputs
|
||||||
|
|
||||||
|
channel := &lnrpc.Channel{
|
||||||
|
Active: isActive,
|
||||||
|
Private: !isPublic,
|
||||||
|
RemotePubkey: nodeID,
|
||||||
|
ChannelPoint: chanPoint.String(),
|
||||||
|
ChanId: chanID,
|
||||||
|
Capacity: int64(dbChannel.Capacity),
|
||||||
|
LocalBalance: int64(localBalance.ToSatoshis()),
|
||||||
|
RemoteBalance: int64(remoteBalance.ToSatoshis()),
|
||||||
|
CommitFee: int64(externalCommitFee),
|
||||||
|
CommitWeight: commitWeight,
|
||||||
|
FeePerKw: int64(localCommit.FeePerKw),
|
||||||
|
TotalSatoshisSent: int64(dbChannel.TotalMSatSent.ToSatoshis()),
|
||||||
|
TotalSatoshisReceived: int64(dbChannel.TotalMSatReceived.ToSatoshis()),
|
||||||
|
NumUpdates: localCommit.CommitHeight,
|
||||||
|
PendingHtlcs: make([]*lnrpc.HTLC, len(localCommit.Htlcs)),
|
||||||
|
CsvDelay: uint32(dbChannel.LocalChanCfg.CsvDelay),
|
||||||
|
Initiator: dbChannel.IsInitiator,
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, htlc := range localCommit.Htlcs {
|
||||||
|
var rHash [32]byte
|
||||||
|
copy(rHash[:], htlc.RHash[:])
|
||||||
|
channel.PendingHtlcs[i] = &lnrpc.HTLC{
|
||||||
|
Incoming: htlc.Incoming,
|
||||||
|
Amount: int64(htlc.Amt.ToSatoshis()),
|
||||||
|
HashLock: rHash[:],
|
||||||
|
ExpirationHeight: htlc.RefundTimeout,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the Pending Htlc Amount to UnsettledBalance field.
|
||||||
|
channel.UnsettledBalance += channel.PendingHtlcs[i].Amount
|
||||||
|
}
|
||||||
|
|
||||||
|
return channel
|
||||||
|
}
|
||||||
|
|
||||||
|
// createRPCClosedChannel creates an *lnrpc.ClosedChannelSummary from a
|
||||||
|
// *channeldb.ChannelCloseSummary.
|
||||||
|
func createRPCClosedChannel(
|
||||||
|
dbChannel *channeldb.ChannelCloseSummary) *lnrpc.ChannelCloseSummary {
|
||||||
|
|
||||||
|
nodePub := dbChannel.RemotePub
|
||||||
|
nodeID := hex.EncodeToString(nodePub.SerializeCompressed())
|
||||||
|
|
||||||
|
var closeType lnrpc.ChannelCloseSummary_ClosureType
|
||||||
|
switch dbChannel.CloseType {
|
||||||
|
case channeldb.CooperativeClose:
|
||||||
|
closeType = lnrpc.ChannelCloseSummary_COOPERATIVE_CLOSE
|
||||||
|
case channeldb.LocalForceClose:
|
||||||
|
closeType = lnrpc.ChannelCloseSummary_LOCAL_FORCE_CLOSE
|
||||||
|
case channeldb.RemoteForceClose:
|
||||||
|
closeType = lnrpc.ChannelCloseSummary_REMOTE_FORCE_CLOSE
|
||||||
|
case channeldb.BreachClose:
|
||||||
|
closeType = lnrpc.ChannelCloseSummary_BREACH_CLOSE
|
||||||
|
case channeldb.FundingCanceled:
|
||||||
|
closeType = lnrpc.ChannelCloseSummary_FUNDING_CANCELED
|
||||||
|
case channeldb.Abandoned:
|
||||||
|
closeType = lnrpc.ChannelCloseSummary_ABANDONED
|
||||||
|
}
|
||||||
|
|
||||||
|
return &lnrpc.ChannelCloseSummary{
|
||||||
|
Capacity: int64(dbChannel.Capacity),
|
||||||
|
RemotePubkey: nodeID,
|
||||||
|
CloseHeight: dbChannel.CloseHeight,
|
||||||
|
CloseType: closeType,
|
||||||
|
ChannelPoint: dbChannel.ChanPoint.String(),
|
||||||
|
ChanId: dbChannel.ShortChanID.ToUint64(),
|
||||||
|
SettledBalance: int64(dbChannel.SettledBalance),
|
||||||
|
TimeLockedBalance: int64(dbChannel.TimeLockedBalance),
|
||||||
|
ChainHash: dbChannel.ChainHash.String(),
|
||||||
|
ClosingTxHash: dbChannel.ClosingTXID.String(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// savePayment saves a successfully completed payment to the database for
|
// savePayment saves a successfully completed payment to the database for
|
||||||
// historical record keeping.
|
// historical record keeping.
|
||||||
func (r *rpcServer) savePayment(route *routing.Route,
|
func (r *rpcServer) savePayment(route *routing.Route,
|
||||||
|
Loading…
Reference in New Issue
Block a user