// TestHasCanonicalPush ensures the canonicalPush function works as expected. func TestHasCanonicalPush(t *testing.T) { t.Parallel() for i := 0; i < 65535; i++ { builder := txscript.NewScriptBuilder() builder.AddInt64(int64(i)) script, err := builder.Script() if err != nil { t.Errorf("Script: test #%d unexpected error: %v\n", i, err) continue } if result := txscript.IsPushOnlyScript(script); !result { t.Errorf("IsPushOnlyScript: test #%d failed: %x\n", i, script) continue } pops, err := txscript.TstParseScript(script) if err != nil { t.Errorf("TstParseScript: #%d failed: %v", i, err) continue } for _, pop := range pops { if result := txscript.TstHasCanonicalPushes(pop); !result { t.Errorf("TstHasCanonicalPushes: test #%d "+ "failed: %x\n", i, script) break } } } for i := 0; i <= txscript.MaxScriptElementSize; i++ { builder := txscript.NewScriptBuilder() builder.AddData(bytes.Repeat([]byte{0x49}, i)) script, err := builder.Script() if err != nil { t.Errorf("StandardPushesTests test #%d unexpected error: %v\n", i, err) continue } if result := txscript.IsPushOnlyScript(script); !result { t.Errorf("StandardPushesTests IsPushOnlyScript test #%d failed: %x\n", i, script) continue } pops, err := txscript.TstParseScript(script) if err != nil { t.Errorf("StandardPushesTests #%d failed to TstParseScript: %v", i, err) continue } for _, pop := range pops { if result := txscript.TstHasCanonicalPushes(pop); !result { t.Errorf("StandardPushesTests TstHasCanonicalPushes test #%d failed: %x\n", i, script) break } } } }
// TestHasCanonicalPushes ensures the canonicalPush function properly determines // what is considered a canonical push for the purposes of removeOpcodeByData. func TestHasCanonicalPushes(t *testing.T) { t.Parallel() tests := []struct { name string script string expected bool }{ { name: "does not parse", script: "0x046708afdb0fe5548271967f1a67130b7105cd6a82" + "8e03909a67962e0ea1f61d", expected: false, }, { name: "non-canonical push", script: "PUSHDATA1 0x04 0x01020304", expected: false, }, } for i, test := range tests { script := mustParseShortForm(test.script) pops, err := txscript.TstParseScript(script) if err != nil { if test.expected { t.Errorf("TstParseScript #%d failed: %v", i, err) } continue } for _, pop := range pops { if txscript.TstHasCanonicalPushes(pop) != test.expected { t.Errorf("TstHasCanonicalPushes: #%d (%s) "+ "wrong result\ngot: %v\nwant: %v", i, test.name, true, test.expected) break } } } }
// TestCalcSignatureHash does some rudimentary testing of msg hash calculation. func TestCalcSignatureHash(t *testing.T) { tx := new(wire.MsgTx) for i := 0; i < 3; i++ { txIn := new(wire.TxIn) txIn.Sequence = 0xFFFFFFFF txIn.PreviousOutPoint.Hash = chainhash.HashFuncH([]byte{byte(i)}) txIn.PreviousOutPoint.Index = uint32(i) txIn.PreviousOutPoint.Tree = int8(0) tx.AddTxIn(txIn) } for i := 0; i < 2; i++ { txOut := new(wire.TxOut) txOut.PkScript = []byte{0x01, 0x01, 0x02, 0x03} txOut.Value = 0x0000FF00FF00FF00 tx.AddTxOut(txOut) } want, _ := hex.DecodeString("d09285b6f60c71329323bc2e76c48" + "a462cde4e1032aa8f59c55823f1722c7f4a") pops, _ := txscript.TstParseScript([]byte{0x01, 0x01, 0x02, 0x03}) // Test prefix caching. msg1, err := txscript.CalcSignatureHash(pops, txscript.SigHashAll, tx, 0, nil) if err != nil { t.Fatalf("unexpected error %v", err.Error()) } prefixHash := tx.TxSha() msg2, err := txscript.CalcSignatureHash(pops, txscript.SigHashAll, tx, 0, &prefixHash) if err != nil { t.Fatalf("unexpected error %v", err.Error()) } if !bytes.Equal(msg1, want) { t.Errorf("for sighash all sig noncached wrong msg %x given, want %x", msg1, want) } if !bytes.Equal(msg2, want) { t.Errorf("for sighash all sig cached wrong msg %x given, want %x", msg1, want) } if !bytes.Equal(msg1, msg2) { t.Errorf("for sighash all sig non-equivalent msgs %x and %x were "+ "returned when using a cached prefix", msg1, msg2) } // Move the index and make sure that we get a whole new hash, despite // using the same TxOuts. msg3, err := txscript.CalcSignatureHash(pops, txscript.SigHashAll, tx, 1, &prefixHash) if err != nil { t.Fatalf("unexpected error %v", err.Error()) } if bytes.Equal(msg1, msg3) { t.Errorf("for sighash all sig equivalent msgs %x and %x were "+ "returned when using a cached prefix but different indices", msg1, msg3) } }