Solidity. Смарт контракты и аудит – Telegram
Solidity. Смарт контракты и аудит
2.62K subscribers
246 photos
7 videos
18 files
547 links
Обучение Solidity. Уроки, аудит, разбор кода и популярных сервисов
Download Telegram
Урок 11

Я был в дороге последние три дня, потому постов на канале не было совсем. Думал, что успею доехать еще утром в место, где будет связь, но увы.

Тем не менее, по предыдущим опросам я рад, что большинство понимает английскую речь и могут без перевода добирать знания из уроков позже. Для остальных, я попытаюсь делать небольшие выдержки из иностранных уроков, на которые нужно будет обращать внимание.

На этой неделе мы приступаем уже к серьезной работе со смарт-контрактами, и в текущем уроке попробуем разобрать, что такое Наследование в смарт-контрактах.

Видео урок - Наследование.

Этот урок довольно простой, но нужно точно следовать в написании кода за лектором. Так будет намного понятнее.

Я же, как и обычно, но по мере нахождения точек связи, постараюсь выкладывать сюда короткие сниппеты из урока, чтобы можно было быстро находить подсказки в будущем.

Всем приятного просмотра и легких знаний!

#урок #наследование
🔥1
Чтобы создать наследование в контрактах, нужно получить или написать контракт родителя, а затем сослаться на его в дочернем контракте через "is".

Один контракт может наследовать функции из нескольких других. Однако в этом случае важен их порядок определения в дочернем контракте.

Также в наследовании контрактов важно следить за областями видимости функций.

#наследование
🔥1
В некоторых случаях контракты могут становиться Абстрактными. Они не разворачиваются самостоятельно, но при этом могут наследовать или передовать функции в другие контракты.

Чаще всего контракты становятся абстрактными, когда не могут передавать значения в constructor родителя.

Я редко пока что встречал abstract на практике, поэтому буду дополнять инфо по ходу обучения.

#abstract #наследование
🔥1
А вот так можно передавать значения в контруктор родителя, от которого будем получать функции.

#наследование
🔥1
Чтобы переопредилить функцию в дочернем контракте, в родительском контракте необходимо указать параметр virtual, а в первом - override.

#наследование #virtual #override
🔥1
Чтобы не писать дважды функцию и в родителе, и в дочернем контракте, можно писать функцию сразу от имени родителя или использовать super (если родитель на одном уровне выше).

#наследование #super
🔥1
Урок 12. Интерфейсы и библиотеки

Привет всем! Полагаю, за два дня вам удалось разобраться с наследованием в смарт-контрактах. Там, по сути, ничего сложно, однако это вы будете применять достаточно часто, в особенности, составляя сложные контракты, например, для создания токенов или nft, их продажи через магазины и т.д.

В общем штука полезная и с ней надо научиться работать.

В сегодняшнем уроке мы пойдем чуть дальше и поговорим об интерфейсах и библиотеках, которые помогаю сокращать смарт-контракты и подключать функции из сторонних файлов.

Видео урок - Интерфейсы и библиотеки.

Я сам не с первого раза освоил эту тему и приходилось пересматривать урок вновь и вновь. И это только потому, что в одном из следующих видео, лектор начинает свой стрим с подключения библиотеки без особых разъяснений.

Забегая вперед, скажу, что нам осталось еще пара обучающих уроков, и мы перейдем к работе со смарт-контрактами, как "взрослые разработчики".

Поэтому желательно закрепить все знания в течение последующей недели, чтобы с комфортом обучаться дальше!

Всем легких знаний и хорошей памяти!

#интерфейсы #библиотка
👍1🔥1
Чтобы адрес трансформировать в специальный объект, который может отчевать на привильные функции, нам необходимо имортировать исходный код нужного контракта в свой, и затем инициализировать объект, как в примере на скрине. и тогда уже, относительно этого объекта, мы можем вызывать функции из подключенного контракта.

#подключениеконтракта #import
🔥1
Для того, чтобы создать интерфейс вам необходимо создать новый файл с расширением sol, также прописать тип лицензии и версию Solidity, а затем начать процесс создания с написания interface.

После этого можно копировать функции без их "тела", как показано в примере.

При этом не забудьте подключить интерфейс через import в оригинальном контракте, если сами написали его, и в своем.

По свеой сути интерфейс это описание смарт-контракта, от которого можно наследовать и принимать функции.

#interface
🔥1
Библиотека - это фактически некий набор функций, который мы можем подключать к определенным типам данных, чтобы их расширять.

Библиотеки открываются ключевым словом library, внитри чего прописывается функция.

Подключается она также через import, а используется через "using "func name" for "тип данных".


#библиотека #library
🔥1
А зачем нужны интерфейсы, библиотеки и наследование?

Больше всего в обучении меня напрягал тот факт, что лекторы всегда рассказывали тему или давали материал без объяснения: "А нафига мне все это надо?". В том плане, а как это использовать я буду в работе. Типа выучил, понял и хорошо.

Вот примерно тоже у меня было и с последними темами: вроде бы все понятно, но для чего мне это?! Пришлось смотреть другие видео для лучшего понимания.

В целом и общем, могу вот чем поделиться по этому поводу.

Во-первых, в большинстве случаев разработчики не пишут контракты от и до с нуля. Они накидывают часто употребляемые функции из других контрактов, типа проверки на владельца. И одним из основных ресурсов является портал Open Zeppelin, где выставляются уже отработанные и качественные контракты для подключения. Там уже предусмотрены многие моменты безопасности и масштабируемости, поэтому он так популярен.

И вот, получается, что как только вы затеялись с написанием своего контракта, вы можете посетить данный портал, подключить сторонний контракт к себе через интерфейс, и затем вызывать функции через наследование.

Можно думать об этом процессе, как о неком текстовом конструкторе, который позволяет быстрее вести разработку.

Надеюсь, после этого поста вас станет чуть понятнее, зачем это все учится.
👍3🔥1
Урок 13. Древо Меркла

Привет всем! Вчера я снова был в дороге, потому была тишина на канале. Пишу это просто для того, чтобы вы знали, что обучение еще продолжается, и мы закончим его в любом случае до конца августа.

В целом, еще пара уроков и мы сможем понять базовую суть написания смарт-контрактов и достичь уровня Джуна в Solidity.

Сегодняшний урок может показаться немного запутанным, но он нужен для того чтобы понимать суть хеширования в Solidity.

Видео урок - древо Меркла.

Я посмотрел несколько подобных видео по данной теме, и могу с уверенностью сказать, что данный урок от Ильи является одним из самых понятных.

Думаю, тут также будет не много скринов из урока, так как все 30 минут объясняются одни и те же принципы работы древа.

Приятного просмотра и легкого обучения!

#урок
👍1
Наглядное изображение древа Меркла.

Сложно в одном посте написать весь его смысл, но, если говорить кратко, то это такой метод хеширования данных для последующей валидации.

При этом, если хоть один символ в каком-либо месте транзакции будет изменен, то функция проверки будет выдавать ошибку.

#древомеркла
Очередной пример работы древа Меркла.

Если, скажем, вам нужно проверить валидность транзакции Т5, то для проверки вам потребуются только 3 дополнительных хеша.

#древомеркла
Забыл еще вчера важную картинку по теме древа Мерка выложить.

Очень важно, чтобы количество транзакций было "2 в степени n", иначе будет выдаваться ошибка.

Я слышал, что есть уже способы работы с древом с разными наборами транзакций, но это сильно усложняет задачу. На данном этапе главное понять принципы.

#древомеркла
Урок 14. Низкоуровневые вызовы

Ну, что? Готовы к хардкорным занятиям по Solidity?

За предыдущие 13 уроков мы многое узнали, но то были цветочки в языке, для новичков. Если вы двигались по обучению вместе со мной, то к данному уроку накопили уже некоторую практику и понимание, как работают смарт-контракты.

В последующие две недели мы закончим основное обучение по языку и начнем разбирать уже прицельные темы по разработке смарт-контрактов: как например, создание своего токена, NFT, DAO, DeFi, Dapp и многое другие.

Сегодняшний урок открывает двери в более глубокое изучение Solidity. И вы можете по-настоящему гордиться собой, если дошли до этого момента.

Итак, дамы и господа, новый видео урок - Низкоуровневые вызовы
Над ним стоит посидеть пару дней, чтобы точнее понять, о чем там говорится. Эти знания будут применяться очень часто при создании токенов и проведении выплат в рамках смарт-контрактов.

#низкоуровневыевызовы #урок
1🔥1
В данном примере, call служит для отправки денежных средств на другой контракт, который мы указываем в constructor.

Записывается как: contractAddress.call{value: valueVar}(""), где в начале указывается адрес контракта, а valueVar - сумма.

Низкоуровневый вызов call возвращает кортеж из двух значений: первый - это булево значение, второе - выходной результат, которое возвращает вызванная функция. Если результат вас не интересует, то оставляете это поле пустым.

Тут нужно обратить внимание, что даже если call не прошел, то ошибка вызвана не будет, поэтому для подтверждения успешности вызова следует использовать require.

Как я понял, вообще call чаще всего используется для отправки денег на другой адрес, или же для вызова функций в стороннем контракте.

#call
🔥2
С помощью call мы также можем обращаться к функциям в стороннем контракте, даже к тем, к которым мы не имеем прямого доступа или интерфейса.

Для этого, вместо денежных средств мы должны передать название самой функции в нужном контракте, а также аргументы, которые данная функция принимает.

Делается это при помощи abi.encodeWithSignature("funcNam(type)", arguments), и выглядит так:

otherContract.call{}(abi.encodeWithSignature("funcNam(type)", arguments));

Следует отметить, что в этом случае ответ всегда приходит в виде байтов: bytes memory response. И к этому response мы можем порождать события с emit.

#call #abi #encodewithsignature
🔥21
Если функция в другом контракте возвращает, например строку, то в нашем контракте, при call вызове, мы можем декодировать ответ с помощью abi.decode(response, (string))

#call #abi #decode
🔥2👍1
Помимо abi.encodeWithSignature можно использовать другой метод, если у вас есть доступ к коду другого контракта.

abi.encodeWithSelector(AnotherContract.funcName.selector, _argument)

При этом более универсальной является первая форма.

#call #abi #encodewithselector
🔥1
Delegatecall у меня был один из самых трудных для понимания. Я несколько раз пересматривал урок, копался в документации, искал в иностранных ресурсах описание и сравнение с call. В итоге, для себя сделал небольшое различие.

С "call" мы как бы посылаем вызов из нашего контракта в функцию в другом контракте, там его обрабатываем и присылаем к себе в контракт ответ.

С "delegatecall" мы как бы забираем функцию из другого контракта к себе в контракт, выполняем ее в рамках своего контракта, и затем отдаем функцию обратно. Вроде как, мы "вырываем" функцию из другого контракта, выполняем ее у себя, и возвращаем на место.

Надеюсь это более-менее понятное объяснение. Уверен, при использовании delegatecall в дальнейшем, мы сможем разобраться еще лучше, как она работает.

#delegatecall
1🔥1