Мониторинг обновляемого прокси-контракта
Обновляемому прокси можно подменить код целиком одной транзакцией. Пользователи доверяли коду за ним, а часть его и аудировала. Тихое обновление заменяет этот код, а злоумышленнику, получившему ключ обновления, баг вообще не нужен.
Мониторинг обновлений отвечает на три вопроса: изменился ли код, кто может его менять и можно ли узнать об изменении до того, как оно вступит в силу.
Какой адрес добавить
Добавьте адрес прокси, а не реализации. Прокси хранит состояние и средства и именно он выдаёт события обновления. Адрес реализации меняется при каждом обновлении.
Для верифицированных прокси SmartAlert распознаёт паттерн ERC-1967 и сам предлагает шаблон обновления.
В зависимости от паттерна добавьте ещё один или два адреса:
| Паттерн | Кто может обновить | Что ещё добавить |
|---|---|---|
| Transparent proxy | Владелец отдельного контракта ProxyAdmin | Контракт ProxyAdmin, чтобы ставить алерт на OwnershipTransferred |
| UUPS | Тот, кто проходит проверку в реализации, обычно владелец или роль | Ничего лишнего: следите за OwnershipTransferred или RoleGranted на самом прокси |
| Обновление через мультисиг | Подписанты Safe | Safe, чтобы ставить алерт на смену владельцев и порога |
| Обновление через timelock | Тот, кто может планировать операции в timelock | TimelockController, чтобы ставить алерт на CallScheduled |
- Кто может обновить
- Владелец отдельного контракта ProxyAdmin
- Что ещё добавить
- Контракт ProxyAdmin, чтобы ставить алерт на
OwnershipTransferred
- Кто может обновить
- Тот, кто проходит проверку в реализации, обычно владелец или роль
- Что ещё добавить
- Ничего лишнего: следите за
OwnershipTransferredилиRoleGrantedна самом прокси
- Кто может обновить
- Подписанты Safe
- Что ещё добавить
- Safe, чтобы ставить алерт на смену владельцев и порога
- Кто может обновить
- Тот, кто может планировать операции в timelock
- Что ещё добавить
- TimelockController, чтобы ставить алерт на
CallScheduled
Алерты
| Алерт | Следим за | Срабатывает | Уровень |
|---|---|---|---|
| Прокси обновлён | Upgraded(implementation) на прокси | На любое событие | Критично |
| Админ прокси сменился | AdminChanged(previousAdmin, newAdmin) на прокси | На любое событие | Критично |
| Владелец сменился | OwnershipTransferred на прокси или ProxyAdmin | На любое событие | Критично |
| Роль выдана | RoleGranted, RoleRevoked | На любое событие | Критично |
| Сменились владельцы Safe | AddedOwner, RemovedOwner, ChangedThreshold на Safe | На любое событие | Критично |
- Следим за
Upgraded(implementation)на прокси- Срабатывает
- На любое событие
- Уровень
- Критично
- Следим за
AdminChanged(previousAdmin, newAdmin)на прокси- Срабатывает
- На любое событие
- Уровень
- Критично
- Следим за
OwnershipTransferredна прокси или ProxyAdmin- Срабатывает
- На любое событие
- Уровень
- Критично
- Следим за
RoleGranted,RoleRevoked- Срабатывает
- На любое событие
- Уровень
- Критично
- Следим за
AddedOwner,RemovedOwner,ChangedThresholdна Safe- Срабатывает
- На любое событие
- Уровень
- Критично
Алерт об обновлении называет адрес новой реализации. Алерт об админе называет нового админа. Сверьте их с тем, что команда планировала выкатить.
Это правила «любое событие», а не пороги. В обычный месяц обновления редки и плановые, поэтому каждое стоит сообщения. Проверка на истории перед включением правила покажет, сколько обновлений у контракта было за последние 30 дней.
Узнать об обновлении до его исполнения
Если обновления идут через OpenZeppelin TimelockController, обновление сначала объявляется, а исполняется после задержки. Добавьте адрес timelock и поставьте алерт на CallScheduled: алерт придёт, когда обновление поставлено в очередь, за часы или дни до смены кода. В это окно пользователи могут выйти, а команда — отменить через Cancelled.
Без timelock алерт Upgraded приходит постфактум. Он всё равно важен: чем раньше команда узнает, тем раньше сможет поставить паузу или предупредить пользователей.
Ограничения
- SmartAlert следит за событиями и view-функциями. Прокси, который меняет слот реализации без события
Upgraded, нестандартный: алерт его не увидит. - У неверифицированного прокси нет ABI. Загрузите ABI вручную, иначе шаблон не предложится.
- Алерты сообщают быстро, но не отменяют обновление. Для отмены нужны пауза или действие админа, заранее продуманные.
Вопросы и ответы
Я добавил реализацию и не вижу событий. Почему?
События выдаёт прокси. Добавьте вместо этого адрес прокси.
Нужно ли менять контракт?
Нет. Всё здесь читает публичные события. Без редеплоя и без кода.
Какие сети?
Ethereum, BNB Chain, Base и Arbitrum.
Попробуйте на своём контракте
Достаточно адреса. Первые 14 дней действуют лимиты Pro, а правила проверяются на истории до включения.