3
0
mirror of https://github.com/Qortal/altcoinj.git synced 2025-02-13 10:45:51 +00:00

Fixed headers message serialization.

This commit is contained in:
Stephen Reed 2015-06-09 16:36:25 -05:00 committed by Mike Hearn
parent e25e561560
commit 177bd93802
2 changed files with 22 additions and 8 deletions

View File

@ -56,10 +56,7 @@ public class HeadersMessage extends Message {
public void bitcoinSerializeToStream(OutputStream stream) throws IOException { public void bitcoinSerializeToStream(OutputStream stream) throws IOException {
stream.write(new VarInt(blockHeaders.size()).encode()); stream.write(new VarInt(blockHeaders.size()).encode());
for (Block header : blockHeaders) { for (Block header : blockHeaders) {
if (header.transactions == null) header.cloneAsHeader().bitcoinSerializeToStream(stream);
header.bitcoinSerializeToStream(stream);
else
header.cloneAsHeader().bitcoinSerializeToStream(stream);
stream.write(0); stream.write(0);
} }
} }

View File

@ -163,10 +163,12 @@ public class BitcoinSerializerTest {
public void testHeaders1() throws Exception { public void testHeaders1() throws Exception {
BitcoinSerializer bs = new BitcoinSerializer(MainNetParams.get()); BitcoinSerializer bs = new BitcoinSerializer(MainNetParams.get());
HeadersMessage hm = (HeadersMessage) bs.deserialize(ByteBuffer.wrap(HEX.decode("f9beb4d9686561" + String headersMessageBytesHex = "f9beb4d9686561" +
"646572730000000000520000005d4fab8101010000006fe28c0ab6f1b372c1a6a246ae6" + "646572730000000000520000005d4fab8101010000006fe28c0ab6f1b372c1a6a246ae6" +
"3f74f931e8365e15a089c68d6190000000000982051fd1e4ba744bbbe680e1fee14677b" + "3f74f931e8365e15a089c68d6190000000000982051fd1e4ba744bbbe680e1fee14677b" +
"a1a3c3540bf7b1cdb606e857233e0e61bc6649ffff001d01e3629900"))); "a1a3c3540bf7b1cdb606e857233e0e61bc6649ffff001d01e3629900";
byte[] headersMessageBytes = HEX.decode(headersMessageBytesHex);
HeadersMessage hm = (HeadersMessage) bs.deserialize(ByteBuffer.wrap(HEX.decode(headersMessageBytesHex)));
// The first block after the genesis // The first block after the genesis
// http://blockexplorer.com/b/1 // http://blockexplorer.com/b/1
@ -178,6 +180,13 @@ public class BitcoinSerializerTest {
assertEquals(Utils.HEX.encode(block.getMerkleRoot().getBytes()), assertEquals(Utils.HEX.encode(block.getMerkleRoot().getBytes()),
"0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098"); "0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098");
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bs.serialize(hm, byteArrayOutputStream);
byte[] serializedBytes = byteArrayOutputStream.toByteArray();
String serializedBytesHex = new String(HEX.encode(serializedBytes));
assertEquals(headersMessageBytes.length, serializedBytes.length);
assertEquals(true, Arrays.equals(headersMessageBytes, serializedBytes));
} }
@ -188,7 +197,7 @@ public class BitcoinSerializerTest {
public void testHeaders2() throws Exception { public void testHeaders2() throws Exception {
BitcoinSerializer bs = new BitcoinSerializer(MainNetParams.get()); BitcoinSerializer bs = new BitcoinSerializer(MainNetParams.get());
HeadersMessage hm = (HeadersMessage) bs.deserialize(ByteBuffer.wrap(HEX.decode("f9beb4d96865616465" + String headersMessageBytesHex = "f9beb4d96865616465" +
"72730000000000e701000085acd4ea06010000006fe28c0ab6f1b372c1a6a246ae63f74f931e" + "72730000000000e701000085acd4ea06010000006fe28c0ab6f1b372c1a6a246ae63f74f931e" +
"8365e15a089c68d6190000000000982051fd1e4ba744bbbe680e1fee14677ba1a3c3540bf7b1c" + "8365e15a089c68d6190000000000982051fd1e4ba744bbbe680e1fee14677ba1a3c3540bf7b1c" +
"db606e857233e0e61bc6649ffff001d01e3629900010000004860eb18bf1b1620e37e9490fc8a" + "db606e857233e0e61bc6649ffff001d01e3629900010000004860eb18bf1b1620e37e9490fc8a" +
@ -201,7 +210,9 @@ public class BitcoinSerializerTest {
"a88d221c8bd6c059da090e88f8a2c99690ee55dbba4e00000000e11c48fecdd9e72510ca84f023" + "a88d221c8bd6c059da090e88f8a2c99690ee55dbba4e00000000e11c48fecdd9e72510ca84f023" +
"370c9a38bf91ac5cae88019bee94d24528526344c36649ffff001d1d03e4770001000000fc33f5" + "370c9a38bf91ac5cae88019bee94d24528526344c36649ffff001d1d03e4770001000000fc33f5" +
"96f822a0a1951ffdbf2a897b095636ad871707bf5d3162729b00000000379dfb96a5ea8c81700ea4" + "96f822a0a1951ffdbf2a897b095636ad871707bf5d3162729b00000000379dfb96a5ea8c81700ea4" +
"ac6b97ae9a9312b2d4301a29580e924ee6761a2520adc46649ffff001d189c4c9700"))); "ac6b97ae9a9312b2d4301a29580e924ee6761a2520adc46649ffff001d189c4c9700";
byte[] headersMessageBytes = HEX.decode(headersMessageBytesHex);
HeadersMessage hm = (HeadersMessage) bs.deserialize(ByteBuffer.wrap(headersMessageBytes));
int nBlocks = hm.getBlockHeaders().size(); int nBlocks = hm.getBlockHeaders().size();
assertEquals(nBlocks, 6); assertEquals(nBlocks, 6);
@ -224,6 +235,12 @@ public class BitcoinSerializerTest {
assertEquals("000000004ebadb55ee9096c9a2f8880e09da59c0d68b1c228da88e48844a1485", assertEquals("000000004ebadb55ee9096c9a2f8880e09da59c0d68b1c228da88e48844a1485",
thirdBlockHash); thirdBlockHash);
assertEquals(thirdBlock.getNonce(), 2850094635L); assertEquals(thirdBlock.getNonce(), 2850094635L);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bs.serialize(hm, byteArrayOutputStream);
byte[] serializedBytes = byteArrayOutputStream.toByteArray();
assertEquals(headersMessageBytes.length, serializedBytes.length);
assertEquals(true, Arrays.equals(headersMessageBytes, serializedBytes));
} }
@Test @Test