2018-04-25 04:09:51 +03:00
|
|
|
package hodl
|
|
|
|
|
|
|
|
import "fmt"
|
|
|
|
|
|
|
|
// MaskNone represents the empty Mask, in which no breakpoints are
|
|
|
|
// active.
|
|
|
|
const MaskNone = Mask(0)
|
|
|
|
|
|
|
|
type (
|
|
|
|
// Flag represents a single breakpoint where an HTLC should be dropped
|
|
|
|
// during forwarding. Flags can be composed into a Mask to express more
|
|
|
|
// complex combinations.
|
|
|
|
Flag uint32
|
|
|
|
|
|
|
|
// Mask is a bitvector combining multiple Flags that can be queried to
|
|
|
|
// see which breakpoints are active.
|
|
|
|
Mask uint32
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
// ExitSettle drops an incoming ADD for which we are the exit node,
|
|
|
|
// before processing in the link.
|
|
|
|
ExitSettle Flag = 1 << iota
|
|
|
|
|
|
|
|
// AddIncoming drops an incoming ADD before processing if we are not
|
|
|
|
// the exit node.
|
|
|
|
AddIncoming
|
|
|
|
|
|
|
|
// SettleIncoming drops an incoming SETTLE before processing if we
|
|
|
|
// are not the exit node.
|
|
|
|
SettleIncoming
|
|
|
|
|
|
|
|
// FailIncoming drops an incoming FAIL before processing if we are
|
|
|
|
// not the exit node.
|
|
|
|
FailIncoming
|
|
|
|
|
|
|
|
// TODO(conner): add modes for switch breakpoints
|
|
|
|
|
|
|
|
// AddOutgoing drops an outgoing ADD before it is added to the
|
|
|
|
// in-memory commitment state of the link.
|
|
|
|
AddOutgoing
|
|
|
|
|
|
|
|
// SettleOutgoing drops an SETTLE before it is added to the
|
|
|
|
// in-memory commitment state of the link.
|
|
|
|
SettleOutgoing
|
|
|
|
|
|
|
|
// FailOutgoing drops an outgoing FAIL before is is added to the
|
|
|
|
// in-memory commitment state of the link.
|
|
|
|
FailOutgoing
|
|
|
|
|
|
|
|
// Commit drops all HTLC after any outgoing circuits have been
|
|
|
|
// opened, but before the in-memory commitment state is persisted.
|
|
|
|
Commit
|
2018-05-18 14:59:11 +03:00
|
|
|
|
|
|
|
// BogusSettle attempts to settle back any incoming HTLC for which we
|
|
|
|
// are the exit node with a bogus preimage.
|
|
|
|
BogusSettle
|
2018-04-25 04:09:51 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
// String returns a human-readable identifier for a given Flag.
|
|
|
|
func (f Flag) String() string {
|
|
|
|
switch f {
|
|
|
|
case ExitSettle:
|
|
|
|
return "ExitSettle"
|
|
|
|
case AddIncoming:
|
|
|
|
return "AddIncoming"
|
|
|
|
case SettleIncoming:
|
|
|
|
return "SettleIncoming"
|
|
|
|
case FailIncoming:
|
|
|
|
return "FailIncoming"
|
|
|
|
case AddOutgoing:
|
|
|
|
return "AddOutgoing"
|
|
|
|
case SettleOutgoing:
|
|
|
|
return "SettleOutgoing"
|
|
|
|
case FailOutgoing:
|
|
|
|
return "FailOutgoing"
|
|
|
|
case Commit:
|
|
|
|
return "Commit"
|
2018-05-18 14:59:11 +03:00
|
|
|
case BogusSettle:
|
|
|
|
return "BogusSettle"
|
2018-04-25 04:09:51 +03:00
|
|
|
default:
|
|
|
|
return "UnknownHodlFlag"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Warning generates a warning message to log if a particular breakpoint is
|
|
|
|
// triggered during execution.
|
|
|
|
func (f Flag) Warning() string {
|
|
|
|
var msg string
|
|
|
|
switch f {
|
|
|
|
case ExitSettle:
|
|
|
|
msg = "will not attempt to settle ADD with sender"
|
|
|
|
case AddIncoming:
|
|
|
|
msg = "will not attempt to forward ADD to switch"
|
|
|
|
case SettleIncoming:
|
|
|
|
msg = "will not attempt to forward SETTLE to switch"
|
|
|
|
case FailIncoming:
|
|
|
|
msg = "will not attempt to forward FAIL to switch"
|
|
|
|
case AddOutgoing:
|
|
|
|
msg = "will not update channel state with downstream ADD"
|
|
|
|
case SettleOutgoing:
|
|
|
|
msg = "will not update channel state with downstream SETTLE"
|
|
|
|
case FailOutgoing:
|
|
|
|
msg = "will not update channel state with downstream FAIL"
|
|
|
|
case Commit:
|
|
|
|
msg = "will not commit pending channel updates"
|
2018-05-18 14:59:11 +03:00
|
|
|
case BogusSettle:
|
|
|
|
msg = "will settle HTLC with bogus preimage"
|
2018-04-25 04:09:51 +03:00
|
|
|
default:
|
|
|
|
msg = "incorrect hodl flag usage"
|
|
|
|
}
|
|
|
|
|
|
|
|
return fmt.Sprintf("%s mode enabled -- %s", f, msg)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Mask returns the Mask consisting solely of this Flag.
|
|
|
|
func (f Flag) Mask() Mask {
|
|
|
|
return Mask(f)
|
|
|
|
}
|