decode method
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;
}
}