d17b11862b
With this change we move one step closer to matching the wire protocol currently defined within the spec.
124 lines
3.7 KiB
Go
124 lines
3.7 KiB
Go
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
|
|
}
|