Tamanho do texto
O hash do código de inicialização é basicamente o hash keccak256 do bytecode do contrato.
Uso do código inicial
O hash do código de inicialização é necessário "Como o cálculo do endereço depende do hash
o código de inicialização. Código de inicialização é o código que, quando executado, produz o
bytecode de tempo de execução que será colocado no estado e que
normalmente é usado por linguagens de alto nível para implementar um
‘construtor’.
"EIP-1014: Skinny CREATE2," Propostas de Melhoria Ethereum, no. 1014, abril de 2018. [Série online]. Disponível: https://eips.ethereum.org/EIPS/eip-1014.
Uso do código inicial
O uso principal do código init é para mineração de endereços. Você pode verificar https://github.com/0age/create2crunch para obter um exemplo de como podemos aproveitar o CREATE2 e o código inicial de um contrato para 'minerar' endereços mais eficientes para implantação de contrato.
Aqui está um script bash simples que usa forge para gerar o hash de inicialização do código para você:
https://github.com/sambacha/foundry-scripts/tree/master/scripts/deploy
Roteiro
#!/usr/bin/env bash
#Função para sair em caso de erro com uma mensagem
exit_on_error() {
eco "Erro: $1"
saída 1
}
#Função para exibir informações de uso
uso() {
echo "Uso: $0 [-v]"
echo " : Caminho para o arquivo do contrato do Solidity"
echo ": Nome do contrato Solidity"
echo "-v: Habilita saída detalhada (opcional)"
saída 1
}
#Verifique se o Foundry está instalado
se! comando -v forjar &> /dev/null; então
exit_on_error "Foundry não está instalado. Instale-o primeiro."
fi
# Verifica se o número correto de argumentos foi fornecido
if [ "$#" -lt 2 ] || [ "$#" -gt3]; então
uso
fi
# Variáveis de argumentos
CONTRACT_PATH=$1
CONTRACT_NAME=$2
VERBOSE=falso
# Verifica se a opção detalhada está habilitada
if [ "$#" -eq 3 ] && [ "$3" == "-v" ]; então
VERBOSE = verdadeiro
fi
# Validar caminho do contrato
se [ ! -f "$CONTRACT_PATH"]; então
exit_on_error "O caminho do contrato '$CONTRACT_PATH' não existe ou não é um arquivo."
fi
# Obtém o diretório do caminho do contrato
CONTRACT_DIR=$(nome do diretório "$CONTRACT_PATH")
# shellcheck desabilitar=SC2034
CONTRACT_FILE=$(nome base "$CONTRACT_PATH")
# Mude para o diretório de contratos
cd "$CONTRACT_DIR" || exit_on_error "Falha ao alterar o diretório para '$CONTRACT_DIR'."
# Etapa 1: Compilar o contrato
echo "Compilando o contrato..."
se $VERBOSE; então
forjar construir --contratos . || exit_on_error "Falha ao compilar o contrato."
mais
forjar construir --contratos . > /dev/null 2>&1 || exit_on_error "Falha ao compilar o contrato."
fi
# Etapa 2: Gere o código de inicialização
echo "Gerando código de inicialização..."
INIT_CODE=$(forja inspecionar bytecode "$CONTRACT_NAME") || exit_on_error "Falha ao gerar código de inicialização."
# Etapa 3: Calcule o hash do código inicial
echo "Calculando hash do código de inicialização..."
INIT_CODE_HASH=$(echo -n "$INIT_CODE" | keccak-256sum | cut -d' ' -f1) || exit_on_error "Falha ao calcular o hash do código inicial."
# Etapa 4: Escreva o hash do código inicial em um arquivo
OUTPUT_FILE="${CONTRACT_NAME}_INIT_CODE_HASH.txt"
echo "$INIT_CODE_HASH" > "$OUTPUT_FILE" || exit_on_error "Falha ao gravar o hash do código de inicialização no arquivo."
# Limpe arquivos temporários (se houver)
# (Adicione comandos aqui se houver algum arquivo temporário para limpar)
# Etapa 5: produza o resultado
echo "Hash do código de inicialização foi gravado em $OUTPUT_FILE"
se $VERBOSE; então
echo "Código de inicialização: $INIT_CODE"
echo "Hash do código de inicialização: $INIT_CODE_HASH"
fi
# Reverte para o diretório original
cd - > /dev/null || saída