cnct: add new from reader resolver initializers

This commit is contained in:
Joost Jager 2019-11-01 10:24:33 +01:00
parent ff63a680a1
commit 1e5eec990e
No known key found for this signature in database
GPG Key ID: A61B9D4C393C59C7
6 changed files with 96 additions and 81 deletions

View File

@ -469,54 +469,38 @@ func (b *boltArbitratorLog) FetchUnresolvedContracts() ([]ContractResolver, erro
switch resType { switch resType {
case resolverTimeout: case resolverTimeout:
timeoutRes := &htlcTimeoutResolver{} res, err = newTimeoutResolverFromReader(
if err := timeoutRes.Decode(resReader); err != nil { resReader, resolverCfg,
return err )
}
res = timeoutRes
case resolverSuccess: case resolverSuccess:
successRes := &htlcSuccessResolver{} res, err = newSuccessResolverFromReader(
if err := successRes.Decode(resReader); err != nil { resReader, resolverCfg,
return err )
}
res = successRes
case resolverOutgoingContest: case resolverOutgoingContest:
outContestRes := &htlcOutgoingContestResolver{ res, err = newOutgoingContestResolverFromReader(
htlcTimeoutResolver: htlcTimeoutResolver{}, resReader, resolverCfg,
} )
if err := outContestRes.Decode(resReader); err != nil {
return err
}
res = outContestRes
case resolverIncomingContest: case resolverIncomingContest:
inContestRes := &htlcIncomingContestResolver{ res, err = newIncomingContestResolverFromReader(
htlcSuccessResolver: htlcSuccessResolver{}, resReader, resolverCfg,
} )
if err := inContestRes.Decode(resReader); err != nil {
return err
}
res = inContestRes
case resolverUnilateralSweep: case resolverUnilateralSweep:
sweepRes := &commitSweepResolver{} res, err = newCommitSweepResolverFromReader(
if err := sweepRes.Decode(resReader); err != nil { resReader, resolverCfg,
return err )
}
res = sweepRes
default: default:
return fmt.Errorf("unknown resolver type: %v", resType) return fmt.Errorf("unknown resolver type: %v", resType)
} }
res.AttachConfig(resolverCfg) if err != nil {
return err
}
contracts = append(contracts, res) contracts = append(contracts, res)
return nil return nil
}) })

View File

@ -262,35 +262,40 @@ func (c *commitSweepResolver) Encode(w io.Writer) error {
return nil return nil
} }
// Decode attempts to decode an encoded ContractResolver from the passed Reader // newCommitSweepResolverFromReader attempts to decode an encoded
// instance, returning an active ContractResolver instance. // ContractResolver from the passed Reader instance, returning an active
// // ContractResolver instance.
// NOTE: Part of the ContractResolver interface. func newCommitSweepResolverFromReader(r io.Reader, resCfg ResolverConfig) (
func (c *commitSweepResolver) Decode(r io.Reader) error { *commitSweepResolver, error) {
c := &commitSweepResolver{
contractResolverKit: *newContractResolverKit(resCfg),
}
if err := decodeCommitResolution(r, &c.commitResolution); err != nil { if err := decodeCommitResolution(r, &c.commitResolution); err != nil {
return err return nil, err
} }
if err := binary.Read(r, endian, &c.resolved); err != nil { 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 { if err := binary.Read(r, endian, &c.broadcastHeight); err != nil {
return err return nil, err
} }
_, err := io.ReadFull(r, c.chanPoint.Hash[:]) _, err := io.ReadFull(r, c.chanPoint.Hash[:])
if err != nil { if err != nil {
return err return nil, err
} }
err = binary.Read(r, endian, &c.chanPoint.Index) err = binary.Read(r, endian, &c.chanPoint.Index)
if err != nil { if err != nil {
return err return nil, err
} }
// Previously a sweep tx was deserialized at this point. Refactoring // Previously a sweep tx was deserialized at this point. Refactoring
// removed this, but keep in mind that this data may still be present in // removed this, but keep in mind that this data may still be present in
// the database. // the database.
return nil return c, nil
} }
// AttachConfig should be called once a resolved is successfully decoded from // AttachConfig should be called once a resolved is successfully decoded from

View File

@ -296,18 +296,27 @@ func (h *htlcIncomingContestResolver) Encode(w io.Writer) error {
return h.htlcSuccessResolver.Encode(w) return h.htlcSuccessResolver.Encode(w)
} }
// Decode attempts to decode an encoded ContractResolver from the passed Reader // newIncomingContestResolverFromReader attempts to decode an encoded ContractResolver
// instance, returning an active ContractResolver instance. // from the passed Reader instance, returning an active ContractResolver
// // instance.
// NOTE: Part of the ContractResolver interface. func newIncomingContestResolverFromReader(r io.Reader, resCfg ResolverConfig) (
func (h *htlcIncomingContestResolver) Decode(r io.Reader) error { *htlcIncomingContestResolver, error) {
h := &htlcIncomingContestResolver{}
// We'll first read the one field unique to this resolver. // We'll first read the one field unique to this resolver.
if err := binary.Read(r, endian, &h.htlcExpiry); err != nil { if err := binary.Read(r, endian, &h.htlcExpiry); err != nil {
return err return nil, err
} }
// Then we'll decode our internal resolver. // Then we'll decode our internal resolver.
return h.htlcSuccessResolver.Decode(r) successResolver, err := newSuccessResolverFromReader(r, resCfg)
if err != nil {
return nil, err
}
h.htlcSuccessResolver = *successResolver
return h, nil
} }
// AttachConfig should be called once a resolved is successfully decoded from // AttachConfig should be called once a resolved is successfully decoded from

View File

@ -181,12 +181,19 @@ func (h *htlcOutgoingContestResolver) Encode(w io.Writer) error {
return h.htlcTimeoutResolver.Encode(w) return h.htlcTimeoutResolver.Encode(w)
} }
// Decode attempts to decode an encoded ContractResolver from the passed Reader // newOutgoingContestResolverFromReader attempts to decode an encoded ContractResolver
// instance, returning an active ContractResolver instance. // from the passed Reader instance, returning an active ContractResolver
// // instance.
// NOTE: Part of the ContractResolver interface. func newOutgoingContestResolverFromReader(r io.Reader, resCfg ResolverConfig) (
func (h *htlcOutgoingContestResolver) Decode(r io.Reader) error { *htlcOutgoingContestResolver, error) {
return h.htlcTimeoutResolver.Decode(r)
h := &htlcOutgoingContestResolver{}
timeoutResolver, err := newTimeoutResolverFromReader(r, resCfg)
if err != nil {
return nil, err
}
h.htlcTimeoutResolver = *timeoutResolver
return h, nil
} }
// AttachConfig should be called once a resolved is successfully decoded from // AttachConfig should be called once a resolved is successfully decoded from

View File

@ -290,32 +290,37 @@ func (h *htlcSuccessResolver) Encode(w io.Writer) error {
return nil return nil
} }
// Decode attempts to decode an encoded ContractResolver from the passed Reader // newSuccessResolverFromReader attempts to decode an encoded ContractResolver
// instance, returning an active ContractResolver instance. // from the passed Reader instance, returning an active ContractResolver
// // instance.
// NOTE: Part of the ContractResolver interface. func newSuccessResolverFromReader(r io.Reader, resCfg ResolverConfig) (
func (h *htlcSuccessResolver) Decode(r io.Reader) error { *htlcSuccessResolver, error) {
h := &htlcSuccessResolver{
contractResolverKit: *newContractResolverKit(resCfg),
}
// First we'll decode our inner HTLC resolution. // First we'll decode our inner HTLC resolution.
if err := decodeIncomingResolution(r, &h.htlcResolution); err != nil { if err := decodeIncomingResolution(r, &h.htlcResolution); err != nil {
return err return nil, err
} }
// Next, we'll read all the fields that are specified to the contract // Next, we'll read all the fields that are specified to the contract
// resolver. // resolver.
if err := binary.Read(r, endian, &h.outputIncubating); err != nil { if err := binary.Read(r, endian, &h.outputIncubating); err != nil {
return err return nil, err
} }
if err := binary.Read(r, endian, &h.resolved); err != nil { if err := binary.Read(r, endian, &h.resolved); err != nil {
return err return nil, err
} }
if err := binary.Read(r, endian, &h.broadcastHeight); err != nil { if err := binary.Read(r, endian, &h.broadcastHeight); err != nil {
return err return nil, err
} }
if _, err := io.ReadFull(r, h.payHash[:]); err != nil { if _, err := io.ReadFull(r, h.payHash[:]); err != nil {
return err return nil, err
} }
return nil return h, nil
} }
// AttachConfig should be called once a resolved is successfully decoded from // AttachConfig should be called once a resolved is successfully decoded from

View File

@ -406,34 +406,39 @@ func (h *htlcTimeoutResolver) Encode(w io.Writer) error {
return nil return nil
} }
// Decode attempts to decode an encoded ContractResolver from the passed Reader // newTimeoutResolverFromReader attempts to decode an encoded ContractResolver
// instance, returning an active ContractResolver instance. // from the passed Reader instance, returning an active ContractResolver
// // instance.
// NOTE: Part of the ContractResolver interface. func newTimeoutResolverFromReader(r io.Reader, resCfg ResolverConfig) (
func (h *htlcTimeoutResolver) Decode(r io.Reader) error { *htlcTimeoutResolver, error) {
h := &htlcTimeoutResolver{
contractResolverKit: *newContractResolverKit(resCfg),
}
// First, we'll read out all the mandatory fields of the // First, we'll read out all the mandatory fields of the
// OutgoingHtlcResolution that we store. // OutgoingHtlcResolution that we store.
if err := decodeOutgoingResolution(r, &h.htlcResolution); err != nil { if err := decodeOutgoingResolution(r, &h.htlcResolution); err != nil {
return err return nil, err
} }
// With those fields read, we can now read back the fields that are // With those fields read, we can now read back the fields that are
// specific to the resolver itself. // specific to the resolver itself.
if err := binary.Read(r, endian, &h.outputIncubating); err != nil { if err := binary.Read(r, endian, &h.outputIncubating); err != nil {
return err return nil, err
} }
if err := binary.Read(r, endian, &h.resolved); err != nil { if err := binary.Read(r, endian, &h.resolved); err != nil {
return err return nil, err
} }
if err := binary.Read(r, endian, &h.broadcastHeight); err != nil { if err := binary.Read(r, endian, &h.broadcastHeight); err != nil {
return err return nil, err
} }
if err := binary.Read(r, endian, &h.htlcIndex); err != nil { if err := binary.Read(r, endian, &h.htlcIndex); err != nil {
return err return nil, err
} }
return nil return h, nil
} }
// AttachConfig should be called once a resolved is successfully decoded from // AttachConfig should be called once a resolved is successfully decoded from