channeldb: add new NoFundingTxBit modifier to ChannelType
In this commit, we add a new bit to the existing ChannelType bitfield. If this bit is set, then it signals that we have the funding transaction stored on disk. A future change will enable lnd to have the funding transaction be constructed externally, allowing for things like funding from a hardware wallet, or a channel created as a sub-branch within an existing channel factory.
This commit is contained in:
parent
d59aba35a0
commit
6753a02439
@ -147,6 +147,11 @@ const (
|
|||||||
// type, but it omits the tweak for one's key in the commitment
|
// type, but it omits the tweak for one's key in the commitment
|
||||||
// transaction of the remote party.
|
// transaction of the remote party.
|
||||||
SingleFunderTweaklessBit ChannelType = 1 << 1
|
SingleFunderTweaklessBit ChannelType = 1 << 1
|
||||||
|
|
||||||
|
// NoFundingTxBit denotes if we have the funding transaction locally on
|
||||||
|
// disk. This bit may be on if the funding transaction was crafted by a
|
||||||
|
// wallet external to the primary daemon.
|
||||||
|
NoFundingTxBit ChannelType = 1 << 2
|
||||||
)
|
)
|
||||||
|
|
||||||
// IsSingleFunder returns true if the channel type if one of the known single
|
// IsSingleFunder returns true if the channel type if one of the known single
|
||||||
@ -166,6 +171,12 @@ func (c ChannelType) IsTweakless() bool {
|
|||||||
return c&SingleFunderTweaklessBit == SingleFunderTweaklessBit
|
return c&SingleFunderTweaklessBit == SingleFunderTweaklessBit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HasFundingTx returns true if this channel type is one that has a funding
|
||||||
|
// transaction stored locally.
|
||||||
|
func (c ChannelType) HasFundingTx() bool {
|
||||||
|
return c&NoFundingTxBit == 0
|
||||||
|
}
|
||||||
|
|
||||||
// ChannelConstraints represents a set of constraints meant to allow a node to
|
// ChannelConstraints represents a set of constraints meant to allow a node to
|
||||||
// limit their exposure, enact flow control and ensure that all HTLCs are
|
// limit their exposure, enact flow control and ensure that all HTLCs are
|
||||||
// economically relevant. This struct will be mirrored for both sides of the
|
// economically relevant. This struct will be mirrored for both sides of the
|
||||||
@ -535,7 +546,9 @@ type OpenChannel struct {
|
|||||||
// is found to be pending.
|
// is found to be pending.
|
||||||
//
|
//
|
||||||
// NOTE: This value will only be populated for single-funder channels
|
// NOTE: This value will only be populated for single-funder channels
|
||||||
// for which we are the initiator.
|
// for which we are the initiator, and that we also have the funding
|
||||||
|
// transaction for. One can check this by using the HasFundingTx()
|
||||||
|
// method on the ChanType field.
|
||||||
FundingTxn *wire.MsgTx
|
FundingTxn *wire.MsgTx
|
||||||
|
|
||||||
// TODO(roasbeef): eww
|
// TODO(roasbeef): eww
|
||||||
@ -2522,6 +2535,16 @@ func writeChanConfig(b io.Writer, c *ChannelConfig) error {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fundingTxPresent returns true if expect the funding transcation to be found
|
||||||
|
// on disk or already populated within the passed oen chanel struct.
|
||||||
|
func fundingTxPresent(channel *OpenChannel) bool {
|
||||||
|
chanType := channel.ChanType
|
||||||
|
|
||||||
|
return chanType.IsSingleFunder() && chanType.HasFundingTx() &&
|
||||||
|
channel.IsInitiator &&
|
||||||
|
!channel.hasChanStatus(ChanStatusRestored)
|
||||||
|
}
|
||||||
|
|
||||||
func putChanInfo(chanBucket *bbolt.Bucket, channel *OpenChannel) error {
|
func putChanInfo(chanBucket *bbolt.Bucket, channel *OpenChannel) error {
|
||||||
var w bytes.Buffer
|
var w bytes.Buffer
|
||||||
if err := WriteElements(&w,
|
if err := WriteElements(&w,
|
||||||
@ -2535,10 +2558,9 @@ func putChanInfo(chanBucket *bbolt.Bucket, channel *OpenChannel) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// For single funder channels that we initiated, write the funding txn.
|
// For single funder channels that we initiated, and we have the
|
||||||
if channel.ChanType.IsSingleFunder() && channel.IsInitiator &&
|
// funding transaction, then write the funding txn.
|
||||||
!channel.hasChanStatus(ChanStatusRestored) {
|
if fundingTxPresent(channel) {
|
||||||
|
|
||||||
if err := WriteElement(&w, channel.FundingTxn); err != nil {
|
if err := WriteElement(&w, channel.FundingTxn); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -2657,10 +2679,9 @@ func fetchChanInfo(chanBucket *bbolt.Bucket, channel *OpenChannel) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// For single funder channels that we initiated, read the funding txn.
|
// For single funder channels that we initiated and have the funding
|
||||||
if channel.ChanType.IsSingleFunder() && channel.IsInitiator &&
|
// transaction to, read the funding txn.
|
||||||
!channel.hasChanStatus(ChanStatusRestored) {
|
if fundingTxPresent(channel) {
|
||||||
|
|
||||||
if err := ReadElement(r, &channel.FundingTxn); err != nil {
|
if err := ReadElement(r, &channel.FundingTxn); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user