Dudas sobre el funcionamiento de la librería Wire

Hola a todos. Hace tiempo que no lanzo una pregunta por estos lados, pero creo que ya va siendo hora de hacerlo una vez más.

Para evitar rodeos, iré directo al grano: la idea es crear un programa que convierta un Arduino en un simple expansor de I/O (conservando funciones como lectura analógica y salida PWM), utilizando I2C como interfaz de control.

Sé (más o menos) como funciona I2C y la manera en que el maestro lee y escribe a un esclavo; pero lo que no me queda claro es la forma en que Wire maneja los eventos del esclavo:

Si el maestro, para solicitar datos de un esclavo (lectura), tiene que especificar la cantidad de bytes que espera recibir; ¿cómo lo puede saber el esclavo si el evento onRequest ni siquiera tiene parámetro alguno que se lo indique? ¿Qué pasa si el esclavo no transmite la cantidad exacta de bytes que el maestro solicita?
La pregunta radica porque quiero implementar esa característica de poder enviar el estado de pines consecutivos si el maestro solicita más de un byte para la lectura digital. ¿Cómo es que el esclavo puede saber cuando parar de enviar bytes?

¿Por qué onReceive sí tiene parámetro y onRequest no? Sería más útil que el esclavo supiera la cantidad de bytes que el maestro le solicita, en vez de saberlo cuando los recibe.
No sé cuál es la idea, pero me parece redundante ya que para eso existe available. Entonces... ¿se puede usar el valor del parámetro en vez de available para determinar la cantidad de bytes que recibió?

Agradeciendo de antemano cualquier respuesta, debido a que la duda me tiene estancado :confused: