Размер текста
Хэш кода инициализации — это, по сути, хеш keccak256 байт-кода контракта.
Использование кода инициализации
Требуется хэш кода инициализации «Поскольку вычисление адреса зависит от хеширования
код инициализации. Код инициализации — это код, который при выполнении создает
байт-код времени выполнения, который будет помещен в состояние и который
обычно используется языками высокого уровня для реализации
«конструктор».
«EIP-1014: Skinny CREATE2», Предложения по улучшению Ethereum, №. 1014, апрель 2018. [Онлайн-сериал]. Доступно: 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
# Функция выхода при ошибке с сообщением
выход_on_error() {
эхо «Ошибка: $1»
выход 1
}
# Функция для отображения информации об использовании
использование() {
echo "Использование: $0 <путь_контракта> <имя_контракта> [-v]"
echo ": Путь к файлу контракта Solidity"
echo ": Имя контракта Solidity"
echo "-v: включить подробный вывод (необязательно)"
выход 1
}
# Проверьте, установлен ли Foundry
если! команда -v forge &> /dev/null; тогда
exit_on_error "Foundry не установлен. Сначала установите его."
фи
# Проверьте, указано ли правильное количество аргументов
если [ "$#" -lt 2 ] || [ "$#" -gt 3 ]; тогда
использование
фи
# Переменные из аргументов
CONTRACT_PATH=$1
CONTRACT_NAME=2 доллара США
ПОДРОБНЫЙ = ложь
# Проверьте, включена ли опция подробного описания
if [ "$#" -eq 3 ] && [ "$3" == "-v" ]; тогда
ПОДРОБНО=истина
фи
# Проверка пути контракта
если [ ! -f "$CONTRACT_PATH"]; тогда
exit_on_error «Путь контракта «$CONTRACT_PATH» не существует или не является файлом».
фи
# Получить каталог пути контракта
CONTRACT_DIR=$(имя каталога "$CONTRACT_PATH")
# отключить проверку оболочки=SC2034
CONTRACT_FILE=$(базовое имя "$CONTRACT_PATH")
# Переходим в каталог контракта
компакт-диск "$CONTRACT_DIR" || exit_on_error «Не удалось изменить каталог на $CONTRACT_DIR».
# Шаг 1: Составьте договор
echo "Составление контракта..."
если $VERBOSE; тогда
Forge build --contracts. || exit_on_error "Не удалось скомпилировать контракт."
еще
Forge build --contracts. > /dev/null 2>&1 || exit_on_error "Не удалось скомпилировать контракт."
фи
# Шаг 2: Создайте код инициализации
echo "Генерация кода инициализации..."
INIT_CODE=$(подделать проверку байт-кода "$CONTRACT_NAME") || exit_on_error «Не удалось сгенерировать код инициализации».
# Шаг 3: Вычислите хэш кода инициализации
echo "Вычисление хэша кода инициализации..."
INIT_CODE_HASH=$(echo -n "$INIT_CODE" | keccak-256sum | Cut -d' ' -f1) || exit_on_error «Не удалось вычислить хэш кода инициализации».
# Шаг 4: Запишите хэш кода инициализации в файл
OUTPUT_FILE="${CONTRACT_NAME}_INIT_CODE_HASH.txt"
echo "$INIT_CODE_HASH" > "$OUTPUT_FILE" || exit_on_error «Не удалось записать хэш кода инициализации в файл».
# Очистите временные файлы (если есть)
# (Добавьте сюда команды, если есть временные файлы, которые нужно очистить)
# Шаг 5: Выведите результат
echo "Хеш кода инициализации записан в $OUTPUT_FILE"
если $VERBOSE; тогда
echo "Код инициализации: $INIT_CODE"
echo "Хеш кода инициализации: $INIT_CODE_HASH"
фи
# Вернёмся в исходный каталог
компакт-диск -> /dev/null || Выход