Aula 203: A Função blockhash
No mundo dos contratos inteligentes do Ethereum, compreender as várias funções integradas é crucial para o desenvolvimento de aplicações eficientes e seguras. Uma dessas funções é blockhash
, que pode ser utilizada para obter o hash de um bloco específico. Esta aula vai introduzir a função blockhash
, explicar seus casos de uso e fornecer exemplos de codificação.
O que é a Função blockhash
?
A função blockhash
retorna o hash de um bloco especificado, identificado pelo seu número de bloco. O hash é um hash keccak256 do conteúdo do bloco e pode ser utilizado para diversos fins, como verificar o estado ou recuperar dados que foram incluídos nesse bloco.
A sintaxe para usar blockhash
é a seguinte:
bytes32 blockhash(uint blockNumber)
blockNumber
: O número do bloco para o qual você deseja obter o hash.
Observações Importantes:
- A função
blockhash
só pode retornar o hash dos últimos 256 blocos. Tentar obter o hash de qualquer bloco mais antigo resultará em0x0
. blockhash
não pode ser usada para manipular estados ou tomar decisões com base em blocos futuros, já que a rede Ethereum não permite saber os hashes de blocos futuros.
Casos de Uso para blockhash
-
Aleatoriedade: Desenvolvedores às vezes usam
blockhash
para gerar números pseudo-aleatórios, embora esse método tenha vulnerabilidades e não deva ser confiável para aplicações críticas. -
Lógica de Jogos: Em jogos, você pode querer verificar ações baseadas em blocos anteriores, garantindo que certos eventos do jogo sejam determinísticos.
-
Auditoria: Você pode usar os hashes de blocos para verificar a integridade de certas ações, bloqueando-as com um estado de bloco conhecido.
Exemplo de Implementação
Vamos implementar um contrato básico que usa blockhash
para demonstrar como ele funciona.
Exemplo de Contrato: GeradorDeNumeroAleatorio
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract GeradorDeNumeroAleatorio {
// Armazena o último número aleatório gerado
uint256 public ultimoNumeroAleatorio;
event NumeroAleatorioGerado(uint256 numeroAleatorio, bytes32 hashDoBloco);
// Função para gerar um número aleatório baseado no blockhash
function gerarNumeroAleatorio() public {
// Usa o blockhash mais recente como parte da aleatoriedade
bytes32 hashDoBloco = blockhash(block.number - 1);
// Gera um número pseudo-aleatório
uint256 numeroAleatorio = uint256(hashDoBloco) % 100; // Número aleatório entre 0 e 99
ultimoNumeroAleatorio = numeroAleatorio;
// Emite um evento com o número aleatório gerado e o hash do bloco
emit NumeroAleatorioGerado(numeroAleatorio, hashDoBloco);
}
}
Explicação do Contrato
- Variável de Estado:
ultimoNumeroAleatorio
mantém o controle do número aleatório gerado mais recentemente. - Evento:
NumeroAleatorioGerado
é emitido toda vez que um novo número aleatório é gerado. - Função:
gerarNumeroAleatorio
faz o seguinte:- Recupera o blockhash do último bloco usando
blockhash(block.number - 1)
. - Usa o blockhash para gerar um número pseudo-aleatório ao hasheá-lo e aplicar o módulo 100 para um intervalo de 0-99.
- Atualiza a variável de estado e emite o evento.
- Recupera o blockhash do último bloco usando
Limitações
Enquanto o uso do blockhash pode ajudar a gerar números pseudo-aleatórios, existem considerações importantes:
- Previsibilidade: Como os mineradores podem influenciar o conteúdo do bloco, o
blockhash
pode ser manipulado em favor de certos resultados, tornando-o inadequado para uso em jogos com apostas reais ou para geração segura de números aleatórios. - Segredo: Nem todos os blocos são conhecidos antecipadamente, e confiar em estados futuros que dependem de blockhash pode levar a comportamentos imprevisíveis e inseguros do contrato.
Conclusão
A função blockhash
é uma ferramenta poderosa nos contratos inteligentes do Ethereum, proporcionando acesso a hashes de blocos passados que podem ser usados para diversos fins. No entanto, é preciso ter cautela ao utilizá-la, especialmente para tarefas que requerem segurança ou aleatoriedade. No contexto do desenvolvimento de jogos casuais ou verificação de dados, pode ser um recurso útil, mas para aplicações de alto risco, considere métodos de geração de números aleatórios mais seguros, como Chainlink VRF ou outras soluções descentralizadas de aleatoriedade.
Com esse entendimento da função blockhash
, você pode explorar suas aplicações mais a fundo e integrá-la em seus próprios contratos inteligentes de forma segura e eficaz.