Ukubwa wa maandishi
Init code hash kimsingi ni keccak256 hash ya bytecode ya mkataba.
Matumizi ya Init Code
Init code hash inahitajika "Kwa kuwa hesabu ya anwani inategemea hashing
ya init code. Init code ni msimbo ambao, unapotekelezwa, huzalisha
runtime bytecode ambayo itawekwa kwenye hali, na ambayo
kwa kawaida hutumiwa na lugha za kiwango cha juu kutekeleza
'constructor'."
"EIP-1014: Skinny CREATE2," Mapendekezo ya Uboreshaji ya Ethereum, na. 1014, Aprili 2018. [Mtandao wa mfululizo]. Inapatikana: https://eips.ethereum.org/EIPS/eip-1014.
Matumizi ya Init Code
Matumizi ya msingi ya init code ni kwa uchimbaji wa anwani. Unaweza kuangalia https://github.com/0age/create2crunch kwa mfano wa jinsi tunavyoweza kutumia CREATE2 na init code ya mkataba 'kuchimba' anwani zenye ufanisi zaidi kwa usambazaji wa mkataba.
Hapa kuna script rahisi ya bash inayotumia forge kukuzalishia code init hash:
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."# Hatua 4: Andika hash ya msimbo wa kuanzisha kwenye faili
OUTPUT_FILE="${CONTRACT_NAME}_INIT_CODE_HASH.txt"
echo "$INIT_CODE_HASH" > "$OUTPUT_FILE" || exit_on_error "Imeshindwa kuandika hash ya msimbo wa kuanzisha kwenye faili."
# Safisha faili za muda (kama zipo)
# (Ongeza amri hapa kama kuna faili za muda za kusafisha)
# Hatua 5: Toa matokeo
echo "Hash ya msimbo wa kuanzisha imeandikwa kwenye $OUTPUT_FILE"
if $VERBOSE; then
echo "Msimbo wa kuanzisha: $INIT_CODE"
echo "Hash ya msimbo wa kuanzisha: $INIT_CODE_HASH"
fi
# Rudi kwenye saraka ya awali
cd - > /dev/null || exit