MessageHeader.deserialize constructor

MessageHeader.deserialize(
  1. Uint8List data
)

Deserialize header from bytes

Implementation

factory MessageHeader.deserialize(Uint8List data) {
  if (data.length < messageHeaderSize) {
    throw ArgumentError('Invalid header size: ${data.length}');
  }

  final buffer = ByteData.sublistView(data, 0, messageHeaderSize);

  // Read network magic
  final magic = buffer.getUint32(0, Endian.little);
  final network = BitcoinNetwork.fromMagic(magic);
  if (network == null) {
    throw ArgumentError('Unknown network magic: 0x${magic.toRadixString(16)}');
  }

  // Read command (null-terminated)
  final commandBytes = <int>[];
  for (int i = 0; i < commandSize; i++) {
    final byte = buffer.getUint8(4 + i);
    if (byte == 0) break;
    commandBytes.add(byte);
  }
  final command = utf8.decode(commandBytes);

  // Read payload length
  final payloadLength = buffer.getUint32(16, Endian.little);

  // Read checksum (4 raw bytes)
  final checksum = Uint8List(4);
  for (int i = 0; i < 4; i++) {
    checksum[i] = buffer.getUint8(20 + i);
  }

  return MessageHeader(
    network: network,
    command: command,
    payloadLength: payloadLength,
    checksum: checksum,
  );
}