Revisão de Princípios de Blockchain e Rust
Atores Maliciosos
Em um sistema de blockchain, a segurança é primordial. Atores maliciosos podem tentar explorar vulnerabilidades, como saldos insuficientes durante transferências de fundos, ou problemas de overflow/underflow. As operações de matemática segura e os mecanismos de tratamento de erros do Rust ajudam a mitigar esses riscos.
Matemática Segura
As operações de matemática segura do Rust previnem overflow e underflow. Os métodos checked_add e checked_sub
retornam uma Option que permite lidar com possíveis erros aritméticos de forma segura.
No Rust, o tipo Option é uma parte fundamental da biblioteca padrão, projetada para lidar com cenários onde um valor
pode ou não estar presente. É comumente usado em situações onde o resultado de uma operação pode ser indefinido ou
ausente.
Métodos como checked_add e checked_sub retornam Option para indicar sucesso ou falha devido a overflow ou
underflow:
let result = a.checked_add(b);
match result {
Some(sum) => println!("Sum: {}", sum),
None => println!("Overflow occurred."),
}Tratamento de Erros
No Rust, o tratamento de erros é uma parte integral da escrita de código robusto e seguro. O tipo Result é comumente
usado para funções que podem encontrar erros durante sua execução.
O tipo Result é uma enum definida na biblioteca padrão. Ela tem duas variantes: Ok(value) para um resultado
bem-sucedido e Err(error) para um erro:
enum Result<T, E> {
Ok(T),
Err(E),
}T e E são parâmetros genéricos que permitem customizar o tipo de resultado conforme suas necessidades. Para os
propósitos deste tutorial, sempre retornaremos Ok(()) quando tudo ocorrer bem, e um Err(&'static str) para descrever
quaisquer erros com uma string básica.
Você pode então definir o tipo Result assim:
Result<(), &'static str>Options e Results
Você pode usar o tipo Option para acionar um Err, o que é útil quando você só quer que sua função execute quando
tudo corre conforme o esperado.
Nesse contexto, queremos uma função que retorne um erro sempre que alguma operação de matemática segura retornar None.
Para isso, podemos encadear ok_or juntamente com ? diretamente após a operação de matemática segura, assim:
let new_from_balance = from_balance
.checked_sub(amount)
.ok_or("Not enough funds.")?;Se checked_sub retornar None, retornaremos um Err com a mensagem "Not enough funds." que pode ser exibida ao
usuário. Caso contrário, se checked_sub retornar Some(value), atribuiremos new_from_balance diretamente a esse
valor.
Nesse caso, estamos escrevendo código que trata completamente o tipo Option de maneira segura e ergonômica.