decode method

  1. @override
void decode(
  1. Uint8List data,
  2. int protocolVersion,
  3. MessageEncoding encoding
)
override

Decode message from bytes

Implementation

@override
void decode(Uint8List data, int protocolVersion, MessageEncoding encoding) {
  if (data.length < 85) { // Minimum size without user agent
    throw WireException('Version message too short');
  }

  final buffer = ByteData.sublistView(data);
  int offset = 0;

  // Protocol version (4 bytes)
  this.protocolVersion = buffer.getUint32(offset, Endian.little);
  offset += 4;

  // Services (8 bytes)
  services = _decodeUint64(data, offset);
  offset += 8;

  // Timestamp (8 bytes)
  timestamp = _decodeUint64(data, offset);
  offset += 8;

  // Receiver address (26 bytes)
  addrReceiver = NetworkAddress.deserialize(data, offset);
  offset += 26;

  // Sender address (26 bytes)
  addrSender = NetworkAddress.deserialize(data, offset);
  offset += 26;

  // Nonce (8 bytes)
  nonce = _decodeUint64(data, offset);
  offset += 8;

  // User agent (variable length)
  final userAgentLength = VarInt.read(buffer, offset);
  offset += VarInt.size(userAgentLength);

  if (offset + userAgentLength > data.length) {
    throw WireException('Invalid user agent length');
  }

  userAgent = utf8.decode(data.sublist(offset, offset + userAgentLength));
  offset += userAgentLength;

  // Start height (4 bytes)
  if (offset + 4 > data.length) {
    throw WireException('Version message truncated at start height');
  }
  startHeight = buffer.getUint32(offset, Endian.little);
  offset += 4;

  // Relay flag (1 byte) - optional for older protocol versions
  if (offset < data.length) {
    relay = data[offset] != 0;
  }
}