mirror of
https://github.com/Qortal/altcoinj.git
synced 2025-02-07 14:54:15 +00:00
Implement some (de)serialization (so we can roundtrip msgs in test)
Implements deserialization for getblocks/getheaders and supports FilteredBlock entries in ListMessage (for getdata). Implements serialization for FilteredBlock, HeadersMessage, and PartialMerkleTree.
This commit is contained in:
parent
a724bcada5
commit
7011d68165
@ -213,6 +213,10 @@ public class BitcoinSerializer {
|
||||
message = new FilteredBlock(params, payloadBytes);
|
||||
} else if (command.equals("getdata")) {
|
||||
message = new GetDataMessage(params, payloadBytes, parseLazy, parseRetain, length);
|
||||
} else if (command.equals("getblocks")) {
|
||||
message = new GetBlocksMessage(params, payloadBytes);
|
||||
} else if (command.equals("getheaders")) {
|
||||
message = new GetHeadersMessage(params, payloadBytes);
|
||||
} else if (command.equals("tx")) {
|
||||
Transaction tx = new Transaction(params, payloadBytes, null, parseLazy, parseRetain, length);
|
||||
if (hash != null)
|
||||
|
@ -42,7 +42,11 @@ public class FilteredBlock extends Message {
|
||||
}
|
||||
|
||||
public void bitcoinSerializeToStream(OutputStream stream) throws IOException {
|
||||
throw new RuntimeException("Not implemented");
|
||||
if (header.transactions == null)
|
||||
header.bitcoinSerializeToStream(stream);
|
||||
else
|
||||
header.cloneAsHeader().bitcoinSerializeToStream(stream);
|
||||
merkleTree.bitcoinSerializeToStream(stream);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -38,8 +38,17 @@ public class GetBlocksMessage extends Message {
|
||||
this.stopHash = stopHash;
|
||||
}
|
||||
|
||||
public GetBlocksMessage(NetworkParameters params, byte[] msg) throws ProtocolException {
|
||||
super(params, msg, 0);
|
||||
}
|
||||
|
||||
protected void parseLite() throws ProtocolException {
|
||||
// NOP. This is a root level message and should always be provided with a length.
|
||||
cursor = offset;
|
||||
version = readUint32();
|
||||
int startCount = (int) readVarInt();
|
||||
if (startCount > 500)
|
||||
throw new ProtocolException("Number of locators cannot be > 500, received: " + startCount);
|
||||
length = (int) (cursor - offset + ((startCount + 1) * 32));
|
||||
}
|
||||
|
||||
public void parse() throws ProtocolException {
|
||||
|
@ -29,6 +29,10 @@ public class GetHeadersMessage extends GetBlocksMessage {
|
||||
super(params, locator, stopHash);
|
||||
}
|
||||
|
||||
public GetHeadersMessage(NetworkParameters params, byte[] msg) throws ProtocolException {
|
||||
super(params, msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuffer b = new StringBuffer();
|
||||
|
@ -19,6 +19,8 @@ package com.google.bitcoin.core;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
@ -45,6 +47,18 @@ public class HeadersMessage extends Message {
|
||||
blockHeaders = Arrays.asList(headers);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bitcoinSerializeToStream(OutputStream stream) throws IOException {
|
||||
stream.write(new VarInt(blockHeaders.size()).encode());
|
||||
for (Block header : blockHeaders) {
|
||||
if (header.transactions == null)
|
||||
header.bitcoinSerializeToStream(stream);
|
||||
else
|
||||
header.cloneAsHeader().bitcoinSerializeToStream(stream);
|
||||
stream.write(0);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void parseLite() throws ProtocolException {
|
||||
if (length == UNKNOWN_LENGTH) {
|
||||
|
@ -99,6 +99,9 @@ public abstract class ListMessage extends Message {
|
||||
case 2:
|
||||
type = InventoryItem.Type.Block;
|
||||
break;
|
||||
case 3:
|
||||
type = InventoryItem.Type.FilteredBlock;
|
||||
break;
|
||||
default:
|
||||
throw new ProtocolException("Unknown CInv type: " + typeCode);
|
||||
}
|
||||
|
@ -65,7 +65,14 @@ public class PartialMerkleTree extends Message {
|
||||
}
|
||||
|
||||
public void bitcoinSerializeToStream(OutputStream stream) throws IOException {
|
||||
throw new RuntimeException("Not implemented");
|
||||
Utils.uint32ToByteStreamLE(transactionCount, stream);
|
||||
|
||||
stream.write(new VarInt(hashes.size()).encode());
|
||||
for (Sha256Hash hash : hashes)
|
||||
stream.write(Utils.reverseBytes(hash.getBytes()));
|
||||
|
||||
stream.write(new VarInt(matchedChildBits.length).encode());
|
||||
stream.write(matchedChildBits);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
Loading…
x
Reference in New Issue
Block a user