MsgHeaders.deserialize constructor

MsgHeaders.deserialize(
  1. Uint8List data
)

Deserializes a MsgHeaders from byte data.

Implementation

factory MsgHeaders.deserialize(Uint8List data) {
  final buffer = ByteData.sublistView(data);
  var offset = 0;

  // Read count of headers
  final count = VarInt.read(buffer, offset);
  offset += VarInt.size(count);

  // Limit to max block headers per message
  if (count > maxBlockHeadersPerMsg) {
    throw WireException('headers',
        'Too many block headers for message: count $count, max $maxBlockHeadersPerMsg');
  }

  final headers = <BlockHeader>[];

  // Read each header
  for (int i = 0; i < count; i++) {
    // Ensure we have enough data for a block header
    if (offset + blockHeaderLen > data.length) {
      throw WireException('headers',
          'Insufficient data for block header $i: need $blockHeaderLen, got ${data.length - offset}');
    }

    // Extract header bytes
    final headerBytes = data.sublist(offset, offset + blockHeaderLen);
    final header = BlockHeader.deserialize(headerBytes);
    headers.add(header);
    offset += blockHeaderLen;

    // Read transaction count (should always be 0 for headers message)
    if (offset >= data.length) {
      throw WireException('headers', 'Insufficient data for transaction count');
    }

    final txCount = VarInt.read(buffer, offset);
    offset += VarInt.size(txCount);

    // Transaction count should be 0 in headers message
    if (txCount != 0) {
      throw WireException('headers',
          'Invalid transaction count in headers message: expected 0, got $txCount');
    }
  }

  return MsgHeaders(headers: headers);
}