build+lncli: default to hex encoding for byte slices

This commit swaps out golang/protobuf/jsonpb for a custom variant that
by default prints byte slices as hex, which is more useful for our
setting. Some existing wrapper structs are removed as they can now be
printed directly with the new jsonpb.

!!! NOTE !!!

This commit introduces a breaking change to lncli listinvoices since
payment hashes and preimages will now be printed in hex instead of
base64.
This commit is contained in:
Conner Fromknecht committed 2019-12-20 01:05:08 -08:00
1 parent fb6cf21948
commit 8f5d78c875
9 files changed
+22 -149

No files matched your search

+1 -1
View File
@@ -88,7 +88,7 @@ func buildRoute(ctx *cli.Context) error {
return err
}
printJSON(route)
printRespJSON(route)
return nil
}
+1 -29
View File
@@ -4,7 +4,6 @@ package main
import (
"context"
"encoding/hex"
"github.com/lightningnetwork/lnd/lnrpc/routerrpc"
@@ -31,34 +30,7 @@ func queryMissionControl(ctx *cli.Context) error {
return err
}
type displayPairHistory struct {
NodeFrom, NodeTo string
SuccessTime, FailTime int64
FailAmtSat, FailAmtMsat int64
SuccessAmtSat, SuccessAmtMsat int64
}
displayResp := struct {
Pairs []displayPairHistory
}{}
for _, n := range snapshot.Pairs {
displayResp.Pairs = append(
displayResp.Pairs,
displayPairHistory{
NodeFrom: hex.EncodeToString(n.NodeFrom),
NodeTo: hex.EncodeToString(n.NodeTo),
FailTime: n.History.FailTime,
SuccessTime: n.History.SuccessTime,
FailAmtSat: n.History.FailAmtSat,
FailAmtMsat: n.History.FailAmtMsat,
SuccessAmtSat: n.History.SuccessAmtSat,
SuccessAmtMsat: n.History.SuccessAmtMsat,
},
)
}
printJSON(displayResp)
printRespJSON(snapshot)
return nil
}
+12 -47
View File
@@ -5,7 +5,6 @@ import (
"bytes"
"context"
"encoding/hex"
"encoding/json"
"errors"
"fmt"
"io"
@@ -20,8 +19,9 @@ import (
"github.com/btcsuite/btcd/chaincfg/chainhash"
"github.com/btcsuite/btcd/wire"
"github.com/golang/protobuf/jsonpb"
"github.com/golang/protobuf/proto"
"github.com/lightninglabs/protobuf-hex-display/json"
"github.com/lightninglabs/protobuf-hex-display/jsonpb"
"github.com/lightninglabs/protobuf-hex-display/proto"
"github.com/lightningnetwork/lnd/lnrpc"
"github.com/lightningnetwork/lnd/lnrpc/routerrpc"
"github.com/lightningnetwork/lnd/routing/route"
@@ -2427,15 +2427,7 @@ func sendPaymentRequest(ctx *cli.Context, req *lnrpc.SendRequest) error {
paymentStream.CloseSend()
printJSON(struct {
E string `json:"payment_error"`
P string `json:"payment_preimage"`
R *lnrpc.Route `json:"payment_route"`
}{
E: resp.PaymentError,
P: hex.EncodeToString(resp.PaymentPreimage),
R: resp.PaymentRoute,
})
printRespJSON(resp)
// If we get a payment error back, we pass an error
// up to main which eventually calls fatal() and returns
@@ -2637,15 +2629,7 @@ func sendToRouteRequest(ctx *cli.Context, req *lnrpc.SendToRouteRequest) error {
return err
}
printJSON(struct {
E string `json:"payment_error"`
P string `json:"payment_preimage"`
R *lnrpc.Route `json:"payment_route"`
}{
E: resp.PaymentError,
P: hex.EncodeToString(resp.PaymentPreimage),
R: resp.PaymentRoute,
})
printRespJSON(resp)
return nil
}
@@ -2762,15 +2746,7 @@ func addInvoice(ctx *cli.Context) error {
return err
}
printJSON(struct {
RHash string `json:"r_hash"`
PayReq string `json:"pay_req"`
AddIndex uint64 `json:"add_index"`
}{
RHash: hex.EncodeToString(resp.RHash),
PayReq: resp.PaymentRequest,
AddIndex: resp.AddIndex,
})
printRespJSON(resp)
return nil
}
@@ -3856,14 +3832,11 @@ func exportChanBackup(ctx *cli.Context) error {
printJSON(struct {
ChanPoint string `json:"chan_point"`
ChanBackup string `json:"chan_backup"`
ChanBackup []byte `json:"chan_backup"`
}{
ChanPoint: chanPoint.String(),
ChanBackup: hex.EncodeToString(
chanBackup.ChanBackup,
),
},
)
ChanPoint: chanPoint.String(),
ChanBackup: chanBackup.ChanBackup,
})
return nil
}
@@ -3901,16 +3874,8 @@ func exportChanBackup(ctx *cli.Context) error {
}.String())
}
printJSON(struct {
ChanPoints []string `json:"chan_points"`
MultiChanBackup string `json:"multi_chan_backup"`
}{
ChanPoints: chanPoints,
MultiChanBackup: hex.EncodeToString(
chanBackup.MultiChanBackup.MultiChanBackup,
),
},
)
printRespJSON(chanBackup)
return nil
}
+2 -2
View File
@@ -81,7 +81,7 @@ func settleInvoice(ctx *cli.Context) error {
return err
}
printJSON(resp)
printRespJSON(resp)
return nil
}
@@ -134,7 +134,7 @@ func cancelInvoice(ctx *cli.Context) error {
return err
}
printJSON(resp)
printRespJSON(resp)
return nil
}
+1 -10
View File
@@ -4,7 +4,6 @@ package main
import (
"context"
"encoding/hex"
"github.com/lightningnetwork/lnd/lnrpc/watchtowerrpc"
"github.com/urfave/cli"
@@ -51,15 +50,7 @@ func towerInfo(ctx *cli.Context) error {
return err
}
printJSON(struct {
Pubkey string `json:"pubkey"`
Listeners []string `json:"listeners"`
URIs []string `json:"uris"`
}{
Pubkey: hex.EncodeToString(resp.Pubkey),
Listeners: resp.Listeners,
URIs: resp.Uris,
})
printRespJSON(resp)
return nil
}
+2 -10
View File
@@ -170,16 +170,8 @@ func listTowers(ctx *cli.Context) error {
return err
}
var listTowersResp = struct {
Towers []*Tower `json:"towers"`
}{
Towers: make([]*Tower, len(resp.Towers)),
}
for i, tower := range resp.Towers {
listTowersResp.Towers[i] = NewTowerFromProto(tower)
}
printRespJSON(resp)
printJSON(listTowersResp)
return nil
}
@@ -224,7 +216,7 @@ func getTower(ctx *cli.Context) error {
return err
}
printJSON(NewTowerFromProto(resp))
printRespJSON(resp)
return nil
}
-50
View File
@@ -1,50 +0,0 @@
package main
import (
"encoding/hex"
"github.com/lightningnetwork/lnd/lnrpc/wtclientrpc"
)
// TowerSession encompasses information about a tower session.
type TowerSession struct {
NumBackups uint32 `json:"num_backups"`
NumPendingBackups uint32 `json:"num_pending_backups"`
MaxBackups uint32 `json:"max_backups"`
SweepSatPerByte uint32 `json:"sweep_sat_per_byte"`
}
// NewTowerSessionsFromProto converts a set of tower sessions from their RPC
// type to a CLI-friendly type.
func NewTowerSessionsFromProto(sessions []*wtclientrpc.TowerSession) []*TowerSession {
towerSessions := make([]*TowerSession, 0, len(sessions))
for _, session := range sessions {
towerSessions = append(towerSessions, &TowerSession{
NumBackups: session.NumBackups,
NumPendingBackups: session.NumPendingBackups,
MaxBackups: session.MaxBackups,
SweepSatPerByte: session.SweepSatPerByte,
})
}
return towerSessions
}
// Tower encompasses information about a registered watchtower.
type Tower struct {
PubKey string `json:"pubkey"`
Addresses []string `json:"addresses"`
ActiveSessionCandidate bool `json:"active_session_candidate"`
NumSessions uint32 `json:"num_sessions"`
Sessions []*TowerSession `json:"sessions"`
}
// NewTowerFromProto converts a tower from its RPC type to a CLI-friendly type.
func NewTowerFromProto(tower *wtclientrpc.Tower) *Tower {
return &Tower{
PubKey: hex.EncodeToString(tower.Pubkey),
Addresses: tower.Addresses,
ActiveSessionCandidate: tower.ActiveSessionCandidate,
NumSessions: tower.NumSessions,
Sessions: NewTowerSessionsFromProto(tower.Sessions),
}
}