github.com/decred/dcrlnd@v0.7.6/input/size_test.go (about)

     1  package input_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/decred/dcrd/chaincfg/chainhash"
     7  	"github.com/decred/dcrd/chaincfg/v3"
     8  	"github.com/decred/dcrd/dcrec/secp256k1/v4"
     9  	"github.com/decred/dcrd/dcrutil/v4"
    10  	"github.com/decred/dcrd/txscript/v4"
    11  	"github.com/decred/dcrd/txscript/v4/stdaddr"
    12  	"github.com/decred/dcrd/wire"
    13  	"github.com/decred/dcrlnd/channeldb"
    14  	"github.com/decred/dcrlnd/input"
    15  	"github.com/decred/dcrlnd/keychain"
    16  	"github.com/decred/dcrlnd/lnwallet"
    17  	"github.com/stretchr/testify/require"
    18  )
    19  
    20  const (
    21  	// A CSV int may be up to 5 bytes long, so test with the max uint32.
    22  	testCSVDelay = (1 << 32) - 1
    23  
    24  	testCLTVExpiry = 500000000
    25  
    26  	// maxDERSignatureSize is the largest possible DER-encoded signature
    27  	// without the trailing sighash flag.
    28  	maxDERSignatureSize = 72
    29  
    30  	testAmt = dcrutil.MaxAmount
    31  )
    32  
    33  var (
    34  	testPubkeyBytes = make([]byte, 33)
    35  
    36  	testHash160  = make([]byte, 20)
    37  	testPreimage = make([]byte, 32)
    38  
    39  	testPrivkey = secp256k1.PrivKeyFromBytes(make([]byte, 32))
    40  	testPubkey  = testPrivkey.PubKey()
    41  
    42  	testTx = wire.NewMsgTx()
    43  
    44  	testOutPoint = wire.OutPoint{
    45  		Hash:  chainhash.Hash{},
    46  		Index: 1,
    47  	}
    48  )
    49  
    50  func init() {
    51  	testTx.Version = 2
    52  }
    53  
    54  // TestTxSizeEstimator tests that transaction size estimates are calculated
    55  // correctly by comparing against an actual (though invalid) transaction
    56  // matching the template.
    57  func TestTxSizeEstimator(t *testing.T) {
    58  	netParams := chaincfg.MainNetParams()
    59  
    60  	// Static test data.
    61  	var nullData [73]byte
    62  
    63  	p2pkhAddr, err := stdaddr.NewAddressPubKeyHashEcdsaSecp256k1V0(
    64  		nullData[:20], netParams)
    65  	if err != nil {
    66  		t.Fatalf("Failed to generate address: %v", err)
    67  	}
    68  	p2pkhPkScript, err := input.PayToAddrScript(p2pkhAddr)
    69  	if err != nil {
    70  		t.Fatalf("Failed to generate scriptPubKey: %v", err)
    71  	}
    72  
    73  	signature := nullData[:73]
    74  	compressedPubKey := nullData[:33]
    75  	p2pkhSigScript, err := txscript.NewScriptBuilder().AddData(signature).
    76  		AddData(compressedPubKey).Script()
    77  	if err != nil {
    78  		t.Fatalf("Failed to generate p2pkhSigScript: %v", err)
    79  	}
    80  
    81  	p2shAddr, err := stdaddr.NewAddressScriptHashV0FromHash(nullData[:20], netParams)
    82  	if err != nil {
    83  		t.Fatalf("Failed to generate address: %v", err)
    84  	}
    85  	p2shPkScript, err := input.PayToAddrScript(p2shAddr)
    86  	if err != nil {
    87  		t.Fatalf("Failed to generate scriptPubKey: %v", err)
    88  	}
    89  	p2shRedeemScript := nullData[:71] // 2-of-2 multisig
    90  	p2shSigScript, err := txscript.NewScriptBuilder().AddData(signature).
    91  		AddData(signature).AddData(p2shRedeemScript).Script()
    92  	if err != nil {
    93  		t.Fatalf("Failed to generate ps2shSigScript: %v", err)
    94  	}
    95  
    96  	testCases := []struct {
    97  		numP2PKHInputs  int
    98  		numP2SHInputs   int
    99  		numP2PKHOutputs int
   100  		numP2SHOutputs  int
   101  	}{
   102  		{
   103  			numP2PKHInputs:  1,
   104  			numP2PKHOutputs: 2,
   105  		},
   106  		{
   107  			numP2PKHInputs: 1,
   108  			numP2SHOutputs: 1,
   109  		},
   110  		{
   111  			numP2SHInputs:   1,
   112  			numP2PKHOutputs: 1,
   113  		},
   114  		{
   115  			numP2SHInputs:  1,
   116  			numP2SHOutputs: 1,
   117  		},
   118  		{
   119  			numP2SHInputs:   1,
   120  			numP2PKHOutputs: 1,
   121  			numP2SHOutputs:  2,
   122  		},
   123  		{
   124  			numP2SHInputs:   253,
   125  			numP2PKHOutputs: 1,
   126  			numP2SHOutputs:  1,
   127  		},
   128  		{
   129  			numP2SHInputs:   1,
   130  			numP2PKHOutputs: 253,
   131  			numP2SHOutputs:  1,
   132  		},
   133  		{
   134  			numP2SHInputs:   1,
   135  			numP2PKHOutputs: 1,
   136  			numP2SHOutputs:  253,
   137  		},
   138  	}
   139  
   140  	for i, test := range testCases {
   141  		var sizeEstimate input.TxSizeEstimator
   142  		tx := wire.NewMsgTx()
   143  
   144  		// Inputs.
   145  
   146  		for j := 0; j < test.numP2PKHInputs; j++ {
   147  			sizeEstimate.AddP2PKHInput()
   148  			tx.AddTxIn(&wire.TxIn{SignatureScript: p2pkhSigScript})
   149  		}
   150  		for j := 0; j < test.numP2SHInputs; j++ {
   151  			sizeEstimate.AddCustomInput(int64(len(p2shSigScript)))
   152  			tx.AddTxIn(&wire.TxIn{SignatureScript: p2shSigScript})
   153  		}
   154  
   155  		// Outputs.
   156  
   157  		for j := 0; j < test.numP2PKHOutputs; j++ {
   158  			sizeEstimate.AddP2PKHOutput()
   159  			tx.AddTxOut(&wire.TxOut{PkScript: p2pkhPkScript})
   160  		}
   161  		for j := 0; j < test.numP2SHOutputs; j++ {
   162  			sizeEstimate.AddP2SHOutput()
   163  			tx.AddTxOut(&wire.TxOut{PkScript: p2shPkScript})
   164  		}
   165  
   166  		expectedSize := int64(tx.SerializeSize())
   167  		actualSize := sizeEstimate.Size()
   168  		if actualSize != expectedSize {
   169  			t.Errorf("Case %d: Got wrong size: expected %d, got %d",
   170  				i, expectedSize, actualSize)
   171  		}
   172  	}
   173  }
   174  
   175  type maxDERSignature struct{}
   176  
   177  func (s *maxDERSignature) Serialize() []byte {
   178  	// Always return worst-case signature length, excluding the one byte
   179  	// sighash flag.
   180  	return make([]byte, maxDERSignatureSize)
   181  }
   182  
   183  func (s *maxDERSignature) Verify(_ []byte, _ *secp256k1.PublicKey) bool {
   184  	return true
   185  }
   186  
   187  // dummySigner is a fake signer used for size (upper bound) calculations.
   188  type dummySigner struct {
   189  	input.Signer
   190  }
   191  
   192  // SignOutputRaw generates a signature for the passed transaction according to
   193  // the data within the passed SignDescriptor.
   194  func (s *dummySigner) SignOutputRaw(tx *wire.MsgTx,
   195  	signDesc *input.SignDescriptor) (input.Signature, error) {
   196  
   197  	return &maxDERSignature{}, nil
   198  }
   199  
   200  type witnessSizeTest struct {
   201  	name       string
   202  	expSize    int64
   203  	genWitness func(t *testing.T) input.TxWitness
   204  }
   205  
   206  var witnessSizeTests = []witnessSizeTest{
   207  	{
   208  		name:    "funding",
   209  		expSize: input.FundingOutputSigScriptSize,
   210  		genWitness: func(t *testing.T) input.TxWitness {
   211  			witnessScript, _, err := input.GenFundingPkScript(
   212  				testPubkeyBytes, testPubkeyBytes, 1,
   213  			)
   214  			if err != nil {
   215  				t.Fatal(err)
   216  			}
   217  
   218  			return input.SpendMultiSig(
   219  				witnessScript,
   220  				testPubkeyBytes, &maxDERSignature{},
   221  				testPubkeyBytes, &maxDERSignature{},
   222  			)
   223  		},
   224  	},
   225  	{
   226  		name:    "to local timeout",
   227  		expSize: input.ToLocalTimeoutSigScriptSize,
   228  		genWitness: func(t *testing.T) input.TxWitness {
   229  			witnessScript, err := input.CommitScriptToSelf(
   230  				testCSVDelay, testPubkey, testPubkey,
   231  			)
   232  			if err != nil {
   233  				t.Fatal(err)
   234  			}
   235  
   236  			signDesc := &input.SignDescriptor{
   237  				WitnessScript: witnessScript,
   238  			}
   239  
   240  			witness, err := input.CommitSpendTimeout(
   241  				&dummySigner{}, signDesc, testTx,
   242  			)
   243  			if err != nil {
   244  				t.Fatal(err)
   245  			}
   246  
   247  			return witness
   248  		},
   249  	},
   250  	{
   251  		name:    "to local revoke",
   252  		expSize: input.ToLocalPenaltySigScriptSize,
   253  		genWitness: func(t *testing.T) input.TxWitness {
   254  			witnessScript, err := input.CommitScriptToSelf(
   255  				testCSVDelay, testPubkey, testPubkey,
   256  			)
   257  			if err != nil {
   258  				t.Fatal(err)
   259  			}
   260  
   261  			signDesc := &input.SignDescriptor{
   262  				WitnessScript: witnessScript,
   263  			}
   264  
   265  			witness, err := input.CommitSpendRevoke(
   266  				&dummySigner{}, signDesc, testTx,
   267  			)
   268  			if err != nil {
   269  				t.Fatal(err)
   270  			}
   271  
   272  			return witness
   273  		},
   274  	},
   275  	{
   276  		name:    "to remote confirmed",
   277  		expSize: input.ToRemoteConfirmedWitnessSize,
   278  		genWitness: func(t *testing.T) input.TxWitness {
   279  			witScript, err := input.CommitScriptToRemoteConfirmed(
   280  				testPubkey,
   281  			)
   282  			if err != nil {
   283  				t.Fatal(err)
   284  			}
   285  
   286  			signDesc := &input.SignDescriptor{
   287  				WitnessScript: witScript,
   288  				KeyDesc: keychain.KeyDescriptor{
   289  					PubKey: testPubkey,
   290  				},
   291  			}
   292  
   293  			witness, err := input.CommitSpendToRemoteConfirmed(
   294  				&dummySigner{}, signDesc, testTx,
   295  			)
   296  			if err != nil {
   297  				t.Fatal(err)
   298  			}
   299  
   300  			return witness
   301  		},
   302  	},
   303  	{
   304  		name:    "anchor",
   305  		expSize: input.AnchorSigScriptSize,
   306  		genWitness: func(t *testing.T) input.TxWitness {
   307  			witScript, err := input.CommitScriptAnchor(
   308  				testPubkey,
   309  			)
   310  			if err != nil {
   311  				t.Fatal(err)
   312  			}
   313  
   314  			signDesc := &input.SignDescriptor{
   315  				WitnessScript: witScript,
   316  				KeyDesc: keychain.KeyDescriptor{
   317  					PubKey: testPubkey,
   318  				},
   319  			}
   320  
   321  			witness, err := input.CommitSpendAnchor(
   322  				&dummySigner{}, signDesc, testTx,
   323  			)
   324  			if err != nil {
   325  				t.Fatal(err)
   326  			}
   327  
   328  			return witness
   329  		},
   330  	},
   331  	{
   332  		name:    "anchor anyone",
   333  		expSize: input.AnchorAnyoneSigScriptSize,
   334  		genWitness: func(t *testing.T) input.TxWitness {
   335  			witScript, err := input.CommitScriptAnchor(
   336  				testPubkey,
   337  			)
   338  			if err != nil {
   339  				t.Fatal(err)
   340  			}
   341  
   342  			witness, _ := input.CommitSpendAnchorAnyone(witScript)
   343  
   344  			return witness
   345  		},
   346  	},
   347  	{
   348  		name:    "offered htlc revoke",
   349  		expSize: input.OfferedHtlcPenaltySigScriptSize,
   350  		genWitness: func(t *testing.T) input.TxWitness {
   351  			witScript, err := input.SenderHTLCScript(
   352  				testPubkey, testPubkey, testPubkey,
   353  				testHash160, false,
   354  			)
   355  			if err != nil {
   356  				t.Fatal(err)
   357  			}
   358  
   359  			signDesc := &input.SignDescriptor{
   360  				WitnessScript: witScript,
   361  				KeyDesc: keychain.KeyDescriptor{
   362  					PubKey: testPubkey,
   363  				},
   364  				DoubleTweak: testPrivkey,
   365  			}
   366  
   367  			witness, err := input.SenderHtlcSpendRevoke(
   368  				&dummySigner{}, signDesc, testTx,
   369  			)
   370  			if err != nil {
   371  				t.Fatal(err)
   372  			}
   373  
   374  			return witness
   375  		},
   376  	},
   377  	{
   378  		name:    "offered htlc revoke confirmed",
   379  		expSize: input.OfferedHtlcPenaltySigScriptSizeConfirmed,
   380  		genWitness: func(t *testing.T) input.TxWitness {
   381  			hash := make([]byte, 20)
   382  
   383  			witScript, err := input.SenderHTLCScript(
   384  				testPubkey, testPubkey, testPubkey,
   385  				hash, true,
   386  			)
   387  			if err != nil {
   388  				t.Fatal(err)
   389  			}
   390  
   391  			signDesc := &input.SignDescriptor{
   392  				WitnessScript: witScript,
   393  				KeyDesc: keychain.KeyDescriptor{
   394  					PubKey: testPubkey,
   395  				},
   396  				DoubleTweak: testPrivkey,
   397  			}
   398  
   399  			witness, err := input.SenderHtlcSpendRevoke(
   400  				&dummySigner{}, signDesc, testTx,
   401  			)
   402  			if err != nil {
   403  				t.Fatal(err)
   404  			}
   405  
   406  			return witness
   407  		},
   408  	},
   409  	{
   410  		name:    "offered htlc timeout",
   411  		expSize: input.OfferedHtlcTimeoutSigScriptSize,
   412  		genWitness: func(t *testing.T) input.TxWitness {
   413  			witScript, err := input.SenderHTLCScript(
   414  				testPubkey, testPubkey, testPubkey,
   415  				testHash160, false,
   416  			)
   417  			if err != nil {
   418  				t.Fatal(err)
   419  			}
   420  
   421  			signDesc := &input.SignDescriptor{
   422  				WitnessScript: witScript,
   423  			}
   424  
   425  			witness, err := input.SenderHtlcSpendTimeout(
   426  				&maxDERSignature{}, txscript.SigHashAll,
   427  				&dummySigner{}, signDesc, testTx,
   428  			)
   429  			if err != nil {
   430  				t.Fatal(err)
   431  			}
   432  
   433  			return witness
   434  		},
   435  	},
   436  	{
   437  		name:    "offered htlc timeout confirmed",
   438  		expSize: input.OfferedHtlcTimeoutSigScriptSizeConfirmed,
   439  		genWitness: func(t *testing.T) input.TxWitness {
   440  			witScript, err := input.SenderHTLCScript(
   441  				testPubkey, testPubkey, testPubkey,
   442  				testHash160, true,
   443  			)
   444  			if err != nil {
   445  				t.Fatal(err)
   446  			}
   447  
   448  			signDesc := &input.SignDescriptor{
   449  				WitnessScript: witScript,
   450  			}
   451  
   452  			witness, err := input.SenderHtlcSpendTimeout(
   453  				&maxDERSignature{}, txscript.SigHashAll,
   454  				&dummySigner{}, signDesc, testTx,
   455  			)
   456  			if err != nil {
   457  				t.Fatal(err)
   458  			}
   459  
   460  			return witness
   461  		},
   462  	},
   463  	{
   464  		name:    "offered htlc success",
   465  		expSize: input.OfferedHtlcSuccessSigScriptSize,
   466  		genWitness: func(t *testing.T) input.TxWitness {
   467  			witScript, err := input.SenderHTLCScript(
   468  				testPubkey, testPubkey, testPubkey,
   469  				testHash160, false,
   470  			)
   471  			if err != nil {
   472  				t.Fatal(err)
   473  			}
   474  
   475  			signDesc := &input.SignDescriptor{
   476  				WitnessScript: witScript,
   477  			}
   478  
   479  			witness, err := input.SenderHtlcSpendRedeem(
   480  				&dummySigner{}, signDesc, testTx, testPreimage,
   481  			)
   482  			if err != nil {
   483  				t.Fatal(err)
   484  			}
   485  			for _, w := range witness {
   486  				t.Logf("%d %x", len(w), w)
   487  			}
   488  
   489  			return witness
   490  		},
   491  	},
   492  	{
   493  		name:    "offered htlc success confirmed",
   494  		expSize: input.OfferedHtlcSuccessSigScriptSizeConfirmed,
   495  		genWitness: func(t *testing.T) input.TxWitness {
   496  			witScript, err := input.SenderHTLCScript(
   497  				testPubkey, testPubkey, testPubkey,
   498  				testHash160, true,
   499  			)
   500  			if err != nil {
   501  				t.Fatal(err)
   502  			}
   503  
   504  			signDesc := &input.SignDescriptor{
   505  				WitnessScript: witScript,
   506  			}
   507  
   508  			witness, err := input.SenderHtlcSpendRedeem(
   509  				&dummySigner{}, signDesc, testTx, testPreimage,
   510  			)
   511  			if err != nil {
   512  				t.Fatal(err)
   513  			}
   514  
   515  			return witness
   516  		},
   517  	},
   518  	{
   519  		name:    "accepted htlc revoke",
   520  		expSize: input.AcceptedHtlcPenaltySigScriptSize,
   521  		genWitness: func(t *testing.T) input.TxWitness {
   522  			witScript, err := input.ReceiverHTLCScript(
   523  				testCLTVExpiry, testPubkey, testPubkey,
   524  				testPubkey, testHash160, false,
   525  			)
   526  			if err != nil {
   527  				t.Fatal(err)
   528  			}
   529  
   530  			signDesc := &input.SignDescriptor{
   531  				WitnessScript: witScript,
   532  				KeyDesc: keychain.KeyDescriptor{
   533  					PubKey: testPubkey,
   534  				},
   535  				DoubleTweak: testPrivkey,
   536  			}
   537  
   538  			witness, err := input.ReceiverHtlcSpendRevoke(
   539  				&dummySigner{}, signDesc, testTx,
   540  			)
   541  			if err != nil {
   542  				t.Fatal(err)
   543  			}
   544  
   545  			return witness
   546  		},
   547  	},
   548  	{
   549  		name:    "accepted htlc revoke confirmed",
   550  		expSize: input.AcceptedHtlcPenaltySigScriptSizeConfirmed,
   551  		genWitness: func(t *testing.T) input.TxWitness {
   552  			witScript, err := input.ReceiverHTLCScript(
   553  				testCLTVExpiry, testPubkey, testPubkey,
   554  				testPubkey, testHash160, true,
   555  			)
   556  			if err != nil {
   557  				t.Fatal(err)
   558  			}
   559  
   560  			signDesc := &input.SignDescriptor{
   561  				WitnessScript: witScript,
   562  				KeyDesc: keychain.KeyDescriptor{
   563  					PubKey: testPubkey,
   564  				},
   565  				DoubleTweak: testPrivkey,
   566  			}
   567  
   568  			witness, err := input.ReceiverHtlcSpendRevoke(
   569  				&dummySigner{}, signDesc, testTx,
   570  			)
   571  			if err != nil {
   572  				t.Fatal(err)
   573  			}
   574  
   575  			return witness
   576  		},
   577  	},
   578  	{
   579  		name:    "accepted htlc timeout",
   580  		expSize: input.AcceptedHtlcTimeoutSigScriptSize,
   581  		genWitness: func(t *testing.T) input.TxWitness {
   582  
   583  			witScript, err := input.ReceiverHTLCScript(
   584  				testCLTVExpiry, testPubkey, testPubkey,
   585  				testPubkey, testHash160, false,
   586  			)
   587  			if err != nil {
   588  				t.Fatal(err)
   589  			}
   590  
   591  			signDesc := &input.SignDescriptor{
   592  				WitnessScript: witScript,
   593  			}
   594  
   595  			witness, err := input.ReceiverHtlcSpendTimeout(
   596  				&dummySigner{}, signDesc, testTx,
   597  				testCLTVExpiry,
   598  			)
   599  			if err != nil {
   600  				t.Fatal(err)
   601  			}
   602  
   603  			return witness
   604  		},
   605  	},
   606  	{
   607  		name:    "accepted htlc timeout confirmed",
   608  		expSize: input.AcceptedHtlcTimeoutSigScriptSizeConfirmed,
   609  		genWitness: func(t *testing.T) input.TxWitness {
   610  			witScript, err := input.ReceiverHTLCScript(
   611  				testCLTVExpiry, testPubkey, testPubkey,
   612  				testPubkey, testHash160, true,
   613  			)
   614  			if err != nil {
   615  				t.Fatal(err)
   616  			}
   617  
   618  			signDesc := &input.SignDescriptor{
   619  				WitnessScript: witScript,
   620  			}
   621  
   622  			witness, err := input.ReceiverHtlcSpendTimeout(
   623  				&dummySigner{}, signDesc, testTx,
   624  				testCLTVExpiry,
   625  			)
   626  			if err != nil {
   627  				t.Fatal(err)
   628  			}
   629  
   630  			return witness
   631  		},
   632  	},
   633  	{
   634  		name:    "accepted htlc success",
   635  		expSize: input.AcceptedHtlcSuccessSigScriptSize,
   636  		genWitness: func(t *testing.T) input.TxWitness {
   637  			witScript, err := input.ReceiverHTLCScript(
   638  				testCLTVExpiry, testPubkey, testPubkey,
   639  				testPubkey, testHash160, false,
   640  			)
   641  			if err != nil {
   642  				t.Fatal(err)
   643  			}
   644  
   645  			signDesc := &input.SignDescriptor{
   646  				WitnessScript: witScript,
   647  				KeyDesc: keychain.KeyDescriptor{
   648  					PubKey: testPubkey,
   649  				},
   650  			}
   651  
   652  			witness, err := input.ReceiverHtlcSpendRedeem(
   653  				&maxDERSignature{}, txscript.SigHashAll,
   654  				testPreimage, &dummySigner{}, signDesc, testTx,
   655  			)
   656  			if err != nil {
   657  				t.Fatal(err)
   658  			}
   659  
   660  			return witness
   661  		},
   662  	},
   663  	{
   664  		name:    "accepted htlc success confirmed",
   665  		expSize: input.AcceptedHtlcSuccessSigScriptSizeConfirmed,
   666  		genWitness: func(t *testing.T) input.TxWitness {
   667  			witScript, err := input.ReceiverHTLCScript(
   668  				testCLTVExpiry, testPubkey, testPubkey,
   669  				testPubkey, testHash160, true,
   670  			)
   671  			if err != nil {
   672  				t.Fatal(err)
   673  			}
   674  
   675  			signDesc := &input.SignDescriptor{
   676  				WitnessScript: witScript,
   677  				KeyDesc: keychain.KeyDescriptor{
   678  					PubKey: testPubkey,
   679  				},
   680  			}
   681  
   682  			witness, err := input.ReceiverHtlcSpendRedeem(
   683  				&maxDERSignature{}, txscript.SigHashAll,
   684  				testPreimage, &dummySigner{}, signDesc, testTx,
   685  			)
   686  			if err != nil {
   687  				t.Fatal(err)
   688  			}
   689  
   690  			return witness
   691  		},
   692  	},
   693  }
   694  
   695  // TestWitnessSizes asserts the correctness of our magic witness constants.
   696  // Witnesses involving signatures will have maxDERSignatures injected so that we
   697  // can determine upper bounds for the witness sizes. These constants are
   698  // predominately used for fee estimation, so we want to be certain that we
   699  // aren't under estimating or our transactions could get stuck.
   700  func TestWitnessSizes(t *testing.T) {
   701  	for _, test := range witnessSizeTests {
   702  		test := test
   703  		t.Run(test.name, func(t *testing.T) {
   704  			witness := test.genWitness(t)
   705  			sigScript, err := input.WitnessStackToSigScript(witness)
   706  			if err != nil {
   707  				t.Fatalf("unable to convert witness to sigScript: %v", err)
   708  			}
   709  			size := int64(len(sigScript))
   710  			if size != test.expSize {
   711  				t.Fatalf("size mismatch, want: %v, got: %v",
   712  					test.expSize, size)
   713  			}
   714  		})
   715  	}
   716  }
   717  
   718  // genTimeoutTx creates a signed HTLC second level timeout tx.
   719  func genTimeoutTx(chanType channeldb.ChannelType) (*wire.MsgTx, error) {
   720  	// Create the unsigned timeout tx.
   721  	timeoutTx, err := lnwallet.CreateHtlcTimeoutTx(
   722  		chanType, false, testOutPoint, testAmt, testCLTVExpiry,
   723  		testCSVDelay, 0, testPubkey, testPubkey,
   724  	)
   725  	if err != nil {
   726  		return nil, err
   727  	}
   728  
   729  	// In order to sign the transcation, generate the script for the output
   730  	// it spends.
   731  	witScript, err := input.SenderHTLCScript(
   732  		testPubkey, testPubkey, testPubkey, testHash160,
   733  		chanType.HasAnchors(),
   734  	)
   735  	if err != nil {
   736  		return nil, err
   737  	}
   738  
   739  	signDesc := &input.SignDescriptor{
   740  		WitnessScript: witScript,
   741  		KeyDesc: keychain.KeyDescriptor{
   742  			PubKey: testPubkey,
   743  		},
   744  	}
   745  
   746  	// Sign the timeout tx and add the witness.
   747  	sigHashType := lnwallet.HtlcSigHashType(chanType)
   748  	timeoutWitness, err := input.SenderHtlcSpendTimeout(
   749  		&maxDERSignature{}, sigHashType, &dummySigner{},
   750  		signDesc, timeoutTx,
   751  	)
   752  	if err != nil {
   753  		return nil, err
   754  	}
   755  	sigScript, err := input.WitnessStackToSigScript(timeoutWitness)
   756  	if err != nil {
   757  		return nil, err
   758  	}
   759  	timeoutTx.TxIn[0].SignatureScript = sigScript
   760  
   761  	return timeoutTx, nil
   762  }
   763  
   764  // genSuccessTx creates a signed HTLC second level success tx.
   765  func genSuccessTx(chanType channeldb.ChannelType) (*wire.MsgTx, error) {
   766  	// Create the unisgned success tx.
   767  	successTx, err := lnwallet.CreateHtlcSuccessTx(
   768  		chanType, false, testOutPoint, testAmt, testCSVDelay, 0,
   769  		testPubkey, testPubkey,
   770  	)
   771  	if err != nil {
   772  		return nil, err
   773  	}
   774  
   775  	// In order to sign the transcation, generate the script for the output
   776  	// it spends.
   777  	witScript, err := input.ReceiverHTLCScript(
   778  		testCLTVExpiry, testPubkey, testPubkey,
   779  		testPubkey, testHash160, chanType.HasAnchors(),
   780  	)
   781  	if err != nil {
   782  		return nil, err
   783  	}
   784  
   785  	signDesc := &input.SignDescriptor{
   786  		WitnessScript: witScript,
   787  		KeyDesc: keychain.KeyDescriptor{
   788  			PubKey: testPubkey,
   789  		},
   790  	}
   791  
   792  	// Sign the success tx and add the witness.
   793  	sigHashType := lnwallet.HtlcSigHashType(channeldb.SingleFunderBit)
   794  	successWitness, err := input.ReceiverHtlcSpendRedeem(
   795  		&maxDERSignature{}, sigHashType, testPreimage,
   796  		&dummySigner{}, signDesc, successTx,
   797  	)
   798  	if err != nil {
   799  		return nil, err
   800  	}
   801  	sigScript, err := input.WitnessStackToSigScript(successWitness)
   802  	if err != nil {
   803  		return nil, err
   804  	}
   805  	successTx.TxIn[0].SignatureScript = sigScript
   806  
   807  	return successTx, nil
   808  
   809  }
   810  
   811  type txSizeTest struct {
   812  	name    string
   813  	expSize int64
   814  	genTx   func(t *testing.T) *wire.MsgTx
   815  }
   816  
   817  var txSizeTests = []txSizeTest{
   818  	{
   819  		name: "htlc timeout regular ",
   820  		// The size estimate from the spec is off by one.
   821  		expSize: input.HTLCTimeoutTxSize + 1,
   822  		genTx: func(t *testing.T) *wire.MsgTx {
   823  			tx, err := genTimeoutTx(channeldb.SingleFunderBit)
   824  			require.NoError(t, err)
   825  
   826  			return tx
   827  		},
   828  	},
   829  	{
   830  		name: "htlc timeout confirmed",
   831  		// The size estimate from the spec is off by one.
   832  		expSize: input.HTLCTimeoutConfirmedTxSize + 1,
   833  		genTx: func(t *testing.T) *wire.MsgTx {
   834  			tx, err := genTimeoutTx(channeldb.AnchorOutputsBit)
   835  			require.NoError(t, err)
   836  
   837  			return tx
   838  		},
   839  	},
   840  
   841  	{
   842  		name: "htlc success regular",
   843  		// The size estimate from the spec is off by one, but it's
   844  		// okay since we overestimate the size.
   845  		expSize: input.HTLCSuccessTxSize - 1,
   846  		genTx: func(t *testing.T) *wire.MsgTx {
   847  			tx, err := genSuccessTx(channeldb.SingleFunderBit)
   848  			require.NoError(t, err)
   849  
   850  			return tx
   851  		},
   852  	},
   853  	{
   854  		name: "htlc success confirmed",
   855  		// The size estimate from the spec is off by one, but it's
   856  		// okay since we overestimate the size.
   857  		expSize: input.HTLCSuccessConfirmedTxSize - 1,
   858  		genTx: func(t *testing.T) *wire.MsgTx {
   859  			tx, err := genSuccessTx(channeldb.AnchorOutputsBit)
   860  			require.NoError(t, err)
   861  
   862  			return tx
   863  		},
   864  	},
   865  }
   866  
   867  // TestWitnessSizes asserts the correctness of our magic tx size constants.
   868  func TestTxSizes(t *testing.T) {
   869  	for _, test := range txSizeTests {
   870  		test := test
   871  		t.Run(test.name, func(t *testing.T) {
   872  			tx := test.genTx(t)
   873  
   874  			size := tx.SerializeSize()
   875  			if size != int(test.expSize) {
   876  				t.Fatalf("size mismatch, want: %v, got: %v",
   877  					test.expSize, size)
   878  			}
   879  		})
   880  	}
   881  }