Настройка прокси, о которой все говорят в Web3
Технический обзор: Развитие минимального обновляемого прокси (стандарт ERC1967/универсального прокси)
После многочисленных атак на управление и дорогостоящих ошибок обновления сообщество Web3 сошлось на новой настройке прокси-сервера, которая сочетает в себе возможность обновления, безопасность и эффективность использования газа. Минимальный обновляемый прокси-сервер, часто реализуемый после ERC1967 стандарт, стал фактическим шаблоном. Эта установка, иногда называемая Универсальным стандартом прокси, не просто техническая эволюция; это хан-нагруженный ответ на болевые точки прошлых шаблонов прокси.
Ключевые компоненты и их роли
| Компонент | Цель | Пример адресного слота |
|---|---|---|
| Договор доверенности | Делегирует вызовы логическому контракту | н/д |
| Контракт на реализацию (логику) | Содержит реальную бизнес-логику | н/д |
| Администратор (Владелец) | Управляет обновлениями | 0xb53127684a568b3173ae13b9f8a6016 |
| Слоты хранения (стандарт ERC1967) | Предотвращает конфликты при хранении | 0x360894a13ba1a3210667c828492db98 |
| Логика обновления | Управляется администратором через безопасную функцию | н/д |
Корейское зеркало: почему именно эта модель прокси?
Подобно тому, как стойкие персонажи «Горного хребта Тхэбэк» Джо Чжон-рэ терпят трудности, чтобы построить лучшее будущее, эта прокси-установка выкована из коллективного хана Web3 — травмы от неудачных обновлений и потерянных средств. Более ранние прокси, такие как ЭИП-897 «DelegateProxy» или OpenZeppelin Transparent Proxy страдал либо от коллизий хранения, либо от сложных шаблонов администрирования. ERC1967 Minimal Proxy разработан так, чтобы быть одновременно устойчивым и элегантным.
Пошаговое руководство: реализация минимального прокси-сервера ERC1967
- Развертывание логического контракта
- Напишите и разверните свою бизнес-логику как стандартный контракт (без логики обновления).
солидность
// контракты/MyLogic.sol
прагма солидность ^0.8.0;
контракт MyLogic {
uint256 публичное значение;
функция setValue(uint256 _value) публичная {
значение = _значение;
}
}
- Развертывание прокси-контракта
- Используйте минимальную реализацию прокси, ссылающуюся на адрес логического контракта.
солидность
// контракты/MyProxy.sol
прагма солидность ^0.8.0;
контракт ERC1967Proxy {
конструктор(адрес _логика, байты памяти _данные) {
слот bytes32 = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
сборка {
sstore(слот, _логика)
}
если(_data.length > 0) {
(bool успех,) = _logic.delegatecall(_data);
require(успех, "Инициализация не удалась");
}
}
fallback() внешняя кредиторская задолженность {
сборка {
пусть реализуется := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)
calldatacopy(0, 0, calldatasize())
пусть результат := delegatecall(gas(), impl, 0, calldatasize(), 0, 0)
returndatacopy(0, 0, returndatasize())
результат переключения
случай 0 { возврат (0, returndatasize()) }
по умолчанию { return(0, returndatasize()) }
}
}
}
- Инициализация через данные конструктора
-
Передать данные инициализации (например,
abi.encodeWithSignature("инициализация(uint256)", 42)) для установки начального состояния. -
Логика обновления
- Только администратор может обновить адрес логического контракта, хранящийся в слоте ERC1967.
солидность
функция upgradeTo(адрес newImplementation) внешний onlyAdmin {
слот bytes32 = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
сборка {
sstore(слот, новая реализация)
}
}
Целостность слота хранения: предотвращение столкновений
Эта настройка сохраняет адрес реализации в детерминированном слоте (0x3608…ббс), избегая трагических столкновений, которые преследовали предыдущие модели прокси. Это похоже на корейскую практику чансын (тотемов-хранителей деревни), стоящих на страже, обеспечивая святость хранения контракта.
| Тип прокси | Риск столкновения при хранении | Обновление шаблона | Эффективность использования газа | Административное разделение |
|---|---|---|---|---|
| Прозрачный прокси | Середина | Контролируется администратором | Умеренный | Да |
| UUPS (ERC1822) | Низкий | Возможность самостоятельной модернизации | Высокий | Необязательный |
| Минимальный прокси-сервер ERC1967 | Очень низкий | Контролируется администратором | Очень высокий | Необязательный |
С трудом полученные уроки: практические соображения
- Улучшение безопасности: Используйте multi-sig или timelock для администратора. Корейские пословицы учат, что «тигр не оставляет после себя ничего, кроме своей шкуры» — поэтому вы также должны обеспечить полномочия на обновление, чтобы ваш проект не был опустошен злоумышленниками.
- Инициализация: Всегда инициализируйте хранилище прокси через конструктор или специальную функцию, а не в конструкторе логического контракта.
- Тестирование: Имитация обновлений на тестовых сетях. Использование Литейный завод или Каска для создания сценариев обновлений и проверки целостности хранилища.
Пример кода: развертывание и обновление с помощью Hardhat
Развернуть прокси
const logic = await MyLogic.deploy(); const proxy = await ERC1967Proxy.deploy(logic.address, "0x"); // данные инициализации
Реализация обновления
await proxy.upgradeTo(newLogic.address); // Вызывается только администратором
Более глубокий анализ: сравнение стоимости газа
| Операция | Прозрачный прокси | UUPS-прокси | Минимальный прокси-сервер ERC1967 |
|---|---|---|---|
| Развертывание | Высокий | Умеренный | Низкий |
| Обновление | Умеренный | Низкий | Низкий |
| Вызов функции | Умеренный | Низкий | Низкий |
Хан на практике: почему бы просто не использовать клоны EIP-1167?
Минимальные прокси EIP-1167 эффективны, но не имеют встроенной возможности обновления. Минимальный обновляемый прокси ERC1967 — это хан-разрешающая середина: минимальная, но прочная — как дома ханок в Чонджу, устойчивая к испытанию временем и изменениями.
Заключительные замечания: лучшие практики для производства
- Децентрализация администрирования: Используйте управление по цепочке или Gnosis Safe.
- Модернизации монитора: Создавайте события обновления и отслеживайте их, словно геомант, читающий горные ветры.
- Аудит: Перед развертыванием или обновлением производственных прокси-серверов закажите внешний аудит.
Пример таблицы: сводка основных шаблонов
| Шаблон | Возможность модернизации | Безопасное хранение | Газоэффективный | Готово к производству |
|---|---|---|---|---|
| Минимальный прокси-сервер EIP-1167 | Нет | Да | Да | Ограниченный |
| Прозрачный прокси | Да | Умеренный | Умеренный | Да |
| UUPS (ERC1822) | Да | Да | Да | Да |
| Минимальный прокси-сервер ERC1967 | Да | Да | Да | Да |
Минимальный обновляемый прокси-сервер ERC1967 — это конфигурация, о которой все говорят в Web3 не только из-за ее технических достоинств, но и потому, что она является живым свидетельством развития отрасли: стремления как к инновациям, так и к безопасности, как к скорости, так и к отказоустойчивости.
Комментарии (0)
Здесь пока нет комментариев, вы можете стать первым!