lnwallet: add new methods to ChannelReservation for dealing w/ chan constraints

This commit adds to methods to the ChannelReservation struct: one for
generating the channel constraints we require for the remote party, and
one for validating their desired constraints, and committing them to
our ChannelConfig.

With these two new methods, we can now begin to properly store and
adhere to the current set of channel flow control constraints.
This commit is contained in:
Olaoluwa Osuntokun 2017-09-12 17:41:40 +02:00
parent 5bb3efba4c
commit 5359476936
No known key found for this signature in database
GPG Key ID: 964EA263DD637C21
2 changed files with 46 additions and 10 deletions

@ -261,7 +261,8 @@ func testDualFundingReservationWorkflow(miner *rpctest.Harness,
t.Fatalf("unable to initialize funding reservation: %v", err) t.Fatalf("unable to initialize funding reservation: %v", err)
} }
aliceChanReservation.SetNumConfsRequired(numReqConfs) aliceChanReservation.SetNumConfsRequired(numReqConfs)
aliceChanReservation.RequireLocalDelay(csvDelay) aliceChanReservation.CommitConstraints(csvDelay, lnwallet.MaxHTLCNumber/2,
lnwire.NewMSatFromSatoshis(fundingAmount), 10)
// The channel reservation should now be populated with a multi-sig key // The channel reservation should now be populated with a multi-sig key
// from our HD chain, a change output with 3 BTC, and 2 outputs // from our HD chain, a change output with 3 BTC, and 2 outputs
@ -283,7 +284,8 @@ func testDualFundingReservationWorkflow(miner *rpctest.Harness,
if err != nil { if err != nil {
t.Fatalf("bob unable to init channel reservation: %v", err) t.Fatalf("bob unable to init channel reservation: %v", err)
} }
bobChanReservation.RequireLocalDelay(csvDelay) bobChanReservation.CommitConstraints(csvDelay, lnwallet.MaxHTLCNumber/2,
lnwire.NewMSatFromSatoshis(fundingAmount), 10)
bobChanReservation.SetNumConfsRequired(numReqConfs) bobChanReservation.SetNumConfsRequired(numReqConfs)
assertContributionInitPopulated(t, bobChanReservation.OurContribution()) assertContributionInitPopulated(t, bobChanReservation.OurContribution())
@ -551,7 +553,8 @@ func testSingleFunderReservationWorkflow(miner *rpctest.Harness,
t.Fatalf("unable to init channel reservation: %v", err) t.Fatalf("unable to init channel reservation: %v", err)
} }
aliceChanReservation.SetNumConfsRequired(numReqConfs) aliceChanReservation.SetNumConfsRequired(numReqConfs)
aliceChanReservation.RequireLocalDelay(csvDelay) aliceChanReservation.CommitConstraints(csvDelay, lnwallet.MaxHTLCNumber/2,
lnwire.NewMSatFromSatoshis(fundingAmt), 10)
// Verify all contribution fields have been set properly. // Verify all contribution fields have been set properly.
aliceContribution := aliceChanReservation.OurContribution() aliceContribution := aliceChanReservation.OurContribution()
@ -573,7 +576,8 @@ func testSingleFunderReservationWorkflow(miner *rpctest.Harness,
if err != nil { if err != nil {
t.Fatalf("unable to create bob reservation: %v", err) t.Fatalf("unable to create bob reservation: %v", err)
} }
bobChanReservation.RequireLocalDelay(csvDelay) bobChanReservation.CommitConstraints(csvDelay, lnwallet.MaxHTLCNumber/2,
lnwire.NewMSatFromSatoshis(fundingAmt), 10)
bobChanReservation.SetNumConfsRequired(numReqConfs) bobChanReservation.SetNumConfsRequired(numReqConfs)
// We'll ensure that Bob's contribution also gets generated properly. // We'll ensure that Bob's contribution also gets generated properly.

@ -236,16 +236,48 @@ func (r *ChannelReservation) SetNumConfsRequired(numConfs uint16) {
r.partialState.NumConfsRequired = numConfs r.partialState.NumConfsRequired = numConfs
} }
// RequireLocalDelay sets the mandatory CSV delay that MUST be used when // CommitConstraints takes the constraints that the remote party specifies for
// creating the local commitment transaction. This is distinct from the normal // the type of commitments that we can generate for them. These constraints
// reservation workflow as the remote party will dictate this value for us. // include several parameters that serve as flow control restricting the amount
// // of satoshis that can be transferred in a single commitment. This function
// TODO(roasbeef): abstract out dictation of params remote side gives // will also attempt to verify the constraints for sanity, returning an error
func (r *ChannelReservation) RequireLocalDelay(csvDelay uint16) { // if the parameters are seemed unsound.
func (r *ChannelReservation) CommitConstraints(csvDelay, maxHtlcs uint16,
maxValueInFlight lnwire.MilliSatoshi, chanReserve btcutil.Amount) error {
r.Lock() r.Lock()
defer r.Unlock() defer r.Unlock()
r.ourContribution.ChannelConfig.CsvDelay = csvDelay r.ourContribution.ChannelConfig.CsvDelay = csvDelay
r.ourContribution.ChannelConfig.ChanReserve = chanReserve
r.ourContribution.ChannelConfig.MaxAcceptedHtlcs = maxHtlcs
r.ourContribution.ChannelConfig.MaxPendingAmount = maxValueInFlight
return nil
}
// RemoteChanConstraints returns our desired parameters which constraint the
// type of commitment transactions that the remote party can extend for our
// current state. In order to ensure that we only accept sane states, we'll
// specify: the required reserve the remote party must uphold, the max value in
// flight, and the maximum number of HTLC's that can propose in a state.
func (r *ChannelReservation) RemoteChanConstraints() (btcutil.Amount, lnwire.MilliSatoshi, uint16) {
chanCapacity := r.partialState.Capacity
// TODO(roasbeef): move csv delay calculation into func?
// By default, we'll require them to maintain at least 1% of thee total
// channel capacity at all times.
chanReserve := (chanCapacity + 99) / 100
// We'll allow them to fully utilize the full bandwidth of the channel,
// minus our required reserve.
maxValue := lnwire.NewMSatFromSatoshis(chanCapacity - chanReserve)
// Finally, we'll permit them to utilize the full channel bandwidth
maxHTLCs := uint16(MaxHTLCNumber / 2)
return chanReserve, maxValue, maxHTLCs
} }
// OurContribution returns the wallet's fully populated contribution to the // OurContribution returns the wallet's fully populated contribution to the