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.