From 5d6b8e49a3678db0cd694eaf6c54d8b1e63a3b6b Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Sun, 23 Oct 2016 18:42:03 -0700 Subject: [PATCH] lnwallet: disallow creating a funding reservation with zero total satoshis --- lnwallet/reservation.go | 10 +++++++++- lnwallet/wallet.go | 30 +++++++++++++++++++----------- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/lnwallet/reservation.go b/lnwallet/reservation.go index 39ba76e2..e86ee874 100644 --- a/lnwallet/reservation.go +++ b/lnwallet/reservation.go @@ -140,17 +140,25 @@ func NewChannelReservation(capacity, fundingAmt btcutil.Amount, minFeeRate btcut var ourBalance btcutil.Amount var theirBalance btcutil.Amount + // If we're the responder to a single-funder reservation, then we have + // no initial balance in the channel. if fundingAmt == 0 { ourBalance = 0 theirBalance = capacity - commitFee } else { // TODO(roasbeef): need to rework fee structure in general and // also when we "unlock" dual funder within the daemon - if capacity == fundingAmt+commitFee { // Single funder + + // If we're initiating a single funder workflow, then we pay + // all the initial fees within the commitment transaction. + if capacity == fundingAmt+commitFee { ourBalance = capacity - commitFee + // Otherwise, this is a dual funder workflow where both slides + // split the amount funded and the commitment fee. } else { ourBalance = fundingAmt - commitFee } + theirBalance = capacity - fundingAmt - commitFee } diff --git a/lnwallet/wallet.go b/lnwallet/wallet.go index 862dbcbb..deb997b3 100644 --- a/lnwallet/wallet.go +++ b/lnwallet/wallet.go @@ -495,6 +495,14 @@ func (l *LightningWallet) InitChannelReservation(capacity, // handleFundingReserveRequest processes a message intending to create, and // validate a funding reservation request. func (l *LightningWallet) handleFundingReserveRequest(req *initFundingReserveMsg) { + // It isn't possible to create a channel with zero funds committed. + if req.fundingAmount+req.capacity == 0 { + req.err <- fmt.Errorf("cannot have channel with zero " + + "satoshis funded") + req.resp <- nil + return + } + id := atomic.AddUint64(&l.nextFundingID, 1) totalCapacity := req.capacity + commitFee reservation := NewChannelReservation(totalCapacity, req.fundingAmount, @@ -612,11 +620,11 @@ func (l *LightningWallet) handleFundingCancelRequest(req *fundingReserveCancelMs req.err <- nil } -// handleFundingCounterPartyFunds processes the second workflow step for the -// lifetime of a channel reservation. Upon completion, the reservation will -// carry a completed funding transaction (minus the counterparty's input -// signatures), both versions of the commitment transaction, and our signature -// for their version of the commitment transaction. +// handleContributionMsg processes the second workflow step for the lifetime of +// a channel reservation. Upon completion, the reservation will carry a +// completed funding transaction (minus the counterparty's input signatures), +// both versions of the commitment transaction, and our signature for their +// version of the commitment transaction. func (l *LightningWallet) handleContributionMsg(req *addContributionMsg) { l.limboMtx.Lock() pendingReservation, ok := l.fundingLimbo[req.pendingFundingID] @@ -793,11 +801,11 @@ func (l *LightningWallet) handleContributionMsg(req *addContributionMsg) { // transaction. signDesc = SignDescriptor{ WitnessScript: witnessScript, - PubKey: ourKey, - Output: multiSigOut, - HashType: txscript.SigHashAll, - SigHashes: txscript.NewTxSigHashes(theirCommitTx), - InputIndex: 0, + PubKey: ourKey, + Output: multiSigOut, + HashType: txscript.SigHashAll, + SigHashes: txscript.NewTxSigHashes(theirCommitTx), + InputIndex: 0, } sigTheirCommit, err := l.Signer.SignOutputRaw(theirCommitTx, &signDesc) if err != nil { @@ -1101,7 +1109,7 @@ func (l *LightningWallet) handleSingleFunderSigs(req *addSingleFunderSigsMsg) { } signDesc := SignDescriptor{ WitnessScript: witnessScript, - PubKey: ourKey, + PubKey: ourKey, Output: &wire.TxOut{ PkScript: p2wsh, Value: channelValue,