Skip to content

Commit 2ea4ded

Browse files
committed
backend/btc: move unused SignatureScript()
Since we use PSBT's and btcd/psbt's extract function, our own function to create witnesses is redundant. We still need it in the test, so we just move it there for now.
1 parent 5f29479 commit 2ea4ded

File tree

2 files changed

+49
-51
lines changed

2 files changed

+49
-51
lines changed

backend/coins/btc/addresses/address.go

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import (
2626
"github.com/btcsuite/btcd/btcutil"
2727
"github.com/btcsuite/btcd/chaincfg"
2828
"github.com/btcsuite/btcd/txscript"
29-
"github.com/btcsuite/btcd/wire"
3029
"github.com/sirupsen/logrus"
3130
)
3231

@@ -171,51 +170,3 @@ func (address *AccountAddress) ScriptForHashToSign() (bool, []byte) {
171170
}
172171
panic("The end of the function cannot be reached.")
173172
}
174-
175-
// SignatureScript returns the signature script (and witness) needed to spend from this address.
176-
// The signatures have to be provided in the order of the configuration (and some can be nil).
177-
func (address *AccountAddress) SignatureScript(
178-
signature types.Signature,
179-
) ([]byte, wire.TxWitness) {
180-
publicKey := address.PublicKey
181-
switch address.AccountConfiguration.ScriptType() {
182-
case signing.ScriptTypeP2PKH:
183-
signatureScript, err := txscript.NewScriptBuilder().
184-
AddData(append(signature.SerializeDER(), byte(txscript.SigHashAll))).
185-
AddData(publicKey.SerializeCompressed()).
186-
Script()
187-
if err != nil {
188-
address.log.WithError(err).Panic("Failed to build signature script for P2PKH.")
189-
}
190-
return signatureScript, nil
191-
case signing.ScriptTypeP2WPKHP2SH:
192-
signatureScript, err := txscript.NewScriptBuilder().
193-
AddData(address.RedeemScript).
194-
Script()
195-
if err != nil {
196-
address.log.WithError(err).Panic("Failed to build segwit signature script.")
197-
}
198-
txWitness := wire.TxWitness{
199-
append(signature.SerializeDER(), byte(txscript.SigHashAll)),
200-
publicKey.SerializeCompressed(),
201-
}
202-
return signatureScript, txWitness
203-
case signing.ScriptTypeP2WPKH:
204-
txWitness := wire.TxWitness{
205-
append(signature.SerializeDER(), byte(txscript.SigHashAll)),
206-
publicKey.SerializeCompressed(),
207-
}
208-
return []byte{}, txWitness
209-
case signing.ScriptTypeP2TR:
210-
// We assume SIGHASH_DEFAULT, which defaults to SIGHASH_ALL without needing to explicitly
211-
// append it to the signature. See:
212-
// https://github.com/bitcoin/bips/blob/97e02b2223b21753acefa813a4e59dbb6e849e77/bip-0341.mediawiki#taproot-key-path-spending-signature-validation
213-
txWitness := wire.TxWitness{
214-
signature.SerializeCompact(),
215-
}
216-
return []byte{}, txWitness
217-
default:
218-
address.log.Panic("Unrecognized address type.")
219-
}
220-
panic("The end of the function cannot be reached.")
221-
}

backend/coins/btc/maketx/txsize_internal_test.go

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@ import (
2020
"math/big"
2121
"testing"
2222

23+
"github.com/BitBoxSwiss/bitbox-wallet-app/backend/coins/btc/addresses"
2324
addressesTest "github.com/BitBoxSwiss/bitbox-wallet-app/backend/coins/btc/addresses/test"
2425
"github.com/BitBoxSwiss/bitbox-wallet-app/backend/coins/btc/types"
2526
"github.com/BitBoxSwiss/bitbox-wallet-app/backend/signing"
2627
"github.com/btcsuite/btcd/btcutil"
2728
"github.com/btcsuite/btcd/mempool"
29+
"github.com/btcsuite/btcd/txscript"
2830
"github.com/btcsuite/btcd/wire"
2931
"github.com/stretchr/testify/require"
3032
)
@@ -57,6 +59,51 @@ func makeSig() types.Signature {
5759
return sig
5860
}
5961

62+
// signatureScript returns the signature script (and witness) needed to spend from this address.
63+
func signatureScript(
64+
t *testing.T,
65+
address *addresses.AccountAddress,
66+
signature types.Signature,
67+
) ([]byte, wire.TxWitness) {
68+
t.Helper()
69+
publicKey := address.PublicKey
70+
switch address.AccountConfiguration.ScriptType() {
71+
case signing.ScriptTypeP2PKH:
72+
signatureScript, err := txscript.NewScriptBuilder().
73+
AddData(append(signature.SerializeDER(), byte(txscript.SigHashAll))).
74+
AddData(publicKey.SerializeCompressed()).
75+
Script()
76+
require.NoError(t, err)
77+
return signatureScript, nil
78+
case signing.ScriptTypeP2WPKHP2SH:
79+
signatureScript, err := txscript.NewScriptBuilder().
80+
AddData(address.RedeemScript).
81+
Script()
82+
require.NoError(t, err)
83+
txWitness := wire.TxWitness{
84+
append(signature.SerializeDER(), byte(txscript.SigHashAll)),
85+
publicKey.SerializeCompressed(),
86+
}
87+
return signatureScript, txWitness
88+
case signing.ScriptTypeP2WPKH:
89+
txWitness := wire.TxWitness{
90+
append(signature.SerializeDER(), byte(txscript.SigHashAll)),
91+
publicKey.SerializeCompressed(),
92+
}
93+
return []byte{}, txWitness
94+
case signing.ScriptTypeP2TR:
95+
// We assume SIGHASH_DEFAULT, which defaults to SIGHASH_ALL without needing to explicitly
96+
// append it to the signature. See:
97+
// https://github.com/bitcoin/bips/blob/97e02b2223b21753acefa813a4e59dbb6e849e77/bip-0341.mediawiki#taproot-key-path-spending-signature-validation
98+
txWitness := wire.TxWitness{
99+
signature.SerializeCompact(),
100+
}
101+
return []byte{}, txWitness
102+
default:
103+
panic("Unrecognized address type.")
104+
}
105+
}
106+
60107
func testEstimateTxSize(
61108
t *testing.T, useSegwit bool, outputScriptType, changeScriptType signing.ScriptType) {
62109
t.Helper()
@@ -86,7 +133,7 @@ func testEstimateTxSize(
86133
for counter := 0; counter < 10; counter++ {
87134
for _, inputScriptType := range inputScriptTypes {
88135
inputAddress := addressesTest.GetAddress(inputScriptType)
89-
sigScript, witness := inputAddress.SignatureScript(sig)
136+
sigScript, witness := signatureScript(t, inputAddress, sig)
90137
tx.TxIn = append(tx.TxIn, &wire.TxIn{
91138
SignatureScript: sigScript,
92139
Witness: witness,
@@ -121,7 +168,7 @@ func TestSigScriptWitnessSize(t *testing.T) {
121168
address := addressesTest.GetAddress(scriptType)
122169
t.Run(address.AccountConfiguration.String(), func(t *testing.T) {
123170
sigScriptSize, witnessSize := sigScriptWitnessSize(address.AccountConfiguration)
124-
sigScript, witness := address.SignatureScript(sig)
171+
sigScript, witness := signatureScript(t, address, sig)
125172
require.Equal(t, len(sigScript), sigScriptSize)
126173
if witness != nil {
127174
require.Equal(t, witness.SerializeSize(), witnessSize)

0 commit comments

Comments
 (0)