7:57: Через прямой вызов, `returns()` получить не проблема.
@IlyaBodrovKrukowski8 ай бұрын
Это правда
@mrin08 ай бұрын
21:40 Взломать некорректно работающий контракта, который записывает `at` в `otherContract`, a `sender` в `owner` не самый лучший пример. Лучше чем никакого примера, но хотелось бы пример с условно работающим контрактом. 24:00: `uint(uint160(address(this)))`: избыточная запись, т.к. uint160 является подмножеством uint доступно неявное преобразование: `uint160(address(this))` 25:46: `owner` уже изменён на адрес атакующего контракта `Hack` при первой атаке через `attack()`
@IlyaBodrovKrukowski8 ай бұрын
@@mrin0 видимо, и это тоже так. Понимаете какое дело, я пока это всё записывал, сам учился, и там наверняка есть ошибки. Первое видео я когда записывал, то вообще почти ничего не знал о крипте
@mrin08 ай бұрын
Да, всё нормально. Спасибо за ваш труд. Эти сообщения для тех кто будет разбирать код и для себя. Как-то так. Просто не всегда получается писать мягко.
@IlyaBodrovKrukowski8 ай бұрын
@@mrin0 да, я понимаю, благодарю
@bst00802 жыл бұрын
Гениальный контент,единственный на русском языке. Ваши ролики очень помогают в работе спасибо вам большое.
@IlyaBodrovKrukowski2 жыл бұрын
Благодарю
@fox_pranks2 жыл бұрын
Ура, спасибо за новый урок! Прекрасная подача материала :)
@vladimireliseev7602 Жыл бұрын
Благодарю, Вы очень хорошо объясняете! И материал очень интересный!
@IlyaBodrovKrukowski Жыл бұрын
На здоровье
@роматарасов-о8л2 жыл бұрын
Отличные уроки, очень помогают фулстаку понять web-3.0 штуки. в конторе в которой работаю очень часто встречаются проекты в которых помогают знания из ваших гайдов
@IlyaBodrovKrukowski2 жыл бұрын
@МаксимИванов-о4л2 жыл бұрын
Илья, разберите, пожалуйста, как-нибудь в своем новом виде как выложить НФТ своего контракта на OpenSea.
@momotdmvi2 жыл бұрын
Есть 2 вопроса: 1. В каком случае функция возвращает не true? Должен сработать revert? Но тогда функция контракт прекратит выполнение 2. Сколько может быть вложенных delegatecall друг в друга?
@Logi_Crypto2 жыл бұрын
Здравствуйте!Еще один вопросик: (1:24)"name = _name;" Нужно писать нижнее подчеркивание ибо "name" это внутреняя переменная функции setName?
@IlyaBodrovKrukowski2 жыл бұрын
Ну да, это аргумент функции
@Logi_Crypto2 жыл бұрын
@@IlyaBodrovKrukowski благодарю вас!
@Евгений-в5ц3п2 жыл бұрын
Хотелось бы поднять тему о взаимодействии контрактов, например как сделать оплату токеном из другого Смарта или как сделать проверку что на баланс смарта поступил нужный нфт
@momotdmvi2 жыл бұрын
Илья, добрый день. Спасибо за урок. Есть 2 вопроса: 1. В каком случае функция возвращает false? Должен сработать revert? Но тогда контракт прекратит выполнение, а вы говорите, что контракт будет продолжен. 2. Сколько может быть вложенных delegatecall друг в друга?
@IlyaBodrovKrukowski2 жыл бұрын
Функция вернёт false, если call не прошёл. Тогда на строке require(success) всё остановится. Ну, а если такой строки нет, то в общем-то всё продолжился. Delegatecall - да в принципе не ограничено количество
@w00ki3z42 жыл бұрын
Здравствуйте! В первую очередь спасибо за ваш труд. Хотел спросить на счет аудита смарт контрактов. Можете вкратце написать роадмэп аудитора смарт контрактов. Что должен уметь, какими навыками обладать?
@IlyaBodrovKrukowski2 жыл бұрын
Честно говоря, это не совсем по адресу вопрос, я этим не занимался. Но вообще из общих соображений нужно отлично знать EVM и Solidity, понимать инструкции assembly, знать все типичные атаки и уязвимости, т.е. короче говоря быть большим специалистом в области безопасности. Написание тестов лишним не будет.
@white60062 жыл бұрын
Познавательное видео. Можно еще сделать обзор по улучшениям ERC20 - ERC223, ERC777, ERC1363... Интересно будет узнать ваше мнение. Также про обновление контрактов на более новые версии (например как у токенов)
@IlyaBodrovKrukowski2 жыл бұрын
Постараюсь!
@googleadmin47492 жыл бұрын
Мне все же не хватает видео про "области видимости", так же более подробные остановки на взаимодействие контрактов при наследовании или вот как в видео использованные решение, немного сумбурно показалось. Хотя казалось бы куда чем более ясно описано это "Мой контракт" это "Другой контракт" и тд, но на самом деле не показалось очевидным, все оно в одно сливается. Буду пересматривать.
@IlyaBodrovKrukowski2 жыл бұрын
Ну, тут имеем, что имеем - это всё-таки бесплатная версия. В полном курсе про всё это куда подробнее, ссылка на него в описании под каждый видео
@googleadmin47492 жыл бұрын
@@IlyaBodrovKrukowski = ) да и так норм, доку еще нужно почитать и материала отложенного, а там глядишь и до курса не далеко будет
@Receive_ Жыл бұрын
Спасибо за урок! Только я не пойму зачем в атакующем контракте дополнительная функция getData, которая якобы должна переопределить владельца? delegatecall и так пробросит адрес хакерского контракта в переменную sender, которая переназначит владельца. А второй вопрос по поводу второго параметра call - bytes memory data. Через него можно получить информацию об ошибке, если транзакция завершиться ошибкой?
@IlyaBodrovKrukowski Жыл бұрын
По getdata я уже там плохо помню, надо глянуть. В data будет returnvalue функции. Если нужно отследить ошибку, то используется try-catch
@Receive_ Жыл бұрын
@@IlyaBodrovKrukowski спасибо за ответ
@kirillpodolinniy3092 жыл бұрын
Здравствуйте, спасибо за ваши труды! Вопрос такой: на сколько много сейчас вакансий на солидити и, например скажем + питон? Высокий ли порог входа?
@IlyaBodrovKrukowski2 жыл бұрын
Достаточно много: во всяком случае, я знаю, что студенты нашей школы постоянно ходят по разным собеседованиям и вариантов много. Зная Solidity и все сопутствующие инструменты, а ещё и плюс React, можно найти хорошую вакансию. Питон - не уверен, что много кому требуется, но минусом точно не будет
@kirillpodolinniy3092 жыл бұрын
@@IlyaBodrovKrukowski Благодарю Вас за ответ:)
@ingegov2 жыл бұрын
Привет, а можешь рассказать про создание своего токена и работу с ним ?
@IlyaBodrovKrukowski2 жыл бұрын
Был стрим недавно про ERC20, см. на канале, мы как раз токен создавали
@ingegov2 жыл бұрын
@@IlyaBodrovKrukowski спасибо
@WithoutNickname6662 жыл бұрын
Илья, спасибо за урок! Есть такой вопрос : Функция receive() может потреблять не более 2300 газа. И в документации сказано что у нас не хватит газа на запись в хранилище. Означает ли это что используя receive() мы не сможем записать что либо, например, в mapping или просто изменить переменную в блокчейне?
@IlyaBodrovKrukowski2 жыл бұрын
А откуда информация, что receive имеет такое ограничение? Вроде такое для transfer/send
@WithoutNickname6662 жыл бұрын
@@IlyaBodrovKrukowski Да, действительно. Я ошибся. Прочитав документацию не верно понял информацию. Получается что если мы хотим что-то изменить в блокчейне, то нам нужно использовать низкоуровневый вызов, а не transfer/send?
@IlyaBodrovKrukowski2 жыл бұрын
@@WithoutNickname666 Ну, там SSTORE стоит минимум 2900 газа, так что да
@mrin08 ай бұрын
!
@nim39812 жыл бұрын
у remix есть автозаполнение? писать полностью синтаксис языка утомляет
@IlyaBodrovKrukowski2 жыл бұрын
Нет, насколько мне известно. Используйте VS Code или что-то ещё с поддержкой Solidity
@mair92062 жыл бұрын
Когда продолжение по rspec?))
@IlyaBodrovKrukowski2 жыл бұрын
Не знаю, если честно. Особенного интереса к этой серии я не увидел, к сожалению
@mair92062 жыл бұрын
@@IlyaBodrovKrukowski жаль( по rspec практически нет материала, на русском совсем нет
@IlyaBodrovKrukowski2 жыл бұрын
@@mair9206 Я не то, что забросил мысль продолжить серию, просто она не сильно в приоритете, так скажем
@cashbackeer59192 жыл бұрын
понял только то, что delegateCall лучше не пользоваться)
@IlyaBodrovKrukowski2 жыл бұрын
Нет, почему. Есть случаи, когда он необходим, см. видео про proxy
@gilmanRU2 жыл бұрын
Большое спасибо за видео! Вопрос, когда лучше использовать call вместо interface? Ведь если есть данные о функциях стороннего контракта, то можно использовать оба варианта взаимодействия с контрактом (как через interface, так и с помощью call) с примерно одинаковыми возможностями?
@IlyaBodrovKrukowski2 жыл бұрын
Call можно настроить по газу и в целом он более гибкий. Но для простых вызовов лучше через интерфейс работать - это банально удобнее
@Nevybralnick2 жыл бұрын
25:29. Можно не писать вообще _timestamp, синтаксис это позволяет: function getData(uint) external payable {...}
@IlyaBodrovKrukowski2 жыл бұрын
Это правда
@mrin08 ай бұрын
Это, кстати, изменит selector функции getData и `delegatecall` не сможеn найти её в контракте `Hack`. ПОтому что селектор учитвает имя функции и типы передаваемых аргументов, т.е. `delegatecall` обращается по селектору заданному в изначальном вызове, а он содержит uint, а значит отличается от селектора который не содержит uint.
@b33blebrox6 күн бұрын
@@mrin0 Речь о том, что имя неиспользуемого аргумента можно не писать, а только тип, поэтому селектор никак не изменится
@krahmaletskrakmalets75872 жыл бұрын
А кто знает, владелец контракта может сделать смарт контракт публичным в любое время? Когда он уже работает?
@IlyaBodrovKrukowski2 жыл бұрын
Смарт-контракт публичный в любом случае. Но изменить модификатор функции с public на private или обратно нельзя, если контракт уже опубликован, если вопрос в этом
@krahmaletskrakmalets75872 жыл бұрын
@@IlyaBodrovKrukowski Это понятно) Имею в виду выложить в Bscan например можно уже работающий контракт не поломав его логики?
@IlyaBodrovKrukowski2 жыл бұрын
@@krahmaletskrakmalets7587 Ну, наверное да - просто не очень понимаю, как его можно поломать таким образом? Я работал в основном с etherscan правда, но всё, что там делается - это подтверждается, что контракт действительно имеет именно такой исходник
@krahmaletskrakmalets75872 жыл бұрын
@@IlyaBodrovKrukowski Понял. Спасибо!
@Лёша-л1ы2 жыл бұрын
подскажите, а зачем вообще нужны низкоуровневые вызовы? Просто что бы общаться между контрактами?
@IlyaBodrovKrukowski2 жыл бұрын
Ну да, плюс они более гибкие
@kirillilyin81732 жыл бұрын
kzbin.info/www/bejne/aHfcmGBoZ850b6s - это ваш голос на видео?
@IlyaBodrovKrukowski2 жыл бұрын
Ну да, у меня на канале есть это же видео, только на русском
@theserghd13 ай бұрын
- автор почему-то ни слова не сказал о том, что на delegateCall() основаны "обновляемые" контракты (типы 'uups', 'transparent', 'beacon'). По видео в роли proxy-контракта выступает MyContract, а в роли impl - AnotherContact; - автор почему-то использует нейминг с точностью до наоборот относительно того, как это обычно делается. Символ нижнего подчёркивания в начале ставится не для переменных функций, а для мемберов класса; - "хак" сильно притянут за уши. Ну какой разраб будет обозначать метод delCallGetData() как общий для всех юзеров...? А не админский как минимум;