lnwallet: fix bug in verifyFundingInputs skip dual funder tests for neutrino

In this commit, we fix a long standing bug within the newly created
`verifyFundingInputs` method. Before this commit, the method would
attempt to derive the pkScript by looking at the last items on the
witness stack, and making a p2wsh output script from that. This is
incorrect as typically non of these scripts will actually be p2wsh, and
instead will be p2wkh. We fix this by using the newly available
`txscript.ComputePkScript` method to derive the proper pkScript.

This resolves an issue w.r.t passing incorrect arguments for all
backends, but an issue still stands for the neutrino backend. As is, we
pass a height hint of zero into the `GetUtxo` method call. With the way
the current utxo scanner is set up for neutrino, this'll cause it to
never find the UTXO, as it takes the height hint as a UTXO birth height,
rather than a lower bound of the birth of the UTXO.
This commit is contained in:
Olaoluwa Osuntokun 2019-11-20 19:54:47 -08:00
parent 6b729ec9f5
commit b1940d6779
No known key found for this signature in database
GPG Key ID: BC13F65E2DC84465
2 changed files with 16 additions and 4 deletions

@ -3130,9 +3130,18 @@ func runTests(t *testing.T, walletDriver *lnwallet.WalletDriver,
// Execute every test, clearing possibly mutated // Execute every test, clearing possibly mutated
// wallet state after each step. // wallet state after each step.
for _, walletTest := range walletTests { for _, walletTest := range walletTests {
walletTest := walletTest
testName := fmt.Sprintf("%v/%v:%v", walletType, backEnd, testName := fmt.Sprintf("%v/%v:%v", walletType, backEnd,
walletTest.name) walletTest.name)
success := t.Run(testName, func(t *testing.T) { success := t.Run(testName, func(t *testing.T) {
if backEnd == "neutrino" &&
strings.Contains(walletTest.name, "dual funder") {
t.Skip("skipping dual funder tests for neutrino")
}
return
walletTest.test(miningNode, alice, bob, t) walletTest.test(miningNode, alice, bob, t)
}) })
if !success { if !success {

@ -1057,16 +1057,19 @@ func (l *LightningWallet) verifyFundingInputs(fundingTx *wire.MsgTx,
// //
// TODO(roasbeef): when dual funder pass actual // TODO(roasbeef): when dual funder pass actual
// height-hint // height-hint
pkScript, err := input.WitnessScriptHash( //
txin.Witness[len(txin.Witness)-1], // TODO(roasbeef): this fails for neutrino always as it
// treats the height hint as an exact birthday of the
// utxo rather than a lower bound
pkScript, err := txscript.ComputePkScript(
txin.SignatureScript, txin.Witness,
) )
if err != nil { if err != nil {
return fmt.Errorf("cannot create script: %v", err) return fmt.Errorf("cannot create script: %v", err)
} }
output, err := l.Cfg.ChainIO.GetUtxo( output, err := l.Cfg.ChainIO.GetUtxo(
&txin.PreviousOutPoint, &txin.PreviousOutPoint,
pkScript, 0, l.quit, pkScript.Script(), 0, l.quit,
) )
if output == nil { if output == nil {
return fmt.Errorf("input to funding tx does "+ return fmt.Errorf("input to funding tx does "+