diff --git a/contractcourt/breacharbiter.go b/contractcourt/breacharbiter.go index ec285005a..10f49daa5 100644 --- a/contractcourt/breacharbiter.go +++ b/contractcourt/breacharbiter.go @@ -1440,7 +1440,7 @@ func (b *BreachArbiter) sweepSpendableOutputsTxn(txWeight int64, // Create a sighash cache to improve the performance of hashing and // signing SigHashAll inputs. - hashCache := txscript.NewTxSigHashes(txn) + hashCache := input.NewTxSigHashesV0Only(txn) // Create a closure that encapsulates the process of initializing a // particular output's witness generation function, computing the diff --git a/contractcourt/breacharbiter_test.go b/contractcourt/breacharbiter_test.go index f714b5d66..7dae490ab 100644 --- a/contractcourt/breacharbiter_test.go +++ b/contractcourt/breacharbiter_test.go @@ -1377,7 +1377,7 @@ func getSpendTransactions(signer input.Signer, chanPoint *wire.OutPoint, // sign and add the witness to the HTLC sweep. retInfo := newRetributionInfo(chanPoint, retribution) - hashCache := txscript.NewTxSigHashes(htlcSweep) + hashCache := input.NewTxSigHashesV0Only(htlcSweep) for i := range retInfo.breachedOutputs { inp := &retInfo.breachedOutputs[i] diff --git a/go.mod b/go.mod index 65ae2cab3..f7a85ce06 100644 --- a/go.mod +++ b/go.mod @@ -4,15 +4,16 @@ require ( github.com/NebulousLabs/fastrand v0.0.0-20181203155948-6fb6489aac4e // indirect github.com/NebulousLabs/go-upnp v0.0.0-20180202185039-29b680b06c82 github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344 - github.com/btcsuite/btcd v0.22.0-beta.0.20220207191057-4dc4ff7963b4 - github.com/btcsuite/btcd/btcec/v2 v2.1.0 - github.com/btcsuite/btcd/btcutil v1.1.0 - github.com/btcsuite/btcd/btcutil/psbt v1.1.0 + github.com/btcsuite/btcd v0.22.0-beta.0.20220316175102-8d5c75c28923 + github.com/btcsuite/btcd/btcec/v2 v2.1.3 + github.com/btcsuite/btcd/btcutil v1.1.1 + github.com/btcsuite/btcd/btcutil/psbt v1.1.1 + github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f - github.com/btcsuite/btcwallet v0.14.0 - github.com/btcsuite/btcwallet/wallet/txauthor v1.2.1 + github.com/btcsuite/btcwallet v0.14.1-0.20220322182735-b0001c262734 + github.com/btcsuite/btcwallet/wallet/txauthor v1.2.3 github.com/btcsuite/btcwallet/wallet/txrules v1.2.0 - github.com/btcsuite/btcwallet/walletdb v1.3.6-0.20210803004036-eebed51155ec + github.com/btcsuite/btcwallet/walletdb v1.4.0 github.com/btcsuite/btcwallet/wtxmgr v1.5.0 github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f github.com/davecgh/go-spew v1.1.1 diff --git a/go.sum b/go.sum index 6e7b5de55..b7ccfad89 100644 --- a/go.sum +++ b/go.sum @@ -73,39 +73,46 @@ github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcug github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= github.com/btcsuite/btcd v0.22.0-beta.0.20220204213055-eaf0459ff879/go.mod h1:osu7EoKiL36UThEgzYPqdRaxeo0NU8VoXqgcnwpey0g= -github.com/btcsuite/btcd v0.22.0-beta.0.20220207191057-4dc4ff7963b4 h1:CEGr/598C/0LZQUoioaT6sdGGcJgu4+ck0PDeJ/QkKs= github.com/btcsuite/btcd v0.22.0-beta.0.20220207191057-4dc4ff7963b4/go.mod h1:7alexyj/lHlOtr2PJK7L/+HDJZpcGDn/pAU98r7DY08= -github.com/btcsuite/btcd/btcec/v2 v2.1.0 h1:Whmbo9yShKKG+WrUfYGFfgj77vYBiwhwBSJnM66TMKI= +github.com/btcsuite/btcd v0.22.0-beta.0.20220316175102-8d5c75c28923 h1:6H47xWODLXYDuzHapvx4dauPqFjegX4+rHgUkFQPvfw= +github.com/btcsuite/btcd v0.22.0-beta.0.20220316175102-8d5c75c28923/go.mod h1:taIcYprAW2g6Z9S0gGUxyR+zDwimyDMK5ePOX+iJ2ds= github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= +github.com/btcsuite/btcd/btcec/v2 v2.1.1/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/btcec/v2 v2.1.3 h1:xM/n3yIhHAhHy04z4i43C8p4ehixJZMsnrVJkgl+MTE= +github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= -github.com/btcsuite/btcd/btcutil v1.1.0 h1:MO4klnGY+EWJdoWF12Wkuf4AWDBPMpZNeN/jRLrklUU= github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= -github.com/btcsuite/btcd/btcutil/psbt v1.1.0 h1:1LxDjz2ar4L2mrviBdxrzxesMMcAtj4nuBlX4FdqjOA= -github.com/btcsuite/btcd/btcutil/psbt v1.1.0/go.mod h1:xMuACsIKDzcE3kWMxqK+aLrAWZ8bMdn7YjYEwNs5q8k= +github.com/btcsuite/btcd/btcutil v1.1.1 h1:hDcDaXiP0uEzR8Biqo2weECKqEw0uHDZ9ixIWevVQqY= +github.com/btcsuite/btcd/btcutil v1.1.1/go.mod h1:nbKlBMNm9FGsdvKvu0essceubPiAcI57pYBNnsLAa34= +github.com/btcsuite/btcd/btcutil/psbt v1.1.1 h1:t8yNrashLB1ZLqOapxtWy/d8jMfMDgwPKwf70sgnSac= +github.com/btcsuite/btcd/btcutil/psbt v1.1.1/go.mod h1:KsGzRAzAdEimzgERpK9Xm+RhuCMvc4j2ctK0BEQ8JV0= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcwallet v0.14.0 h1:+Nwf0GkRUwDjd/F3i9HgrRhDp8RHZFbBZ3kQaZr6zD0= -github.com/btcsuite/btcwallet v0.14.0/go.mod h1:KFR1x3ZH7c31i4qA34XIvcsnhrEBLK1SHli52lN8E54= -github.com/btcsuite/btcwallet/wallet/txauthor v1.2.1 h1:oxIaFiF8gmOLJh7wNkXYkyLWT7Pj5igSrn5HthPVDYg= +github.com/btcsuite/btcwallet v0.14.1-0.20220322182735-b0001c262734 h1:gG2UgzXLiMiT4sw74161AEf0LE/mxDM8Ia6TaoV0VBw= +github.com/btcsuite/btcwallet v0.14.1-0.20220322182735-b0001c262734/go.mod h1:QN2tl1ipATUQRo9RtgvMHLSspqx7QWsj30qL+7AXuAo= github.com/btcsuite/btcwallet/wallet/txauthor v1.2.1/go.mod h1:/74bubxX5Js48d76nf/TsNabpYp/gndUuJw4chzCmhU= +github.com/btcsuite/btcwallet/wallet/txauthor v1.2.3 h1:M2yr5UlULvpqtxUqpMxTME/pA92Z9cpqeyvAFk9lAg0= +github.com/btcsuite/btcwallet/wallet/txauthor v1.2.3/go.mod h1:T2xSiKGpUkSLCh68aF+FMXmKK9mFqNdHl9VaqOr+JjU= github.com/btcsuite/btcwallet/wallet/txrules v1.2.0 h1:BtEN5Empw62/RVnZ0VcJaVtVlBijnLlJY+dwjAye2Bg= github.com/btcsuite/btcwallet/wallet/txrules v1.2.0/go.mod h1:AtkqiL7ccKWxuLYtZm8Bu8G6q82w4yIZdgq6riy60z0= github.com/btcsuite/btcwallet/wallet/txsizes v1.1.0 h1:wZnOolEAeNOHzHTnznw/wQv+j35ftCIokNrnOTOU5o8= github.com/btcsuite/btcwallet/wallet/txsizes v1.1.0/go.mod h1:pauEU8UuMFiThe5PB3EO+gO5kx87Me5NvdQDsTuq6cs= github.com/btcsuite/btcwallet/walletdb v1.3.5/go.mod h1:oJDxAEUHVtnmIIBaa22wSBPTVcs6hUp5NKWmI8xDwwU= -github.com/btcsuite/btcwallet/walletdb v1.3.6-0.20210803004036-eebed51155ec h1:zcAU3Ij8SmqaE+ITtS76fua2Niq7DRNp46sJRhi8PiI= github.com/btcsuite/btcwallet/walletdb v1.3.6-0.20210803004036-eebed51155ec/go.mod h1:oJDxAEUHVtnmIIBaa22wSBPTVcs6hUp5NKWmI8xDwwU= +github.com/btcsuite/btcwallet/walletdb v1.4.0 h1:/C5JRF+dTuE2CNMCO/or5N8epsrhmSM4710uBQoYPTQ= +github.com/btcsuite/btcwallet/walletdb v1.4.0/go.mod h1:oJDxAEUHVtnmIIBaa22wSBPTVcs6hUp5NKWmI8xDwwU= github.com/btcsuite/btcwallet/wtxmgr v1.5.0 h1:WO0KyN4l6H3JWnlFxfGR7r3gDnlGT7W2cL8vl6av4SU= github.com/btcsuite/btcwallet/wtxmgr v1.5.0/go.mod h1:TQVDhFxseiGtZwEPvLgtfyxuNUDsIdaJdshvWzR0HJ4= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/golangcrypto v0.0.0-20150304025918-53f62d9b43e8/go.mod h1:tYvUd8KLhm/oXvUeSEs2VlLghFjQt9+ZaF9ghH0JNjc= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/goleveldb v1.0.0 h1:Tvd0BfvqX9o823q1j2UZ/epQo09eJh6dTcRp79ilIN4= github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/snappy-go v1.0.0 h1:ZxaA6lo2EpxGddsA8JwWOcxlzRybb444sgmeJQMJGQE= github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= @@ -631,6 +638,8 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= diff --git a/input/input.go b/input/input.go index 642897a8d..865a761a3 100644 --- a/input/input.go +++ b/input/input.go @@ -338,7 +338,7 @@ func MakeHtlcSecondLevelTimeoutAnchorInput(signedTx *wire.MsgTx, txinIdx int) (wire.TxWitness, error) { desc := signDetails.SignDesc - desc.SigHashes = txscript.NewTxSigHashes(txn) + desc.SigHashes = NewTxSigHashesV0Only(txn) desc.InputIndex = txinIdx return SenderHtlcSpendTimeout( diff --git a/input/script_utils.go b/input/script_utils.go index 53d87587a..8302a972a 100644 --- a/input/script_utils.go +++ b/input/script_utils.go @@ -864,7 +864,7 @@ func HtlcSpendSuccess(signer Signer, signDesc *SignDescriptor, // As we mutated the transaction, we'll re-calculate the sighashes for // this instance. - signDesc.SigHashes = txscript.NewTxSigHashes(sweepTx) + signDesc.SigHashes = NewTxSigHashesV0Only(sweepTx) // With the proper sequence and version set, we'll now sign the timeout // transaction using the passed signed descriptor. In order to generate diff --git a/input/script_utils_test.go b/input/script_utils_test.go index 67a4f7988..a99873af8 100644 --- a/input/script_utils_test.go +++ b/input/script_utils_test.go @@ -280,7 +280,7 @@ func TestHTLCSenderSpendValidation(t *testing.T) { }, ) - sweepTxSigHashes = txscript.NewTxSigHashes(sweepTx) + sweepTxSigHashes = NewTxSigHashesV0Only(sweepTx) bobSigHash = txscript.SigHashAll if confirmed { @@ -546,9 +546,14 @@ func TestHTLCSenderSpendValidation(t *testing.T) { sweepTx.TxIn[0].Witness = testCase.witness() newEngine := func() (*txscript.Engine, error) { - return txscript.NewEngine(htlcPkScript, - sweepTx, 0, txscript.StandardVerifyFlags, nil, - nil, int64(paymentAmt)) + return txscript.NewEngine( + htlcPkScript, sweepTx, 0, + txscript.StandardVerifyFlags, nil, nil, + int64(paymentAmt), + txscript.NewCannedPrevOutputFetcher( + htlcPkScript, int64(paymentAmt), + ), + ) } assertEngineExecution(t, i, testCase.valid, newEngine) @@ -674,7 +679,7 @@ func TestHTLCReceiverSpendValidation(t *testing.T) { Value: 1 * 10e8, }, ) - sweepTxSigHashes = txscript.NewTxSigHashes(sweepTx) + sweepTxSigHashes = NewTxSigHashesV0Only(sweepTx) aliceSigHash = txscript.SigHashAll if confirmed { @@ -962,9 +967,14 @@ func TestHTLCReceiverSpendValidation(t *testing.T) { sweepTx.TxIn[0].Witness = testCase.witness() newEngine := func() (*txscript.Engine, error) { - return txscript.NewEngine(htlcPkScript, + return txscript.NewEngine( + htlcPkScript, sweepTx, 0, txscript.StandardVerifyFlags, nil, - nil, int64(paymentAmt)) + nil, int64(paymentAmt), + txscript.NewCannedPrevOutputFetcher( + htlcPkScript, int64(paymentAmt), + ), + ) } assertEngineExecution(t, i, testCase.valid, newEngine) @@ -1014,7 +1024,7 @@ func TestSecondLevelHtlcSpends(t *testing.T) { Value: 1 * 10e8, }, ) - sweepTxSigHashes := txscript.NewTxSigHashes(sweepTx) + sweepTxSigHashes := NewTxSigHashesV0Only(sweepTx) // The delay key will be crafted using Bob's public key as the output // we created will be spending from Alice's commitment transaction. @@ -1165,9 +1175,14 @@ func TestSecondLevelHtlcSpends(t *testing.T) { sweepTx.TxIn[0].Witness = testCase.witness() newEngine := func() (*txscript.Engine, error) { - return txscript.NewEngine(htlcPkScript, + return txscript.NewEngine( + htlcPkScript, sweepTx, 0, txscript.StandardVerifyFlags, nil, - nil, int64(htlcAmt)) + nil, int64(htlcAmt), + txscript.NewCannedPrevOutputFetcher( + htlcPkScript, int64(htlcAmt), + ), + ) } assertEngineExecution(t, i, testCase.valid, newEngine) @@ -1220,7 +1235,7 @@ func TestLeaseSecondLevelHtlcSpends(t *testing.T) { Value: 1 * 10e8, }, ) - sweepTxSigHashes := txscript.NewTxSigHashes(sweepTx) + sweepTxSigHashes := NewTxSigHashesV0Only(sweepTx) // The delay key will be crafted using Bob's public key as the output // we created will be spending from Alice's commitment transaction. @@ -1400,9 +1415,14 @@ func TestLeaseSecondLevelHtlcSpends(t *testing.T) { sweepTx.TxIn[0].Witness = testCase.witness() newEngine := func() (*txscript.Engine, error) { - return txscript.NewEngine(htlcPkScript, - sweepTx, 0, txscript.StandardVerifyFlags, nil, - nil, int64(htlcAmt)) + return txscript.NewEngine( + htlcPkScript, sweepTx, 0, + txscript.StandardVerifyFlags, nil, nil, + int64(htlcAmt), + txscript.NewCannedPrevOutputFetcher( + htlcPkScript, int64(htlcAmt), + ), + ) } assertEngineExecution(t, i, testCase.valid, newEngine) @@ -1472,7 +1492,7 @@ func TestLeaseCommmitSpendToSelf(t *testing.T) { // Bob can spend with his revocation key, but not // without the proper tweak. makeWitnessTestCase(t, func() (wire.TxWitness, error) { - sweepTxSigHashes := txscript.NewTxSigHashes(sweepTx) + sweepTxSigHashes := NewTxSigHashesV0Only(sweepTx) signDesc := &SignDescriptor{ KeyDesc: keychain.KeyDescriptor{ PubKey: bobKeyPub, @@ -1494,7 +1514,7 @@ func TestLeaseCommmitSpendToSelf(t *testing.T) { // Bob can spend with his revocation key with the proper // tweak. makeWitnessTestCase(t, func() (wire.TxWitness, error) { - sweepTxSigHashes := txscript.NewTxSigHashes(sweepTx) + sweepTxSigHashes := NewTxSigHashesV0Only(sweepTx) signDesc := &SignDescriptor{ KeyDesc: keychain.KeyDescriptor{ PubKey: bobKeyPub, @@ -1521,7 +1541,7 @@ func TestLeaseCommmitSpendToSelf(t *testing.T) { sweepTx.TxIn[0].Sequence = LockTimeToSequence( false, csvDelay/2, ) - sweepTxSigHashes := txscript.NewTxSigHashes(sweepTx) + sweepTxSigHashes := NewTxSigHashesV0Only(sweepTx) signDesc := &SignDescriptor{ KeyDesc: keychain.KeyDescriptor{ PubKey: aliceKeyPub, @@ -1548,7 +1568,7 @@ func TestLeaseCommmitSpendToSelf(t *testing.T) { sweepTx.TxIn[0].Sequence = LockTimeToSequence( false, csvDelay, ) - sweepTxSigHashes := txscript.NewTxSigHashes(sweepTx) + sweepTxSigHashes := NewTxSigHashesV0Only(sweepTx) signDesc := &SignDescriptor{ KeyDesc: keychain.KeyDescriptor{ PubKey: aliceKeyPub, @@ -1575,7 +1595,7 @@ func TestLeaseCommmitSpendToSelf(t *testing.T) { sweepTx.TxIn[0].Sequence = LockTimeToSequence( false, csvDelay, ) - sweepTxSigHashes := txscript.NewTxSigHashes(sweepTx) + sweepTxSigHashes := NewTxSigHashesV0Only(sweepTx) signDesc := &SignDescriptor{ KeyDesc: keychain.KeyDescriptor{ PubKey: aliceKeyPub, @@ -1599,9 +1619,14 @@ func TestLeaseCommmitSpendToSelf(t *testing.T) { sweepTx.TxIn[0].Witness = testCase.witness() newEngine := func() (*txscript.Engine, error) { - return txscript.NewEngine(commitPkScript, + return txscript.NewEngine( + commitPkScript, sweepTx, 0, txscript.StandardVerifyFlags, nil, - nil, int64(outputVal)) + nil, int64(outputVal), + txscript.NewCannedPrevOutputFetcher( + commitPkScript, int64(outputVal), + ), + ) } assertEngineExecution(t, i, testCase.valid, newEngine) @@ -1659,7 +1684,7 @@ func TestCommitSpendToRemoteConfirmed(t *testing.T) { // Alice can spend after the a CSV delay has passed. makeWitnessTestCase(t, func() (wire.TxWitness, error) { sweepTx.TxIn[0].Sequence = LockTimeToSequence(false, 1) - sweepTxSigHashes := txscript.NewTxSigHashes(sweepTx) + sweepTxSigHashes := NewTxSigHashesV0Only(sweepTx) signDesc := &SignDescriptor{ KeyDesc: keychain.KeyDescriptor{ @@ -1681,7 +1706,7 @@ func TestCommitSpendToRemoteConfirmed(t *testing.T) { // Alice cannot spend output without sequence set. makeWitnessTestCase(t, func() (wire.TxWitness, error) { sweepTx.TxIn[0].Sequence = wire.MaxTxInSequenceNum - sweepTxSigHashes := txscript.NewTxSigHashes(sweepTx) + sweepTxSigHashes := NewTxSigHashesV0Only(sweepTx) signDesc := &SignDescriptor{ KeyDesc: keychain.KeyDescriptor{ @@ -1705,9 +1730,14 @@ func TestCommitSpendToRemoteConfirmed(t *testing.T) { sweepTx.TxIn[0].Witness = testCase.witness() newEngine := func() (*txscript.Engine, error) { - return txscript.NewEngine(commitPkScript, - sweepTx, 0, txscript.StandardVerifyFlags, nil, - nil, int64(outputVal)) + return txscript.NewEngine( + commitPkScript, sweepTx, 0, + txscript.StandardVerifyFlags, nil, nil, + int64(outputVal), + txscript.NewCannedPrevOutputFetcher( + commitPkScript, int64(outputVal), + ), + ) } assertEngineExecution(t, i, testCase.valid, newEngine) @@ -1770,7 +1800,7 @@ func TestLeaseCommitSpendToRemoteConfirmed(t *testing.T) { sweepTx.TxIn[0].Sequence = LockTimeToSequence( false, 1, ) - sweepTxSigHashes := txscript.NewTxSigHashes(sweepTx) + sweepTxSigHashes := NewTxSigHashesV0Only(sweepTx) signDesc := &SignDescriptor{ KeyDesc: keychain.KeyDescriptor{ @@ -1795,7 +1825,7 @@ func TestLeaseCommitSpendToRemoteConfirmed(t *testing.T) { makeWitnessTestCase(t, func() (wire.TxWitness, error) { sweepTx.LockTime = leaseExpiry sweepTx.TxIn[0].Sequence = wire.MaxTxInSequenceNum - sweepTxSigHashes := txscript.NewTxSigHashes(sweepTx) + sweepTxSigHashes := NewTxSigHashesV0Only(sweepTx) signDesc := &SignDescriptor{ KeyDesc: keychain.KeyDescriptor{ @@ -1820,7 +1850,7 @@ func TestLeaseCommitSpendToRemoteConfirmed(t *testing.T) { makeWitnessTestCase(t, func() (wire.TxWitness, error) { sweepTx.LockTime = 0 sweepTx.TxIn[0].Sequence = wire.MaxTxInSequenceNum - sweepTxSigHashes := txscript.NewTxSigHashes(sweepTx) + sweepTxSigHashes := NewTxSigHashesV0Only(sweepTx) signDesc := &SignDescriptor{ KeyDesc: keychain.KeyDescriptor{ @@ -1849,6 +1879,9 @@ func TestLeaseCommitSpendToRemoteConfirmed(t *testing.T) { commitPkScript, sweepTx, 0, txscript.StandardVerifyFlags, nil, nil, int64(outputVal), + txscript.NewCannedPrevOutputFetcher( + commitPkScript, int64(outputVal), + ), ) } @@ -1913,7 +1946,7 @@ func TestSpendAnchor(t *testing.T) { // Alice can spend immediately. makeWitnessTestCase(t, func() (wire.TxWitness, error) { sweepTx.TxIn[0].Sequence = wire.MaxTxInSequenceNum - sweepTxSigHashes := txscript.NewTxSigHashes(sweepTx) + sweepTxSigHashes := NewTxSigHashesV0Only(sweepTx) signDesc := &SignDescriptor{ KeyDesc: keychain.KeyDescriptor{ @@ -1953,9 +1986,14 @@ func TestSpendAnchor(t *testing.T) { sweepTx.TxIn[0].Witness = testCase.witness() newEngine := func() (*txscript.Engine, error) { - return txscript.NewEngine(anchorPkScript, + return txscript.NewEngine( + anchorPkScript, sweepTx, 0, txscript.StandardVerifyFlags, nil, - nil, int64(anchorSize)) + nil, int64(anchorSize), + txscript.NewCannedPrevOutputFetcher( + anchorPkScript, int64(anchorSize), + ), + ) } assertEngineExecution(t, i, testCase.valid, newEngine) diff --git a/input/taproot.go b/input/taproot.go new file mode 100644 index 000000000..a80b51d29 --- /dev/null +++ b/input/taproot.go @@ -0,0 +1,20 @@ +package input + +import ( + "github.com/btcsuite/btcd/txscript" + "github.com/btcsuite/btcd/wire" +) + +// NewTxSigHashesV0Only returns a new txscript.TxSigHashes instance that will +// only calculate the sighash midstate values for segwit v0 inputs and can +// therefore never be used for transactions that want to spend segwit v1 +// (taproot) inputs. +func NewTxSigHashesV0Only(tx *wire.MsgTx) *txscript.TxSigHashes { + // The canned output fetcher returns a wire.TxOut instance with the + // given pk script and amount. We can get away with nil since the first + // thing the TxSigHashes constructor checks is the length of the pk + // script and whether it matches taproot output script length. If the + // length doesn't match it assumes v0 inputs only. + nilFetcher := txscript.NewCannedPrevOutputFetcher(nil, 0) + return txscript.NewTxSigHashes(tx, nilFetcher) +} diff --git a/lnrpc/signrpc/signer_server.go b/lnrpc/signrpc/signer_server.go index 54ce3a37d..bf0e2471c 100644 --- a/lnrpc/signrpc/signer_server.go +++ b/lnrpc/signrpc/signer_server.go @@ -266,7 +266,7 @@ func (s *Server) SignOutputRaw(ctx context.Context, in *SignReq) (*SignResp, return nil, fmt.Errorf("unable to decode tx: %v", err) } - sigHashCache := txscript.NewTxSigHashes(&txToSign) + sigHashCache := input.NewTxSigHashesV0Only(&txToSign) log.Debugf("Generating sigs for %v inputs: ", len(in.SignDescs)) @@ -405,7 +405,7 @@ func (s *Server) ComputeInputScript(ctx context.Context, return nil, fmt.Errorf("unable to decode tx: %v", err) } - sigHashCache := txscript.NewTxSigHashes(&txToSign) + sigHashCache := input.NewTxSigHashesV0Only(&txToSign) signDescs := make([]*input.SignDescriptor, 0, len(in.SignDescs)) for _, signDesc := range in.SignDescs { diff --git a/lnwallet/btcwallet/psbt.go b/lnwallet/btcwallet/psbt.go index 064555340..409277d22 100644 --- a/lnwallet/btcwallet/psbt.go +++ b/lnwallet/btcwallet/psbt.go @@ -107,7 +107,7 @@ func (b *BtcWallet) SignPsbt(packet *psbt.Packet) error { // there are inputs that we don't know how to sign, we won't return any // error. So it's possible we're not the final signer. tx := packet.UnsignedTx - sigHashes := txscript.NewTxSigHashes(tx) + sigHashes := input.NewTxSigHashesV0Only(tx) for idx := range tx.TxIn { in := packet.Inputs[idx] diff --git a/lnwallet/btcwallet/psbt_test.go b/lnwallet/btcwallet/psbt_test.go index b37dbf1d1..d4fcfc4ec 100644 --- a/lnwallet/btcwallet/psbt_test.go +++ b/lnwallet/btcwallet/psbt_test.go @@ -330,6 +330,9 @@ func TestSignPsbt(t *testing.T) { refTx.TxOut[0].PkScript, finalTx, 0, txscript.StandardVerifyFlags, nil, nil, refTx.TxOut[0].Value, + txscript.NewCannedPrevOutputFetcher( + refTx.TxOut[0].PkScript, refTx.TxOut[0].Value, + ), ) require.NoError(t, err) require.NoError(t, vm.Execute()) diff --git a/lnwallet/chanfunding/wallet_assembler.go b/lnwallet/chanfunding/wallet_assembler.go index 394540506..72cf56ce2 100644 --- a/lnwallet/chanfunding/wallet_assembler.go +++ b/lnwallet/chanfunding/wallet_assembler.go @@ -109,7 +109,7 @@ func (f *FullIntent) CompileFundingTx(extraInputs []*wire.TxIn, // order of the inputs. signDesc := input.SignDescriptor{ HashType: txscript.SigHashAll, - SigHashes: txscript.NewTxSigHashes(fundingTx), + SigHashes: input.NewTxSigHashesV0Only(fundingTx), } for i, txIn := range fundingTx.TxIn { // We can only sign this input if it's ours, so we'll ask the diff --git a/lnwallet/channel.go b/lnwallet/channel.go index 22a53defc..df5b244d8 100644 --- a/lnwallet/channel.go +++ b/lnwallet/channel.go @@ -3044,7 +3044,7 @@ func genRemoteHtlcSigJobs(keyRing *CommitmentKeyRing, WitnessScript: htlc.theirWitnessScript, Output: txOut, HashType: sigHashType, - SigHashes: txscript.NewTxSigHashes(sigJob.Tx), + SigHashes: input.NewTxSigHashesV0Only(sigJob.Tx), InputIndex: 0, } sigJob.OutputIndex = htlc.remoteOutputIndex @@ -3098,7 +3098,7 @@ func genRemoteHtlcSigJobs(keyRing *CommitmentKeyRing, WitnessScript: htlc.theirWitnessScript, Output: txOut, HashType: sigHashType, - SigHashes: txscript.NewTxSigHashes(sigJob.Tx), + SigHashes: input.NewTxSigHashesV0Only(sigJob.Tx), InputIndex: 0, } sigJob.OutputIndex = htlc.remoteOutputIndex @@ -3610,7 +3610,7 @@ func (lc *LightningChannel) SignNextCommitment() (lnwire.Sig, []lnwire.Sig, // While the jobs are being carried out, we'll Sign their version of // the new commitment transaction while we're waiting for the rest of // the HTLC signatures to be processed. - lc.signDesc.SigHashes = txscript.NewTxSigHashes(newCommitView.txn) + lc.signDesc.SigHashes = input.NewTxSigHashesV0Only(newCommitView.txn) rawSig, err := lc.Signer.SignOutputRaw(newCommitView.txn, lc.signDesc) if err != nil { close(cancelChan) @@ -4143,7 +4143,7 @@ func genHtlcSigValidationJobs(localCommitmentView *commitment, return nil, err } - hashCache := txscript.NewTxSigHashes(successTx) + hashCache := input.NewTxSigHashesV0Only(successTx) sigHash, err := txscript.CalcWitnessSigHash( htlc.ourWitnessScript, hashCache, sigHashType, successTx, 0, @@ -4198,7 +4198,7 @@ func genHtlcSigValidationJobs(localCommitmentView *commitment, return nil, err } - hashCache := txscript.NewTxSigHashes(timeoutTx) + hashCache := input.NewTxSigHashesV0Only(timeoutTx) sigHash, err := txscript.CalcWitnessSigHash( htlc.ourWitnessScript, hashCache, sigHashType, timeoutTx, 0, @@ -4391,7 +4391,7 @@ func (lc *LightningChannel) ReceiveNewCommitment(commitSig lnwire.Sig, // this newly proposed state update. localCommitTx := localCommitmentView.txn multiSigScript := lc.signDesc.WitnessScript - hashCache := txscript.NewTxSigHashes(localCommitTx) + hashCache := input.NewTxSigHashesV0Only(localCommitTx) sigHash, err := txscript.CalcWitnessSigHash( multiSigScript, hashCache, txscript.SigHashAll, localCommitTx, 0, int64(lc.channelState.Capacity), @@ -5493,7 +5493,7 @@ func (lc *LightningChannel) getSignedCommitTx() (*wire.MsgTx, error) { // With this, we then generate the full witness so the caller can // broadcast a fully signed transaction. - lc.signDesc.SigHashes = txscript.NewTxSigHashes(commitTx) + lc.signDesc.SigHashes = input.NewTxSigHashesV0Only(commitTx) ourSig, err := lc.Signer.SignOutputRaw(commitTx, lc.signDesc) if err != nil { return nil, err @@ -5901,7 +5901,7 @@ func newOutgoingHtlcResolution(signer input.Signer, WitnessScript: htlcScript, Output: txOut, HashType: txscript.SigHashAll, - SigHashes: txscript.NewTxSigHashes(timeoutTx), + SigHashes: input.NewTxSigHashesV0Only(timeoutTx), InputIndex: 0, } @@ -6036,7 +6036,7 @@ func newIncomingHtlcResolution(signer input.Signer, WitnessScript: htlcScript, Output: txOut, HashType: txscript.SigHashAll, - SigHashes: txscript.NewTxSigHashes(successTx), + SigHashes: input.NewTxSigHashesV0Only(successTx), InputIndex: 0, } @@ -6459,7 +6459,7 @@ func (lc *LightningChannel) CreateCloseProposal(proposedFee btcutil.Amount, // initiator we'll simply send our signature over to the remote party, // using the generated txid to be notified once the closure transaction // has been confirmed. - lc.signDesc.SigHashes = txscript.NewTxSigHashes(closeTx) + lc.signDesc.SigHashes = input.NewTxSigHashesV0Only(closeTx) sig, err := lc.Signer.SignOutputRaw(closeTx, lc.signDesc) if err != nil { return nil, nil, 0, err @@ -6519,7 +6519,7 @@ func (lc *LightningChannel) CompleteCooperativeClose( if err := blockchain.CheckTransactionSanity(tx); err != nil { return nil, 0, err } - hashCache := txscript.NewTxSigHashes(closeTx) + hashCache := input.NewTxSigHashesV0Only(closeTx) // Finally, construct the witness stack minding the order of the // pubkeys+sigs on the stack. @@ -6536,8 +6536,12 @@ func (lc *LightningChannel) CompleteCooperativeClose( // Validate the finalized transaction to ensure the output script is // properly met, and that the remote peer supplied a valid signature. prevOut := lc.signDesc.Output - vm, err := txscript.NewEngine(prevOut.PkScript, closeTx, 0, - txscript.StandardVerifyFlags, nil, hashCache, prevOut.Value) + vm, err := txscript.NewEngine( + prevOut.PkScript, closeTx, 0, txscript.StandardVerifyFlags, nil, + hashCache, prevOut.Value, txscript.NewCannedPrevOutputFetcher( + prevOut.PkScript, prevOut.Value, + ), + ) if err != nil { return nil, 0, err } diff --git a/lnwallet/channel_test.go b/lnwallet/channel_test.go index 0c6c456f7..4962c61d6 100644 --- a/lnwallet/channel_test.go +++ b/lnwallet/channel_test.go @@ -990,9 +990,14 @@ func testForceClose(t *testing.T, testCase *forceCloseTestCase) { // the multi-sig clause within the output on the commitment transaction // that produces this HTLC. timeoutTx := htlcResolution.SignedTimeoutTx - vm, err := txscript.NewEngine(senderHtlcPkScript, + vm, err := txscript.NewEngine( + senderHtlcPkScript, timeoutTx, 0, txscript.StandardVerifyFlags, nil, - nil, int64(htlcAmount.ToSatoshis())) + nil, int64(htlcAmount.ToSatoshis()), + txscript.NewCannedPrevOutputFetcher( + senderHtlcPkScript, int64(htlcAmount.ToSatoshis()), + ), + ) if err != nil { t.Fatalf("unable to create engine: %v", err) } @@ -1028,6 +1033,10 @@ func testForceClose(t *testing.T, testCase *forceCloseTestCase) { htlcResolution.SweepSignDesc.Output.PkScript, sweepTx, 0, txscript.StandardVerifyFlags, nil, nil, htlcResolution.SweepSignDesc.Output.Value, + txscript.NewCannedPrevOutputFetcher( + htlcResolution.SweepSignDesc.Output.PkScript, + htlcResolution.SweepSignDesc.Output.Value, + ), ) if err != nil { t.Fatalf("unable to create engine: %v", err) @@ -1057,9 +1066,14 @@ func testForceClose(t *testing.T, testCase *forceCloseTestCase) { // before publication. successTx := inHtlcResolution.SignedSuccessTx successTx.TxIn[0].Witness[3] = preimageBob[:] - vm, err = txscript.NewEngine(receiverHtlcScript, + vm, err = txscript.NewEngine( + receiverHtlcScript, successTx, 0, txscript.StandardVerifyFlags, nil, - nil, int64(htlcAmount.ToSatoshis())) + nil, int64(htlcAmount.ToSatoshis()), + txscript.NewCannedPrevOutputFetcher( + receiverHtlcScript, int64(htlcAmount.ToSatoshis()), + ), + ) if err != nil { t.Fatalf("unable to create engine: %v", err) } @@ -1091,6 +1105,10 @@ func testForceClose(t *testing.T, testCase *forceCloseTestCase) { inHtlcResolution.SweepSignDesc.Output.PkScript, sweepTx, 0, txscript.StandardVerifyFlags, nil, nil, inHtlcResolution.SweepSignDesc.Output.Value, + txscript.NewCannedPrevOutputFetcher( + inHtlcResolution.SweepSignDesc.Output.PkScript, + inHtlcResolution.SweepSignDesc.Output.Value, + ), ) if err != nil { t.Fatalf("unable to create engine: %v", err) @@ -5978,7 +5996,7 @@ func TestChannelUnilateralCloseHtlcResolution(t *testing.T) { Value: outHtlcResolution.SweepSignDesc.Output.Value, }) outHtlcResolution.SweepSignDesc.InputIndex = 0 - outHtlcResolution.SweepSignDesc.SigHashes = txscript.NewTxSigHashes( + outHtlcResolution.SweepSignDesc.SigHashes = input.NewTxSigHashesV0Only( sweepTx, ) sweepTx.LockTime = outHtlcResolution.Expiry @@ -5996,6 +6014,10 @@ func TestChannelUnilateralCloseHtlcResolution(t *testing.T) { outHtlcResolution.SweepSignDesc.Output.PkScript, sweepTx, 0, txscript.StandardVerifyFlags, nil, nil, outHtlcResolution.SweepSignDesc.Output.Value, + txscript.NewCannedPrevOutputFetcher( + outHtlcResolution.SweepSignDesc.Output.PkScript, + outHtlcResolution.SweepSignDesc.Output.Value, + ), ) if err != nil { t.Fatalf("unable to create engine: %v", err) @@ -6016,7 +6038,7 @@ func TestChannelUnilateralCloseHtlcResolution(t *testing.T) { Value: inHtlcResolution.SweepSignDesc.Output.Value, }) inHtlcResolution.SweepSignDesc.InputIndex = 0 - inHtlcResolution.SweepSignDesc.SigHashes = txscript.NewTxSigHashes( + inHtlcResolution.SweepSignDesc.SigHashes = input.NewTxSigHashesV0Only( sweepTx, ) sweepTx.TxIn[0].Witness, err = input.SenderHtlcSpendRedeem( @@ -6034,6 +6056,10 @@ func TestChannelUnilateralCloseHtlcResolution(t *testing.T) { inHtlcResolution.SweepSignDesc.Output.PkScript, sweepTx, 0, txscript.StandardVerifyFlags, nil, nil, inHtlcResolution.SweepSignDesc.Output.Value, + txscript.NewCannedPrevOutputFetcher( + inHtlcResolution.SweepSignDesc.Output.PkScript, + inHtlcResolution.SweepSignDesc.Output.Value, + ), ) if err != nil { t.Fatalf("unable to create engine: %v", err) @@ -6151,7 +6177,7 @@ func TestChannelUnilateralClosePendingCommit(t *testing.T) { PkScript: testHdSeed[:], Value: aliceSignDesc.Output.Value, }) - aliceSignDesc.SigHashes = txscript.NewTxSigHashes(sweepTx) + aliceSignDesc.SigHashes = input.NewTxSigHashesV0Only(sweepTx) sweepTx.TxIn[0].Witness, err = input.CommitSpendNoDelay( aliceChannel.Signer, &aliceSignDesc, sweepTx, false, ) @@ -6165,6 +6191,10 @@ func TestChannelUnilateralClosePendingCommit(t *testing.T) { aliceSignDesc.Output.PkScript, sweepTx, 0, txscript.StandardVerifyFlags, nil, nil, aliceSignDesc.Output.Value, + txscript.NewCannedPrevOutputFetcher( + aliceSignDesc.Output.PkScript, + aliceSignDesc.Output.Value, + ), ) if err != nil { t.Fatalf("unable to create engine: %v", err) diff --git a/lnwallet/chanvalidate/validate.go b/lnwallet/chanvalidate/validate.go index e0b10590d..c349ea974 100644 --- a/lnwallet/chanvalidate/validate.go +++ b/lnwallet/chanvalidate/validate.go @@ -189,6 +189,7 @@ func Validate(ctx *Context) (*wire.OutPoint, error) { vm, err := txscript.NewEngine( ctx.MultiSigPkScript, ctx.CommitCtx.FullySignedCommitTx, 0, txscript.StandardVerifyFlags, nil, nil, fundingValue, + txscript.NewCannedPrevOutputFetcher(ctx.MultiSigPkScript, 0), ) if err != nil { return nil, err diff --git a/lnwallet/chanvalidate/validate_test.go b/lnwallet/chanvalidate/validate_test.go index 13a192b21..85d0e92a1 100644 --- a/lnwallet/chanvalidate/validate_test.go +++ b/lnwallet/chanvalidate/validate_test.go @@ -98,7 +98,7 @@ func newChannelTestCtx(chanSize int64) (*channelTestCtx, error) { }, } - sigHashes := txscript.NewTxSigHashes(commitTx) + sigHashes := input.NewTxSigHashesV0Only(commitTx) aliceSigRaw, err := txscript.RawTxInWitnessSignature( commitTx, sigHashes, 0, chanSize, multiSigScript, txscript.SigHashAll, alicePriv, diff --git a/lnwallet/rpcwallet/rpcwallet.go b/lnwallet/rpcwallet/rpcwallet.go index e4ff17ea6..052b3d86c 100644 --- a/lnwallet/rpcwallet/rpcwallet.go +++ b/lnwallet/rpcwallet/rpcwallet.go @@ -135,7 +135,7 @@ func (r *RPCKeyRing) SendOutputs(outputs []*wire.TxOut, // So we can just compute the input script using the remote signer. signDesc := input.SignDescriptor{ HashType: txscript.SigHashAll, - SigHashes: txscript.NewTxSigHashes(tx), + SigHashes: input.NewTxSigHashesV0Only(tx), } for i, txIn := range tx.TxIn { // We can only sign this input if it's ours, so we'll ask the @@ -255,7 +255,7 @@ func (r *RPCKeyRing) FinalizePsbt(packet *psbt.Packet, _ string) error { // ones to sign. If there is any input without witness data that we // cannot sign because it's not our UTXO, this will be a hard failure. tx := packet.UnsignedTx - sigHashes := txscript.NewTxSigHashes(tx) + sigHashes := input.NewTxSigHashesV0Only(tx) for idx, txIn := range tx.TxIn { in := packet.Inputs[idx] diff --git a/lnwallet/test/test_interface.go b/lnwallet/test/test_interface.go index cba0eae7b..5f0f3fbab 100644 --- a/lnwallet/test/test_interface.go +++ b/lnwallet/test/test_interface.go @@ -1710,7 +1710,7 @@ func txFromOutput(tx *wire.MsgTx, signer input.Signer, fromPubKey, WitnessScript: keyScript, Output: tx.TxOut[outputIndex], HashType: txscript.SigHashAll, - SigHashes: txscript.NewTxSigHashes(tx1), + SigHashes: input.NewTxSigHashesV0Only(tx1), InputIndex: 0, // Has only one input. } @@ -1730,7 +1730,9 @@ func txFromOutput(tx *wire.MsgTx, signer input.Signer, fromPubKey, // private key. vm, err := txscript.NewEngine( keyScript, tx1, 0, txscript.StandardVerifyFlags, nil, - nil, outputValue, + nil, outputValue, txscript.NewCannedPrevOutputFetcher( + keyScript, outputValue, + ), ) if err != nil { return nil, fmt.Errorf("unable to create engine: %v", err) @@ -2096,7 +2098,7 @@ func testSignOutputUsingTweaks(r *rpctest.Harness, WitnessScript: keyScript, Output: newOutput, HashType: txscript.SigHashAll, - SigHashes: txscript.NewTxSigHashes(sweepTx), + SigHashes: input.NewTxSigHashesV0Only(sweepTx), InputIndex: 0, } @@ -2123,9 +2125,13 @@ func testSignOutputUsingTweaks(r *rpctest.Harness, // Finally, attempt to validate the completed transaction. This // should succeed if the wallet was able to properly generate // the proper private key. - vm, err := txscript.NewEngine(keyScript, - sweepTx, 0, txscript.StandardVerifyFlags, nil, - nil, int64(btcutil.SatoshiPerBitcoin)) + vm, err := txscript.NewEngine( + keyScript, sweepTx, 0, txscript.StandardVerifyFlags, + nil, nil, int64(btcutil.SatoshiPerBitcoin), + txscript.NewCannedPrevOutputFetcher( + keyScript, int64(btcutil.SatoshiPerBitcoin), + ), + ) if err != nil { t.Fatalf("unable to create engine: %v", err) } @@ -2833,7 +2839,7 @@ func testSignOutputCreateAccount(r *rpctest.Harness, w *lnwallet.LightningWallet Value: 1000, }, HashType: txscript.SigHashAll, - SigHashes: txscript.NewTxSigHashes(fakeTx), + SigHashes: input.NewTxSigHashesV0Only(fakeTx), InputIndex: 0, } diff --git a/lnwallet/transactions_test.go b/lnwallet/transactions_test.go index 4e8d76f7e..e8446e0e4 100644 --- a/lnwallet/transactions_test.go +++ b/lnwallet/transactions_test.go @@ -612,7 +612,7 @@ func testSpendValidation(t *testing.T, tweakless bool) { PubKey: aliceKeyPub, }, SingleTweak: remoteCommitTweak, - SigHashes: txscript.NewTxSigHashes(sweepTx), + SigHashes: input.NewTxSigHashesV0Only(sweepTx), Output: &wire.TxOut{ Value: int64(channelBalance), }, @@ -626,9 +626,11 @@ func testSpendValidation(t *testing.T, tweakless bool) { t.Fatalf("unable to generate delay commit spend witness: %v", err) } sweepTx.TxIn[0].Witness = aliceWitnessSpend - vm, err := txscript.NewEngine(delayOutput.PkScript, - sweepTx, 0, txscript.StandardVerifyFlags, nil, - nil, int64(channelBalance)) + vm, err := txscript.NewEngine( + delayOutput.PkScript, sweepTx, 0, txscript.StandardVerifyFlags, + nil, nil, int64(channelBalance), + txscript.NewCannedPrevOutputFetcher(nil, 0), + ) if err != nil { t.Fatalf("unable to create engine: %v", err) } @@ -647,7 +649,7 @@ func testSpendValidation(t *testing.T, tweakless bool) { }, DoubleTweak: commitSecret, WitnessScript: delayScript, - SigHashes: txscript.NewTxSigHashes(sweepTx), + SigHashes: input.NewTxSigHashesV0Only(sweepTx), Output: &wire.TxOut{ Value: int64(channelBalance), }, @@ -660,9 +662,11 @@ func testSpendValidation(t *testing.T, tweakless bool) { t.Fatalf("unable to generate revocation witness: %v", err) } sweepTx.TxIn[0].Witness = bobWitnessSpend - vm, err = txscript.NewEngine(delayOutput.PkScript, - sweepTx, 0, txscript.StandardVerifyFlags, nil, - nil, int64(channelBalance)) + vm, err = txscript.NewEngine( + delayOutput.PkScript, sweepTx, 0, txscript.StandardVerifyFlags, + nil, nil, int64(channelBalance), + txscript.NewCannedPrevOutputFetcher(nil, 0), + ) if err != nil { t.Fatalf("unable to create engine: %v", err) } @@ -691,7 +695,7 @@ func testSpendValidation(t *testing.T, tweakless bool) { PubKey: bobKeyPub, }, WitnessScript: bobScriptP2WKH, - SigHashes: txscript.NewTxSigHashes(sweepTx), + SigHashes: input.NewTxSigHashesV0Only(sweepTx), Output: &wire.TxOut{ Value: int64(channelBalance), PkScript: bobScriptP2WKH, @@ -713,6 +717,7 @@ func testSpendValidation(t *testing.T, tweakless bool) { regularOutput.PkScript, sweepTx, 0, txscript.StandardVerifyFlags, nil, nil, int64(channelBalance), + txscript.NewCannedPrevOutputFetcher(bobScriptP2WKH, 0), ) if err != nil { t.Fatalf("unable to create engine: %v", err) diff --git a/lnwallet/wallet.go b/lnwallet/wallet.go index c3548b1de..e6145fae3 100644 --- a/lnwallet/wallet.go +++ b/lnwallet/wallet.go @@ -1615,7 +1615,7 @@ func (l *LightningWallet) handleChanPointReady(req *continueContributionMsg) { KeyDesc: ourKey, Output: fundingOutput, HashType: txscript.SigHashAll, - SigHashes: txscript.NewTxSigHashes(theirCommitTx), + SigHashes: input.NewTxSigHashesV0Only(theirCommitTx), InputIndex: 0, } sigTheirCommit, err := l.Cfg.Signer.SignOutputRaw(theirCommitTx, &signDesc) @@ -1690,7 +1690,7 @@ func (l *LightningWallet) verifyFundingInputs(fundingTx *wire.MsgTx, remoteInputScripts []*input.Script) error { sigIndex := 0 - fundingHashCache := txscript.NewTxSigHashes(fundingTx) + fundingHashCache := input.NewTxSigHashesV0Only(fundingTx) inputScripts := remoteInputScripts for i, txin := range fundingTx.TxIn { if len(inputScripts) != 0 && len(txin.Witness) == 0 { @@ -1727,6 +1727,9 @@ func (l *LightningWallet) verifyFundingInputs(fundingTx *wire.MsgTx, output.PkScript, fundingTx, i, txscript.StandardVerifyFlags, nil, fundingHashCache, output.Value, + txscript.NewCannedPrevOutputFetcher( + output.PkScript, output.Value, + ), ) if err != nil { return fmt.Errorf("cannot create script "+ @@ -1806,7 +1809,7 @@ func (l *LightningWallet) handleFundingCounterPartySigs(msg *addCounterPartySigs // Next, create the spending scriptSig, and then verify that the script // is complete, allowing us to spend from the funding transaction. channelValue := int64(res.partialState.Capacity) - hashCache := txscript.NewTxSigHashes(commitTx) + hashCache := input.NewTxSigHashesV0Only(commitTx) sigHash, err := txscript.CalcWitnessSigHash( witnessScript, hashCache, txscript.SigHashAll, commitTx, 0, channelValue, @@ -1957,7 +1960,7 @@ func (l *LightningWallet) handleSingleFunderSigs(req *addSingleFunderSigsMsg) { req.fundingOutpoint, spew.Sdump(theirCommitTx)) channelValue := int64(pendingReservation.partialState.Capacity) - hashCache := txscript.NewTxSigHashes(ourCommitTx) + hashCache := input.NewTxSigHashesV0Only(ourCommitTx) theirKey := pendingReservation.theirContribution.MultiSigKey ourKey := pendingReservation.ourContribution.MultiSigKey witnessScript, _, err := input.GenFundingPkScript( @@ -2008,7 +2011,7 @@ func (l *LightningWallet) handleSingleFunderSigs(req *addSingleFunderSigsMsg) { Value: channelValue, }, HashType: txscript.SigHashAll, - SigHashes: txscript.NewTxSigHashes(theirCommitTx), + SigHashes: input.NewTxSigHashesV0Only(theirCommitTx), InputIndex: 0, } sigTheirCommit, err := l.Cfg.Signer.SignOutputRaw(theirCommitTx, &signDesc) diff --git a/sweep/txgenerator.go b/sweep/txgenerator.go index 19934213d..3cbdb7c7b 100644 --- a/sweep/txgenerator.go +++ b/sweep/txgenerator.go @@ -7,7 +7,6 @@ import ( "github.com/btcsuite/btcd/blockchain" "github.com/btcsuite/btcd/btcutil" - "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" "github.com/lightningnetwork/lnd/input" "github.com/lightningnetwork/lnd/lnwallet" @@ -264,7 +263,7 @@ func createSweepTx(inputs []input.Input, outputs []*wire.TxOut, return nil, err } - hashCache := txscript.NewTxSigHashes(sweepTx) + hashCache := input.NewTxSigHashesV0Only(sweepTx) // With all the inputs in place, use each output's unique input script // function to generate the final witness required for spending. diff --git a/watchtower/lookout/justice_descriptor.go b/watchtower/lookout/justice_descriptor.go index 87eebbe48..5e21cda6b 100644 --- a/watchtower/lookout/justice_descriptor.go +++ b/watchtower/lookout/justice_descriptor.go @@ -228,6 +228,9 @@ func (p *JusticeDescriptor) assembleJusticeTxn(txWeight int64, input.txOut.PkScript, justiceTxn, i, txscript.StandardVerifyFlags, nil, nil, input.txOut.Value, + txscript.NewCannedPrevOutputFetcher( + input.txOut.PkScript, input.txOut.Value, + ), ) if err != nil { return nil, err diff --git a/watchtower/lookout/justice_descriptor_test.go b/watchtower/lookout/justice_descriptor_test.go index 9ed26db3c..aa1b10f7b 100644 --- a/watchtower/lookout/justice_descriptor_test.go +++ b/watchtower/lookout/justice_descriptor_test.go @@ -269,7 +269,7 @@ func testJusticeDescriptor(t *testing.T, blobType blob.Type) { justiceTxn.TxOut = outputs txsort.InPlaceSort(justiceTxn) - hashCache := txscript.NewTxSigHashes(justiceTxn) + hashCache := input.NewTxSigHashesV0Only(justiceTxn) // Create the sign descriptor used to sign for the to-local input. toLocalSignDesc := &input.SignDescriptor{ diff --git a/watchtower/wtclient/backup_task.go b/watchtower/wtclient/backup_task.go index 349356554..2ae836595 100644 --- a/watchtower/wtclient/backup_task.go +++ b/watchtower/wtclient/backup_task.go @@ -7,7 +7,6 @@ import ( "github.com/btcsuite/btcd/btcec/v2" "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/btcutil/txsort" - "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/input" @@ -285,7 +284,7 @@ func (t *backupTask) craftSessionPayload( } // Construct a sighash cache to improve signing performance. - hashCache := txscript.NewTxSigHashes(justiceTxn) + hashCache := input.NewTxSigHashesV0Only(justiceTxn) // Since the transaction inputs could have been reordered as a result of // the BIP69 sort, create an index mapping each prevout to it's new