package btcwire import ( "bytes" "testing" "git.smesh.lol/nostrino/pkg/crypto/chainhash" ) func TestTxRoundTrip(t *testing.T) { raw := []byte{ 0x01, 0x00, 0x00, 0x00, // version 0x01, // input count 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, // sequence } want := &Tx{Raw: raw} payload, err := want.EncodePayload() if err != nil { t.Fatalf("EncodePayload: %v", err) } if !bytes.Equal(payload, raw) { t.Fatalf("payload = %x, want %x", payload, raw) } var got Tx if err := got.DecodePayload(payload); err != nil { t.Fatalf("DecodePayload: %v", err) } if !bytes.Equal(got.Raw, raw) { t.Fatalf("decoded = %x, want %x", got.Raw, raw) } wantID := chainhash.DoubleHashH(raw) if got.TxID() != wantID { t.Fatalf("TxID = %s, want %s", got.TxID(), wantID) } // Any change to the raw transaction changes the txid. mutated := &Tx{Raw: append([]byte(nil), raw...)} mutated.Raw[0] ^= 0x01 if mutated.TxID() == wantID { t.Fatal("mutated transaction kept the same txid") } } func TestTxEmpty(t *testing.T) { var tx Tx payload, err := tx.EncodePayload() if err != nil { t.Fatalf("EncodePayload: %v", err) } if len(payload) != 0 { t.Fatalf("payload = %x, want empty", payload) } var got Tx if err := got.DecodePayload(nil); err != nil { t.Fatalf("DecodePayload: %v", err) } if len(got.Raw) != 0 { t.Fatalf("raw = %x, want empty", got.Raw) } if got.TxID() != chainhash.DoubleHashH(nil) { t.Fatal("empty transaction txid mismatch") } } func TestTxFrameRoundTrip(t *testing.T) { raw := bytes.Repeat([]byte{0x42}, 500) frame, err := EncodeMessagePayload(TestNet3, CmdTx, &Tx{Raw: raw}) if err != nil { t.Fatalf("EncodeMessagePayload: %v", err) } msg, err := DecodeMessage(TestNet3, bytes.NewReader(frame)) if err != nil { t.Fatalf("DecodeMessage: %v", err) } var got Tx if err := msg.Decode(&got); err != nil { t.Fatalf("Decode: %v", err) } if !bytes.Equal(got.Raw, raw) { t.Fatalf("raw = %x, want %x", got.Raw, raw) } }