Zettelkasten
Section 1
Review Blockchain

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.