حجم النص
تجزئة كود التهيئة هي أساسًا تجزئة keccak256 للبايت كود الخاص بالعقد.
استخدام كود التهيئة
تجزئة كود التهيئة مطلوبة "نظرًا لأن حساب العنوان يعتمد على تجزئة
كود التهيئة. كود التهيئة هو الكود الذي، عند تنفيذه، ينتج
البايت كود وقت التشغيل الذي سيتم وضعه في الحالة، والذي
يُستخدم عادةً بواسطة اللغات عالية المستوى لتنفيذ
'المُنشئ'."
"EIP-1014: Skinny CREATE2," Ethereum Improvement Proposals, no. 1014, April 2018. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-1014.
استخدام كود التهيئة
الاستخدام الأساسي لكود التهيئة هو لتعدين العناوين. يمكنك الاطلاع على https://github.com/0age/create2crunch للحصول على مثال لكيفية استفادتنا من CREATE2 وكود تهيئة العقد 'لتعدين' عناوين أكثر كفاءة لنشر العقود.
إليك نص bash بسيط يستخدم forge لإنشاء تجزئة كود التهيئة لك:
https://github.com/sambacha/foundry-scripts/tree/master/scripts/deploy
النص
#!/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."# الخطوة 4: كتابة تجزئة كود التهيئة إلى ملف
OUTPUT_FILE="${CONTRACT_NAME}_INIT_CODE_HASH.txt"
echo "$INIT_CODE_HASH" > "$OUTPUT_FILE" || exit_on_error "فشل في كتابة تجزئة كود التهيئة إلى الملف."
# تنظيف الملفات المؤقتة (إن وجدت)
# (أضف الأوامر هنا إذا كانت هناك أي ملفات مؤقتة بحاجة إلى تنظيف)
# الخطوة 5: إخراج النتيجة
echo "تمت كتابة تجزئة كود التهيئة إلى $OUTPUT_FILE"
if $VERBOSE; then
echo "كود التهيئة: $INIT_CODE"
echo "تجزئة كود التهيئة: $INIT_CODE_HASH"
fi
# العودة إلى الدليل الأصلي
cd - > /dev/null || exit