lnwire: convert ErrorGeneric to Error
With this change we move one step closer to matching the wire protocol currently defined within the spec.
This commit is contained in:
5 files changed
+155
-137
No files matched your search
+123
@@ -0,0 +1,123 @@
|
||||
package lnwire
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
|
||||
"google.golang.org/grpc/codes"
|
||||
)
|
||||
|
||||
// ErrorCode represents the short error code for each of the defined errors
|
||||
// within the Lightning Network protocol spec.
|
||||
type ErrorCode uint16
|
||||
|
||||
// ToGrpcCode is used to generate gRPC specific code which will be propagated
|
||||
// to the ln rpc client. This code is used to have more detailed view of what
|
||||
// goes wrong and also in order to have the ability pragmatically determine
|
||||
// the error and take specific actions on the client side.
|
||||
func (e ErrorCode) ToGrpcCode() codes.Code {
|
||||
return (codes.Code)(e) + 100
|
||||
}
|
||||
|
||||
const (
|
||||
// ErrMaxPendingChannels is returned by remote peer when the number of
|
||||
// active pending channels exceeds their maximum policy limit.
|
||||
ErrMaxPendingChannels ErrorCode = 1
|
||||
|
||||
// ErrSynchronizingChain is returned by a remote peer that receives a
|
||||
// channel update or a funding request while their still syncing to the
|
||||
// latest state of the blockchain.
|
||||
ErrSynchronizingChain ErrorCode = 2
|
||||
)
|
||||
|
||||
// ErrorData is a set of bytes associated with a particular sent error. A
|
||||
// receiving node SHOULD only print out data verbatim if the string is composed
|
||||
// solely of printable ASCII characters. For reference, the printable character
|
||||
// set includes byte values 32 through 127 inclusive.
|
||||
type ErrorData []byte
|
||||
|
||||
// Error represents a generic error bound to an exact channel. The message
|
||||
// format is purposefully general in order to allow expression of a wide array
|
||||
// of possible errors. Each Error message is directed at a particular open
|
||||
// channel referenced by ChannelPoint.
|
||||
type Error struct {
|
||||
// ChanID references the active channel in which the error occurred
|
||||
// within. If the ChanID is all zeroes, then this error applies to the
|
||||
// entire established connection.
|
||||
ChanID ChannelID
|
||||
|
||||
// Code is the short error code that succinctly identifies the error
|
||||
// code. This is similar field is similar to HTTP error codes.
|
||||
//
|
||||
// TODO(roasbeef): make PR to repo to add error codes, in addition to
|
||||
// what's there atm
|
||||
Code ErrorCode
|
||||
|
||||
// Data is the attached error data that describes the exact failure
|
||||
// which caused the error message to be sent.
|
||||
Data ErrorData
|
||||
}
|
||||
|
||||
// NewError creates a new Error message.
|
||||
func NewError() *Error {
|
||||
return &Error{}
|
||||
}
|
||||
|
||||
// A compile time check to ensure Error implements the lnwire.Message
|
||||
// interface.
|
||||
var _ Message = (*Error)(nil)
|
||||
|
||||
// Decode deserializes a serialized Error message stored in the passed
|
||||
// io.Reader observing the specified protocol version.
|
||||
//
|
||||
// This is part of the lnwire.Message interface.
|
||||
func (c *Error) Decode(r io.Reader, pver uint32) error {
|
||||
return readElements(r,
|
||||
&c.ChanID,
|
||||
&c.Code,
|
||||
&c.Data,
|
||||
)
|
||||
}
|
||||
|
||||
// Encode serializes the target Error into the passed io.Writer observing the
|
||||
// protocol version specified.
|
||||
//
|
||||
// This is part of the lnwire.Message interface.
|
||||
func (c *Error) Encode(w io.Writer, pver uint32) error {
|
||||
return writeElements(w,
|
||||
c.ChanID,
|
||||
c.Code,
|
||||
c.Data,
|
||||
)
|
||||
}
|
||||
|
||||
// Command returns the integer uniquely identifying an Error message on the
|
||||
// wire.
|
||||
//
|
||||
// This is part of the lnwire.Message interface.
|
||||
func (c *Error) Command() uint32 {
|
||||
return CmdError
|
||||
}
|
||||
|
||||
// MaxPayloadLength returns the maximum allowed payload size for a Error
|
||||
// complete message observing the specified protocol version.
|
||||
//
|
||||
// This is part of the lnwire.Message interface.
|
||||
func (c *Error) MaxPayloadLength(uint32) uint32 {
|
||||
// 32 + 2 + 655326
|
||||
return 65536
|
||||
}
|
||||
|
||||
// Validate performs any necessary sanity checks to ensure all fields present
|
||||
// on the Error are valid.
|
||||
//
|
||||
// This is part of the lnwire.Message interface.
|
||||
func (c *Error) Validate() error {
|
||||
if len(c.Data) > math.MaxUint16 {
|
||||
return fmt.Errorf("problem string length too long")
|
||||
}
|
||||
|
||||
// We're good!
|
||||
return nil
|
||||
}
|
||||
Reference in new issue
Block a user