mirror of
https://github.com/btcsuite/btcd.git
synced 2026-08-13 12:32:51 +02:00
105 lines
2.3 KiB
Go
105 lines
2.3 KiB
Go
package txscript
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/btcsuite/btcd/wire/v2"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// TestP2ASpending tests that pay-to-anchor outputs can be spent correctly.
|
|
func TestP2ASpending(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
scriptPubKey []byte
|
|
witness wire.TxWitness
|
|
sigScript []byte
|
|
shouldPass bool
|
|
errCode ErrorCode
|
|
}{
|
|
{
|
|
name: "valid P2A spend with empty witness and " +
|
|
"sigscript",
|
|
scriptPubKey: PayToAnchorScript,
|
|
witness: wire.TxWitness{},
|
|
sigScript: []byte{},
|
|
shouldPass: true,
|
|
},
|
|
{
|
|
name: "P2A with non-empty witness should " +
|
|
"succeed",
|
|
scriptPubKey: PayToAnchorScript,
|
|
witness: wire.TxWitness{[]byte{0x01}},
|
|
sigScript: []byte{},
|
|
shouldPass: true,
|
|
},
|
|
{
|
|
name: "P2A with non-empty sigscript should fail",
|
|
scriptPubKey: PayToAnchorScript,
|
|
witness: wire.TxWitness{},
|
|
sigScript: []byte{0x01, 0x02},
|
|
shouldPass: false,
|
|
errCode: ErrWitnessMalleated,
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
// Create a transaction with the P2A output being spent.
|
|
prevTx := wire.NewMsgTx(2)
|
|
prevTx.AddTxOut(&wire.TxOut{
|
|
Value: 1000,
|
|
PkScript: test.scriptPubKey,
|
|
})
|
|
prevTxHash := prevTx.TxHash()
|
|
|
|
// Create the spending transaction.
|
|
tx := wire.NewMsgTx(2)
|
|
tx.AddTxIn(&wire.TxIn{
|
|
PreviousOutPoint: wire.OutPoint{
|
|
Hash: prevTxHash,
|
|
Index: 0,
|
|
},
|
|
SignatureScript: test.sigScript,
|
|
Witness: test.witness,
|
|
})
|
|
tx.AddTxOut(&wire.TxOut{
|
|
Value: 900,
|
|
PkScript: []byte{OP_TRUE},
|
|
})
|
|
|
|
// Create the script engine.
|
|
vm, err := NewEngine(
|
|
test.scriptPubKey, tx, 0,
|
|
StandardVerifyFlags, nil,
|
|
nil, 1000, nil,
|
|
)
|
|
if err != nil {
|
|
if test.errCode != 0 {
|
|
require.True(t, IsErrorCode(err, test.errCode))
|
|
return
|
|
} else {
|
|
require.NoError(t, err)
|
|
}
|
|
}
|
|
|
|
if test.shouldPass {
|
|
if err != nil {
|
|
t.Fatalf("NewEngine failed "+
|
|
"unexpectedly: %v", err)
|
|
}
|
|
|
|
err = vm.Execute()
|
|
if err != nil {
|
|
t.Fatalf("Execute failed unexpectedly: %v", err)
|
|
}
|
|
} else {
|
|
if err == nil {
|
|
t.Fatal("Expected NewEngine to fail, but it succeeded")
|
|
}
|
|
|
|
require.True(t, IsErrorCode(err, test.errCode))
|
|
}
|
|
})
|
|
}
|
|
}
|