EIP-2535 или гиперболизированные прокси
Сегодня мы попробуем разобраться с EIP-2535
Начнем!
Для начала стоит вспомнить немного теории про делегейт колы, сделать это можно ТУТ
Суть прокси
Прокси используют в своей основе делегейт колы и разделение контрактов на два уровня: уровень выполнение (execution) и уровень хранение (storage). Каждый из уровней это отдельный контракт. Уровень хранения является постоянным, а уровень выполнения изменяемым. Два этих уровня связываются при помощи делегейт колов от уровня хранения к уровню выполнеия
Обьясню на примере NFT контракта, который реализует в себе прокси
У нас есть основной контракт хранения, который хранит в себе холдеров, метаданные, максимальный саплай и тд, а есть относящийся к этому контракту контракт выполнения, в котором прописываются все функции. Например я могу в контракте исполнения прописать функцию минта, которая будет проверять сигнатуру при минте, а потом я решу изменить эту функцию и я смогу это сделать. Мне надо будет просто задеплоить новый контракт выполнения с новой функцией минта, которая на этот раз будет без сигнатуры, после чего сказать контракту хранения (основному), что теперь вы выполняем функции в новом контракте и делегейт коллим на другой контракт. Таким образом мы можем менять реализацию у наших контрактов, за чем прокси и используются
Проблемы прокси
Проблема прокси заключается в том, что надо очень аккуратно работать с памятью, ведь делегейт колл работает не с переменными, не их названиями или ссылками на них, а конкретно с ячейками памяти, из-за этого уровень выполнения должен полностью дублировать выделенные ячейки памяти с уровня хранения
Стероидные прокси EIP-2535
В обычных прокси мы шлем дату на контракт хранения, после чего наша транзакция натыкается на фоллбек функцию, где она делегейт коллом летит на контракт выполнения и изменяет данные в контракте хранения. По сути EIP-2535 работает ровно по тому же сценарию, но позволяет немного больше
Несколько контрактов исполнения в зависимости от функции
В EIP-2535 селектор контракта для делегейт кола работает хитро и позволяет делать несколько контрактов выполнения для одного контракта хранения. Получается это благодаря маппингу (bytes4 => address), где bytes4 - селектор функции, а address - адрес контракта выполнения
Удобная работа с памятью
Во всех контрактах выполнения мы не просто прописываем изменение переменной, мы прописываем изменение в конкретном участке памяти
В указателе памяти мы можем прописывать полностью кастомный путь до библиотеки с хранилищем, тем самым у нас открываются невероятные просторы для работы с памятью
Возможность выхода за рамки контракта в 24577 байта
Не могу не указать этот важный плюс, но думаю как он работает - вы сами догадаетесь)
Возможность сделать контракт без аби
Так как наш основной контракт зачастую импортирует в себя только несколько интерфейсов, а остальная часть контракта - конструктор и фоллбек, аби там взять неоткуда, поэтому когда мы заходим в подобные контракты на etherscan мы можем увидеть, что "Write contract" и "Read contract" полностью пустые
С практической точки зрения с EIP-2535 можно познакомить в репозиториях его создателя ТЫК (там страшно)
Надеюсь статья была интересной и понятной!