Друзья, я прекрасно понимаю, что у многих сейчас нет материальной или просто физической возможности спонсировать канал - некоторые спонсоры уже отписались, и это вполне понятно, никаких обид нет и быть не может. Но хотел вас попросить просто поставить лайк, если это видео оказалось для вас полезным. Это очень важно для привлечения новых зрителей, особенно сейчас, когда просмотры резко упали по очевидныи причинам. Я буду продолжать работать для вас, насколько мне позволит ситуация.
@zaqwsx45712 жыл бұрын
Илья, пожалуйста не останавливайся и продолжай пилить видосы, это очень крутой и качественный контент, процветания каналу!
@IlyaBodrovKrukowski2 жыл бұрын
@@zaqwsx4571 Спасибо!
@АлександрИноземцев-и4х2 жыл бұрын
Илья, продолжайте, буду поддерижвать вас тоже по мере возможности
@IlyaBodrovKrukowski2 жыл бұрын
@@АлександрИноземцев-и4х Спасибо!
@slava_po2 жыл бұрын
Илья готов стать спонсором, но ответа по обучению так и недожлался
@ДенисЗайков-ы8к2 жыл бұрын
Лучший контент про солидити, который есть в интернете !
@IlyaBodrovKrukowski2 жыл бұрын
Спасибо, стараюсь!
@korg22 жыл бұрын
Илья, спасибо! очень ждал урок!
@IlyaBodrovKrukowski2 жыл бұрын
@mojodont2 жыл бұрын
Илья, спасибо большое! Очень познавательный и полезный контент. Ждем ваших видео!
@IlyaBodrovKrukowski2 жыл бұрын
@КонстантинПономарчук-д5м2 жыл бұрын
Илья, огромное спасибо за ваш труд. Вы открыли для меня этот язык программирования!
@IlyaBodrovKrukowski2 жыл бұрын
@MikhailKuklenkov Жыл бұрын
Доброго дня, Илья. Очень понравился урок и подача материала. Интересно двигаться от урока к уроку. Справедливости ради признаюсь, что тесты для меня это просто темный лес) И даются тяжелее и вызывают меньше интереса. Единственный момент - не увидел разницы в логах между событием с индексированным аргументом и событием с аргументом без индексации. #смартконтракты #солидити #solidity #блокчейн #etherium #события #модификаторы #блокчейнразработка
@НикитаТихонов-ъ2м5 ай бұрын
Аргументы индексируются для того что бы можно было быстро получать данные из хранилища логов. То есть ты берешь и собираещь кучу данных в логе. Но хочешь что бы удобно и очень быстро получать все логи по определенному кошельку. Тогда ты индексируешь это поле и получаешь что нужно. Если не сделать индекс и оправить запрос тот же. Он будет делаться гораздо дольше.
@andrewshelpy2 жыл бұрын
Спасибо огромное за курс! Заметил особенность revertedWith - если ее аргумент является подстрокой сообщения require - то будет как раз false positive. Это я решил проверить, просто удалив, а не заменив последнее слово)
@АлександрАлександр-р1з2 жыл бұрын
Спасибо большое! Отличный урок!!!!
@neuromancersmith98902 жыл бұрын
спасибо за то что вы делаете!
@Pixell772 жыл бұрын
Большое спасибо Илья за то что просвещаете! Благодаря вам я прямо сейчас работаю над тестовым проектом для прохождения на стажировку по solidity и с нетерпением жду новых уроков по нему)
@IlyaBodrovKrukowski2 жыл бұрын
Отлично, поздравляю :)
@viktor.nedvyha2 жыл бұрын
Не расскажете, как у Вас прошло?
@Pixell772 жыл бұрын
@@viktor.nedvyha всё хорошо, осталось несколько недель до конца стажировки
@ЕвгенийАтлас-и3р2 жыл бұрын
@@Pixell77 Как сейчас обстоят дела с работой с solidity? И если не сложно, то можешь поделиться тем, как нашел оффер в этой сфере
@biglemon1908 Жыл бұрын
спасибо большое за ваши уроки❤
@IlyaBodrovKrukowski Жыл бұрын
@nb-cy6cw2 жыл бұрын
Спасибо за урок!
@IlyaBodrovKrukowski2 жыл бұрын
@AlexErmashev Жыл бұрын
Где то читал, что основная разница между `require/revert` и `assert`, что первые две возвращают газ пользователю который и вызвал. Ну и использовать первую пару нужно для валидации входящих параметров, а вторую для внутренних проверок
@IlyaBodrovKrukowski Жыл бұрын
Ну да, примерно так и есть. assert газ не вернё
@ildan6520 Жыл бұрын
какие доп плагины используете? просто у меня не видны подсказки(описание) по методам бибиотеки waffle, ethers, я обычно с помощью ctrl, мог наводить мышь и читать, смотреть перегрузки и доп инфу. но в случае этих библиотек у меня так не выходит
@IlyaBodrovKrukowski Жыл бұрын
Да никаких особо. Стоит плагин Solidity, но есть отдельный Solidity+Hardhat, можно попробовать его
@KOCadm2 жыл бұрын
Если у вас будет время - запишите пожалуйста короткий обзор, как делать поиск по журналу событий + indexed fields
@vladimireliseev7602 Жыл бұрын
Благодарю за видео! Скажите пожалуйста, а почему ругается в тестах: "TypeError: demo.deployed is not a function"
@IlyaBodrovKrukowski Жыл бұрын
А, это объяснено в FAQ по курсу, там в общем просто некоторые методы сменились за последние полгода bodrovis.tech/en/categories/solidityethereum/posts/faq-po-kursu-solidity
@ВладимирАксенов-т8е2 жыл бұрын
Спасибо вам за уроки, все доходчиво объяснено. Скажите, а не планируется ли когда-нибудь теоретического урока, например по теме блокчейна, как в нем хранятся данные, или например, что такое смарт контракты и как они исполняются?
@IlyaBodrovKrukowski2 жыл бұрын
Да, это хорошая мысль, надо будет попробовать что-то такое организовать
@АлександрИноземцев-и4х2 жыл бұрын
Поддерживаю ещё интересно про нфт для чего и с чем едят, после этого будет понятно зачем нам контракты писать
@ДамирКу-е6р2 жыл бұрын
Лучший тигр!
@IlyaBodrovKrukowski2 жыл бұрын
:))
@proorg37532 жыл бұрын
Илья спасибо за контент)
@IlyaBodrovKrukowski2 жыл бұрын
@levonhambard62082 жыл бұрын
Насколько я понял , там есть ошибка в коде , 08:03 вы должны были написать if (msg.sender != owner) revert(''error") ,чтобы это было эквивалетно require
@IlyaBodrovKrukowski2 жыл бұрын
Ага, в исходном коде уже исправил
@mramilvideo2 жыл бұрын
Тоже заметил что ошибка. Так и вынесут весь баланс😂
@Receive_2 жыл бұрын
Спасибо за доступное объяснение! Очень ценный материал. Из урока возник вопрос: Если я работаю с внутренними инструментами JS я использую ссылки на аккаунты в виде owner и other_addr, а если мне нужно обратится к функции контракта я вытаскиваю прям адрес owner.address и other_addr.address? Не совсем понятно что хранится в самих переменных owner и other_addr, ссылки на аккаунты?
@IlyaBodrovKrukowski2 жыл бұрын
Там специальный объект JS, который знает, как отправить запрос к блокчейну, ничего больше
@Receive_2 жыл бұрын
@@IlyaBodrovKrukowski спасибо!
@nikolaizarezako9344Ай бұрын
А в TS какой тип следует указывать для sender? Хотелось бы конечно видеть все уроки сразу с тайпскриптом, но к сожалению понимаю, что это все требует времени на перезапись, даже если просто добавлять обновленные исходники =(
@IlyaBodrovKrukowskiАй бұрын
Если вопрос про тип signer, то он берётся из import type { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; Это аккаунт, подписывающий транзакцию
@nikolayts7142 Жыл бұрын
Все супер! Один момент не очень понятен по функции withdraw в контракте - она ничего же не возвращает - function withdraw(address payable _to) external onlyOwner(_to) { А в тесте указано, что она возвращает транзакцию и дальше ее используем: const tx = await sender.sendTransaction(txData) Почему так происходит?
@IlyaBodrovKrukowski Жыл бұрын
Потому что даже если функция ничего не возвращает, то транзакция для её вызова создаётся, и мы можем ещё вытащить с помощью ethers.js
@АлександрИноземцев-и4х2 жыл бұрын
Добавлю для практики, ломать тесты лучше через код, не через тесты)
@akasatikov68512 жыл бұрын
Хороший курс. Подскажите, пожалуйста, как называется программа для работы с командной строкой которой вы пользуетесь?
@IlyaBodrovKrukowski2 жыл бұрын
Это ConEmu для Windows
@MrVivivilcka Жыл бұрын
Добрый день! У меня возникла проблема с remix. Когда копирую адрес контракта или кошелька, то всё время копируется один и тот же адрес. В чём может заключаться проблема? Может сталкивался кто?
@IlyaBodrovKrukowski Жыл бұрын
То есть в дропдауне выбрано что-то одно, а копируется другое? Звучит, как баг, надо глянуть баг-репорты у них в репозитарии на gh
@BBotinok Жыл бұрын
Скажите, если в директории есть несколько контрактов и несколько тестов для них, то как указать хардхэту нужный тебе тест? Просто команда npx hardhat test работает только с первым в списке тестом. Или для каждого контракта нужно создавать отдельную папку и каждый раз надо туда заново устанавливать хардхэт?
@IlyaBodrovKrukowski Жыл бұрын
Я думаю, может получиться с паттернами типа glob, в духе test/**/*.test.ts чтобы указать все файлы в папке
@BBotinok Жыл бұрын
@@IlyaBodrovKrukowski Помогло, спасибо!
@IlyaBodrovKrukowski Жыл бұрын
@@BBotinok
@glebrokotov29033 ай бұрын
есть папка hardhat и в ней к примеру файлы контрактов и файлы тестов к ним. они отображаются в проводнике visual code. достаточно указать какой конкретно тест нужно запустить в формате: npx hardhat test test/НАЗВАНИЕФАЙЛА.test.ts
@ОстапБобрис-г1п2 жыл бұрын
Спасибо за урок, есть один вопрос, можно как то в ConEmu вызывать только один тест при вызове команды npx hardhat test, а то у меня сразу все остальные также вызываются
@IlyaBodrovKrukowski2 жыл бұрын
В целом да, эта фича есть в mocha, которая используется для тестов stackoverflow.com/questions/10832031/how-to-run-a-single-test-with-mocha
@ОстапБобрис-г1п2 жыл бұрын
@@IlyaBodrovKrukowski Как я понял, не все там так и просто, много разных вариантов есть, спасибо, изучу)
@ОстапБобрис-г1п2 жыл бұрын
@@IlyaBodrovKrukowski Аа, все не так уж и сложно, просто describe.only или it.only и проблемы нет, спасибо еще раз ваш уроки)
@IlyaBodrovKrukowski2 жыл бұрын
@@ОстапБобрис-г1п На здоровье! Ну, там либо использовать only, либо через grep выбирать тесты с нужным описанием. Там можно передавать ещё и опции, в частности, имя файла, откуда тащить тесты, но я точно не знаю, как это будет работать именно в hardhat (у него там свои конфиги могут быть)
@nikolayts7142 Жыл бұрын
у меня так получилось запустить тесты только из одного файла: npx hardhat test --grep "Demo"
@МихаилРощин-г4ж2 жыл бұрын
видео топчик, только не совсем понимаю для чего тесты ? Потерялся в этот теме. Иду по Remix
@IlyaBodrovKrukowski2 жыл бұрын
Ну чтобы руками функционал контракта не тестировать каждый раз, это дольше ведь, чем просто нажать две кнопки и проверить, что всё работает
@laches12 жыл бұрын
Благодарю за ваши видео, но возник вопрос, как можно сделать проверку перед выполнением функции, чтобы msg.value был равен value другой транзакции (зная его хэш), заранее спасибо
@IlyaBodrovKrukowski2 жыл бұрын
keccak256 посчитает хэш. Но вообще получать информацию о других транзакциях особо не выйдет, надо её где-то тогда хранить. Максимум можно читать хэши последних 256 блоков, см доки docs.soliditylang.org/en/develop/units-and-global-variables.html#special-variables-and-functions
@Ww-xc2fq Жыл бұрын
За добавление события в журнал газ платить не нужно? Где храниться этот журнал и как его просмотреть ?
@IlyaBodrovKrukowski Жыл бұрын
Платить нужно, хранится в БЧ, смотреть через ethers.js
@0x0xxx082 жыл бұрын
3:50 Скажите, пожалуйста, в чем особенность функции Constructor и чем это написание отличается от следующих вариантов? У меня код работает так: address owner = msg.sender; и так : address owner; Как бы я не записал require не дает выполнится функции если я ее вызываю не от адреса, который разместил смарт контракт.
@IlyaBodrovKrukowski2 жыл бұрын
Этого не может быть. Если в owner ничего нет, то мы владельца не ставим. Про конструкторы было в прошлых уроках, где функции
@0x0xxx082 жыл бұрын
@@IlyaBodrovKrukowski конструктор - та функция, которая вызовется автоматически когда контракт будет размещен в блокчейн, он вызывается однократно и потом его вызвать уже нельзя. Я задаю владельца переменной. В чем разница, отличие в способах задания информации о владельце в конструкторе либо в переменной? Вот код. 3 функции withdraw через require, модификатор и реверт. Ни одна не работает при передачи данных в функцию в смарт-контракт со стороннего адреса. // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0
@0x0xxx082 жыл бұрын
ой address owner; в этом случае адрес owner является нулевым заглушкой. Так не работает контракт вообще. address owner = msg.sender; вот так работает
@IlyaBodrovKrukowski2 жыл бұрын
@@0x0xxx08 Ну особенно разницы нет, но в конструкторе можно делать это динамически засчёт передаваемых аргументов, какие-то условия ставить... Плюс конструкторы при наследовании тоже могут вызывать из потомков. Короче больше гибкости
@0x0xxx082 жыл бұрын
@@IlyaBodrovKrukowski спасибо
@МарсДевелопер Жыл бұрын
Привет! как результат reqire вывести на фронтэнд?
@reaexp10 ай бұрын
Уроки просто супер. Спасибо Вам огромное за Ваш труд. Подскажите, почему у меня такая проблема? Не соображу : 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 то ошибки нет, но только лог выводится без временной метки.
@reaexp10 ай бұрын
ха ха ха , сам задал вопрос и сам его решил через 5 минут, просто заменил msg.timestamp на block.timestamp , подглядев Ваш код уже в VSCode👍 прикольно, и всё работает. Всё равно спасибо ОГРОМНОЕ за Ваш труд
@IlyaBodrovKrukowski10 ай бұрын
@@reaexp
@renichigava41832 жыл бұрын
компилируется контракт Payments в hardhat хотя я переименовал контракт на demo и скомпилировал его в вскоде
@IlyaBodrovKrukowski2 жыл бұрын
Может, файл не переименован?..
@KOCadm2 жыл бұрын
Не совсем понятно почему в функ. withdraw парам. _to позначен как payable. или я что-то пропустил...
@IlyaBodrovKrukowski2 жыл бұрын
Потому что если не payable, то туда нельзя ничего отправить. Это было в одном из прошлых уроков
@renichigava41832 жыл бұрын
"before each" hook for "should be deployed": - в чем может быть проблема?
@IlyaBodrovKrukowski2 жыл бұрын
Так что-то не очень понятно, пришлите плз код в наш чат, посмотрим
@Breaksignal2 жыл бұрын
Братан давай я тебе отвечу надо просто прописать npx hardhat compile
@radionmarkov69812 жыл бұрын
Привет Илья....Скажи,пожалуйста,я занимаюсь бизнесом,хочу создать свою монету,чтоб мне оплачивали деньги за товар через неё,как можно создать простой смарт контракт с маленьким ликвидом,чтоб люди могли покупать мою монету,но не могли продать,чтоб только я мог снять ликвид....заранее спасибо.....
@IlyaBodrovKrukowski2 жыл бұрын
Нужно реализовать стандарт ERC20 и, видимо, сделать смарт-контракт, который просто будет продавать эти токены. В двух словах не объяснить, но скоро будет урок по теме
@radionmarkov69812 жыл бұрын
@@IlyaBodrovKrukowski Как с вами можно пообщаться лично,в каких сетях,так будет проще....
@IlyaBodrovKrukowski2 жыл бұрын
@@radionmarkov6981 Пардон, я не даю сейчас персональных консультаций. Можно в нашем чате писать, я стараюсь отвечать по возможности (очень много вопросов приходит)
@radionmarkov69812 жыл бұрын
@@IlyaBodrovKrukowski А по прошлым вашим урокам,где вы создаёте смарт контракт,если туда просто вписать код строку,то есть прописать свой адрес кошелька метамаск,чтоб только на него можно было снимать деньги,так можно сделать,я просто в этом дилетант,смотрю ваши уроки,очень всё толково,познавательно....Жду вашего ответа....
@IlyaBodrovKrukowski2 жыл бұрын
@@radionmarkov6981 ну в теории можно, конечно, да
@yevheniimoskalenko16242 жыл бұрын
куль
@KOCadm2 жыл бұрын
еще вопросик. зачем писать other_addr.address если other_addr это же и так адрес ??
@IlyaBodrovKrukowski2 жыл бұрын
На самом деле, это signer, а не адрес
@fknxor4 ай бұрын
Здравствуйте, когда пытаюсь затестить код из видео вылезает следущее сообщение: 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 подскажите что нужно делать
@IlyaBodrovKrukowski4 ай бұрын
bodrovis.tech/posts/faq-po-kursu-solidity/ думаю, тут есть ответ
@mramilvideo2 жыл бұрын
If msg.sendersender revert(...
@Breaksignal2 жыл бұрын
Я конечно не спец но орнул if(msg.sender != owner) { } else { } _to.transfer(address(this).balance); // вы вынесли отправку денег за пределы условия тем самым с контракта может любой человек забрать деньги даже после того как условие выполнится
@IlyaBodrovKrukowski2 жыл бұрын
Так там модификатор onlyOwner на функции - если человек не владелец, то сразу будет ошибка, он даже в тело функции не попадёт. Если конечно об этом речь github.com/bodrovis-learning/Solidity-YT-Series/blob/master/lesson_7_modifiers_events/Demo.sol#L32= Закомментированные строки в этой функции просто, чтобы показать, как ещё это условие сделать можно
@Breaksignal2 жыл бұрын
@@IlyaBodrovKrukowski модификатор просто позже по уроку появился уже, изначально когда условия просто в if были без require вот тогда был эксплойт