Ukuran teks
Init code hash pada dasarnya adalah hash keccak256 dari bytecode kontrak.
Penggunaan Init Code
Init code hash diperlukan "Karena perhitungan alamat bergantung pada hashing
init code. Init code adalah kode yang, ketika dieksekusi, menghasilkan
runtime bytecode yang akan ditempatkan ke dalam state, dan yang
biasanya digunakan oleh bahasa tingkat tinggi untuk mengimplementasikan
‘constructor’."
"EIP-1014: Skinny CREATE2," Ethereum Improvement Proposals, no. 1014, April 2018. [Online serial]. Tersedia: https://eips.ethereum.org/EIPS/eip-1014.
Penggunaan Init Code
Penggunaan utama init code adalah untuk mining alamat. Anda dapat melihat https://github.com/0age/create2crunch untuk contoh bagaimana kita dapat memanfaatkan CREATE2 dan init code sebuah kontrak untuk 'menambang' alamat yang lebih efisien untuk deployment kontrak.
Berikut adalah skrip bash sederhana yang menggunakan forge untuk menghasilkan code init hash untuk Anda:
https://github.com/sambacha/foundry-scripts/tree/master/scripts/deploy
Script
#!/usr/bin/env bash
# Function to exit on error with a message
exit_on_error() {
echo "Error: $1"
exit 1
}
# Function to display usage information
usage() {
echo "Usage: $0 [-v]"
echo " : Path to the Solidity contract file"
echo " : Name of the Solidity contract"
echo " -v : Enable verbose output (optional)"
exit 1
}
# Check if foundry is installed
if ! command -v forge &> /dev/null; then
exit_on_error "Foundry is not installed. Please install it first."
fi
# Check if correct number of arguments is provided
if [ "$#" -lt 2 ] || [ "$#" -gt 3 ]; then
usage
fi
# Variables from arguments
CONTRACT_PATH=$1
CONTRACT_NAME=$2
VERBOSE=false
# Check if verbose option is enabled
if [ "$#" -eq 3 ] && [ "$3" == "-v" ]; then
VERBOSE=true
fi
# Validate contract path
if [ ! -f "$CONTRACT_PATH" ]; then
exit_on_error "Contract path '$CONTRACT_PATH' does not exist or is not a file."
fi
# Get the directory of the contract path
CONTRACT_DIR=$(dirname "$CONTRACT_PATH")
# shellcheck disable=SC2034
CONTRACT_FILE=$(basename "$CONTRACT_PATH")
# Change to the contract directory
cd "$CONTRACT_DIR" || exit_on_error "Failed to change directory to '$CONTRACT_DIR'."
# Step 1: Compile the contract
echo "Compiling the contract..."
if $VERBOSE; then
forge build --contracts . || exit_on_error "Failed to compile the contract."
else
forge build --contracts . > /dev/null 2>&1 || exit_on_error "Failed to compile the contract."
fi
# Step 2: Generate the init code
echo "Generating init code..."
INIT_CODE=$(forge inspect "$CONTRACT_NAME" bytecode) || exit_on_error "Failed to generate init code."
# Step 3: Calculate the init code hash
echo "Calculating init code hash..."
INIT_CODE_HASH=$(echo -n "$INIT_CODE" | keccak-256sum | cut -d' ' -f1) || exit_on_error "Failed to calculate init code hash."# Langkah 4: Tulis hash kode init ke file
OUTPUT_FILE="${CONTRACT_NAME}_INIT_CODE_HASH.txt"
echo "$INIT_CODE_HASH" > "$OUTPUT_FILE" || exit_on_error "Gagal menulis hash kode init ke file."
# Bersihkan file sementara (jika ada)
# (Tambahkan perintah di sini jika ada file sementara yang perlu dibersihkan)
# Langkah 5: Keluarkan hasilnya
echo "Hash kode init telah ditulis ke $OUTPUT_FILE"
if $VERBOSE; then
echo "Kode init: $INIT_CODE"
echo "Hash kode init: $INIT_CODE_HASH"
fi
# Kembali ke direktori asli
cd - > /dev/null || exit