Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 20 additions & 38 deletions contractcourt/briefcase.go
Original file line number Diff line number Diff line change
Expand Up @@ -440,7 +440,7 @@ func (b *boltArbitratorLog) CommitState(s ArbitratorState) error {
//
// NOTE: Part of the ContractResolver interface.
func (b *boltArbitratorLog) FetchUnresolvedContracts() ([]ContractResolver, error) {
resKit := ResolverKit{
resolverCfg := ResolverConfig{
ChannelArbitratorConfig: b.cfg,
Checkpoint: b.checkpointContract,
}
Expand Down Expand Up @@ -469,56 +469,38 @@ func (b *boltArbitratorLog) FetchUnresolvedContracts() ([]ContractResolver, erro

switch resType {
case resolverTimeout:
timeoutRes := &htlcTimeoutResolver{}
if err := timeoutRes.Decode(resReader); err != nil {
return err
}
timeoutRes.AttachResolverKit(resKit)
Comment thread
halseth marked this conversation as resolved.
Outdated

res = timeoutRes
res, err = newTimeoutResolverFromReader(
resReader, resolverCfg,
)

case resolverSuccess:
successRes := &htlcSuccessResolver{}
if err := successRes.Decode(resReader); err != nil {
return err
}

res = successRes
res, err = newSuccessResolverFromReader(
resReader, resolverCfg,
)

case resolverOutgoingContest:
outContestRes := &htlcOutgoingContestResolver{
htlcTimeoutResolver: htlcTimeoutResolver{},
}
if err := outContestRes.Decode(resReader); err != nil {
return err
}

res = outContestRes
res, err = newOutgoingContestResolverFromReader(
Comment thread
joostjager marked this conversation as resolved.
resReader, resolverCfg,
)

case resolverIncomingContest:
inContestRes := &htlcIncomingContestResolver{
htlcSuccessResolver: htlcSuccessResolver{},
}
if err := inContestRes.Decode(resReader); err != nil {
return err
}

res = inContestRes
res, err = newIncomingContestResolverFromReader(
resReader, resolverCfg,
)

case resolverUnilateralSweep:
sweepRes := &commitSweepResolver{}
if err := sweepRes.Decode(resReader); err != nil {
return err
}

res = sweepRes
res, err = newCommitSweepResolverFromReader(
resReader, resolverCfg,
)

default:
return fmt.Errorf("unknown resolver type: %v", resType)
}

resKit.Quit = make(chan struct{})
res.AttachResolverKit(resKit)
if err != nil {
return err
}

contracts = append(contracts, res)
return nil
})
Expand Down
69 changes: 22 additions & 47 deletions contractcourt/channel_arbitrator.go
Original file line number Diff line number Diff line change
Expand Up @@ -1685,7 +1685,7 @@ func (c *ChannelArbitrator) prepContractResolutions(

// We'll create the resolver kit that we'll be cloning for each
// resolver so they each can do their duty.
resKit := ResolverKit{
resolverCfg := ResolverConfig{
ChannelArbitratorConfig: c.cfg,
Checkpoint: func(res ContractResolver) error {
return c.log.InsertUnresolvedContracts(res)
Expand Down Expand Up @@ -1733,14 +1733,10 @@ func (c *ChannelArbitrator) prepContractResolutions(
continue
}

resKit.Quit = make(chan struct{})
resolver := &htlcSuccessResolver{
htlcResolution: resolution,
broadcastHeight: height,
payHash: htlc.RHash,
htlcAmt: htlc.Amt,
ResolverKit: resKit,
}
resolver := newSuccessResolver(
Comment thread
halseth marked this conversation as resolved.
Outdated
resolution, height,
htlc.RHash, htlc.Amt, resolverCfg,
)
htlcResolvers = append(htlcResolvers, resolver)
}

Expand All @@ -1761,14 +1757,10 @@ func (c *ChannelArbitrator) prepContractResolutions(
continue
}

resKit.Quit = make(chan struct{})
resolver := &htlcTimeoutResolver{
htlcResolution: resolution,
broadcastHeight: height,
htlcIndex: htlc.HtlcIndex,
htlcAmt: htlc.Amt,
ResolverKit: resKit,
}
resolver := newTimeoutResolver(
resolution, height, htlc.HtlcIndex,
htlc.Amt, resolverCfg,
)
htlcResolvers = append(htlcResolvers, resolver)
}

Expand Down Expand Up @@ -1798,18 +1790,11 @@ func (c *ChannelArbitrator) prepContractResolutions(
ChanID: c.cfg.ShortChanID,
}

resKit.Quit = make(chan struct{})
resolver := &htlcIncomingContestResolver{
htlcExpiry: htlc.RefundTimeout,
circuitKey: circuitKey,
htlcSuccessResolver: htlcSuccessResolver{
htlcResolution: resolution,
broadcastHeight: height,
payHash: htlc.RHash,
htlcAmt: htlc.Amt,
ResolverKit: resKit,
},
}
resolver := newIncomingContestResolver(
htlc.RefundTimeout, circuitKey,
resolution, height, htlc.RHash,
htlc.Amt, resolverCfg,
)
htlcResolvers = append(htlcResolvers, resolver)
}

Expand All @@ -1831,16 +1816,10 @@ func (c *ChannelArbitrator) prepContractResolutions(
continue
}

resKit.Quit = make(chan struct{})
resolver := &htlcOutgoingContestResolver{
htlcTimeoutResolver: htlcTimeoutResolver{
htlcResolution: resolution,
broadcastHeight: height,
htlcIndex: htlc.HtlcIndex,
htlcAmt: htlc.Amt,
ResolverKit: resKit,
},
}
resolver := newOutgoingContestResolver(
resolution, height, htlc.HtlcIndex,
htlc.Amt, resolverCfg,
)
htlcResolvers = append(htlcResolvers, resolver)
}
}
Expand All @@ -1850,14 +1829,10 @@ func (c *ChannelArbitrator) prepContractResolutions(
// a resolver to sweep our commitment output (but only if it wasn't
// trimmed).
if contractResolutions.CommitResolution != nil {
resKit.Quit = make(chan struct{})
resolver := &commitSweepResolver{
commitResolution: *contractResolutions.CommitResolution,
broadcastHeight: height,
chanPoint: c.cfg.ChanPoint,
ResolverKit: resKit,
}

resolver := newCommitSweepResolver(
*contractResolutions.CommitResolution,
height, c.cfg.ChanPoint, resolverCfg,
)
htlcResolvers = append(htlcResolvers, resolver)
}

Expand Down
61 changes: 35 additions & 26 deletions contractcourt/commit_sweep_resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,20 @@ type commitSweepResolver struct {
// chanPoint is the channel point of the original contract.
chanPoint wire.OutPoint

ResolverKit
contractResolverKit
}

// newCommitSweepResolver instantiates a new direct commit output resolver.
func newCommitSweepResolver(res lnwallet.CommitOutputResolution,
broadcastHeight uint32,
chanPoint wire.OutPoint, resCfg ResolverConfig) *commitSweepResolver {

return &commitSweepResolver{
contractResolverKit: *newContractResolverKit(resCfg),
commitResolution: res,
broadcastHeight: broadcastHeight,
chanPoint: chanPoint,
}
}

// ResolverKey returns an identifier which should be globally unique for this
Expand Down Expand Up @@ -80,7 +93,7 @@ func (c *commitSweepResolver) Resolve() (ContractResolver, error) {
return nil, errResolverShuttingDown
}

case <-c.Quit:
case <-c.quit:
return nil, errResolverShuttingDown
}

Expand Down Expand Up @@ -138,7 +151,7 @@ func (c *commitSweepResolver) Resolve() (ContractResolver, error) {

log.Infof("ChannelPoint(%v) commit tx is fully resolved by "+
"sweep tx: %v", c.chanPoint, sweepResult.Tx.TxHash())
case <-c.Quit:
case <-c.quit:
return nil, errResolverShuttingDown
}

Expand Down Expand Up @@ -180,7 +193,7 @@ func (c *commitSweepResolver) Resolve() (ContractResolver, error) {
log.Errorf("unable to Checkpoint: %v", err)
return nil, err
}
case <-c.Quit:
case <-c.quit:
return nil, errResolverShuttingDown
}

Expand All @@ -206,7 +219,7 @@ func (c *commitSweepResolver) Resolve() (ContractResolver, error) {
log.Infof("ChannelPoint(%v) commit tx is fully resolved, at height: %v",
c.chanPoint, confInfo.BlockHeight)

case <-c.Quit:
case <-c.quit:
return nil, errResolverShuttingDown
}

Expand All @@ -221,7 +234,7 @@ func (c *commitSweepResolver) Resolve() (ContractResolver, error) {
//
// NOTE: Part of the ContractResolver interface.
func (c *commitSweepResolver) Stop() {
close(c.Quit)
close(c.quit)
}

// IsResolved returns true if the stored state in the resolve is fully
Expand Down Expand Up @@ -262,44 +275,40 @@ func (c *commitSweepResolver) Encode(w io.Writer) error {
return nil
}

// Decode attempts to decode an encoded ContractResolver from the passed Reader
// instance, returning an active ContractResolver instance.
//
// NOTE: Part of the ContractResolver interface.
func (c *commitSweepResolver) Decode(r io.Reader) error {
// newCommitSweepResolverFromReader attempts to decode an encoded
// ContractResolver from the passed Reader instance, returning an active
// ContractResolver instance.
func newCommitSweepResolverFromReader(r io.Reader, resCfg ResolverConfig) (
*commitSweepResolver, error) {

c := &commitSweepResolver{
contractResolverKit: *newContractResolverKit(resCfg),
}

if err := decodeCommitResolution(r, &c.commitResolution); err != nil {
return err
return nil, err
}

if err := binary.Read(r, endian, &c.resolved); err != nil {
return err
return nil, err
}
if err := binary.Read(r, endian, &c.broadcastHeight); err != nil {
return err
return nil, err
}
_, err := io.ReadFull(r, c.chanPoint.Hash[:])
if err != nil {
return err
return nil, err
}
err = binary.Read(r, endian, &c.chanPoint.Index)
if err != nil {
return err
return nil, err
}

// Previously a sweep tx was deserialized at this point. Refactoring
// removed this, but keep in mind that this data may still be present in
// the database.

return nil
}

// AttachResolverKit should be called once a resolved is successfully decoded
// from its stored format. This struct delivers a generic tool kit that
// resolvers need to complete their duty.
//
// NOTE: Part of the ContractResolver interface.
func (c *commitSweepResolver) AttachResolverKit(r ResolverKit) {
c.ResolverKit = r
return c, nil
}

// A compile time assertion to ensure commitSweepResolver meets the
Expand Down
34 changes: 19 additions & 15 deletions contractcourt/contract_resolvers.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,6 @@ type ContractResolver interface {
// passed Writer.
Encode(w io.Writer) error

// Decode attempts to decode an encoded ContractResolver from the
// passed Reader instance, returning an active ContractResolver
// instance.
Decode(r io.Reader) error
Comment thread
halseth marked this conversation as resolved.
Outdated

// AttachResolverKit should be called once a resolved is successfully
// decoded from its stored format. This struct delivers a generic tool
// kit that resolvers need to complete their duty.
AttachResolverKit(ResolverKit)

// Stop signals the resolver to cancel any current resolution
// processes, and suspend.
Stop()
Expand All @@ -69,10 +59,9 @@ type reportingContractResolver interface {
report() *ContractReport
}

// ResolverKit is meant to be used as a mix-in struct to be embedded within a
// given ContractResolver implementation. It contains all the items that a
// resolver requires to carry out its duties.
type ResolverKit struct {
// ResolverConfig contains the externally supplied configuration items that are
// required by a ContractResolver implementation.
type ResolverConfig struct {
// ChannelArbitratorConfig contains all the interfaces and closures
// required for the resolver to interact with outside sub-systems.
ChannelArbitratorConfig
Expand All @@ -81,8 +70,23 @@ type ResolverKit struct {
// should write the state of the resolver to persistent storage, and
// return a non-nil error upon success.
Checkpoint func(ContractResolver) error
}

// contractResolverKit is meant to be used as a mix-in struct to be embedded within a
// given ContractResolver implementation. It contains all the common items that
// a resolver requires to carry out its duties.
type contractResolverKit struct {
ResolverConfig

quit chan struct{}
Comment thread
halseth marked this conversation as resolved.
Outdated
}

Quit chan struct{}
// newContractResolverKit instantiates the mix-in struct.
func newContractResolverKit(cfg ResolverConfig) *contractResolverKit {
return &contractResolverKit{
ResolverConfig: cfg,
quit: make(chan struct{}),
}
}

var (
Expand Down
Loading