Solidity и смарт-контракты Ethereum, урок #7 | События, модификаторы, require/revert и тесты

  Рет қаралды 17,463

Ilya Krukowski

Ilya Krukowski

Күн бұрын

Пікірлер: 118
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Друзья, я прекрасно понимаю, что у многих сейчас нет материальной или просто физической возможности спонсировать канал - некоторые спонсоры уже отписались, и это вполне понятно, никаких обид нет и быть не может. Но хотел вас попросить просто поставить лайк, если это видео оказалось для вас полезным. Это очень важно для привлечения новых зрителей, особенно сейчас, когда просмотры резко упали по очевидныи причинам. Я буду продолжать работать для вас, насколько мне позволит ситуация.
@zaqwsx4571
@zaqwsx4571 2 жыл бұрын
Илья, пожалуйста не останавливайся и продолжай пилить видосы, это очень крутой и качественный контент, процветания каналу!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@@zaqwsx4571 Спасибо!
@АлександрИноземцев-и4х
@АлександрИноземцев-и4х 2 жыл бұрын
Илья, продолжайте, буду поддерижвать вас тоже по мере возможности
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@@АлександрИноземцев-и4х Спасибо!
@slava_po
@slava_po 2 жыл бұрын
Илья готов стать спонсором, но ответа по обучению так и недожлался
@ДенисЗайков-ы8к
@ДенисЗайков-ы8к 2 жыл бұрын
Лучший контент про солидити, который есть в интернете !
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Спасибо, стараюсь!
@korg2
@korg2 2 жыл бұрын
Илья, спасибо! очень ждал урок!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@mojodont
@mojodont 2 жыл бұрын
Илья, спасибо большое! Очень познавательный и полезный контент. Ждем ваших видео!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@КонстантинПономарчук-д5м
@КонстантинПономарчук-д5м 2 жыл бұрын
Илья, огромное спасибо за ваш труд. Вы открыли для меня этот язык программирования!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@MikhailKuklenkov
@MikhailKuklenkov Жыл бұрын
Доброго дня, Илья. Очень понравился урок и подача материала. Интересно двигаться от урока к уроку. Справедливости ради признаюсь, что тесты для меня это просто темный лес) И даются тяжелее и вызывают меньше интереса. Единственный момент - не увидел разницы в логах между событием с индексированным аргументом и событием с аргументом без индексации. #смартконтракты #солидити #solidity #блокчейн #etherium #события #модификаторы #блокчейнразработка
@НикитаТихонов-ъ2м
@НикитаТихонов-ъ2м 5 ай бұрын
Аргументы индексируются для того что бы можно было быстро получать данные из хранилища логов. То есть ты берешь и собираещь кучу данных в логе. Но хочешь что бы удобно и очень быстро получать все логи по определенному кошельку. Тогда ты индексируешь это поле и получаешь что нужно. Если не сделать индекс и оправить запрос тот же. Он будет делаться гораздо дольше.
@andrewshelpy
@andrewshelpy 2 жыл бұрын
Спасибо огромное за курс! Заметил особенность revertedWith - если ее аргумент является подстрокой сообщения require - то будет как раз false positive. Это я решил проверить, просто удалив, а не заменив последнее слово)
@АлександрАлександр-р1з
@АлександрАлександр-р1з 2 жыл бұрын
Спасибо большое! Отличный урок!!!!
@neuromancersmith9890
@neuromancersmith9890 2 жыл бұрын
спасибо за то что вы делаете!
@Pixell77
@Pixell77 2 жыл бұрын
Большое спасибо Илья за то что просвещаете! Благодаря вам я прямо сейчас работаю над тестовым проектом для прохождения на стажировку по solidity и с нетерпением жду новых уроков по нему)
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Отлично, поздравляю :)
@viktor.nedvyha
@viktor.nedvyha 2 жыл бұрын
Не расскажете, как у Вас прошло?
@Pixell77
@Pixell77 2 жыл бұрын
@@viktor.nedvyha всё хорошо, осталось несколько недель до конца стажировки
@ЕвгенийАтлас-и3р
@ЕвгенийАтлас-и3р 2 жыл бұрын
@@Pixell77 Как сейчас обстоят дела с работой с solidity? И если не сложно, то можешь поделиться тем, как нашел оффер в этой сфере
@biglemon1908
@biglemon1908 Жыл бұрын
спасибо большое за ваши уроки❤
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
@nb-cy6cw
@nb-cy6cw 2 жыл бұрын
Спасибо за урок!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@AlexErmashev
@AlexErmashev Жыл бұрын
Где то читал, что основная разница между `require/revert` и `assert`, что первые две возвращают газ пользователю который и вызвал. Ну и использовать первую пару нужно для валидации входящих параметров, а вторую для внутренних проверок
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
Ну да, примерно так и есть. assert газ не вернё
@ildan6520
@ildan6520 Жыл бұрын
какие доп плагины используете? просто у меня не видны подсказки(описание) по методам бибиотеки waffle, ethers, я обычно с помощью ctrl, мог наводить мышь и читать, смотреть перегрузки и доп инфу. но в случае этих библиотек у меня так не выходит
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
Да никаких особо. Стоит плагин Solidity, но есть отдельный Solidity+Hardhat, можно попробовать его
@KOCadm
@KOCadm 2 жыл бұрын
Если у вас будет время - запишите пожалуйста короткий обзор, как делать поиск по журналу событий + indexed fields
@vladimireliseev7602
@vladimireliseev7602 Жыл бұрын
Благодарю за видео! Скажите пожалуйста, а почему ругается в тестах: "TypeError: demo.deployed is not a function"
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
А, это объяснено в FAQ по курсу, там в общем просто некоторые методы сменились за последние полгода bodrovis.tech/en/categories/solidityethereum/posts/faq-po-kursu-solidity
@ВладимирАксенов-т8е
@ВладимирАксенов-т8е 2 жыл бұрын
Спасибо вам за уроки, все доходчиво объяснено. Скажите, а не планируется ли когда-нибудь теоретического урока, например по теме блокчейна, как в нем хранятся данные, или например, что такое смарт контракты и как они исполняются?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Да, это хорошая мысль, надо будет попробовать что-то такое организовать
@АлександрИноземцев-и4х
@АлександрИноземцев-и4х 2 жыл бұрын
Поддерживаю ещё интересно про нфт для чего и с чем едят, после этого будет понятно зачем нам контракты писать
@ДамирКу-е6р
@ДамирКу-е6р 2 жыл бұрын
Лучший тигр!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
:))
@proorg3753
@proorg3753 2 жыл бұрын
Илья спасибо за контент)
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@levonhambard6208
@levonhambard6208 2 жыл бұрын
Насколько я понял , там есть ошибка в коде , 08:03 вы должны были написать if (msg.sender != owner) revert(''error") ,чтобы это было эквивалетно require
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Ага, в исходном коде уже исправил
@mramilvideo
@mramilvideo 2 жыл бұрын
Тоже заметил что ошибка. Так и вынесут весь баланс😂
@Receive_
@Receive_ 2 жыл бұрын
Спасибо за доступное объяснение! Очень ценный материал. Из урока возник вопрос: Если я работаю с внутренними инструментами JS я использую ссылки на аккаунты в виде owner и other_addr, а если мне нужно обратится к функции контракта я вытаскиваю прям адрес owner.address и other_addr.address? Не совсем понятно что хранится в самих переменных owner и other_addr, ссылки на аккаунты?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Там специальный объект JS, который знает, как отправить запрос к блокчейну, ничего больше
@Receive_
@Receive_ 2 жыл бұрын
@@IlyaBodrovKrukowski спасибо!
@nikolaizarezako9344
@nikolaizarezako9344 Ай бұрын
А в TS какой тип следует указывать для sender? Хотелось бы конечно видеть все уроки сразу с тайпскриптом, но к сожалению понимаю, что это все требует времени на перезапись, даже если просто добавлять обновленные исходники =(
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Ай бұрын
Если вопрос про тип signer, то он берётся из import type { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; Это аккаунт, подписывающий транзакцию
@nikolayts7142
@nikolayts7142 Жыл бұрын
Все супер! Один момент не очень понятен по функции withdraw в контракте - она ничего же не возвращает - function withdraw(address payable _to) external onlyOwner(_to) { А в тесте указано, что она возвращает транзакцию и дальше ее используем: const tx = await sender.sendTransaction(txData) Почему так происходит?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
Потому что даже если функция ничего не возвращает, то транзакция для её вызова создаётся, и мы можем ещё вытащить с помощью ethers.js
@АлександрИноземцев-и4х
@АлександрИноземцев-и4х 2 жыл бұрын
Добавлю для практики, ломать тесты лучше через код, не через тесты)
@akasatikov6851
@akasatikov6851 2 жыл бұрын
Хороший курс. Подскажите, пожалуйста, как называется программа для работы с командной строкой которой вы пользуетесь?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Это ConEmu для Windows
@MrVivivilcka
@MrVivivilcka Жыл бұрын
Добрый день! У меня возникла проблема с remix. Когда копирую адрес контракта или кошелька, то всё время копируется один и тот же адрес. В чём может заключаться проблема? Может сталкивался кто?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
То есть в дропдауне выбрано что-то одно, а копируется другое? Звучит, как баг, надо глянуть баг-репорты у них в репозитарии на gh
@BBotinok
@BBotinok Жыл бұрын
Скажите, если в директории есть несколько контрактов и несколько тестов для них, то как указать хардхэту нужный тебе тест? Просто команда npx hardhat test работает только с первым в списке тестом. Или для каждого контракта нужно создавать отдельную папку и каждый раз надо туда заново устанавливать хардхэт?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
Я думаю, может получиться с паттернами типа glob, в духе test/**/*.test.ts чтобы указать все файлы в папке
@BBotinok
@BBotinok Жыл бұрын
@@IlyaBodrovKrukowski Помогло, спасибо!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
@@BBotinok
@glebrokotov2903
@glebrokotov2903 3 ай бұрын
есть папка hardhat и в ней к примеру файлы контрактов и файлы тестов к ним. они отображаются в проводнике visual code. достаточно указать какой конкретно тест нужно запустить в формате: npx hardhat test test/НАЗВАНИЕФАЙЛА.test.ts
@ОстапБобрис-г1п
@ОстапБобрис-г1п 2 жыл бұрын
Спасибо за урок, есть один вопрос, можно как то в ConEmu вызывать только один тест при вызове команды npx hardhat test, а то у меня сразу все остальные также вызываются
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
В целом да, эта фича есть в mocha, которая используется для тестов stackoverflow.com/questions/10832031/how-to-run-a-single-test-with-mocha
@ОстапБобрис-г1п
@ОстапБобрис-г1п 2 жыл бұрын
@@IlyaBodrovKrukowski Как я понял, не все там так и просто, много разных вариантов есть, спасибо, изучу)
@ОстапБобрис-г1п
@ОстапБобрис-г1п 2 жыл бұрын
@@IlyaBodrovKrukowski Аа, все не так уж и сложно, просто describe.only или it.only и проблемы нет, спасибо еще раз ваш уроки)
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@@ОстапБобрис-г1п На здоровье! Ну, там либо использовать only, либо через grep выбирать тесты с нужным описанием. Там можно передавать ещё и опции, в частности, имя файла, откуда тащить тесты, но я точно не знаю, как это будет работать именно в hardhat (у него там свои конфиги могут быть)
@nikolayts7142
@nikolayts7142 Жыл бұрын
у меня так получилось запустить тесты только из одного файла: npx hardhat test --grep "Demo"
@МихаилРощин-г4ж
@МихаилРощин-г4ж 2 жыл бұрын
видео топчик, только не совсем понимаю для чего тесты ? Потерялся в этот теме. Иду по Remix
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Ну чтобы руками функционал контракта не тестировать каждый раз, это дольше ведь, чем просто нажать две кнопки и проверить, что всё работает
@laches1
@laches1 2 жыл бұрын
Благодарю за ваши видео, но возник вопрос, как можно сделать проверку перед выполнением функции, чтобы msg.value был равен value другой транзакции (зная его хэш), заранее спасибо
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
keccak256 посчитает хэш. Но вообще получать информацию о других транзакциях особо не выйдет, надо её где-то тогда хранить. Максимум можно читать хэши последних 256 блоков, см доки docs.soliditylang.org/en/develop/units-and-global-variables.html#special-variables-and-functions
@Ww-xc2fq
@Ww-xc2fq Жыл бұрын
За добавление события в журнал газ платить не нужно? Где храниться этот журнал и как его просмотреть ?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
Платить нужно, хранится в БЧ, смотреть через ethers.js
@0x0xxx08
@0x0xxx08 2 жыл бұрын
3:50 Скажите, пожалуйста, в чем особенность функции Constructor и чем это написание отличается от следующих вариантов? У меня код работает так: address owner = msg.sender; и так : address owner; Как бы я не записал require не дает выполнится функции если я ее вызываю не от адреса, который разместил смарт контракт.
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Этого не может быть. Если в owner ничего нет, то мы владельца не ставим. Про конструкторы было в прошлых уроках, где функции
@0x0xxx08
@0x0xxx08 2 жыл бұрын
@@IlyaBodrovKrukowski конструктор - та функция, которая вызовется автоматически когда контракт будет размещен в блокчейн, он вызывается однократно и потом его вызвать уже нельзя. Я задаю владельца переменной. В чем разница, отличие в способах задания информации о владельце в конструкторе либо в переменной? Вот код. 3 функции withdraw через require, модификатор и реверт. Ни одна не работает при передачи данных в функцию в смарт-контракт со стороннего адреса. // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0
@0x0xxx08
@0x0xxx08 2 жыл бұрын
ой address owner; в этом случае адрес owner является нулевым заглушкой. Так не работает контракт вообще. address owner = msg.sender; вот так работает
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@@0x0xxx08 Ну особенно разницы нет, но в конструкторе можно делать это динамически засчёт передаваемых аргументов, какие-то условия ставить... Плюс конструкторы при наследовании тоже могут вызывать из потомков. Короче больше гибкости
@0x0xxx08
@0x0xxx08 2 жыл бұрын
@@IlyaBodrovKrukowski спасибо
@МарсДевелопер
@МарсДевелопер Жыл бұрын
Привет! как результат reqire вывести на фронтэнд?
@reaexp
@reaexp 10 ай бұрын
Уроки просто супер. Спасибо Вам огромное за Ваш труд. Подскажите, почему у меня такая проблема? Не соображу : TypeError: Member "_timestamp" not found or not visible after argument-dependent lookup in msg. (The error occurred because the variable "_timestamp" does not exist in the "msg" object. There is no built-in timestamp in the Solidity "msg" object. To fix the error, you can remove the use of "msg._timestamp" and emit only the "msg.sender" and "msg.value" arguments in the "Paid" event.) Не понял только почему у Вас проблем нет, а у меня есть ;-( И если убрать _timestamp то ошибки нет, но только лог выводится без временной метки.
@reaexp
@reaexp 10 ай бұрын
ха ха ха , сам задал вопрос и сам его решил через 5 минут, просто заменил msg.timestamp на block.timestamp , подглядев Ваш код уже в VSCode👍 прикольно, и всё работает. Всё равно спасибо ОГРОМНОЕ за Ваш труд
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 10 ай бұрын
@@reaexp
@renichigava4183
@renichigava4183 2 жыл бұрын
компилируется контракт Payments в hardhat хотя я переименовал контракт на demo и скомпилировал его в вскоде
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Может, файл не переименован?..
@KOCadm
@KOCadm 2 жыл бұрын
Не совсем понятно почему в функ. withdraw парам. _to позначен как payable. или я что-то пропустил...
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Потому что если не payable, то туда нельзя ничего отправить. Это было в одном из прошлых уроков
@renichigava4183
@renichigava4183 2 жыл бұрын
"before each" hook for "should be deployed": - в чем может быть проблема?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Так что-то не очень понятно, пришлите плз код в наш чат, посмотрим
@Breaksignal
@Breaksignal 2 жыл бұрын
Братан давай я тебе отвечу надо просто прописать npx hardhat compile
@radionmarkov6981
@radionmarkov6981 2 жыл бұрын
Привет Илья....Скажи,пожалуйста,я занимаюсь бизнесом,хочу создать свою монету,чтоб мне оплачивали деньги за товар через неё,как можно создать простой смарт контракт с маленьким ликвидом,чтоб люди могли покупать мою монету,но не могли продать,чтоб только я мог снять ликвид....заранее спасибо.....
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Нужно реализовать стандарт ERC20 и, видимо, сделать смарт-контракт, который просто будет продавать эти токены. В двух словах не объяснить, но скоро будет урок по теме
@radionmarkov6981
@radionmarkov6981 2 жыл бұрын
@@IlyaBodrovKrukowski Как с вами можно пообщаться лично,в каких сетях,так будет проще....
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@@radionmarkov6981 Пардон, я не даю сейчас персональных консультаций. Можно в нашем чате писать, я стараюсь отвечать по возможности (очень много вопросов приходит)
@radionmarkov6981
@radionmarkov6981 2 жыл бұрын
@@IlyaBodrovKrukowski А по прошлым вашим урокам,где вы создаёте смарт контракт,если туда просто вписать код строку,то есть прописать свой адрес кошелька метамаск,чтоб только на него можно было снимать деньги,так можно сделать,я просто в этом дилетант,смотрю ваши уроки,очень всё толково,познавательно....Жду вашего ответа....
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@@radionmarkov6981 ну в теории можно, конечно, да
@yevheniimoskalenko1624
@yevheniimoskalenko1624 2 жыл бұрын
куль
@KOCadm
@KOCadm 2 жыл бұрын
еще вопросик. зачем писать other_addr.address если other_addr это же и так адрес ??
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
На самом деле, это signer, а не адрес
@fknxor
@fknxor 4 ай бұрын
Здравствуйте, когда пытаюсь затестить код из видео вылезает следущее сообщение: Demo 1) "before each" hook for "shound allow to send money" 0 passing (657ms) 1 failing 1) Demo "before each" hook for "shound allow to send money": TypeError: demo.deployed is not a function at Context. (test\lesson7.test.js:14:16) код полностью скопировал из github подскажите что нужно делать
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 4 ай бұрын
bodrovis.tech/posts/faq-po-kursu-solidity/ думаю, тут есть ответ
@mramilvideo
@mramilvideo 2 жыл бұрын
If msg.sendersender revert(...
@Breaksignal
@Breaksignal 2 жыл бұрын
Я конечно не спец но орнул if(msg.sender != owner) { } else { } _to.transfer(address(this).balance); // вы вынесли отправку денег за пределы условия тем самым с контракта может любой человек забрать деньги даже после того как условие выполнится
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Так там модификатор onlyOwner на функции - если человек не владелец, то сразу будет ошибка, он даже в тело функции не попадёт. Если конечно об этом речь github.com/bodrovis-learning/Solidity-YT-Series/blob/master/lesson_7_modifiers_events/Demo.sol#L32= Закомментированные строки в этой функции просто, чтобы показать, как ещё это условие сделать можно
@Breaksignal
@Breaksignal 2 жыл бұрын
@@IlyaBodrovKrukowski модификатор просто позже по уроку появился уже, изначально когда условия просто в if были без require вот тогда был эксплойт
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@@Breaksignal Ну это просто демо же
Players vs Pitch 🤯
00:26
LE FOOT EN VIDÉO
Рет қаралды 124 МЛН
Car Bubble vs Lamborghini
00:33
Stokes Twins
Рет қаралды 40 МЛН
Amazing remote control#devil  #lilith #funny #shorts
00:30
Devil Lilith
Рет қаралды 15 МЛН
КОГДА К БАТЕ ПРИШЕЛ ДРУГ😂#shorts
00:59
BATEK_OFFICIAL
Рет қаралды 7 МЛН
СРОЧНО❗️ ЯПОНИЯ РАЗРЕШИЛА ВЫВОЗ ГИБРИДОВ🔥
15:17
Япония Транзит
Рет қаралды 81 М.
СТРИМ! Solidity и Ethereum, урок #10 | Практика
1:21:45
Players vs Pitch 🤯
00:26
LE FOOT EN VIDÉO
Рет қаралды 124 МЛН