Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
chanbackup: create new Single version for tweakless commitment chans
In this commit, we create a new Single version for channels that use the
tweakless commitment scheme. When recovering from an SCB into an open
channel shell, we'll now check this field and use it to determine the
proper channel type. Otherwise, we may attempt to sweep the on chain
funds using the commitment point, when it goes directly to our key, or
the other way around.
  • Loading branch information
Roasbeef committed Sep 18, 2019
1 parent 5beed2f commit f9e440d
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 5 deletions.
22 changes: 18 additions & 4 deletions chanbackup/single.go
Expand Up @@ -21,11 +21,16 @@ import (
type SingleBackupVersion byte

const (
// DefaultSingleVersion is the defautl version of the single channel
// backup. The seralized version of this static channel backup is
// DefaultSingleVersion is the default version of the single channel
// backup. The serialized version of this static channel backup is
// simply: version || SCB. Where SCB is the known format of the
// version.
DefaultSingleVersion = 0

// TweaklessCommitVersion is the second SCB version. This version
// implicitly denotes that this channel uses the new tweakless commit
// format.
TweaklessCommitVersion = 1
)

// Single is a static description of an existing channel that can be used for
Expand Down Expand Up @@ -121,8 +126,7 @@ func NewSingle(channel *channeldb.OpenChannel,
// key.
_, shaChainPoint := btcec.PrivKeyFromBytes(btcec.S256(), b.Bytes())

return Single{
Version: DefaultSingleVersion,
single := Single{
IsInitiator: channel.IsInitiator,
ChainHash: channel.ChainHash,
FundingOutpoint: channel.FundingOutpoint,
Expand All @@ -139,6 +143,14 @@ func NewSingle(channel *channeldb.OpenChannel,
},
},
}

if !channel.ChanType.IsTweakless() {
single.Version = DefaultSingleVersion
} else {
single.Version = TweaklessCommitVersion
}

return single
}

// Serialize attempts to write out the serialized version of the target
Expand All @@ -148,6 +160,7 @@ func (s *Single) Serialize(w io.Writer) error {
// we're aware of.
switch s.Version {
case DefaultSingleVersion:
case TweaklessCommitVersion:
default:
return fmt.Errorf("unable to serialize w/ unknown "+
"version: %v", s.Version)
Expand Down Expand Up @@ -305,6 +318,7 @@ func (s *Single) Deserialize(r io.Reader) error {

switch s.Version {
case DefaultSingleVersion:
case TweaklessCommitVersion:
default:
return fmt.Errorf("unable to de-serialize w/ unknown "+
"version: %v", s.Version)
Expand Down
14 changes: 13 additions & 1 deletion chanbackup/single_test.go
Expand Up @@ -124,8 +124,14 @@ func genRandomOpenChannelShell() (*channeldb.OpenChannel, error) {
isInitiator = true
}

var chanType channeldb.ChannelType
if rand.Int63()%2 == 0 {
chanType = channeldb.SingleFunderTweakless
}

return &channeldb.OpenChannel{
ChainHash: chainHash,
ChanType: chanType,
IsInitiator: isInitiator,
FundingOutpoint: chanPoint,
ShortChannelID: lnwire.NewShortChanIDFromInt(
Expand Down Expand Up @@ -223,6 +229,12 @@ func TestSinglePackUnpack(t *testing.T) {
valid: true,
},

// The new tweakless version, should pack/unpack with no problem.
{
version: TweaklessCommitVersion,
valid: true,
},

// A non-default version, atm this should result in a failure.
{
version: 99,
Expand Down Expand Up @@ -274,7 +286,7 @@ func TestSinglePackUnpack(t *testing.T) {
}

rawBytes := rawSingle.Bytes()
rawBytes[0] ^= 1
rawBytes[0] ^= 5

newReader := bytes.NewReader(rawBytes)
err = unpackedSingle.Deserialize(newReader)
Expand Down
14 changes: 14 additions & 0 deletions chanrestore.go
Expand Up @@ -83,9 +83,23 @@ func (c *chanDBRestorer) openChannelShell(backup chanbackup.Single) (
return nil, fmt.Errorf("unable to derive htlc key: %v", err)
}

var chanType channeldb.ChannelType
switch backup.Version {

case chanbackup.DefaultSingleVersion:
chanType = channeldb.SingleFunder

case chanbackup.TweaklessCommitVersion:
chanType = channeldb.SingleFunderTweakless

default:
return nil, fmt.Errorf("unknown Single version: %v", err)
}

chanShell := channeldb.ChannelShell{
NodeAddrs: backup.Addresses,
Chan: &channeldb.OpenChannel{
ChanType: chanType,
ChainHash: backup.ChainHash,
IsInitiator: backup.IsInitiator,
Capacity: backup.Capacity,
Expand Down

0 comments on commit f9e440d

Please sign in to comment.