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 }