Решил продолжить серию статей про DeFi, потому, что перед новым годом у меня случился мягко скажем затык. Попробую объяснить по русски.
В одном из лендинговых сервисов, а лендинговые сервисы, это сервисы по кредитованию в криптовалютном мире децентрализованных финансов у меня лежали средства под хороший процент.
Нашёл я этот сервис случайно в редкой сети. И мне капало около 100% годовых в ETH -эфириум, что уже как бы не плохо.
Но 30 декабря с утра я обнаружил, что сайт не открывается, просто ошибка и всё.
Такое теоретически может случится с каждым сервисом.
Естественно я вначале понервничал, т.к. заблокирован у меня был там 1 ETH, с хвостиком, это около 350 т.р. Потом я стал анализировать свои возможные потери. Так как я в данном сервисе под залог этого 1 ETH взял кредит, то потенциальные потери это разница между стоимостью 1 ETH и суммой взятых в кредит средств. Ведь в мире DeFi, если организация пропадает, ты ей ничего не должен, ну и она тебе соответственно тоже.
По разнице сумма получилась чуть меньше, около 1400$, это мой заработок примерно за 1,5 недели и я успокоился, деньги хоть и приличные, но не глобальные. Можно бы было смириться, но мириться как бы не хотелось и я полез в твиттер где нашёл аккаунт этого сервиса, где было указано, что:
Мы переезжаем на другие сервера, поэтому сайт какое то время работать не будет, все ваши средства в безопасности в смарт-контрактах.
Ну это так примерно по памяти. А ниже комментарий одного из участников, что 2 дня для переезда более чем достаточно, но сайт так и не работает.
Это меня насторожило, я не привык верить людям и не известным организациям на слово. А так же я увидел слово смарт-контракты и подумал, почему бы не попробовать научится вытаскивать средства от туда вручную. Ведь действительно средства хранятся не на сайте который был по сути закрыт, сайт лишь оболочка для взаимодействия, а средства заблокированы в блокчейне в смарт-контрактах, так вот сайт просто позволяет делать команды для взаимодействия со смарт-контрактам.
То есть повторю, для понимания ещё раз, схематично:
- Ваши средства (блокчейн + метамаск для взаимодействия) = > Лендинговый сервис (блокчей/смарт-контракт + сайт для взаимодействия)=>вывод средств:
- А) Через сайт отдать комманду смарт-контракту, для снятия средств из смарт-контракта блокчейна в блокчейн в Ваш кошелёк (метамаск Ваш ключ к блокчейну).
- Б) Напрямую через смарт контракт, для снятия средств из смарт контракта в Ваш кошелёк (естественно тоже всё это происходит в блокчейне, а не на сайте и даже не в вашем кошельке, кошелёк только отображает баланс и позволяет отдавать комманды).
Всё это время средства находятся в блокчейне, в виде записи, что такому то адресу или такому то смарт-контракту принадлежит такое то кол-во токенов. Поэтому закрытие сайта по сути не на что не влияет! Средства действительно на месте и не были украдены сервисом, просто руководство сервиса безалаберно затянуло процесс переезда, ещё и перед новогодними праздниками, хотя теоретически это мог быть и скам проекта.
Поэтому я решил перестраховаться.
Что такое смарт-контракт?
Смарт-контракт, это набор команд (по сути код, как в матрице), который позволяет в автоматическом режиме производить сделки.
То, есть доверяя средства смарт-контаркту, вы доверяете - коду. Чтобы доверять коду, надо либо А) уметь его читать, либо Б) знать, тех кто умеет его читать, и доверять им.
Вариант Б - это аудит. Я вспомнил и нашёл подтверждение в твиттере, что аудит безопасности они прошли, причём ещё и двумя сервисами, в чём я убедился лично.
Более того, прошли его у Certik, одного из крупнейших аудиторов и большинство проблем с кодом было устранено, критических проблем нет, как видно из отчёта:
То есть средства точно в безопасности, успокаивал себя я, но что-то мне всё равно не давало покоя. А то, что я не умею ими управлять в отсутствии сайта, т.е. оболочки для управления.
А управлять ими в отсутствии оболочки можно, потому, что доступ к смарт контрактам имеется через обозреватели блокчейна.
У каждой сети, есть свой обозреватель, который позволяет видеть все сделки, и взаимодействовать со всеми смарт контрактами всей сети! Вот так вот, как в матрице.
Т.е. для кого то, это просто набор буквоцифр, а для кого-то вся информация о всех сделках прошлых и текущих за всё время. И в этих буквоцифрах, вполне себе можно во первых всё узнать, во вторых всё изменить.
Поэтому я полез узнавать и искать смарт контракт, где у меня заблокированы средства.
Для этого есть два пути. Можно пользоваться самим обозревателем, вбив туда адрес своего кошелька, а можно пользоваться доп. сервисами типа DeBank, который слегка упрощает процесс, т.к. делает его более визуально удобным.
Для поиска смарт контракта решил пойти вторым путём. Чтобы не усложнять себе и без того нервную жизнь.
Для этого я вбил кошелёк, выбрал раздел сделок (history) и ту сеть где у меня были заблокированы средства.
Далее я до листал до того места, где был произведена транзакция по переносу средств из моего кошелька в смарт контракт проекта (хотя я очень сомневался, что это, то что нужно):
Вот, оно то, что нужно, операция которой я перевёл средства в смарт-контракт сервиса, сайт которого отключился и не известно когда включится.
Далее осталось найти его адрес, для этого я тыкнул по этой сделке:
Вначале я убедился, что у меня есть расписки, которые мне выдали взамен 1 ETH, для этого я зашёл по ссылке nETH и добавил адрес контракта в метамаск (как это делать я писал в предыдущих статьях).
Это уже хорошо, значит взамен расписок я могу вернуть назад свой эфир. Потеряв или продав расписки я бы лишился этой возможности (но я даже не знал, что они у меня есть, потому, что изначально они не отображаются, адрес контракта расписок надо добавлять в ручную в большинстве случаев).
Далее надо зайти по адресу март контракта, который указан скриншотом выше, точнее через скриншот, просто тыкнуть на него.
Далее я даже не поленился и нашёл свою сделку, по переводу 1 ETH.
Потом увидел, что со смарт контракта кто то усиленно выводил все средства, но естественно свои средства, это я тоже проверил.
На самом деле всё было понятно, в смарт контракте лежело около 35 ETH + мой 1 ETH и когда большую часть средств вывели. Процент - доходность резко выросла (до 100%) годовых, потому, что чем больше средств заняли из протокола и чем меньше в нём их, тем больше доходность. Но это инфа для другой статьи в общем. Суть в том, что в смарт-контракте остался мой эфир и ещё два чьих то эфира. В балансе это не отображалось, но это можно было просто посчитать по сумме сделок, а так же по сумме имеющихся на депозитах расписок nETH.
К слову, сейчас их примерно столько же 310, т.е. 3,1 ETH заблокировано в протоколе. Из них 1 ETH мой.
Это утешало, значит кто-то, кроме меня тоже "попал".
Далее стояла задача забрать средства. Но тут всё не так просто, т.к. средства являются залогом, то забрать их не вернув залог не возможно, точнее не возможно забрать в полном объёме. Поэтому я решил провести мелкую транзакцию, чтобы вообще понять, можно ли это сделать.
И для этого пошёл в раздел операций со смарт контрактами(на странице смарт контракта - через 2 скриншота выше):
После того, как я подконнектил кошелёк, стал искать операцию, которая отвечает за вывод средств, т.е. листать список операций указанных на скриншоте выше (листать соовт. ниже).
И нашёл её, нашёл я её по названию из deBank (когда закладывал средства):
То есть если операция по блокировке средств это mint (минт в переводе означает - чеканить. В замен 1 ETH мне отчеканили 100 nETH - расписок).
То обратная операция соответственно это redeem ( редим в переводе означает - выкупать или обменять). То есть если изначально я отчеканил 100 nETH, то обратным действием я должен выкупить свой 1 ETH.
Далее проблема была в том, что я не знал, сколько я могу выкупить назад, т.к. я взял кредит под залог этого 1 ETH, это была первая проблема, второй проблемой было, то, что вводить сумму нужно было в кодировке unit256, т.е. я не мог просто взять и ввести цифру 1 и получить результат. Я бы получил х...н.
Поэтому надо было узнать сумму баланса кошелька в кодировке unit256. Звучит всё это очень сложно и мне тоже в тот момент так казалось, но на самом деле, это как в математике, если на обратной стороне тетрадки есть таблица умножения, то не зная правил ты можешь решать задачи. Так же и тут, таблица умножения была в разделе чтения баланса кошелька.
Почему я так подробно пишу, потому, что по этой инструкции в случае проблем вы сможете извлечь средства из любого смарт контракта, даже в таком сложном варианте как лендинговый протокол, т.к. там по сути по минимуму смарт-контракта два, один на депонирование средств, второй на займ. Без подробной инструкции и бутылки водки, тут явно не разберёшься.
Далее мы листаем ниже, чтобы найти раздел, чтения баланса именно Вашего кошелька, в данном смарт контракте.
Для этого в раздел owner надо ввести свой адрес и нажать кнопку querry для раздела balans of(что как бы логично).
Так я получил результат по кол-ву эфира в нужной мне кодировке.
Случайно тыкнув на сами символы(синеньким на скриншоте выше), открылся калькулятор, который как оказался мне и был нужен. Но кстати для эфира он оказался почти бесполезен, т.к. считает нативную валюту MOVRики, но в нём более наглядно, что-ли.
Осталось только поставить в нужном месте запятую, чтобы понять, сколько надо снимать,
а снять я решил 0,0003 eth, для проверки, что это вообще возможно. И что я действительно могу взаимодействовать без веб интерфейса.
Соответственно, в той кодировке сумму нужно было вбить 00003000000, естественно нули спереди я решил убрать, оставив 3000000. Данная сумма равняется 0,0003 eth.
Далее я вернулся в раздел write, т.е. взаимодействия с контрактом. Где был уже подконнекчен мой адрес:
и до листал опять до того раздела, где можно забрать баланс.
Первой моей ошибкой, было использование нижней строчки redeemAmoun, по сути это забрать ВСЁ. А ВСЁ я забрать не мог, т.к. этот депозит частично является залогом за взятые в кредит токены MOVR и USDC. Поэтому первая транзакция логично завершилась ошибкой.
Но вторая, когда я вбил указанное значение в поле redeemTokens, прошла успешно.
Я вернул на свой кошелёк, без сайта оболочки пусть не большую, но всё же сумму моих личных заблокированных средств.
И они до сих пор там. Так как эти копейки лень куда то переводить.
Часть 2. "Спасение" депозита путём получения большего кредита.
Почему на этом не всё. Потому, что это не был выход из ситуации, я не мог забрать все средства, т.к. они как я уже не раз писал, были залогом, по кредиту. Это значит, что без погашения кредита смарт контракт мне не вернёт мой 1 ETH.
Погашать кредит мне было страшно, хотя это можно бы было сделать вполне найдя другой смарт контракт который отвечает за погашение. Страшно потому, что не смотря на аудит, где у меня гарантия, что после возврата кредита, залог мне вернут назад в полном объёме (хотя выше вроде видно, что возвращается именно столько сколько запросил, даже чуть больше). Но я не хотел рисковать, поэтому было приятно решение, занять ещё средств. По максимуму, столько сколько позволяет протокол, а мои потери в случае если не починят сайт составят разницу между залогом (1 ETH) и взятыми в кредит средств (USDC + MOVR). Разница в 1400$ примерно меня не устраивала.
Поэтому я решил найти два смарт контракта, где я брал в кредит на этом сервисе средства, которые за это отвечают, один который отвечает за MOVR, второй за USDC, для этого опять полез в debank в историю транзакций. И нашёл оба смарт контракта
То есть по сути я нашёл все три точки, где можно управлять средствами без сайта вообще.
Дальше я делал уже по накатанной, вначале я посчитал сколько у меня взято МУВриков, и обнаружил, что тут калькулятор показывает верно.
С USDC тоже особых проблем не было, хотя там калькулятор показывал НЕ верно, но отделить количество знаков даже школьник сможет, т.е. взятые в кредит 600 баксов отображались, как не что вроде 600000000 и много нулей(сейчас точно не помню).
В данном случае, чтобы совершить заём мне надо было примерно прикинуть, сколько я ещё могу взять средств исходя из моего залога 1 ETH зная, сколько я уже занял.
Но т.к. высчитать вручную было практически не возможно (я не знал коэффициент обеспечения, т.к. не всю сумму можно брать, а только сумму помноженную на этот кооф.-нт), то я стал брать небольшими партиями, так же подконнектив кошелёк к смарт контракту и найдя соотв. поле в списках команд:
Далее после трёх не удачных попыток, я уменьшил сумму кредита в MOVR, до разумных (изначально хотел выгрести всё, но там же не дадут, банкомат не даст больше, чем у тебя есть возможность снять)
я получил 500 USDC и некоторое кол-во MOVR, у сервиса по сути который находился в offline (при этом на тот момент никто другой такие транзакции совершить не мог или не хотел или не умел из пользователей данным сервисом).
По итогу всех операций, я высчитал, что максимальные возможные потери (разница между залогом и суммой займа) составят всего 350-400$, что меня вполне устроило.
Почему я решил не возвращать кредит я уже писал выше, потому, что я не был до конца уверен, что после возврата средств я смогу забрать ВЕСЬ залог(депонированный 1 ETH), кроме этого в твиттере объявление о том, что сайт они запустят, меня частично успокаивало, как и пройденные два аудита у двух независимых аудитора смарт контрактов.
Всё это происходило 31 декабря с утра, т.е. прямо перед самым новым годом. Произведя все манипуляции я забыл об этой проблеме как о страшном сне, потому, что смог найти ключик к её решению (без помощи ютьюба, да и нет там разбора таких сложных случаев).
1 января сервис (оболочка-сайт) заработал, чем сказочно меня порадовал. И заодно порадовал тем, что стимулировал меня научится работать со смарт-контрактами напрямую, чем я попытался научить и Вас.
Но в целом мне понравилось именно это
работа с блокчейном напрямую.
И самый главный вывод который бы я хотел сделать, это то, что в сфере децентрализованных финансов, если у проекта пройден аудит и(или не пройден аудит),но хороший код который исключает взлом, то никто кроме Вас не может забрать, похитить, лишить Вас Ваших средств.
Потому, что владельцы сервиса не могут доставать средства из смарт-контрактов, они могут только убрать интерфейс , но это ничего не даст. Т.к. данными средствами можно управлять и без отдельного интерфейса напрямую взаимодействуя с блокчейном.
А все сделки которые Вы совершаете НЕ возможно заблокировать или отменить или наложить на них арест(заморозить) в отличии от банков и централизованных бирж.
Остальные статьи на данную тематику:
Часть 6. Прямое предоставление ликвидности, "потерял" 2200$. В чём ошибка и как её избежать.
Часть 4. Как вынимать средства из смарт-контракта, когда сайт DEX сервиса не работает. Децентрализованные финансы. Личный опыт. (данная статья)
#смарт контракт #блокчейн #DeFi #криптовалюта