From 4dff2e377e5af38286895f6c884d2179f73425f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BF=97=E5=AE=87?= Date: Thu, 5 Mar 2020 20:52:03 +0800 Subject: [PATCH] Improved logging. * Made rpcutil.LogCall to log RPC call on the server side. * Improved appserver.RPCGateway logging #195 * Changed appcommon.Key to use UUID. --- go.mod | 2 +- go.sum | 4 +- pkg/app/appcommon/key.go | 7 +- pkg/app/appserver/rpc_gateway.go | 57 +++++++------ pkg/app/appserver/server.go | 2 +- pkg/transport/managed_transport.go | 2 +- pkg/util/rpcutil/log_call.go | 36 +++++++++ pkg/visor/rpc.go | 80 +++++++------------ .../SkycoinProject/dmsg/httputil/error.go | 3 +- vendor/modules.txt | 2 +- 10 files changed, 103 insertions(+), 92 deletions(-) create mode 100644 pkg/util/rpcutil/log_call.go diff --git a/go.mod b/go.mod index df84059f8..a37ecaf2a 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/SkycoinProject/skywire-mainnet go 1.13 require ( - github.com/SkycoinProject/dmsg v0.0.0-20200304115237-130cc9d98ffb + github.com/SkycoinProject/dmsg v0.0.0-20200305081343-7a67392d759d github.com/SkycoinProject/skycoin v0.27.0 github.com/SkycoinProject/yamux v0.0.0-20191213015001-a36efeefbf6a github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 diff --git a/go.sum b/go.sum index 4f8b15bed..d68e1f8c7 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/SkycoinProject/dmsg v0.0.0-20200304115237-130cc9d98ffb h1:UPgo4kZ/nFV4jI9djG0esOyZjda4IZGZpGl/ntYRyuM= -github.com/SkycoinProject/dmsg v0.0.0-20200304115237-130cc9d98ffb/go.mod h1:DzykXMLlx6Fx0fGjZsCIRas/MIvxW8DZpmDA6f2nCRk= +github.com/SkycoinProject/dmsg v0.0.0-20200305081343-7a67392d759d h1:2vjoH2HOsRRvqvXQb2K4uQnqaMRJnYiDpsfCRxixzvs= +github.com/SkycoinProject/dmsg v0.0.0-20200305081343-7a67392d759d/go.mod h1:DzykXMLlx6Fx0fGjZsCIRas/MIvxW8DZpmDA6f2nCRk= github.com/SkycoinProject/skycoin v0.26.0/go.mod h1:xqPLOKh5B6GBZlGA7B5IJfQmCy7mwimD9NlqxR3gMXo= github.com/SkycoinProject/skycoin v0.27.0 h1:N3IHxj8ossHOcsxLYOYugT+OaELLncYHJHxbbYLPPmY= github.com/SkycoinProject/skycoin v0.27.0/go.mod h1:xqPLOKh5B6GBZlGA7B5IJfQmCy7mwimD9NlqxR3gMXo= diff --git a/pkg/app/appcommon/key.go b/pkg/app/appcommon/key.go index 525065e7e..897d13bce 100644 --- a/pkg/app/appcommon/key.go +++ b/pkg/app/appcommon/key.go @@ -1,6 +1,8 @@ package appcommon -import "github.com/SkycoinProject/dmsg/cipher" +import ( + "github.com/google/uuid" +) // Key is an app key to authenticate within the // app server. @@ -8,6 +10,5 @@ type Key string // GenerateAppKey generates new app key. func GenerateAppKey() Key { - raw, _ := cipher.GenerateKeyPair() - return Key(raw.Hex()) + return Key(uuid.New().String()) } diff --git a/pkg/app/appserver/rpc_gateway.go b/pkg/app/appserver/rpc_gateway.go index 4f4c0a89a..b2b4123f4 100644 --- a/pkg/app/appserver/rpc_gateway.go +++ b/pkg/app/appserver/rpc_gateway.go @@ -9,6 +9,8 @@ import ( "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skywire-mainnet/pkg/util/rpcutil" + "github.com/SkycoinProject/skywire-mainnet/pkg/app/appnet" "github.com/SkycoinProject/skywire-mainnet/pkg/app/idmanager" "github.com/SkycoinProject/skywire-mainnet/pkg/routing" @@ -77,7 +79,9 @@ type DialResp struct { } // Dial dials to the remote. -func (r *RPCGateway) Dial(remote *appnet.Addr, resp *DialResp) error { +func (r *RPCGateway) Dial(remote *appnet.Addr, resp *DialResp) (err error) { + defer rpcutil.LogCall(r.log, "Dial", remote)(resp, &err) + reservedConnID, free, err := r.cm.ReserveNextID() if err != nil { return err @@ -96,12 +100,10 @@ func (r *RPCGateway) Dial(remote *appnet.Addr, resp *DialResp) error { } if err := r.cm.Set(*reservedConnID, wrappedConn); err != nil { - if err := wrappedConn.Close(); err != nil { - r.log.WithError(err).Error("error closing conn") + if cErr := wrappedConn.Close(); cErr != nil { + r.log.WithError(cErr).Error("Error closing wrappedConn.") } - free() - return err } @@ -114,7 +116,9 @@ func (r *RPCGateway) Dial(remote *appnet.Addr, resp *DialResp) error { } // Listen starts listening. -func (r *RPCGateway) Listen(local *appnet.Addr, lisID *uint16) error { +func (r *RPCGateway) Listen(local *appnet.Addr, lisID *uint16) (err error) { + defer rpcutil.LogCall(r.log, "Listen", local)(lisID, &err) + nextLisID, free, err := r.lm.ReserveNextID() if err != nil { return err @@ -127,17 +131,14 @@ func (r *RPCGateway) Listen(local *appnet.Addr, lisID *uint16) error { } if err := r.lm.Set(*nextLisID, l); err != nil { - if err := l.Close(); err != nil { - r.log.WithError(err).Error("error closing listener") + if cErr := l.Close(); cErr != nil { + r.log.WithError(cErr).Error("Error closing listener.") } - free() - return err } *lisID = *nextLisID - return nil } @@ -148,35 +149,31 @@ type AcceptResp struct { } // Accept accepts connection from the listener specified by `lisID`. -func (r *RPCGateway) Accept(lisID *uint16, resp *AcceptResp) error { - r.log.Infoln("Inside RPC Accept on server side") +func (r *RPCGateway) Accept(lisID *uint16, resp *AcceptResp) (err error) { + defer rpcutil.LogCall(r.log, "Accept", lisID)(resp, &err) + + log := r.log.WithField("func", "Accept") + log.Debug("Getting listener...") lis, err := r.getListener(*lisID) if err != nil { - r.log.Infoln("Error getting listener on RPC Accept server side") return err } - r.log.Infoln("Reserving next ID on RPC Accept server side") - + log.Debug("Reserving next ID...") connID, free, err := r.cm.ReserveNextID() if err != nil { - r.log.Infoln("Error reserving next ID on RPC Accept server side") return err } - r.log.Infoln("Accepting conn on RPC Accept server side") - + log.Debug("Accepting conn...") conn, err := lis.Accept() if err != nil { - r.log.Warnf("Error accepting conn on RPC Accept server side: %v", err) free() - return err } - r.log.Infoln("Wrapping conn on RPC Accept server side") - + log.Debug("Wrapping conn...") wrappedConn, err := appnet.WrapConn(conn) if err != nil { free() @@ -184,12 +181,10 @@ func (r *RPCGateway) Accept(lisID *uint16, resp *AcceptResp) error { } if err := r.cm.Set(*connID, wrappedConn); err != nil { - if err := wrappedConn.Close(); err != nil { - r.log.WithError(err).Error("error closing DMSG transport") + if cErr := wrappedConn.Close(); cErr != nil { + r.log.WithError(cErr).Error("Failed to close wrappedConn.") } - free() - return err } @@ -264,7 +259,9 @@ func (r *RPCGateway) Read(req *ReadReq, resp *ReadResp) error { } // CloseConn closes connection specified by `connID`. -func (r *RPCGateway) CloseConn(connID *uint16, _ *struct{}) error { +func (r *RPCGateway) CloseConn(connID *uint16, _ *struct{}) (err error) { + defer rpcutil.LogCall(r.log, "CloseConn", connID)(nil, &err) + conn, err := r.popConn(*connID) if err != nil { return err @@ -274,7 +271,9 @@ func (r *RPCGateway) CloseConn(connID *uint16, _ *struct{}) error { } // CloseListener closes listener specified by `lisID`. -func (r *RPCGateway) CloseListener(lisID *uint16, _ *struct{}) error { +func (r *RPCGateway) CloseListener(lisID *uint16, _ *struct{}) (err error) { + defer rpcutil.LogCall(r.log, "CloseConn", lisID)(nil, &err) + lis, err := r.popListener(*lisID) if err != nil { return err diff --git a/pkg/app/appserver/server.go b/pkg/app/appserver/server.go index 7e75a8921..b2d761b45 100644 --- a/pkg/app/appserver/server.go +++ b/pkg/app/appserver/server.go @@ -33,7 +33,7 @@ func New(log *logging.Logger, sockFile string) *Server { // Register registers an app key in RPC server. func (s *Server) Register(appKey appcommon.Key) error { - logger := logging.MustGetLogger(fmt.Sprintf("rpc_server_%s", appKey)) + logger := logging.MustGetLogger(fmt.Sprintf("app_gateway:%s", appKey)) gateway := NewRPCGateway(logger) return s.rpcS.RegisterName(string(appKey), gateway) diff --git a/pkg/transport/managed_transport.go b/pkg/transport/managed_transport.go index ffddcf26e..22faa76aa 100644 --- a/pkg/transport/managed_transport.go +++ b/pkg/transport/managed_transport.go @@ -515,7 +515,7 @@ func (mt *ManagedTransport) WritePacket(ctx context.Context, packet routing.Pack // WARNING: Not thread safe. func (mt *ManagedTransport) readPacket() (packet routing.Packet, err error) { - log := mt.log.WithField("func", "readPacket()") + log := mt.log.WithField("func", "readPacket") var conn *snet.Conn for { diff --git a/pkg/util/rpcutil/log_call.go b/pkg/util/rpcutil/log_call.go new file mode 100644 index 000000000..a47344da8 --- /dev/null +++ b/pkg/util/rpcutil/log_call.go @@ -0,0 +1,36 @@ +package rpcutil + +import ( + "time" + + "github.com/sirupsen/logrus" +) + +// LogCall is used to log an RPC call from the rpc.Server +func LogCall(log logrus.FieldLogger, method string, in interface{}) func(out interface{}, err *error) { + + // Just in case log is not set. + // However, this is dangerous as it may result in a race condition. + if log == nil { + log = logrus.New() + } + + start := time.Now() + log = log. + WithField("_method", method). + WithField("_received", start.Format(time.Kitchen)) + if in != nil { + log = log.WithField("input", in) + } + + return func(out interface{}, err *error) { + log := log.WithField("_period", time.Since(start).String()) + if out != nil { + log = log.WithField("output", out) + } + if err != nil && *err != nil { + log = log.WithError(*err) + } + log.Info("Request processed.") + } +} diff --git a/pkg/visor/rpc.go b/pkg/visor/rpc.go index 393004ac2..450fd896e 100644 --- a/pkg/visor/rpc.go +++ b/pkg/visor/rpc.go @@ -14,6 +14,8 @@ import ( "github.com/google/uuid" "github.com/sirupsen/logrus" + "github.com/SkycoinProject/skywire-mainnet/pkg/util/rpcutil" + "github.com/SkycoinProject/skywire-mainnet/pkg/app" "github.com/SkycoinProject/skywire-mainnet/pkg/routing" "github.com/SkycoinProject/skywire-mainnet/pkg/transport" @@ -54,34 +56,6 @@ func newRPCServer(v *Visor, remoteName string) *rpc.Server { return rpcS } -func (r *RPC) logReq(name string, in interface{}) func(out interface{}, err *error) { - - // Just in case r.log is not set. - // However, this is dangerous in production as it may result in a race condition. - if r.log == nil { - r.log = r.visor.Logger.PackageLogger("visor_rpc") - } - - start := time.Now() - log := r.log. - WithField("_method", name). - WithField("_received", start.Format(time.Kitchen)) - if in != nil { - log = log.WithField("input", in) - } - - return func(out interface{}, err *error) { - log := log.WithField("_period", time.Since(start).String()) - if out != nil { - log = log.WithField("output", out) - } - if err != nil && *err != nil { - log = log.WithError(*err) - } - log.Info("Request processed.") - } -} - /* <<< NODE HEALTH >>> */ @@ -95,7 +69,7 @@ type HealthInfo struct { // Health returns health information about the visor func (r *RPC) Health(_ *struct{}, out *HealthInfo) (err error) { - defer r.logReq("Health", nil)(out, &err) + defer rpcutil.LogCall(r.log, "Health", nil)(out, &err) out.TransportDiscovery = http.StatusOK out.RouteFinder = http.StatusOK @@ -122,7 +96,7 @@ func (r *RPC) Health(_ *struct{}, out *HealthInfo) (err error) { // Uptime returns for how long the visor has been running in seconds func (r *RPC) Uptime(_ *struct{}, out *float64) (err error) { - defer r.logReq("Uptime", nil)(out, &err) + defer rpcutil.LogCall(r.log, "Uptime", nil)(out, &err) *out = time.Since(r.visor.startedAt).Seconds() return nil @@ -142,7 +116,7 @@ type AppLogsRequest struct { // LogsSince returns all logs from an specific app since the timestamp func (r *RPC) LogsSince(in *AppLogsRequest, out *[]string) (err error) { - defer r.logReq("LogsSince", in)(out, &err) + defer rpcutil.LogCall(r.log, "LogsSince", in)(out, &err) ls, err := app.NewLogStore(filepath.Join(r.visor.dir(), in.AppName), in.AppName, "bbolt") if err != nil { @@ -199,7 +173,7 @@ type Summary struct { // Summary provides a summary of the AppNode. func (r *RPC) Summary(_ *struct{}, out *Summary) (err error) { - defer r.logReq("Summary", nil)(out, &err) + defer rpcutil.LogCall(r.log, "Summary", nil)(out, &err) var summaries []*TransportSummary r.visor.tm.WalkTransports(func(tp *transport.ManagedTransport) bool { @@ -224,7 +198,7 @@ func (r *RPC) Summary(_ *struct{}, out *Summary) (err error) { // Apps returns list of Apps registered on the Visor. func (r *RPC) Apps(_ *struct{}, reply *[]*AppState) (err error) { - defer r.logReq("Apps", nil)(reply, &err) + defer rpcutil.LogCall(r.log, "Apps", nil)(reply, &err) *reply = r.visor.Apps() return nil @@ -232,14 +206,14 @@ func (r *RPC) Apps(_ *struct{}, reply *[]*AppState) (err error) { // StartApp start App with provided name. func (r *RPC) StartApp(name *string, _ *struct{}) (err error) { - defer r.logReq("StartApp", name)(nil, &err) + defer rpcutil.LogCall(r.log, "StartApp", name)(nil, &err) return r.visor.StartApp(*name) } // StopApp stops App with provided name. func (r *RPC) StopApp(name *string, _ *struct{}) (err error) { - defer r.logReq("StopApp", name)(nil, &err) + defer rpcutil.LogCall(r.log, "StopApp", name)(nil, &err) return r.visor.StopApp(*name) } @@ -252,21 +226,21 @@ type SetAutoStartIn struct { // SetAutoStart sets auto-start settings for an app. func (r *RPC) SetAutoStart(in *SetAutoStartIn, _ *struct{}) (err error) { - defer r.logReq("SetAutoStart", in)(nil, &err) + defer rpcutil.LogCall(r.log, "SetAutoStart", in)(nil, &err) return r.visor.setAutoStart(in.AppName, in.AutoStart) } // SetSocksPassword sets password for skysocks. func (r *RPC) SetSocksPassword(in *string, _ *struct{}) (err error) { - defer r.logReq("SetSocksPassword", in)(nil, &err) + defer rpcutil.LogCall(r.log, "SetSocksPassword", in)(nil, &err) return r.visor.setSocksPassword(*in) } // SetSocksClientPK sets PK for skysocks-client. func (r *RPC) SetSocksClientPK(in *cipher.PubKey, _ *struct{}) (err error) { - defer r.logReq("SetSocksClientPK", in)(nil, &err) + defer rpcutil.LogCall(r.log, "SetSocksClientPK", in)(nil, &err) return r.visor.setSocksClientPK(*in) } @@ -277,7 +251,7 @@ func (r *RPC) SetSocksClientPK(in *cipher.PubKey, _ *struct{}) (err error) { // TransportTypes lists all transport types supported by the Visor. func (r *RPC) TransportTypes(_ *struct{}, out *[]string) (err error) { - defer r.logReq("TransportTypes", nil)(out, &err) + defer rpcutil.LogCall(r.log, "TransportTypes", nil)(out, &err) *out = r.visor.tm.Networks() return nil @@ -292,7 +266,7 @@ type TransportsIn struct { // Transports lists Transports of the Visor and provides a summary of each. func (r *RPC) Transports(in *TransportsIn, out *[]*TransportSummary) (err error) { - defer r.logReq("Transports", in)(out, &err) + defer rpcutil.LogCall(r.log, "Transports", in)(out, &err) typeIncluded := func(tType string) bool { if in.FilterTypes != nil { @@ -327,7 +301,7 @@ func (r *RPC) Transports(in *TransportsIn, out *[]*TransportSummary) (err error) // Transport obtains a Transport Summary of Transport of given Transport ID. func (r *RPC) Transport(in *uuid.UUID, out *TransportSummary) (err error) { - defer r.logReq("Transport", in)(out, &err) + defer rpcutil.LogCall(r.log, "Transport", in)(out, &err) tp := r.visor.tm.Transport(*in) if tp == nil { @@ -347,7 +321,7 @@ type AddTransportIn struct { // AddTransport creates a transport for the visor. func (r *RPC) AddTransport(in *AddTransportIn, out *TransportSummary) (err error) { - defer r.logReq("AddTransport", in)(out, &err) + defer rpcutil.LogCall(r.log, "AddTransport", in)(out, &err) ctx := context.Background() @@ -368,7 +342,7 @@ func (r *RPC) AddTransport(in *AddTransportIn, out *TransportSummary) (err error // RemoveTransport removes a Transport from the visor. func (r *RPC) RemoveTransport(tid *uuid.UUID, _ *struct{}) (err error) { - defer r.logReq("RemoveTransport", tid)(nil, &err) + defer rpcutil.LogCall(r.log, "RemoveTransport", tid)(nil, &err) r.visor.tm.DeleteTransport(*tid) return nil @@ -380,7 +354,7 @@ func (r *RPC) RemoveTransport(tid *uuid.UUID, _ *struct{}) (err error) { // DiscoverTransportsByPK obtains available transports via the transport discovery via given public key. func (r *RPC) DiscoverTransportsByPK(pk *cipher.PubKey, out *[]*transport.EntryWithStatus) (err error) { - defer r.logReq("DiscoverTransportsByPK", pk)(out, &err) + defer rpcutil.LogCall(r.log, "DiscoverTransportsByPK", pk)(out, &err) tpD, err := r.visor.conf.TransportDiscovery() if err != nil { @@ -398,7 +372,7 @@ func (r *RPC) DiscoverTransportsByPK(pk *cipher.PubKey, out *[]*transport.EntryW // DiscoverTransportByID obtains available transports via the transport discovery via a given transport ID. func (r *RPC) DiscoverTransportByID(id *uuid.UUID, out *transport.EntryWithStatus) (err error) { - defer r.logReq("DiscoverTransportByID", id)(out, &err) + defer rpcutil.LogCall(r.log, "DiscoverTransportByID", id)(out, &err) tpD, err := r.visor.conf.TransportDiscovery() if err != nil { @@ -420,7 +394,7 @@ func (r *RPC) DiscoverTransportByID(id *uuid.UUID, out *transport.EntryWithStatu // RoutingRules obtains all routing rules of the RoutingTable. func (r *RPC) RoutingRules(_ *struct{}, out *[]routing.Rule) (err error) { - defer r.logReq("RoutingRules", nil)(out, &err) + defer rpcutil.LogCall(r.log, "RoutingRules", nil)(out, &err) *out = r.visor.router.Rules() return nil @@ -428,7 +402,7 @@ func (r *RPC) RoutingRules(_ *struct{}, out *[]routing.Rule) (err error) { // RoutingRule obtains a routing rule of given RouteID. func (r *RPC) RoutingRule(key *routing.RouteID, rule *routing.Rule) (err error) { - defer r.logReq("RoutingRule", key)(rule, &err) + defer rpcutil.LogCall(r.log, "RoutingRule", key)(rule, &err) *rule, err = r.visor.router.Rule(*key) return err @@ -436,14 +410,14 @@ func (r *RPC) RoutingRule(key *routing.RouteID, rule *routing.Rule) (err error) // SaveRoutingRule saves a routing rule. func (r *RPC) SaveRoutingRule(in *routing.Rule, _ *struct{}) (err error) { - defer r.logReq("SaveRoutingRule", in)(nil, &err) + defer rpcutil.LogCall(r.log, "SaveRoutingRule", in)(nil, &err) return r.visor.router.SaveRule(*in) } // RemoveRoutingRule removes a RoutingRule based on given RouteID key. func (r *RPC) RemoveRoutingRule(key *routing.RouteID, _ *struct{}) (err error) { - defer r.logReq("RemoveRoutingRule", key)(nil, &err) + defer rpcutil.LogCall(r.log, "RemoveRoutingRule", key)(nil, &err) r.visor.router.DelRules([]routing.RouteID{*key}) return nil @@ -462,7 +436,7 @@ type LoopInfo struct { // Loops retrieves loops via rules of the routing table. func (r *RPC) Loops(_ *struct{}, out *[]LoopInfo) (err error) { - defer r.logReq("Loops", nil)(out, &err) + defer rpcutil.LogCall(r.log, "Loops", nil)(out, &err) var loops []LoopInfo @@ -497,7 +471,7 @@ const exitDelay = 100 * time.Millisecond // Restart restarts visor. func (r *RPC) Restart(_ *struct{}, _ *struct{}) (err error) { // @evanlinjin: do not defer this log statement, as the underlying visor.Logger will get closed. - r.logReq("Restart", nil)(nil, nil) + rpcutil.LogCall(r.log, "Restart", nil)(nil, nil) defer func() { if err == nil { @@ -517,7 +491,7 @@ func (r *RPC) Restart(_ *struct{}, _ *struct{}) (err error) { // Exec executes a given command in cmd and writes its output to out. func (r *RPC) Exec(cmd *string, out *[]byte) (err error) { - defer r.logReq("Exec", cmd)(out, &err) + defer rpcutil.LogCall(r.log, "Exec", cmd)(out, &err) *out, err = r.visor.Exec(*cmd) return err @@ -525,7 +499,7 @@ func (r *RPC) Exec(cmd *string, out *[]byte) (err error) { // Update updates visor. func (r *RPC) Update(_ *struct{}, _ *struct{}) (err error) { - defer r.logReq("Update", nil)(nil, &err) + defer rpcutil.LogCall(r.log, "Update", nil)(nil, &err) return r.visor.Update() } diff --git a/vendor/github.com/SkycoinProject/dmsg/httputil/error.go b/vendor/github.com/SkycoinProject/dmsg/httputil/error.go index 5b545990a..0752c6a05 100644 --- a/vendor/github.com/SkycoinProject/dmsg/httputil/error.go +++ b/vendor/github.com/SkycoinProject/dmsg/httputil/error.go @@ -1,6 +1,7 @@ package httputil import ( + "bytes" "fmt" "io/ioutil" "net/http" @@ -22,7 +23,7 @@ func ErrorFromResp(resp *http.Response) error { if err != nil && len(msg) == 0 { msg = []byte(fmt.Sprintf("failed to read HTTP response body: %v", err)) } - return &HTTPError{Status: status, Body: string(msg)} + return &HTTPError{Status: status, Body: string(bytes.TrimSpace(msg))} } // Error returns the error message. diff --git a/vendor/modules.txt b/vendor/modules.txt index 2ece7f09d..9e4174704 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,4 +1,4 @@ -# github.com/SkycoinProject/dmsg v0.0.0-20200304115237-130cc9d98ffb +# github.com/SkycoinProject/dmsg v0.0.0-20200305081343-7a67392d759d github.com/SkycoinProject/dmsg github.com/SkycoinProject/dmsg/cipher github.com/SkycoinProject/dmsg/disc