watchtower: introduce CommitmentType
In this commit a new enum, CommitmentType, is introduced and initially there are 3 CommitmentTypes: Legacy, LegacyTweakless and Anchor. Then, various methods are added to `CommitmentType`. This allows us to remove a bunch of "if-else" chains from the `wtclient` and `lookout` code. This will also make things easier to extend when a new commitment type (like Taproot) is added.
This commit is contained in:
6 files changed
+305
-161
No files matched your search
@@ -264,6 +264,11 @@ func (p *JusticeDescriptor) CreateJusticeTxn() (*wire.MsgTx, error) {
|
||||
weightEstimate input.TxWeightEstimator
|
||||
)
|
||||
|
||||
commitmentType, err := p.SessionInfo.Policy.BlobType.CommitmentType(nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Add the sweep address's contribution, depending on whether it is a
|
||||
// p2wkh or p2wsh output.
|
||||
switch len(p.JusticeKit.SweepAddress) {
|
||||
@@ -290,16 +295,13 @@ func (p *JusticeDescriptor) CreateJusticeTxn() (*wire.MsgTx, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// An older ToLocalPenaltyWitnessSize constant used to underestimate the
|
||||
// size by one byte. The diferrence in weight can cause different output
|
||||
// values on the sweep transaction, so we mimic the original bug to
|
||||
// avoid invalidating signatures by older clients. For anchor channels
|
||||
// we correct this and use the correct witness size.
|
||||
if p.JusticeKit.BlobType.IsAnchorChannel() {
|
||||
weightEstimate.AddWitnessInput(input.ToLocalPenaltyWitnessSize)
|
||||
} else {
|
||||
weightEstimate.AddWitnessInput(input.ToLocalPenaltyWitnessSize - 1)
|
||||
// Get the weight for the to-local witness and add that to the
|
||||
// estimator.
|
||||
toLocalWitnessSize, err := commitmentType.ToLocalWitnessSize()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
weightEstimate.AddWitnessInput(toLocalWitnessSize)
|
||||
|
||||
sweepInputs = append(sweepInputs, toLocalInput)
|
||||
|
||||
@@ -319,11 +321,14 @@ func (p *JusticeDescriptor) CreateJusticeTxn() (*wire.MsgTx, error) {
|
||||
log.Debugf("Found to remote witness output=%#v, stack=%v",
|
||||
toRemoteInput.txOut, toRemoteInput.witness)
|
||||
|
||||
if p.JusticeKit.BlobType.IsAnchorChannel() {
|
||||
weightEstimate.AddWitnessInput(input.ToRemoteConfirmedWitnessSize)
|
||||
} else {
|
||||
weightEstimate.AddWitnessInput(input.P2WKHWitnessSize)
|
||||
// Get the weight for the to-remote witness and add that to the
|
||||
// estimator.
|
||||
toRemoteWitnessSize, err := commitmentType.ToRemoteWitnessSize()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
weightEstimate.AddWitnessInput(toRemoteWitnessSize)
|
||||
}
|
||||
|
||||
// TODO(conner): sweep htlc outputs
|
||||
|
||||
@@ -92,15 +92,13 @@ func testJusticeDescriptor(t *testing.T, blobType blob.Type) {
|
||||
)
|
||||
|
||||
// Parse the key pairs for all keys used in the test.
|
||||
revSK, revPK := btcec.PrivKeyFromBytes(
|
||||
revPrivBytes,
|
||||
)
|
||||
_, toLocalPK := btcec.PrivKeyFromBytes(
|
||||
toLocalPrivBytes,
|
||||
)
|
||||
toRemoteSK, toRemotePK := btcec.PrivKeyFromBytes(
|
||||
toRemotePrivBytes,
|
||||
)
|
||||
revSK, revPK := btcec.PrivKeyFromBytes(revPrivBytes)
|
||||
_, toLocalPK := btcec.PrivKeyFromBytes(toLocalPrivBytes)
|
||||
toRemoteSK, toRemotePK := btcec.PrivKeyFromBytes(toRemotePrivBytes)
|
||||
|
||||
// Get the commitment type.
|
||||
commitType, err := blobType.CommitmentType(nil)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Create the signer, and add the revocation and to-remote privkeys.
|
||||
signer := wtmock.NewMockSigner()
|
||||
@@ -113,11 +111,11 @@ func testJusticeDescriptor(t *testing.T, blobType blob.Type) {
|
||||
toLocalScript, err := input.CommitScriptToSelf(
|
||||
csvDelay, toLocalPK, revPK,
|
||||
)
|
||||
require.Nil(t, err)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Compute the to-local witness script hash.
|
||||
toLocalScriptHash, err := input.WitnessScriptHash(toLocalScript)
|
||||
require.Nil(t, err)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Compute the to-remote redeem script, witness script hash, and
|
||||
// sequence numbers.
|
||||
@@ -147,12 +145,12 @@ func testJusticeDescriptor(t *testing.T, blobType blob.Type) {
|
||||
toRemoteRedeemScript, err = input.CommitScriptToRemoteConfirmed(
|
||||
toRemotePK,
|
||||
)
|
||||
require.Nil(t, err)
|
||||
require.NoError(t, err)
|
||||
|
||||
toRemoteScriptHash, err = input.WitnessScriptHash(
|
||||
toRemoteRedeemScript,
|
||||
)
|
||||
require.Nil(t, err)
|
||||
require.NoError(t, err)
|
||||
|
||||
// As it should be.
|
||||
toRemoteSigningScript = toRemoteRedeemScript
|
||||
@@ -161,7 +159,7 @@ func testJusticeDescriptor(t *testing.T, blobType blob.Type) {
|
||||
toRemoteScriptHash, err = input.CommitScriptUnencumbered(
|
||||
toRemotePK,
|
||||
)
|
||||
require.Nil(t, err)
|
||||
require.NoError(t, err)
|
||||
|
||||
// NOTE: This is the _pkscript_.
|
||||
toRemoteSigningScript = toRemoteScriptHash
|
||||
@@ -188,26 +186,24 @@ func testJusticeDescriptor(t *testing.T, blobType blob.Type) {
|
||||
// Compute the weight estimate for our justice transaction.
|
||||
var weightEstimate input.TxWeightEstimator
|
||||
|
||||
// An older ToLocalPenaltyWitnessSize constant used to underestimate the
|
||||
// size by one byte. The diferrence in weight can cause different output
|
||||
// values on the sweep transaction, so we mimic the original bug and
|
||||
// create signatures using the original weight estimate. For anchor
|
||||
// channels we fix this and use the correct witness size.
|
||||
if isAnchorChannel {
|
||||
weightEstimate.AddWitnessInput(input.ToLocalPenaltyWitnessSize)
|
||||
} else {
|
||||
weightEstimate.AddWitnessInput(input.ToLocalPenaltyWitnessSize - 1)
|
||||
}
|
||||
// Add the local witness size to the weight estimator.
|
||||
toLocalWitnessSize, err := commitType.ToLocalWitnessSize()
|
||||
require.NoError(t, err)
|
||||
weightEstimate.AddWitnessInput(toLocalWitnessSize)
|
||||
|
||||
if isAnchorChannel {
|
||||
weightEstimate.AddWitnessInput(input.ToRemoteConfirmedWitnessSize)
|
||||
} else {
|
||||
weightEstimate.AddWitnessInput(input.P2WKHWitnessSize)
|
||||
}
|
||||
// Add the remote witness size to the weight estimator.
|
||||
toRemoteWitnessSize, err := commitType.ToRemoteWitnessSize()
|
||||
require.NoError(t, err)
|
||||
weightEstimate.AddWitnessInput(toRemoteWitnessSize)
|
||||
|
||||
// Add the sweep output to the weight estimator.
|
||||
weightEstimate.AddP2WKHOutput()
|
||||
|
||||
// Add the reward output to the weight estimator.
|
||||
if blobType.Has(blob.FlagReward) {
|
||||
weightEstimate.AddP2WKHOutput()
|
||||
}
|
||||
|
||||
txWeight := weightEstimate.Weight()
|
||||
|
||||
// Create a session info so that simulate agreement of the sweep
|
||||
@@ -263,7 +259,7 @@ func testJusticeDescriptor(t *testing.T, blobType blob.Type) {
|
||||
totalAmount, int64(txWeight), justiceKit.SweepAddress,
|
||||
sessionInfo.RewardAddress,
|
||||
)
|
||||
require.Nil(t, err)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Attach the txouts and BIP69 sort the resulting transaction.
|
||||
justiceTxn.TxOut = outputs
|
||||
|
||||
Reference in new issue
Block a user