October 31, 2022

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 можно познакомить в репозиториях его создателя ТЫК (там страшно)

Надеюсь статья была интересной и понятной!

Все мои ресурсы - https://t.me/ortomich_links