Passei as últimas duas semanas estudando o codificador TLV em Rust: comprimento, tipo e valor — o truque mais antigo para empacotar dados de um jeito que possa crescer sem quebrar leitores antigos. Depois que pensei nisso para o Dusk, o motivo ficou claro. Uma cadeia como @Dusk move mensagens pela rede sem parar, enquanto pares fofocam sobre contratos, chamam carteiras e fazem sync. Tudo isso precisa de um formato que sobreviva ao fato de alguém adicionar um novo campo daqui a dois anos.
O Rust deixa a parte chata quase entediante, e é justamente esse o ponto. Verificação de limites. Recusar confiar em um byte de comprimento que diz que vai ler 4GB.
Um parser que entra em panic com entrada inválida é um parser que você não consegue executar em uma rede onde bytes aleatórios aparecem sem serem convidados. Eu sigo com fatias simples &[u8], evitando cópias até eu realmente precisar, e uso um enum para o byte de tipo, para que o compilador avise qualquer caso que eu esquecer.
Não pule o código feio de empurrar bytes. Escreva primeiro e escreva paranoico. O resto de tudo que você constrói depende de ele não mentir para você. #dusk
$DUSK