tx_test.go raw

   1  package btcwire
   2  
   3  import (
   4  	"bytes"
   5  	"testing"
   6  
   7  	"git.smesh.lol/nostrino/pkg/crypto/chainhash"
   8  )
   9  
  10  func TestTxRoundTrip(t *testing.T) {
  11  	raw := []byte{
  12  		0x01, 0x00, 0x00, 0x00, // version
  13  		0x01, // input count
  14  		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  15  		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  16  		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  17  		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  18  		0xff, 0xff, 0xff, 0xff, // sequence
  19  	}
  20  	want := &Tx{Raw: raw}
  21  	payload, err := want.EncodePayload()
  22  	if err != nil {
  23  		t.Fatalf("EncodePayload: %v", err)
  24  	}
  25  	if !bytes.Equal(payload, raw) {
  26  		t.Fatalf("payload = %x, want %x", payload, raw)
  27  	}
  28  	var got Tx
  29  	if err := got.DecodePayload(payload); err != nil {
  30  		t.Fatalf("DecodePayload: %v", err)
  31  	}
  32  	if !bytes.Equal(got.Raw, raw) {
  33  		t.Fatalf("decoded = %x, want %x", got.Raw, raw)
  34  	}
  35  	wantID := chainhash.DoubleHashH(raw)
  36  	if got.TxID() != wantID {
  37  		t.Fatalf("TxID = %s, want %s", got.TxID(), wantID)
  38  	}
  39  	// Any change to the raw transaction changes the txid.
  40  	mutated := &Tx{Raw: append([]byte(nil), raw...)}
  41  	mutated.Raw[0] ^= 0x01
  42  	if mutated.TxID() == wantID {
  43  		t.Fatal("mutated transaction kept the same txid")
  44  	}
  45  }
  46  
  47  func TestTxEmpty(t *testing.T) {
  48  	var tx Tx
  49  	payload, err := tx.EncodePayload()
  50  	if err != nil {
  51  		t.Fatalf("EncodePayload: %v", err)
  52  	}
  53  	if len(payload) != 0 {
  54  		t.Fatalf("payload = %x, want empty", payload)
  55  	}
  56  	var got Tx
  57  	if err := got.DecodePayload(nil); err != nil {
  58  		t.Fatalf("DecodePayload: %v", err)
  59  	}
  60  	if len(got.Raw) != 0 {
  61  		t.Fatalf("raw = %x, want empty", got.Raw)
  62  	}
  63  	if got.TxID() != chainhash.DoubleHashH(nil) {
  64  		t.Fatal("empty transaction txid mismatch")
  65  	}
  66  }
  67  
  68  func TestTxFrameRoundTrip(t *testing.T) {
  69  	raw := bytes.Repeat([]byte{0x42}, 500)
  70  	frame, err := EncodeMessagePayload(TestNet3, CmdTx, &Tx{Raw: raw})
  71  	if err != nil {
  72  		t.Fatalf("EncodeMessagePayload: %v", err)
  73  	}
  74  	msg, err := DecodeMessage(TestNet3, bytes.NewReader(frame))
  75  	if err != nil {
  76  		t.Fatalf("DecodeMessage: %v", err)
  77  	}
  78  	var got Tx
  79  	if err := msg.Decode(&got); err != nil {
  80  		t.Fatalf("Decode: %v", err)
  81  	}
  82  	if !bytes.Equal(got.Raw, raw) {
  83  		t.Fatalf("raw = %x, want %x", got.Raw, raw)
  84  	}
  85  }
  86