Pasé las últimas dos semanas estudiando el codificador TLV en Rust: la longitud del tipo, el valor y el truco más antiguo para empaquetar datos para que puedan crecer sin romper a los lectores antiguos. Una vez que lo pensé para Dusk, el motivo encajó. Una cadena como @Dusk mueve mensajes por la red sin parar: pares que hacen chismes entre sí, contratos, llamando a monederos y sincronizándose. Todo ello necesita un formato que sobreviva a que alguien añada un nuevo campo dentro de dos años.
Rust hace que la parte molesta sea casi aburrida, y esa es toda la idea. La comprobación de límites. Negarse a confiar en un byte de longitud que afirma que leerá 4GB.
Un parser que entra en pánico con entradas basura es un parser que no puedes ejecutar en una red donde aparecen bytes aleatorios sin invitación. Me ciño a los segmentos simples de &[u8] y salto copias hasta que de verdad las necesito, y me apoyo en un enum para el byte de tipo para que el compilador detecte cualquier caso que se me olvide.
No te saltes el código feo de empujar bytes. Escríbelo primero y escríbelo paranoico. Todo lo demás que construyas depende de que no te mienta. #dusk
$DUSK
Rust hace que la parte molesta sea casi aburrida, y esa es toda la idea. La comprobación de límites. Negarse a confiar en un byte de longitud que afirma que leerá 4GB.
Un parser que entra en pánico con entradas basura es un parser que no puedes ejecutar en una red donde aparecen bytes aleatorios sin invitación. Me ciño a los segmentos simples de &[u8] y salto copias hasta que de verdad las necesito, y me apoyo en un enum para el byte de tipo para que el compilador detecte cualquier caso que se me olvide.
No te saltes el código feo de empujar bytes. Escríbelo primero y escríbelo paranoico. Todo lo demás que construyas depende de que no te mienta. #dusk
$DUSK

