size_test.go 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588
  1. package input_test
  2. import (
  3. "testing"
  4. "github.com/btcsuite/btcd/blockchain"
  5. "github.com/btcsuite/btcd/btcec/v2"
  6. "github.com/btcsuite/btcd/btcutil"
  7. "github.com/btcsuite/btcd/chaincfg"
  8. "github.com/btcsuite/btcd/chaincfg/chainhash"
  9. "github.com/btcsuite/btcd/txscript"
  10. "github.com/btcsuite/btcd/wire"
  11. "github.com/lightningnetwork/lnd/channeldb"
  12. "github.com/lightningnetwork/lnd/input"
  13. "github.com/lightningnetwork/lnd/keychain"
  14. "github.com/lightningnetwork/lnd/lnwallet"
  15. "github.com/stretchr/testify/require"
  16. )
  17. const (
  18. testCSVDelay = (1 << 31) - 1
  19. testCLTVExpiry = 500000000
  20. // maxDERSignatureSize is the largest possible DER-encoded signature
  21. // without the trailing sighash flag.
  22. maxDERSignatureSize = 72
  23. // maxSchnorrSignature is the largest possilbe schnorr sig w/o a non
  24. // default sighash.
  25. maxSchnorrSignatureSize = 64
  26. testAmt = btcutil.MaxSatoshi
  27. )
  28. var (
  29. testPubkeyBytes = make([]byte, 33)
  30. testHash160 = make([]byte, 20)
  31. testPreimage = make([]byte, 32)
  32. // testPubkey is a pubkey used in script size calculation.
  33. testPubkey = &btcec.PublicKey{}
  34. testPrivkey, _ = btcec.PrivKeyFromBytes(make([]byte, 32))
  35. testTx = wire.NewMsgTx(2)
  36. testOutPoint = wire.OutPoint{
  37. Hash: chainhash.Hash{},
  38. Index: 1,
  39. }
  40. )
  41. // TestTxWeightEstimator tests that transaction weight estimates are calculated
  42. // correctly by comparing against an actual (though invalid) transaction
  43. // matching the template.
  44. func TestTxWeightEstimator(t *testing.T) {
  45. netParams := &chaincfg.MainNetParams
  46. p2pkhAddr, err := btcutil.NewAddressPubKeyHash(
  47. make([]byte, 20), netParams)
  48. require.NoError(t, err, "Failed to generate address")
  49. p2pkhScript, err := txscript.PayToAddrScript(p2pkhAddr)
  50. require.NoError(t, err, "Failed to generate scriptPubKey")
  51. p2wkhAddr, err := btcutil.NewAddressWitnessPubKeyHash(
  52. make([]byte, 20), netParams)
  53. require.NoError(t, err, "Failed to generate address")
  54. p2wkhScript, err := txscript.PayToAddrScript(p2wkhAddr)
  55. require.NoError(t, err, "Failed to generate scriptPubKey")
  56. p2wshAddr, err := btcutil.NewAddressWitnessScriptHash(
  57. make([]byte, 32), netParams)
  58. require.NoError(t, err, "Failed to generate address")
  59. p2wshScript, err := txscript.PayToAddrScript(p2wshAddr)
  60. require.NoError(t, err, "Failed to generate scriptPubKey")
  61. p2shAddr, err := btcutil.NewAddressScriptHash([]byte{0}, netParams)
  62. require.NoError(t, err, "Failed to generate address")
  63. p2shScript, err := txscript.PayToAddrScript(p2shAddr)
  64. require.NoError(t, err, "Failed to generate scriptPubKey")
  65. testCases := []struct {
  66. numP2PKHInputs int
  67. numP2WKHInputs int
  68. numP2WSHInputs int
  69. numNestedP2WKHInputs int
  70. numNestedP2WSHInputs int
  71. numP2PKHOutputs int
  72. numP2WKHOutputs int
  73. numP2WSHOutputs int
  74. numP2SHOutputs int
  75. }{
  76. // Assert base txn size.
  77. {},
  78. // Assert single input/output sizes.
  79. {
  80. numP2PKHInputs: 1,
  81. },
  82. {
  83. numP2WKHInputs: 1,
  84. },
  85. {
  86. numP2WSHInputs: 1,
  87. },
  88. {
  89. numNestedP2WKHInputs: 1,
  90. },
  91. {
  92. numNestedP2WSHInputs: 1,
  93. },
  94. {
  95. numP2WKHOutputs: 1,
  96. },
  97. {
  98. numP2PKHOutputs: 1,
  99. },
  100. {
  101. numP2WSHOutputs: 1,
  102. },
  103. {
  104. numP2SHOutputs: 1,
  105. },
  106. // Assert each input/output increments input/output counts.
  107. {
  108. numP2PKHInputs: 253,
  109. },
  110. {
  111. numP2WKHInputs: 253,
  112. },
  113. {
  114. numP2WSHInputs: 253,
  115. },
  116. {
  117. numNestedP2WKHInputs: 253,
  118. },
  119. {
  120. numNestedP2WSHInputs: 253,
  121. },
  122. {
  123. numP2WKHOutputs: 253,
  124. },
  125. {
  126. numP2PKHOutputs: 253,
  127. },
  128. {
  129. numP2WSHOutputs: 253,
  130. },
  131. {
  132. numP2SHOutputs: 253,
  133. },
  134. // Assert basic combinations of inputs and outputs.
  135. {
  136. numP2PKHInputs: 1,
  137. numP2PKHOutputs: 2,
  138. },
  139. {
  140. numP2PKHInputs: 1,
  141. numP2WKHInputs: 1,
  142. numP2WKHOutputs: 1,
  143. numP2WSHOutputs: 1,
  144. },
  145. {
  146. numP2WKHInputs: 1,
  147. numP2WKHOutputs: 1,
  148. numP2WSHOutputs: 1,
  149. },
  150. {
  151. numP2WKHInputs: 2,
  152. numP2WKHOutputs: 1,
  153. numP2WSHOutputs: 1,
  154. },
  155. {
  156. numP2WSHInputs: 1,
  157. numP2WKHOutputs: 1,
  158. },
  159. {
  160. numP2PKHInputs: 1,
  161. numP2SHOutputs: 1,
  162. },
  163. {
  164. numNestedP2WKHInputs: 1,
  165. numP2WKHOutputs: 1,
  166. },
  167. {
  168. numNestedP2WSHInputs: 1,
  169. numP2WKHOutputs: 1,
  170. },
  171. // Assert disparate input/output types increment total
  172. // input/output counts.
  173. {
  174. numP2PKHInputs: 50,
  175. numP2WKHInputs: 50,
  176. numP2WSHInputs: 51,
  177. numNestedP2WKHInputs: 51,
  178. numNestedP2WSHInputs: 51,
  179. numP2WKHOutputs: 1,
  180. },
  181. {
  182. numP2WKHInputs: 1,
  183. numP2WKHOutputs: 63,
  184. numP2PKHOutputs: 63,
  185. numP2WSHOutputs: 63,
  186. numP2SHOutputs: 64,
  187. },
  188. {
  189. numP2PKHInputs: 50,
  190. numP2WKHInputs: 50,
  191. numP2WSHInputs: 51,
  192. numNestedP2WKHInputs: 51,
  193. numNestedP2WSHInputs: 51,
  194. numP2WKHOutputs: 63,
  195. numP2PKHOutputs: 63,
  196. numP2WSHOutputs: 63,
  197. numP2SHOutputs: 64,
  198. },
  199. }
  200. for i, test := range testCases {
  201. var weightEstimate input.TxWeightEstimator
  202. tx := wire.NewMsgTx(1)
  203. for j := 0; j < test.numP2PKHInputs; j++ {
  204. weightEstimate.AddP2PKHInput()
  205. signature := make([]byte, maxDERSignatureSize+1)
  206. compressedPubKey := make([]byte, 33)
  207. scriptSig, err := txscript.NewScriptBuilder().AddData(signature).
  208. AddData(compressedPubKey).Script()
  209. if err != nil {
  210. t.Fatalf("Failed to generate scriptSig: %v", err)
  211. }
  212. tx.AddTxIn(&wire.TxIn{SignatureScript: scriptSig})
  213. }
  214. for j := 0; j < test.numP2WKHInputs; j++ {
  215. weightEstimate.AddP2WKHInput()
  216. signature := make([]byte, maxDERSignatureSize+1)
  217. compressedPubKey := make([]byte, 33)
  218. witness := wire.TxWitness{signature, compressedPubKey}
  219. tx.AddTxIn(&wire.TxIn{Witness: witness})
  220. }
  221. for j := 0; j < test.numP2WSHInputs; j++ {
  222. weightEstimate.AddWitnessInput(42)
  223. witnessScript := make([]byte, 40)
  224. witness := wire.TxWitness{witnessScript}
  225. tx.AddTxIn(&wire.TxIn{Witness: witness})
  226. }
  227. for j := 0; j < test.numNestedP2WKHInputs; j++ {
  228. weightEstimate.AddNestedP2WKHInput()
  229. signature := make([]byte, maxDERSignatureSize+1)
  230. compressedPubKey := make([]byte, 33)
  231. witness := wire.TxWitness{signature, compressedPubKey}
  232. scriptSig, err := txscript.NewScriptBuilder().AddData(p2wkhScript).
  233. Script()
  234. if err != nil {
  235. t.Fatalf("Failed to generate scriptSig: %v", err)
  236. }
  237. tx.AddTxIn(&wire.TxIn{SignatureScript: scriptSig, Witness: witness})
  238. }
  239. for j := 0; j < test.numNestedP2WSHInputs; j++ {
  240. weightEstimate.AddNestedP2WSHInput(42)
  241. witnessScript := make([]byte, 40)
  242. witness := wire.TxWitness{witnessScript}
  243. scriptSig, err := txscript.NewScriptBuilder().AddData(p2wshScript).
  244. Script()
  245. if err != nil {
  246. t.Fatalf("Failed to generate scriptSig: %v", err)
  247. }
  248. tx.AddTxIn(&wire.TxIn{SignatureScript: scriptSig, Witness: witness})
  249. }
  250. for j := 0; j < test.numP2PKHOutputs; j++ {
  251. weightEstimate.AddP2PKHOutput()
  252. tx.AddTxOut(&wire.TxOut{PkScript: p2pkhScript})
  253. }
  254. for j := 0; j < test.numP2WKHOutputs; j++ {
  255. weightEstimate.AddP2WKHOutput()
  256. tx.AddTxOut(&wire.TxOut{PkScript: p2wkhScript})
  257. }
  258. for j := 0; j < test.numP2WSHOutputs; j++ {
  259. weightEstimate.AddP2WSHOutput()
  260. tx.AddTxOut(&wire.TxOut{PkScript: p2wshScript})
  261. }
  262. for j := 0; j < test.numP2SHOutputs; j++ {
  263. weightEstimate.AddP2SHOutput()
  264. tx.AddTxOut(&wire.TxOut{PkScript: p2shScript})
  265. }
  266. expectedWeight := blockchain.GetTransactionWeight(btcutil.NewTx(tx))
  267. if weightEstimate.Weight() != int(expectedWeight) {
  268. t.Errorf("Case %d: Got wrong weight: expected %d, got %d",
  269. i, expectedWeight, weightEstimate.Weight())
  270. }
  271. }
  272. }
  273. type maxDERSignature struct{}
  274. func (s *maxDERSignature) Serialize() []byte {
  275. // Always return worst-case signature length, excluding the one byte
  276. // sighash flag.
  277. return make([]byte, maxDERSignatureSize)
  278. }
  279. func (s *maxDERSignature) Verify(_ []byte, _ *btcec.PublicKey) bool {
  280. return true
  281. }
  282. type maxSchnorrSignature struct{}
  283. func (s *maxSchnorrSignature) Serialize() []byte {
  284. // Always return worst-case signature length, including a non-default
  285. // sighash type.
  286. return make([]byte, maxSchnorrSignatureSize)
  287. }
  288. func (s *maxSchnorrSignature) Verify(_ []byte, _ *btcec.PublicKey) bool {
  289. return true
  290. }
  291. // dummySigner is a fake signer used for size (upper bound) calculations.
  292. type dummySigner struct {
  293. input.Signer
  294. }
  295. // SignOutputRaw generates a signature for the passed transaction according to
  296. // the data within the passed SignDescriptor.
  297. func (s *dummySigner) SignOutputRaw(tx *wire.MsgTx,
  298. signDesc *input.SignDescriptor) (input.Signature, error) {
  299. switch signDesc.SignMethod {
  300. case input.TaprootKeySpendBIP0086SignMethod:
  301. fallthrough
  302. case input.TaprootKeySpendSignMethod:
  303. fallthrough
  304. case input.TaprootScriptSpendSignMethod:
  305. return &maxSchnorrSignature{}, nil
  306. }
  307. return &maxDERSignature{}, nil
  308. }
  309. type witnessSizeTest struct {
  310. name string
  311. expSize int
  312. genWitness func(t *testing.T) wire.TxWitness
  313. }
  314. var witnessSizeTests = []witnessSizeTest{
  315. {
  316. name: "funding",
  317. expSize: input.MultiSigWitnessSize,
  318. genWitness: func(t *testing.T) wire.TxWitness {
  319. witnessScript, _, err := input.GenFundingPkScript(
  320. testPubkeyBytes, testPubkeyBytes, 1,
  321. )
  322. if err != nil {
  323. t.Fatal(err)
  324. }
  325. return input.SpendMultiSig(
  326. witnessScript,
  327. testPubkeyBytes, &maxDERSignature{},
  328. testPubkeyBytes, &maxDERSignature{},
  329. )
  330. },
  331. },
  332. {
  333. name: "to local timeout",
  334. expSize: input.ToLocalTimeoutWitnessSize,
  335. genWitness: func(t *testing.T) wire.TxWitness {
  336. witnessScript, err := input.CommitScriptToSelf(
  337. testCSVDelay, testPubkey, testPubkey,
  338. )
  339. if err != nil {
  340. t.Fatal(err)
  341. }
  342. signDesc := &input.SignDescriptor{
  343. WitnessScript: witnessScript,
  344. }
  345. witness, err := input.CommitSpendTimeout(
  346. &dummySigner{}, signDesc, testTx,
  347. )
  348. if err != nil {
  349. t.Fatal(err)
  350. }
  351. return witness
  352. },
  353. },
  354. {
  355. name: "to local revoke",
  356. expSize: input.ToLocalPenaltyWitnessSize,
  357. genWitness: func(t *testing.T) wire.TxWitness {
  358. witnessScript, err := input.CommitScriptToSelf(
  359. testCSVDelay, testPubkey, testPubkey,
  360. )
  361. if err != nil {
  362. t.Fatal(err)
  363. }
  364. signDesc := &input.SignDescriptor{
  365. WitnessScript: witnessScript,
  366. }
  367. witness, err := input.CommitSpendRevoke(
  368. &dummySigner{}, signDesc, testTx,
  369. )
  370. if err != nil {
  371. t.Fatal(err)
  372. }
  373. return witness
  374. },
  375. },
  376. {
  377. name: "to remote confirmed",
  378. expSize: input.ToRemoteConfirmedWitnessSize,
  379. genWitness: func(t *testing.T) wire.TxWitness {
  380. witScript, err := input.CommitScriptToRemoteConfirmed(
  381. testPubkey,
  382. )
  383. if err != nil {
  384. t.Fatal(err)
  385. }
  386. signDesc := &input.SignDescriptor{
  387. WitnessScript: witScript,
  388. KeyDesc: keychain.KeyDescriptor{
  389. PubKey: testPubkey,
  390. },
  391. }
  392. witness, err := input.CommitSpendToRemoteConfirmed(
  393. &dummySigner{}, signDesc, testTx,
  394. )
  395. if err != nil {
  396. t.Fatal(err)
  397. }
  398. return witness
  399. },
  400. },
  401. {
  402. name: "anchor",
  403. expSize: input.AnchorWitnessSize,
  404. genWitness: func(t *testing.T) wire.TxWitness {
  405. witScript, err := input.CommitScriptAnchor(
  406. testPubkey,
  407. )
  408. if err != nil {
  409. t.Fatal(err)
  410. }
  411. signDesc := &input.SignDescriptor{
  412. WitnessScript: witScript,
  413. KeyDesc: keychain.KeyDescriptor{
  414. PubKey: testPubkey,
  415. },
  416. }
  417. witness, err := input.CommitSpendAnchor(
  418. &dummySigner{}, signDesc, testTx,
  419. )
  420. if err != nil {
  421. t.Fatal(err)
  422. }
  423. return witness
  424. },
  425. },
  426. {
  427. name: "anchor anyone",
  428. expSize: 43,
  429. genWitness: func(t *testing.T) wire.TxWitness {
  430. witScript, err := input.CommitScriptAnchor(
  431. testPubkey,
  432. )
  433. if err != nil {
  434. t.Fatal(err)
  435. }
  436. witness, _ := input.CommitSpendAnchorAnyone(witScript)
  437. return witness
  438. },
  439. },
  440. {
  441. name: "offered htlc revoke",
  442. expSize: input.OfferedHtlcPenaltyWitnessSize,
  443. genWitness: func(t *testing.T) wire.TxWitness {
  444. witScript, err := input.SenderHTLCScript(
  445. testPubkey, testPubkey, testPubkey,
  446. testHash160, false,
  447. )
  448. if err != nil {
  449. t.Fatal(err)
  450. }
  451. signDesc := &input.SignDescriptor{
  452. WitnessScript: witScript,
  453. KeyDesc: keychain.KeyDescriptor{
  454. PubKey: testPubkey,
  455. },
  456. DoubleTweak: testPrivkey,
  457. }
  458. witness, err := input.SenderHtlcSpendRevoke(
  459. &dummySigner{}, signDesc, testTx,
  460. )
  461. if err != nil {
  462. t.Fatal(err)
  463. }
  464. return witness
  465. },
  466. },
  467. {
  468. name: "offered htlc revoke confirmed",
  469. expSize: input.OfferedHtlcPenaltyWitnessSizeConfirmed,
  470. genWitness: func(t *testing.T) wire.TxWitness {
  471. hash := make([]byte, 20)
  472. witScript, err := input.SenderHTLCScript(
  473. testPubkey, testPubkey, testPubkey,
  474. hash, true,
  475. )
  476. if err != nil {
  477. t.Fatal(err)
  478. }
  479. signDesc := &input.SignDescriptor{
  480. WitnessScript: witScript,
  481. KeyDesc: keychain.KeyDescriptor{
  482. PubKey: testPubkey,
  483. },
  484. DoubleTweak: testPrivkey,
  485. }
  486. witness, err := input.SenderHtlcSpendRevoke(
  487. &dummySigner{}, signDesc, testTx,
  488. )
  489. if err != nil {
  490. t.Fatal(err)
  491. }
  492. return witness
  493. },
  494. },
  495. {
  496. name: "offered htlc timeout",
  497. expSize: input.OfferedHtlcTimeoutWitnessSize,
  498. genWitness: func(t *testing.T) wire.TxWitness {
  499. witScript, err := input.SenderHTLCScript(
  500. testPubkey, testPubkey, testPubkey,
  501. testHash160, false,
  502. )
  503. if err != nil {
  504. t.Fatal(err)
  505. }
  506. signDesc := &input.SignDescriptor{
  507. WitnessScript: witScript,
  508. }
  509. witness, err := input.SenderHtlcSpendTimeout(
  510. &maxDERSignature{}, txscript.SigHashAll,
  511. &dummySigner{}, signDesc, testTx,
  512. )
  513. if err != nil {
  514. t.Fatal(err)
  515. }
  516. return witness
  517. },
  518. },
  519. {
  520. name: "offered htlc timeout confirmed",
  521. expSize: input.OfferedHtlcTimeoutWitnessSizeConfirmed,
  522. genWitness: func(t *testing.T) wire.TxWitness {
  523. witScript, err := input.SenderHTLCScript(
  524. testPubkey, testPubkey, testPubkey,
  525. testHash160, true,
  526. )
  527. if err != nil {
  528. t.Fatal(err)
  529. }
  530. signDesc := &input.SignDescriptor{
  531. WitnessScript: witScript,
  532. }
  533. witness, err := input.SenderHtlcSpendTimeout(
  534. &maxDERSignature{}, txscript.SigHashAll,
  535. &dummySigner{}, signDesc, testTx,
  536. )
  537. if err != nil {
  538. t.Fatal(err)
  539. }
  540. return witness
  541. },
  542. },
  543. {
  544. name: "offered htlc success",
  545. expSize: input.OfferedHtlcSuccessWitnessSize,
  546. genWitness: func(t *testing.T) wire.TxWitness {
  547. witScript, err := input.SenderHTLCScript(
  548. testPubkey, testPubkey, testPubkey,
  549. testHash160, false,
  550. )
  551. if err != nil {
  552. t.Fatal(err)
  553. }
  554. signDesc := &input.SignDescriptor{
  555. WitnessScript: witScript,
  556. }
  557. witness, err := input.SenderHtlcSpendRedeem(
  558. &dummySigner{}, signDesc, testTx, testPreimage,
  559. )
  560. if err != nil {
  561. t.Fatal(err)
  562. }
  563. return witness
  564. },
  565. },
  566. {
  567. name: "offered htlc success confirmed",
  568. expSize: input.OfferedHtlcSuccessWitnessSizeConfirmed,
  569. genWitness: func(t *testing.T) wire.TxWitness {
  570. witScript, err := input.SenderHTLCScript(
  571. testPubkey, testPubkey, testPubkey,
  572. testHash160, true,
  573. )
  574. if err != nil {
  575. t.Fatal(err)
  576. }
  577. signDesc := &input.SignDescriptor{
  578. WitnessScript: witScript,
  579. }
  580. witness, err := input.SenderHtlcSpendRedeem(
  581. &dummySigner{}, signDesc, testTx, testPreimage,
  582. )
  583. if err != nil {
  584. t.Fatal(err)
  585. }
  586. return witness
  587. },
  588. },
  589. {
  590. name: "accepted htlc revoke",
  591. expSize: input.AcceptedHtlcPenaltyWitnessSize,
  592. genWitness: func(t *testing.T) wire.TxWitness {
  593. witScript, err := input.ReceiverHTLCScript(
  594. testCLTVExpiry, testPubkey, testPubkey,
  595. testPubkey, testHash160, false,
  596. )
  597. if err != nil {
  598. t.Fatal(err)
  599. }
  600. signDesc := &input.SignDescriptor{
  601. WitnessScript: witScript,
  602. KeyDesc: keychain.KeyDescriptor{
  603. PubKey: testPubkey,
  604. },
  605. DoubleTweak: testPrivkey,
  606. }
  607. witness, err := input.ReceiverHtlcSpendRevoke(
  608. &dummySigner{}, signDesc, testTx,
  609. )
  610. if err != nil {
  611. t.Fatal(err)
  612. }
  613. return witness
  614. },
  615. },
  616. {
  617. name: "accepted htlc revoke confirmed",
  618. expSize: input.AcceptedHtlcPenaltyWitnessSizeConfirmed,
  619. genWitness: func(t *testing.T) wire.TxWitness {
  620. witScript, err := input.ReceiverHTLCScript(
  621. testCLTVExpiry, testPubkey, testPubkey,
  622. testPubkey, testHash160, true,
  623. )
  624. if err != nil {
  625. t.Fatal(err)
  626. }
  627. signDesc := &input.SignDescriptor{
  628. WitnessScript: witScript,
  629. KeyDesc: keychain.KeyDescriptor{
  630. PubKey: testPubkey,
  631. },
  632. DoubleTweak: testPrivkey,
  633. }
  634. witness, err := input.ReceiverHtlcSpendRevoke(
  635. &dummySigner{}, signDesc, testTx,
  636. )
  637. if err != nil {
  638. t.Fatal(err)
  639. }
  640. return witness
  641. },
  642. },
  643. {
  644. name: "accepted htlc timeout",
  645. expSize: input.AcceptedHtlcTimeoutWitnessSize,
  646. genWitness: func(t *testing.T) wire.TxWitness {
  647. witScript, err := input.ReceiverHTLCScript(
  648. testCLTVExpiry, testPubkey, testPubkey,
  649. testPubkey, testHash160, false,
  650. )
  651. if err != nil {
  652. t.Fatal(err)
  653. }
  654. signDesc := &input.SignDescriptor{
  655. WitnessScript: witScript,
  656. }
  657. witness, err := input.ReceiverHtlcSpendTimeout(
  658. &dummySigner{}, signDesc, testTx,
  659. testCLTVExpiry,
  660. )
  661. if err != nil {
  662. t.Fatal(err)
  663. }
  664. return witness
  665. },
  666. },
  667. {
  668. name: "accepted htlc timeout confirmed",
  669. expSize: input.AcceptedHtlcTimeoutWitnessSizeConfirmed,
  670. genWitness: func(t *testing.T) wire.TxWitness {
  671. witScript, err := input.ReceiverHTLCScript(
  672. testCLTVExpiry, testPubkey, testPubkey,
  673. testPubkey, testHash160, true,
  674. )
  675. if err != nil {
  676. t.Fatal(err)
  677. }
  678. signDesc := &input.SignDescriptor{
  679. WitnessScript: witScript,
  680. }
  681. witness, err := input.ReceiverHtlcSpendTimeout(
  682. &dummySigner{}, signDesc, testTx,
  683. testCLTVExpiry,
  684. )
  685. if err != nil {
  686. t.Fatal(err)
  687. }
  688. return witness
  689. },
  690. },
  691. {
  692. name: "accepted htlc success",
  693. expSize: input.AcceptedHtlcSuccessWitnessSize,
  694. genWitness: func(t *testing.T) wire.TxWitness {
  695. witScript, err := input.ReceiverHTLCScript(
  696. testCLTVExpiry, testPubkey, testPubkey,
  697. testPubkey, testHash160, false,
  698. )
  699. if err != nil {
  700. t.Fatal(err)
  701. }
  702. signDesc := &input.SignDescriptor{
  703. WitnessScript: witScript,
  704. KeyDesc: keychain.KeyDescriptor{
  705. PubKey: testPubkey,
  706. },
  707. }
  708. witness, err := input.ReceiverHtlcSpendRedeem(
  709. &maxDERSignature{}, txscript.SigHashAll,
  710. testPreimage, &dummySigner{}, signDesc, testTx,
  711. )
  712. if err != nil {
  713. t.Fatal(err)
  714. }
  715. return witness
  716. },
  717. },
  718. {
  719. name: "accepted htlc success confirmed",
  720. expSize: input.AcceptedHtlcSuccessWitnessSizeConfirmed,
  721. genWitness: func(t *testing.T) wire.TxWitness {
  722. witScript, err := input.ReceiverHTLCScript(
  723. testCLTVExpiry, testPubkey, testPubkey,
  724. testPubkey, testHash160, true,
  725. )
  726. if err != nil {
  727. t.Fatal(err)
  728. }
  729. signDesc := &input.SignDescriptor{
  730. WitnessScript: witScript,
  731. KeyDesc: keychain.KeyDescriptor{
  732. PubKey: testPubkey,
  733. },
  734. }
  735. witness, err := input.ReceiverHtlcSpendRedeem(
  736. &maxDERSignature{}, txscript.SigHashAll,
  737. testPreimage, &dummySigner{}, signDesc, testTx,
  738. )
  739. if err != nil {
  740. t.Fatal(err)
  741. }
  742. return witness
  743. },
  744. },
  745. {
  746. name: "taproot to local sweep",
  747. expSize: input.TaprootToLocalWitnessSize,
  748. genWitness: func(t *testing.T) wire.TxWitness {
  749. testKey, err := btcec.NewPrivateKey()
  750. require.NoError(t, err)
  751. signer := &dummySigner{}
  752. commitScriptTree, err := input.NewLocalCommitScriptTree(
  753. testCSVDelay, testKey.PubKey(),
  754. testKey.PubKey(),
  755. )
  756. require.NoError(t, err)
  757. signDesc := &input.SignDescriptor{
  758. KeyDesc: keychain.KeyDescriptor{
  759. PubKey: testKey.PubKey(),
  760. },
  761. //nolint:lll
  762. WitnessScript: commitScriptTree.SettleLeaf.Script,
  763. HashType: txscript.SigHashAll,
  764. InputIndex: 0,
  765. SignMethod: input.TaprootScriptSpendSignMethod, //nolint:lll
  766. }
  767. witness, err := input.TaprootCommitSpendSuccess(
  768. signer, signDesc, testTx,
  769. commitScriptTree.TapscriptTree,
  770. )
  771. require.NoError(t, err)
  772. return witness
  773. },
  774. },
  775. {
  776. name: "taproot to local revocation",
  777. expSize: input.TaprootToLocalRevokeWitnessSize,
  778. genWitness: func(t *testing.T) wire.TxWitness {
  779. testKey, err := btcec.NewPrivateKey()
  780. require.NoError(t, err)
  781. signer := &dummySigner{}
  782. commitScriptTree, err := input.NewLocalCommitScriptTree(
  783. testCSVDelay, testKey.PubKey(),
  784. testKey.PubKey(),
  785. )
  786. require.NoError(t, err)
  787. signDesc := &input.SignDescriptor{
  788. KeyDesc: keychain.KeyDescriptor{
  789. PubKey: testKey.PubKey(),
  790. },
  791. //nolint:lll
  792. WitnessScript: commitScriptTree.RevocationLeaf.Script,
  793. HashType: txscript.SigHashAll,
  794. InputIndex: 0,
  795. SignMethod: input.TaprootScriptSpendSignMethod, //nolint:lll
  796. }
  797. witness, err := input.TaprootCommitSpendRevoke(
  798. signer, signDesc, testTx,
  799. commitScriptTree.TapscriptTree,
  800. )
  801. require.NoError(t, err)
  802. return witness
  803. },
  804. },
  805. {
  806. name: "taproot to remote sweep",
  807. expSize: input.TaprootToRemoteWitnessSize,
  808. genWitness: func(t *testing.T) wire.TxWitness {
  809. testKey, err := btcec.NewPrivateKey()
  810. require.NoError(t, err)
  811. signer := &dummySigner{}
  812. //nolint:lll
  813. commitScriptTree, err := input.NewRemoteCommitScriptTree(
  814. testKey.PubKey(),
  815. )
  816. require.NoError(t, err)
  817. signDesc := &input.SignDescriptor{
  818. KeyDesc: keychain.KeyDescriptor{
  819. PubKey: testKey.PubKey(),
  820. },
  821. //nolint:lll
  822. WitnessScript: commitScriptTree.SettleLeaf.Script,
  823. HashType: txscript.SigHashAll,
  824. InputIndex: 0,
  825. SignMethod: input.TaprootScriptSpendSignMethod, //nolint:lll
  826. }
  827. witness, err := input.TaprootCommitRemoteSpend(
  828. signer, signDesc, testTx,
  829. commitScriptTree.TapscriptTree,
  830. )
  831. require.NoError(t, err)
  832. return witness
  833. },
  834. },
  835. {
  836. name: "taproot anchor sweep",
  837. expSize: input.TaprootAnchorWitnessSize,
  838. genWitness: func(t *testing.T) wire.TxWitness {
  839. testKey, err := btcec.NewPrivateKey()
  840. require.NoError(t, err)
  841. signer := &dummySigner{}
  842. anchorScriptTree, err := input.NewAnchorScriptTree(
  843. testKey.PubKey(),
  844. )
  845. require.NoError(t, err)
  846. signDesc := &input.SignDescriptor{
  847. KeyDesc: keychain.KeyDescriptor{
  848. PubKey: testKey.PubKey(),
  849. },
  850. HashType: txscript.SigHashAll,
  851. InputIndex: 0,
  852. SignMethod: input.TaprootKeySpendSignMethod,
  853. TapTweak: anchorScriptTree.TapscriptRoot,
  854. }
  855. witness, err := input.TaprootAnchorSpend(
  856. signer, signDesc, testTx,
  857. )
  858. require.NoError(t, err)
  859. return witness
  860. },
  861. },
  862. {
  863. name: "taproot second level htlc success+timeout",
  864. expSize: input.TaprootSecondLevelHtlcWitnessSize,
  865. genWitness: func(t *testing.T) wire.TxWitness {
  866. testKey, err := btcec.NewPrivateKey()
  867. require.NoError(t, err)
  868. signer := &dummySigner{}
  869. scriptTree, err := input.SecondLevelHtlcTapscriptTree(
  870. testKey.PubKey(), testCSVDelay,
  871. )
  872. require.NoError(t, err)
  873. tapScriptRoot := scriptTree.RootNode.TapHash()
  874. revokeKey, err := btcec.NewPrivateKey()
  875. require.NoError(t, err)
  876. tapLeaf := scriptTree.LeafMerkleProofs[0].TapLeaf
  877. witnessScript := tapLeaf.Script
  878. signDesc := &input.SignDescriptor{
  879. KeyDesc: keychain.KeyDescriptor{
  880. PubKey: revokeKey.PubKey(),
  881. },
  882. WitnessScript: witnessScript,
  883. HashType: txscript.SigHashAll,
  884. InputIndex: 0,
  885. SignMethod: input.TaprootKeySpendSignMethod,
  886. TapTweak: tapScriptRoot[:],
  887. }
  888. witness, err := input.TaprootHtlcSpendSuccess(
  889. signer, signDesc, testTx, revokeKey.PubKey(),
  890. scriptTree,
  891. )
  892. require.NoError(t, err)
  893. return witness
  894. },
  895. },
  896. {
  897. name: "taproot second level htlc revoke",
  898. expSize: input.TaprootSecondLevelRevokeWitnessSize,
  899. genWitness: func(t *testing.T) wire.TxWitness {
  900. testKey, err := btcec.NewPrivateKey()
  901. require.NoError(t, err)
  902. scriptTree, err := input.SecondLevelHtlcTapscriptTree(
  903. testKey.PubKey(), testCSVDelay,
  904. )
  905. require.NoError(t, err)
  906. revokeKey, err := btcec.NewPrivateKey()
  907. require.NoError(t, err)
  908. signer := &dummySigner{}
  909. tapScriptRoot := scriptTree.RootNode.TapHash()
  910. signDesc := &input.SignDescriptor{
  911. KeyDesc: keychain.KeyDescriptor{
  912. PubKey: revokeKey.PubKey(),
  913. },
  914. HashType: txscript.SigHashAll,
  915. InputIndex: 0,
  916. SignMethod: input.TaprootKeySpendSignMethod,
  917. TapTweak: tapScriptRoot[:],
  918. }
  919. witness, err := input.TaprootHtlcSpendRevoke(
  920. signer, signDesc, testTx,
  921. )
  922. require.NoError(t, err)
  923. return witness
  924. },
  925. },
  926. {
  927. name: "taproot offered htlc revoke",
  928. expSize: input.TaprootOfferedRevokeWitnessSize,
  929. genWitness: func(t *testing.T) wire.TxWitness {
  930. senderKey, err := btcec.NewPrivateKey()
  931. require.NoError(t, err)
  932. receiverKey, err := btcec.NewPrivateKey()
  933. require.NoError(t, err)
  934. revokeKey, err := btcec.NewPrivateKey()
  935. require.NoError(t, err)
  936. var payHash [32]byte
  937. signer := &dummySigner{}
  938. htlcScriptTree, err := input.SenderHTLCScriptTaproot(
  939. senderKey.PubKey(), receiverKey.PubKey(),
  940. revokeKey.PubKey(), payHash[:], false,
  941. )
  942. require.NoError(t, err)
  943. signDesc := &input.SignDescriptor{
  944. KeyDesc: keychain.KeyDescriptor{
  945. PubKey: revokeKey.PubKey(),
  946. },
  947. HashType: txscript.SigHashAll,
  948. InputIndex: 0,
  949. SignMethod: input.TaprootKeySpendSignMethod,
  950. TapTweak: htlcScriptTree.TapscriptRoot,
  951. }
  952. witness, err := input.SenderHTLCScriptTaprootRevoke(
  953. signer, signDesc, testTx,
  954. )
  955. require.NoError(t, err)
  956. return witness
  957. },
  958. },
  959. {
  960. name: "taproot accepted htlc revoke",
  961. expSize: input.TaprootAcceptedRevokeWitnessSize,
  962. genWitness: func(t *testing.T) wire.TxWitness {
  963. senderKey, err := btcec.NewPrivateKey()
  964. require.NoError(t, err)
  965. receiverKey, err := btcec.NewPrivateKey()
  966. require.NoError(t, err)
  967. revokeKey, err := btcec.NewPrivateKey()
  968. require.NoError(t, err)
  969. var payHash [32]byte
  970. signer := &dummySigner{}
  971. htlcScriptTree, err := input.ReceiverHTLCScriptTaproot(
  972. testCLTVExpiry, senderKey.PubKey(),
  973. receiverKey.PubKey(), revokeKey.PubKey(),
  974. payHash[:], false,
  975. )
  976. require.NoError(t, err)
  977. signDesc := &input.SignDescriptor{
  978. KeyDesc: keychain.KeyDescriptor{
  979. PubKey: revokeKey.PubKey(),
  980. },
  981. HashType: txscript.SigHashAll,
  982. InputIndex: 0,
  983. SignMethod: input.TaprootKeySpendSignMethod,
  984. TapTweak: htlcScriptTree.TapscriptRoot,
  985. }
  986. witness, err := input.ReceiverHTLCScriptTaprootRevoke(
  987. signer, signDesc, testTx,
  988. )
  989. require.NoError(t, err)
  990. return witness
  991. },
  992. },
  993. {
  994. name: "taproot offered remote timeout",
  995. expSize: input.TaprootHtlcOfferedRemoteTimeoutWitnessSize,
  996. genWitness: func(t *testing.T) wire.TxWitness {
  997. senderKey, err := btcec.NewPrivateKey()
  998. require.NoError(t, err)
  999. receiverKey, err := btcec.NewPrivateKey()
  1000. require.NoError(t, err)
  1001. revokeKey, err := btcec.NewPrivateKey()
  1002. require.NoError(t, err)
  1003. var payHash [32]byte
  1004. signer := &dummySigner{}
  1005. htlcScriptTree, err := input.ReceiverHTLCScriptTaproot(
  1006. testCLTVExpiry, senderKey.PubKey(),
  1007. receiverKey.PubKey(), revokeKey.PubKey(),
  1008. payHash[:], false,
  1009. )
  1010. require.NoError(t, err)
  1011. timeoutLeaf := htlcScriptTree.TimeoutTapLeaf
  1012. signDesc := &input.SignDescriptor{
  1013. KeyDesc: keychain.KeyDescriptor{
  1014. PubKey: senderKey.PubKey(),
  1015. },
  1016. WitnessScript: timeoutLeaf.Script,
  1017. HashType: txscript.SigHashAll,
  1018. InputIndex: 0,
  1019. SignMethod: input.TaprootScriptSpendSignMethod, //nolint:lll
  1020. }
  1021. witness, err := input.ReceiverHTLCScriptTaprootTimeout(
  1022. signer, signDesc, testTx, testCLTVExpiry,
  1023. revokeKey.PubKey(),
  1024. htlcScriptTree.TapscriptTree,
  1025. )
  1026. require.NoError(t, err)
  1027. return witness
  1028. },
  1029. },
  1030. {
  1031. name: "taproot offered local timeout",
  1032. expSize: input.TaprootOfferedLocalTimeoutWitnessSize,
  1033. genWitness: func(t *testing.T) wire.TxWitness {
  1034. senderKey, err := btcec.NewPrivateKey()
  1035. require.NoError(t, err)
  1036. receiverKey, err := btcec.NewPrivateKey()
  1037. require.NoError(t, err)
  1038. revokeKey, err := btcec.NewPrivateKey()
  1039. require.NoError(t, err)
  1040. var payHash [32]byte
  1041. signer := &dummySigner{}
  1042. htlcScriptTree, err := input.SenderHTLCScriptTaproot(
  1043. senderKey.PubKey(), receiverKey.PubKey(),
  1044. revokeKey.PubKey(), payHash[:], false,
  1045. )
  1046. require.NoError(t, err)
  1047. timeoutLeaf := htlcScriptTree.TimeoutTapLeaf
  1048. scriptTree := htlcScriptTree.TapscriptTree
  1049. receiverDesc := &input.SignDescriptor{
  1050. KeyDesc: keychain.KeyDescriptor{
  1051. PubKey: receiverKey.PubKey(),
  1052. },
  1053. WitnessScript: timeoutLeaf.Script,
  1054. HashType: txscript.SigHashAll,
  1055. InputIndex: 0,
  1056. SignMethod: input.TaprootScriptSpendSignMethod, //nolint:lll
  1057. }
  1058. receiverSig, err := signer.SignOutputRaw(
  1059. testTx, receiverDesc,
  1060. )
  1061. require.NoError(t, err)
  1062. signDesc := &input.SignDescriptor{
  1063. KeyDesc: keychain.KeyDescriptor{
  1064. PubKey: senderKey.PubKey(),
  1065. },
  1066. WitnessScript: timeoutLeaf.Script,
  1067. HashType: txscript.SigHashAll,
  1068. InputIndex: 0,
  1069. SignMethod: input.TaprootScriptSpendSignMethod, //nolint:lll
  1070. }
  1071. witness, err := input.SenderHTLCScriptTaprootTimeout(
  1072. receiverSig, txscript.SigHashAll, signer,
  1073. signDesc, testTx, revokeKey.PubKey(),
  1074. scriptTree,
  1075. )
  1076. require.NoError(t, err)
  1077. return witness
  1078. },
  1079. },
  1080. {
  1081. name: "taproot accepted remote success",
  1082. expSize: input.TaprootHtlcAcceptedRemoteSuccessWitnessSize,
  1083. genWitness: func(t *testing.T) wire.TxWitness {
  1084. senderKey, err := btcec.NewPrivateKey()
  1085. require.NoError(t, err)
  1086. receiverKey, err := btcec.NewPrivateKey()
  1087. require.NoError(t, err)
  1088. revokeKey, err := btcec.NewPrivateKey()
  1089. require.NoError(t, err)
  1090. var payHash [32]byte
  1091. signer := &dummySigner{}
  1092. htlcScriptTree, err := input.SenderHTLCScriptTaproot(
  1093. senderKey.PubKey(), receiverKey.PubKey(),
  1094. revokeKey.PubKey(), payHash[:], false,
  1095. )
  1096. require.NoError(t, err)
  1097. successLeaf := htlcScriptTree.SuccessTapLeaf
  1098. scriptTree := htlcScriptTree.TapscriptTree
  1099. signDesc := &input.SignDescriptor{
  1100. KeyDesc: keychain.KeyDescriptor{
  1101. PubKey: receiverKey.PubKey(),
  1102. },
  1103. WitnessScript: successLeaf.Script,
  1104. HashType: txscript.SigHashAll,
  1105. InputIndex: 0,
  1106. SignMethod: input.TaprootScriptSpendSignMethod, //nolint:lll
  1107. }
  1108. witness, err := input.SenderHTLCScriptTaprootRedeem(
  1109. signer, signDesc, testTx, testPreimage,
  1110. revokeKey.PubKey(), scriptTree,
  1111. )
  1112. require.NoError(t, err)
  1113. return witness
  1114. },
  1115. },
  1116. {
  1117. name: "taproot accepted local success",
  1118. expSize: input.TaprootHtlcAcceptedLocalSuccessWitnessSize,
  1119. genWitness: func(t *testing.T) wire.TxWitness {
  1120. senderKey, err := btcec.NewPrivateKey()
  1121. require.NoError(t, err)
  1122. receiverKey, err := btcec.NewPrivateKey()
  1123. require.NoError(t, err)
  1124. revokeKey, err := btcec.NewPrivateKey()
  1125. require.NoError(t, err)
  1126. var payHash [32]byte
  1127. signer := &dummySigner{}
  1128. htlcScriptTree, err := input.ReceiverHTLCScriptTaproot(
  1129. testCLTVExpiry, senderKey.PubKey(),
  1130. receiverKey.PubKey(), revokeKey.PubKey(),
  1131. payHash[:], false,
  1132. )
  1133. require.NoError(t, err)
  1134. successsLeaf := htlcScriptTree.SuccessTapLeaf
  1135. scriptTree := htlcScriptTree.TapscriptTree
  1136. senderDesc := &input.SignDescriptor{
  1137. KeyDesc: keychain.KeyDescriptor{
  1138. PubKey: senderKey.PubKey(),
  1139. },
  1140. WitnessScript: successsLeaf.Script,
  1141. HashType: txscript.SigHashAll,
  1142. InputIndex: 0,
  1143. SignMethod: input.TaprootScriptSpendSignMethod, //nolint:lll
  1144. }
  1145. senderSig, err := signer.SignOutputRaw(
  1146. testTx, senderDesc,
  1147. )
  1148. require.NoError(t, err)
  1149. signDesc := &input.SignDescriptor{
  1150. KeyDesc: keychain.KeyDescriptor{
  1151. PubKey: receiverKey.PubKey(),
  1152. },
  1153. WitnessScript: successsLeaf.Script,
  1154. HashType: txscript.SigHashAll,
  1155. InputIndex: 0,
  1156. SignMethod: input.TaprootScriptSpendSignMethod, //nolint:lll
  1157. }
  1158. witness, err := input.ReceiverHTLCScriptTaprootRedeem(
  1159. senderSig, txscript.SigHashAll, testPreimage,
  1160. signer, signDesc, testTx, revokeKey.PubKey(),
  1161. scriptTree,
  1162. )
  1163. require.NoError(t, err)
  1164. return witness
  1165. },
  1166. },
  1167. }
  1168. // TestWitnessSizes asserts the correctness of our magic witness constants.
  1169. // Witnesses involving signatures will have maxDERSignatures injected so that we
  1170. // can determine upper bounds for the witness sizes. These constants are
  1171. // predominately used for fee estimation, so we want to be certain that we
  1172. // aren't under estimating or our transactions could get stuck.
  1173. func TestWitnessSizes(t *testing.T) {
  1174. for _, test := range witnessSizeTests {
  1175. test := test
  1176. t.Run(test.name, func(t *testing.T) {
  1177. size := test.genWitness(t).SerializeSize()
  1178. if size != test.expSize {
  1179. t.Fatalf("size mismatch, want: %v, got: %v",
  1180. test.expSize, size)
  1181. }
  1182. })
  1183. }
  1184. }
  1185. // genTimeoutTx creates a signed HTLC second level timeout tx.
  1186. func genTimeoutTx(t *testing.T,
  1187. chanType channeldb.ChannelType) *wire.MsgTx {
  1188. testKeyPriv, err := btcec.NewPrivateKey()
  1189. require.NoError(t, err)
  1190. testPubkey := testKeyPriv.PubKey()
  1191. // Create the unsigned timeout tx.
  1192. timeoutTx, err := lnwallet.CreateHtlcTimeoutTx(
  1193. chanType, false, testOutPoint, testAmt, testCLTVExpiry,
  1194. testCSVDelay, 0, testPubkey, testPubkey,
  1195. )
  1196. require.NoError(t, err)
  1197. // In order to sign the transaction, generate the script for the output
  1198. // it spends.
  1199. var (
  1200. witScript []byte
  1201. tapscriptTree *input.HtlcScriptTree
  1202. )
  1203. if chanType.IsTaproot() {
  1204. tapscriptTree, err = input.SenderHTLCScriptTaproot(
  1205. testPubkey, testPubkey, testPubkey, testHash160, false,
  1206. )
  1207. require.NoError(t, err)
  1208. witScript = tapscriptTree.TimeoutTapLeaf.Script
  1209. } else {
  1210. witScript, err = input.SenderHTLCScript(
  1211. testPubkey, testPubkey, testPubkey, testHash160,
  1212. chanType.HasAnchors(),
  1213. )
  1214. require.NoError(t, err)
  1215. }
  1216. signDesc := &input.SignDescriptor{
  1217. WitnessScript: witScript,
  1218. KeyDesc: keychain.KeyDescriptor{
  1219. PubKey: testPubkey,
  1220. },
  1221. }
  1222. sigHashType := lnwallet.HtlcSigHashType(chanType)
  1223. // Sign the timeout tx and add the witness.
  1224. var timeoutWitness [][]byte
  1225. if chanType.IsTaproot() {
  1226. signDesc.SignMethod = input.TaprootScriptSpendSignMethod
  1227. timeoutWitness, err = input.SenderHTLCScriptTaprootTimeout(
  1228. &maxSchnorrSignature{}, sigHashType, &dummySigner{},
  1229. signDesc, timeoutTx, testPubkey,
  1230. tapscriptTree.TapscriptTree,
  1231. )
  1232. require.NoError(t, err)
  1233. } else {
  1234. timeoutWitness, err = input.SenderHtlcSpendTimeout(
  1235. &maxDERSignature{}, sigHashType, &dummySigner{},
  1236. signDesc, timeoutTx,
  1237. )
  1238. require.NoError(t, err)
  1239. }
  1240. timeoutTx.TxIn[0].Witness = timeoutWitness
  1241. return timeoutTx
  1242. }
  1243. // genSuccessTx creates a signed HTLC second level success tx.
  1244. func genSuccessTx(t *testing.T, chanType channeldb.ChannelType) *wire.MsgTx {
  1245. testKeyPriv, err := btcec.NewPrivateKey()
  1246. require.NoError(t, err)
  1247. testPubkey := testKeyPriv.PubKey()
  1248. // Create the unsigned success tx.
  1249. successTx, err := lnwallet.CreateHtlcSuccessTx(
  1250. chanType, false, testOutPoint, testAmt, testCSVDelay, 0,
  1251. testPubkey, testPubkey,
  1252. )
  1253. require.NoError(t, err)
  1254. // In order to sign the transaction, generate the script for the output
  1255. // it spends.
  1256. var (
  1257. witScript []byte
  1258. tapscriptTree *input.HtlcScriptTree
  1259. )
  1260. if chanType.IsTaproot() {
  1261. tapscriptTree, err = input.ReceiverHTLCScriptTaproot(
  1262. testCLTVExpiry, testPubkey, testPubkey, testPubkey,
  1263. testHash160, false,
  1264. )
  1265. require.NoError(t, err)
  1266. witScript = tapscriptTree.SuccessTapLeaf.Script
  1267. } else {
  1268. witScript, err = input.ReceiverHTLCScript(
  1269. testCLTVExpiry, testPubkey, testPubkey,
  1270. testPubkey, testHash160, chanType.HasAnchors(),
  1271. )
  1272. require.NoError(t, err)
  1273. }
  1274. signDesc := &input.SignDescriptor{
  1275. WitnessScript: witScript,
  1276. KeyDesc: keychain.KeyDescriptor{
  1277. PubKey: testPubkey,
  1278. },
  1279. }
  1280. sigHashType := lnwallet.HtlcSigHashType(channeldb.SingleFunderBit)
  1281. var successWitness [][]byte
  1282. // Sign the success tx and add the witness.
  1283. if chanType.IsTaproot() {
  1284. signDesc.SignMethod = input.TaprootScriptSpendSignMethod
  1285. successWitness, err = input.ReceiverHTLCScriptTaprootRedeem(
  1286. &maxSchnorrSignature{}, sigHashType, testPreimage,
  1287. &dummySigner{}, signDesc, successTx, testPubkey,
  1288. tapscriptTree.TapscriptTree,
  1289. )
  1290. require.NoError(t, err)
  1291. } else {
  1292. successWitness, err = input.ReceiverHtlcSpendRedeem(
  1293. &maxDERSignature{}, sigHashType, testPreimage,
  1294. &dummySigner{}, signDesc, successTx,
  1295. )
  1296. require.NoError(t, err)
  1297. }
  1298. successTx.TxIn[0].Witness = successWitness
  1299. return successTx
  1300. }
  1301. type txSizeTest struct {
  1302. name string
  1303. expWeight int64
  1304. genTx func(t *testing.T) *wire.MsgTx
  1305. }
  1306. var txSizeTests = []txSizeTest{
  1307. {
  1308. name: "htlc timeout regular",
  1309. expWeight: input.HtlcTimeoutWeight,
  1310. genTx: func(t *testing.T) *wire.MsgTx {
  1311. return genTimeoutTx(t, channeldb.SingleFunderBit)
  1312. },
  1313. },
  1314. {
  1315. name: "htlc timeout confirmed",
  1316. expWeight: input.HtlcTimeoutWeightConfirmed,
  1317. genTx: func(t *testing.T) *wire.MsgTx {
  1318. return genTimeoutTx(t, channeldb.AnchorOutputsBit)
  1319. },
  1320. },
  1321. {
  1322. name: "taproot htlc timeout",
  1323. expWeight: input.TaprootHtlcTimeoutWeight,
  1324. genTx: func(t *testing.T) *wire.MsgTx {
  1325. return genTimeoutTx(
  1326. t, channeldb.SimpleTaprootFeatureBit,
  1327. )
  1328. },
  1329. },
  1330. {
  1331. name: "htlc success regular",
  1332. // The weight estimate from the spec is off by one, but it's
  1333. // okay since we overestimate the weight.
  1334. expWeight: input.HtlcSuccessWeight - 1,
  1335. genTx: func(t *testing.T) *wire.MsgTx {
  1336. return genSuccessTx(t, channeldb.SingleFunderBit)
  1337. },
  1338. },
  1339. {
  1340. name: "htlc success confirmed",
  1341. // The weight estimate from the spec is off by one, but it's
  1342. // okay since we overestimate the weight.
  1343. expWeight: input.HtlcSuccessWeightConfirmed - 1,
  1344. genTx: func(t *testing.T) *wire.MsgTx {
  1345. return genSuccessTx(t, channeldb.AnchorOutputsBit)
  1346. },
  1347. },
  1348. {
  1349. name: "taproot htlc success",
  1350. expWeight: input.TaprootHtlcSuccessWeight,
  1351. genTx: func(t *testing.T) *wire.MsgTx {
  1352. return genSuccessTx(
  1353. t, channeldb.SimpleTaprootFeatureBit,
  1354. )
  1355. },
  1356. },
  1357. }
  1358. // TestTxSizes asserts the correctness of our magic tx size constants.
  1359. func TestTxSizes(t *testing.T) {
  1360. for _, test := range txSizeTests {
  1361. test := test
  1362. t.Run(test.name, func(t *testing.T) {
  1363. tx := test.genTx(t)
  1364. weight := blockchain.GetTransactionWeight(
  1365. btcutil.NewTx(tx),
  1366. )
  1367. if weight != test.expWeight {
  1368. t.Fatalf("size mismatch, want: %v, got: %v",
  1369. test.expWeight, weight)
  1370. }
  1371. })
  1372. }
  1373. }