// TestBlockHeaderWire tests the BlockHeader wire encode and decode for various // protocol versions. func TestBlockHeaderWire(t *testing.T) { nonce := uint32(123123) // 0x1e0f3 pver := uint32(70001) // baseBlockHdr is used in the various tests as a baseline BlockHeader. bits := uint32(0x1d00ffff) baseBlockHdr := &wire.BlockHeader{ Version: 1, PrevBlock: mainNetGenesisHash, MerkleRoot: mainNetGenesisMerkleRoot, Timestamp: time.Unix(0x495fab29, 0), // 2009-01-03 12:15:05 -0600 CST Bits: bits, Nonce: nonce, } // baseBlockHdrEncoded is the wire encoded bytes of baseBlockHdr. baseBlockHdrEncoded := []byte{ 0x01, 0x00, 0x00, 0x00, // Version 1 0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72, 0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f, 0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c, 0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, // PrevBlock 0x3b, 0xa3, 0xed, 0xfd, 0x7a, 0x7b, 0x12, 0xb2, 0x7a, 0xc7, 0x2c, 0x3e, 0x67, 0x76, 0x8f, 0x61, 0x7f, 0xc8, 0x1b, 0xc3, 0x88, 0x8a, 0x51, 0x32, 0x3a, 0x9f, 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a, // MerkleRoot 0x29, 0xab, 0x5f, 0x49, // Timestamp 0xff, 0xff, 0x00, 0x1d, // Bits 0xf3, 0xe0, 0x01, 0x00, // Nonce } tests := []struct { in *wire.BlockHeader // Data to encode out *wire.BlockHeader // Expected decoded data buf []byte // Wire encoding pver uint32 // Protocol version for wire encoding }{ // Latest protocol version. { baseBlockHdr, baseBlockHdr, baseBlockHdrEncoded, wire.ProtocolVersion, }, // Protocol version BIP0035Version. { baseBlockHdr, baseBlockHdr, baseBlockHdrEncoded, wire.BIP0035Version, }, // Protocol version BIP0031Version. { baseBlockHdr, baseBlockHdr, baseBlockHdrEncoded, wire.BIP0031Version, }, // Protocol version NetAddressTimeVersion. { baseBlockHdr, baseBlockHdr, baseBlockHdrEncoded, wire.NetAddressTimeVersion, }, // Protocol version MultipleAddressVersion. { baseBlockHdr, baseBlockHdr, baseBlockHdrEncoded, wire.MultipleAddressVersion, }, } t.Logf("Running %d tests", len(tests)) for i, test := range tests { // Encode to wire format. var buf bytes.Buffer err := wire.TstWriteBlockHeader(&buf, test.pver, test.in) if err != nil { t.Errorf("writeBlockHeader #%d error %v", i, err) continue } if !bytes.Equal(buf.Bytes(), test.buf) { t.Errorf("writeBlockHeader #%d\n got: %s want: %s", i, spew.Sdump(buf.Bytes()), spew.Sdump(test.buf)) continue } buf.Reset() err = test.in.BtcEncode(&buf, pver) if err != nil { t.Errorf("BtcEncode #%d error %v", i, err) continue } if !bytes.Equal(buf.Bytes(), test.buf) { t.Errorf("BtcEncode #%d\n got: %s want: %s", i, spew.Sdump(buf.Bytes()), spew.Sdump(test.buf)) continue } // Decode the block header from wire format. var bh wire.BlockHeader rbuf := bytes.NewReader(test.buf) err = wire.TstReadBlockHeader(rbuf, test.pver, &bh) if err != nil { t.Errorf("readBlockHeader #%d error %v", i, err) continue } if !reflect.DeepEqual(&bh, test.out) { t.Errorf("readBlockHeader #%d\n got: %s want: %s", i, spew.Sdump(&bh), spew.Sdump(test.out)) continue } rbuf = bytes.NewReader(test.buf) err = bh.BtcDecode(rbuf, pver) if err != nil { t.Errorf("BtcDecode #%d error %v", i, err) continue } if !reflect.DeepEqual(&bh, test.out) { t.Errorf("BtcDecode #%d\n got: %s want: %s", i, spew.Sdump(&bh), spew.Sdump(test.out)) continue } } }