/**
  * Build a 'getblocks' message
  *
  * @param peer Destination peer
  * @param blockList Block hash list
  * @param stopBlock Stop block hash (Sha256Hash.ZERO_HASH to get all blocks)
  * @return 'getblocks' message
  */
 public static Message buildGetBlocksMessage(
     Peer peer, List<Sha256Hash> blockList, Sha256Hash stopBlock) {
   //
   // Build the message payload
   //
   // The protocol version will be set to the lesser of our version and the peer version
   //
   SerializedBuffer msgBuffer = new SerializedBuffer(blockList.size() * 32 + 40);
   msgBuffer
       .putInt(Math.min(peer.getVersion(), NetParams.PROTOCOL_VERSION))
       .putVarInt(blockList.size());
   for (Sha256Hash hash : blockList) {
     msgBuffer.putBytes(Helper.reverseBytes(hash.getBytes()));
   }
   msgBuffer.putBytes(Helper.reverseBytes(stopBlock.getBytes()));
   //
   // Build the message
   //
   ByteBuffer buffer = MessageHeader.buildMessage("getblocks", msgBuffer);
   return new Message(buffer, peer, MessageHeader.MessageCommand.GETBLOCKS);
 }
 /**
  * Serialize the transaction
  *
  * @param outBuffer Output buffer
  * @return Output buffer
  */
 @Override
 public final SerializedBuffer getBytes(SerializedBuffer outBuffer) {
   if (txData != null) {
     outBuffer.putBytes(txData);
   } else {
     outBuffer
         .putInt(txVersion)
         .putVarInt(txInputs.size())
         .putBytes(txInputs)
         .putVarInt(txOutputs.size())
         .putBytes(txOutputs)
         .putUnsignedInt(txLockTime);
   }
   return outBuffer;
 }