mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-02-22 14:22:37 +01:00
channeldb: ensure restored channels can't be mutated
This commit is contained in:
parent
4fd1f832d7
commit
480ec3bbca
2 changed files with 42 additions and 0 deletions
|
@ -102,6 +102,11 @@ var (
|
||||||
// ErrNoCommitPoint is returned when no data loss commit point is found
|
// ErrNoCommitPoint is returned when no data loss commit point is found
|
||||||
// in the database.
|
// in the database.
|
||||||
ErrNoCommitPoint = fmt.Errorf("no commit point found")
|
ErrNoCommitPoint = fmt.Errorf("no commit point found")
|
||||||
|
|
||||||
|
// ErrNoRestoredChannelMutation is returned when a caller attempts to
|
||||||
|
// mutate a channel that's been recovered.
|
||||||
|
ErrNoRestoredChannelMutation = fmt.Errorf("cannot mutate restored " +
|
||||||
|
"channel state")
|
||||||
)
|
)
|
||||||
|
|
||||||
// ChannelType is an enum-like type that describes one of several possible
|
// ChannelType is an enum-like type that describes one of several possible
|
||||||
|
@ -958,6 +963,13 @@ func (c *OpenChannel) UpdateCommitment(newCommitment *ChannelCommitment) error {
|
||||||
c.Lock()
|
c.Lock()
|
||||||
defer c.Unlock()
|
defer c.Unlock()
|
||||||
|
|
||||||
|
// If this is a restored channel, then we want to avoid mutating the
|
||||||
|
// state as all, as it's impossible to do so in a protocol compliant
|
||||||
|
// manner.
|
||||||
|
if c.hasChanStatus(ChanStatusRestored) {
|
||||||
|
return ErrNoRestoredChannelMutation
|
||||||
|
}
|
||||||
|
|
||||||
err := c.Db.Update(func(tx *bbolt.Tx) error {
|
err := c.Db.Update(func(tx *bbolt.Tx) error {
|
||||||
chanBucket, err := fetchChanBucket(
|
chanBucket, err := fetchChanBucket(
|
||||||
tx, c.IdentityPub, &c.FundingOutpoint, c.ChainHash,
|
tx, c.IdentityPub, &c.FundingOutpoint, c.ChainHash,
|
||||||
|
@ -1379,6 +1391,13 @@ func (c *OpenChannel) AppendRemoteCommitChain(diff *CommitDiff) error {
|
||||||
c.Lock()
|
c.Lock()
|
||||||
defer c.Unlock()
|
defer c.Unlock()
|
||||||
|
|
||||||
|
// If this is a restored channel, then we want to avoid mutating the
|
||||||
|
// state as all, as it's impossible to do so in a protocol compliant
|
||||||
|
// manner.
|
||||||
|
if c.hasChanStatus(ChanStatusRestored) {
|
||||||
|
return ErrNoRestoredChannelMutation
|
||||||
|
}
|
||||||
|
|
||||||
return c.Db.Update(func(tx *bbolt.Tx) error {
|
return c.Db.Update(func(tx *bbolt.Tx) error {
|
||||||
// First, we'll grab the writable bucket where this channel's
|
// First, we'll grab the writable bucket where this channel's
|
||||||
// data resides.
|
// data resides.
|
||||||
|
@ -1503,6 +1522,13 @@ func (c *OpenChannel) AdvanceCommitChainTail(fwdPkg *FwdPkg) error {
|
||||||
c.Lock()
|
c.Lock()
|
||||||
defer c.Unlock()
|
defer c.Unlock()
|
||||||
|
|
||||||
|
// If this is a restored channel, then we want to avoid mutating the
|
||||||
|
// state as all, as it's impossible to do so in a protocol compliant
|
||||||
|
// manner.
|
||||||
|
if c.hasChanStatus(ChanStatusRestored) {
|
||||||
|
return ErrNoRestoredChannelMutation
|
||||||
|
}
|
||||||
|
|
||||||
var newRemoteCommit *ChannelCommitment
|
var newRemoteCommit *ChannelCommitment
|
||||||
|
|
||||||
err := c.Db.Update(func(tx *bbolt.Tx) error {
|
err := c.Db.Update(func(tx *bbolt.Tx) error {
|
||||||
|
|
|
@ -395,6 +395,22 @@ func TestRestoreChannelShells(t *testing.T) {
|
||||||
"pubkey: %v", err)
|
"pubkey: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ensure that it isn't possible to modify the commitment state machine
|
||||||
|
// of this restored channel.
|
||||||
|
channel := nodeChans[0]
|
||||||
|
err = channel.UpdateCommitment(nil)
|
||||||
|
if err != ErrNoRestoredChannelMutation {
|
||||||
|
t.Fatalf("able to mutate restored channel")
|
||||||
|
}
|
||||||
|
err = channel.AppendRemoteCommitChain(nil)
|
||||||
|
if err != ErrNoRestoredChannelMutation {
|
||||||
|
t.Fatalf("able to mutate restored channel")
|
||||||
|
}
|
||||||
|
err = channel.AdvanceCommitChainTail(nil)
|
||||||
|
if err != ErrNoRestoredChannelMutation {
|
||||||
|
t.Fatalf("able to mutate restored channel")
|
||||||
|
}
|
||||||
|
|
||||||
// That single channel should have the proper channel point, and also
|
// That single channel should have the proper channel point, and also
|
||||||
// the expected set of flags to indicate that it was a restored
|
// the expected set of flags to indicate that it was a restored
|
||||||
// channel.
|
// channel.
|
||||||
|
|
Loading…
Add table
Reference in a new issue