На случай падения интернета. Часть 1
Оглавление
1. Зачем вам может понадобиться независимость от интерфейса
2. Готовые UI от сторонних разработчиков
3. Полный потенциал смарт-контрактов без программирования
В октябре упали сервисы Amazon, В ноябре упал Cloudflare. Эта инфраструктура, на которой держится огромное количество приложений, в том числе децентрализованных. Что случилось, когда cloudfare упал? На несколько часов пользователи не могли попасть в банковские приложения, соцсети, обозреватели блокчейнов и даже до фронтенда самых крупных DeFi-протоколов нельзя было достучаться.
Что если подобное снова повторится? Что если вам нужно будет срочно вывести активы? Что если команда перестанет поддерживать протокол и сайт закроют? Или сайт ляжет из-за наплыва пользователей? Как тогда вывести свои активы из протокола?
Хорошая новость - Web3 очень абстрактен. Пока в вашей стране интернет работает не по белым спискам вы можете работать с протоколами без участия пользовательских интерфейсов. Или вы можете воспользоваться сторонним интерфейсом.
Самый простой способ
Найти клоны интерфейсов. Например pi.cp0x.com предоставляет интерфейсы для Aave, Uniswap, Morpho, Spark, Tornado cash, Balancer, Liquity, Sky. Сделано русскоязычным сообществом cp0x, открытый исходный код, вырезаны UI ограничения по геолокации, OFAC-ограничения, сборы данных.
P.S. И хотя исходный код открыт - я его не проверял. Но интерфейсы напрямую вызывают контракты протоколов
Вы можете пользоваться их сайтом, но также можете запустить интерфейс у себя локально через докер-контейнеры.
Даже если вы не умеете работать с докером и никогда не пользовались командной строкой это делается в 4 шага:
- Скачать Docker Desktop
- Найти в строке поиска Images от cp0x и нажимаете run для нужных - начнется скачивание контейнеров
3. Настройте уникальные имя и порт. После этого запустите контейнер кнопкой Run.
4. Открываете в браузере localhost:порт (в моем случае 3002) и получаете локальный интерфейс
Чтобы контейнеры постоянно не съедали ресурсы - выключайте контейнеры когда не используете. Некоторые Images занимают много места (например AAVE занимает 2 гигабайта). Если они вам больше не нужны останавливаете containers -> удаляете containers -> удаляете images.
Вы также можете настроить свои RPC URL, но по умолчанию используются публичные.
- Вы должны доверять проекту / проверить самому код на гитхабе.
- Поддержка новых блокчейнов добавляется медленнее в интерфейсы, чем в официальные интерфейсы, а в контейнеры она добавляется еще медленнее. Если вы используете одни и те же блокчейны arbitrum/base, то на вас это не повлияет.
Есть ли альтернативы?
- DefiSaver -> для AAVE,Compound, Fluid, Morpho, Llamalend
- Revert finance -> для Uniswap, Aerodrome
- Superlend -> Morpho, AAVE
Функциональный способ
Что если вы не доверяете интерфейсам от сторонних разработчиков? Или интерфейса для приложения никто не сделал? Или вы хотите большей функциональности? Тогда этот способ для вас.
Дело в том, что некоторые обозреватели блокчейнов довольно мощные. И они позволяют вам не только смотреть историю переводов, но и взаимодействовать со смарт-контрактами. Это означает, что вы можете вызвать любой контракт в блокчейне через его-обозреватель.
Не все поддерживают такую функцию, особенно если вы работаете с non-EVM блокчейнами. Некоторые обозреватели поддерживают, но интерфейс работает по-другому. Одним словом - все может быть очень по-разному, но я покажу принцип работы с самым популярным обозревателем etherscan. Этот обозреватель есть в большинстве EVM блокчейнов: arbiscan, lineascan, basescan... - у них всех один интерфейс.
Разбирать будем протокол AAVE в сети arbitrum по нескольким причинам:
- AAVE очень популярен
- В AAVE можно внести депозит, что означает, что ваша крипта может "застрять", если интерфейс станет недоступным. По аналогии с AAVE вы сможете вывести активы из любого смарт-контракта, если тот позволяет.
Если контракт позволяет - это ключевое условие. Многие протоколы имеют функцию, которая позволяет команде заморозить весь протокол или актив в протоколе, а некоторые даже позволяют замораживать вывод для конкретных адресов. Например, из-за уязвимости протокола команда AAVE заморозила вывод средств пока не пофиксила баги.
Шаг 1 - найти адрес токена, с которым вы хотите совершить операцию
- Убедитесь, что протокол поддерживает работу с этим токеном
- Если это ETH, то в большинстве блокчейнов используется WETH (перед депозитом ETH оборачивается в WETH, поскольку у ETH нет адреса). В случае Arbitrum, адрес WETH 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1
- Если это другой токен, то можно посмотреть его адрес через обозреватель.
- Найти значение decimals у этого токена через contract -> read / read as proxy ->decimals. Обычно это значение равно 18 у большинства токенов, но у некоторых как USDT оно равняется 6.
5. Скопируйте адрес токена с которым вы будете работать
Шаг 2 - найти правильный адрес протокола
Если вы использовали уже ранее протокол через интерфейс - вам повезло. Найти адрес протокола будет легко. Просто вбив в поиске адрес своего кошелька вы найдете с каким адресом протокола он взаимодействовал.
Просто нажав по нему вы перейдете на страницу контракта.
Если вы еще ни разу не взаимодействовали с контрактом - будет сложнее. Адрес контракта придется найти другими способами: через документацию, гитхаб, обсуждения на форумах, другие кошельки, поисковик, веб архив.
Шаг 3 - найти функцию с которой вам нужно взаимодействовать
В случае AAVE, функций с записью довольно много (43). Некоторые из них продублированы как borrow (2 и 3), некоторые называются похоже (например supply, supplyWithPermit, deposit). Некоторые аргументы функций или они сами для вас будут непонятны. В таком случае используйте метод проб и ошибок, читайте описание функции, обращайтесь в документацию или спрашивайте ИИ.
К примеру в AAVE есть 2 функции borrow, одна из них принимает понятные для человека аргументы. А вторая принимает значение в байтах. Очевидно, что удобнее для вас будет первая. Но она немного дороже.
Какие функции вам будут нужны 99% времени в случае AAVE:
- Supply - вносит активы в AAVE
- Borrow - берет займ под залог
- Repay - выплачивает займ
- Withdraw - выводит активы из протокола в кошелек
У каждой функции есть свои аргументы. Обычно аргументы пустыми быть не могут. Функции borrow, repay и withdraw работают по похожему принципу. А вот supply просто так сделать не получится. Сначала вам нужно будет одобрить трату токенов. Делается это через контракт самого токена (а не протокола). Например у USDT есть функция approve. В ней указываете адрес протокола и сумму, которую вы разрешаете ему потратить.
На скриншоте я указал адрес протокола AAVE (spender аргумент) и 500000 (amout) / 0,5 USDT. Почему 0,5? Если вы помните, чуть ранее мы искали decimals у токенов. У USDT он был равен 6, у большинства токенов он равен 18. Decimals - это "сырая" доля токена. Смарт-контракты принимают значение в сыром виде. 1 ваш токен = 1 000 000, если decimals равен 6 и 100 000 000, если decimals = 8.
В поле amout вводите число токенов, которое вы хотите ввести умноженное на 10 в степени decimals.
Далее отправляете транзакцию через кнопку write. Для таких случаев кошелек rabby отлично подходит, поскольку он умеет симулировать транзакции. Например, если вы ввели неправильно amount - кошелек подсветит, что вы ошиблись нулем.
После того как вы одобрили использование токена, вы можете вернуться в контракт AAVE и вызвать функцию supply.
Вот к примеру как будет выглядеть вызов функции withdraw. Я указал токен, который я хочу вывести, его количество и на какой адрес. Обратите внимание, что вывожу я на другой адрес кошелька (не на тот, где лежат USDT в протоколе). Этой функции нет в стандартном интерфейсе AAVE.
Если я подпишу транзакции, то токены с AAVE выведутся на другой адрес. Нечто похожее есть и в других функциях AAVE:
- Вы можете внести токены через supply, указав другой кошелек как владельца.
- Вы можете повесить свой долг на другой адрес, если этот адрес разрешил
- Вы можете погасить займ у другого кошелька
Теперь расширьте это на многие другие протоколы - у многих из них окажутся скрытые от UI функции.
Это 2 способа как пользоваться протоколами на случай падения основной UI инфраструктуры. Однако можно вообще обойтись без UI. Вы можете установить ноду и через нее вызывать смарт-контракты.