Solidity и смарт-контракты Ethereum, урок #9 | Оптимизация смарт-контрактов и газ

  Рет қаралды 11,096

Ilya Krukowski

Ilya Krukowski

Күн бұрын

Пікірлер: 81
@MikhailKuklenkov
@MikhailKuklenkov Жыл бұрын
Доброго дня, Илья. Огромное спасибо за урок, очень информативно и доходчиво получилось впитать информацию. #смартконтракты #солидити #solidity #блокчейн #etherium #события #модификаторы #блокчейнразработка
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
@h-arti5305
@h-arti5305 2 жыл бұрын
Огромное спасибо за Ваш труд, больше чем уверен что это большой вклад в общественность, верю в то что вы не оставите данные серии уроков.
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Большое спасибо, буду стараться
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
По просьбам зрителей, предлагаю решить следующую задачу. Сделать контракт-аукцион (по принципу "английский аукцион", то есть когда нужно делать всё более и более высокие ставки, перебивая другие). При развёртывании контракта указываем название товара, изначальную цену и адрес продавца (кому потом деньги начислять). Продавец может быть владельцем контракта. Затем сделать функцию "ставка", которая принимает определённую сумму денег от потенциального покупателя. Ставка должна быть больше текущей цены, тк суть аукциона в том, чтобы "перебить" ставку другого. Аукцион может закончиться либо по какому-то условию, либо если продавец вызвал функцию "закончить", либо по какому-то ещё принципу. В этот момент больше ставок уже делать нельзя, а продавец получает свои деньги. Нужно подумать также о том, что люди, чьи ставки "перебили", должны иметь возможность забрать деньги обратно. В идеале, написать для этого контракта тесты. В одном из следующих уроков, возможно, посмотрим, как это сделать.
@yevheniimoskalenko1624
@yevheniimoskalenko1624 2 жыл бұрын
покупка квартиры через смарт контракт, я думаю это будет супер?
@ildan6520
@ildan6520 Жыл бұрын
покопался в документациях, не нашёл как в тестах задеплоить контракт который принимает аргументы в конструкторе, например без аргументов это можно было сделать с помощью метода getContactFactory, но перегрузку с аргументами чёт не вижу
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
@@ildan6520github.com/bodrovis-learning/Solidity-YT-Series/blob/master/lesson_36_role/Demo.test.ts#L9 тут пример есть
@kirill_s_gavr
@kirill_s_gavr Жыл бұрын
Это лучший канал 100% Однозначно подписка!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
Благодарю
@vladimireliseev7602
@vladimireliseev7602 Жыл бұрын
Благодарю, это было очень полезное видео!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
@isthismyfinalform169
@isthismyfinalform169 2 жыл бұрын
Очень полезная серия уроков, спасибо огромное, буду благодарен также за продолжение.
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Обязательно! Стрим в среду вечером (см подробности в списке видео), так что присоединяйтесь
@googleadmin4749
@googleadmin4749 2 жыл бұрын
А вот этот урок придется пересмотреть сейчас подробнее по утру, много деталей, что нужно запомнить и усвоить.
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@kirill_prog
@kirill_prog 2 жыл бұрын
Спасибо! Всегда жду с нетерпением.
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@neuromancersmith9890
@neuromancersmith9890 2 жыл бұрын
Спасибо!
@synchronization666
@synchronization666 2 жыл бұрын
thank you
@МихаилРощин-г4ж
@МихаилРощин-г4ж 2 жыл бұрын
классный урок
@karosargsyan9686
@karosargsyan9686 2 жыл бұрын
thank you very much
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@alexwebcoder1192
@alexwebcoder1192 2 жыл бұрын
Топовый урок!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@lemavisaitov6412
@lemavisaitov6412 2 жыл бұрын
Илья, реально, спасибо за ваш труд, по больше бы людей, которые так объясняют! У меня есть к вам несколько вопросов. 1) если мы пройдём полностью ваш курс по солидити, то будет ли это достаточно для того, чтобы устроиться куда-то джуном в солидити? 2) что вообще нужно знать чтобы стать Junior Smart-contracts разработчиком? Можно своего рода роадмап какой-нибудь чтобы было понятней? 3) как вы сами пришли к смарт-контрактам? Вы работаете в этой сфере? 4) насколько необходимо выучить английский для удобства работы и учёбы? Мне не трудно его выучить, просто лень как то начать, но я начинаю понимать насколько сильно бы расширился бы мои границы, если бы знал 5) нужно ли знать JS для написания тестов?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Спасибо! Отвечаю: 1. Не знаю, но вероятнее всего да. Хотя нужно читать по возможности доп материалы самостоятельно - в частности, документацию 2. Solidity, основы JS, быть знакомым с инфраструктурой NPM, уместь писать тесты для контрактов, понимать принципы EVM - примерно так, я думаю 3. Очень просто: мне в один прекрасный день предложили сделать курс по теме. Ну, я просто делаю платные курсы регулярно, и вот поступил заказ. Теперь веду стримы для студентов курса. Раньше я был только программистом, а сейчас начальник отдела обучения 4. Очень желательно, на русском почти материалов нет 5. Естественно, они же на JS пишутся
@lemavisaitov6412
@lemavisaitov6412 2 жыл бұрын
@@IlyaBodrovKrukowski спасибо за ответ! Соглашусь что 5) вопрос звучит не корректно 😅, я имел ввиду углублённым знание JS
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@@lemavisaitov6412 А, это не слишком обязательно. Главное понимать async-await тк он постоянно используется, типы данных - в таком духе
@404piano
@404piano 2 жыл бұрын
очень полезное видео!
@pphotic
@pphotic 9 ай бұрын
Илья, большое спасибо за урок. Подскажите как запустить консоль hardhat и синхронизировать с remix - как у вас в уроке? Если я развернул hardhat в wsl в windows - это возможно? Или надо hardhat устанавливать в windows?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 9 ай бұрын
На здоровье. Смотрите, надо просто запустить npx hardhat node не важно где, обычно порт 8545 должен быть. Потом в Remix надо просто выбрать провайдера во вкладке Deploy and run transactions. Нужный провайдер - Dev Hardhat provider. Он напомнит, что нужно запустить узел, и потом должен его подрубить. В целом всё, если не работает, напишите мне на почту (есть в описании канала)
@pphotic
@pphotic 9 ай бұрын
@@IlyaBodrovKrukowski Супер! Всё получилось!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 9 ай бұрын
@@pphotic
@АлександрАлександр-р1з
@АлександрАлександр-р1з 2 жыл бұрын
Очень полезные советы!!!! Может быть рассмотрим как писать таски в hardhat?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Надо подумать, спасибо за идею
@fedy_2358
@fedy_2358 2 жыл бұрын
Интересно про virtual override модификаторы узнать
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Немного позднее
@liminitka
@liminitka 2 жыл бұрын
Такой вопрос, вот мне нужно сделать whitelist из 400 пользователей. Рационально использовать mapping для этих целей? Или лучше эти адреса занести в json и оттуда их читать?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Сложно сказать. Я бы на вашем месте примерно посчитал размер такого мэппинга, оценил сколько это будет стоить и потом уже подумал, насколько нужно хранить подобные данные on-chain
@РоманКоротков-з3ц
@РоманКоротков-з3ц 2 жыл бұрын
Подскажите, пожалуйста - что это за команда irb? Что нужно установить?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Не, это можно не ставить. Это интерпретатор Ruby
@РоманКоротков-з3ц
@РоманКоротков-з3ц 2 жыл бұрын
@@IlyaBodrovKrukowski Спасибо!
@Максим-щ2о6ч
@Максим-щ2о6ч 2 жыл бұрын
Как оптимальней распределить память: - uint128, uint128, bytes32 - bytes32, uint128, uint128 первый или второй вариант? или одинаково?)
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Это не особенно важно с точки зрения слотов
@АндрейСергеевич-т4ч
@АндрейСергеевич-т4ч 2 жыл бұрын
Спасибо большое за ваши уроки. Подскажите пожалуйста интересует такой вопрос, можно ли получать данные из смарт контракта в веб3джс ивентом, например, когда что то произошло в блокчейне, ну скажем chainlink стал стоить 40 дол - я хочу чтобы смарт контракт вызвал функцию когда такое произойдет. Возможно ли такое реализовать на смартах ? Фактически функция кола не требующая газа может же такое сделать ? Она же читает из блокчейна данные, ивентом выплюнет наверх в веб3джс , который в свою очерель вызовет функцию в блокчейне. Я все правильно понимаю и это так работает ?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Событие можно породить только в функции контракта, и эту функцию что-то должно запустить. При этом читать журнал событий сам контракт не может, но зато его можно читать через web3.js или ethers.js. В событии могут быть фактически любые данные. Но сам контракт на событие не может реагировать. При этом мы можем написать на ethers скрипт, который слушает событие, а потом по нему выполняет функцию на контракте
@АндрейСергеевич-т4ч
@АндрейСергеевич-т4ч 2 жыл бұрын
@@IlyaBodrovKrukowski Понял, я примерно так себе и представлял это. Спасибо ! С нетерпение жду видео про ивенты )
@yevheniimoskalenko1624
@yevheniimoskalenko1624 2 жыл бұрын
Спасибо за урок! Слушай может есть prettier / eslint только для смарт контрактов?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Возможно, но как-то не пробовал искать пока
@Receive_
@Receive_ 2 жыл бұрын
Спасибо за урок. Тема очень важная и ее тематику нужно продолжать. Вопрос: Разве можно сравнивать мапинг и список? Ведь мапинг это по сути словарь и в нем хранится ключ(адрес = 80бит) и значение(сумма=100wei=3бита), а в список вы добавляете только значение, там конечно еще есть индекс, но я не знаю занимает ли он место. Т.е. вы пытаетесь сравнить разные по размеру данные. Уместен ли такой пример в сравнении?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Кому-то, мне кажется, будет проще это так понимать (пока что). Но в одном из последних уроках будет показано, как именно хранятся мэппинги. Пока можно на этот счёт не беспокоиться слишком сильно. Может, и не очень хороший пример, не знаю
@Anonimus_13
@Anonimus_13 2 жыл бұрын
Когда вы говорите, что большие объемы данных лучше хранить не в блокчейне, а в облачных хранилищах, то о каких данных, например, идет речь? Помимо этого, данные вне блокчейна можно подменить, разве это не противоречит идее смартконтрактов?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Можно. Но если вы хотите сохранить в блокчейне пару мегабайт текста, я бы делать этого не стал, тк это будет стоить пару тысяч долларов. Да, конечно, данные в теории можно подменить, но не всегда и не во всех случаях нам нужно гарантировать 100% неизменность. В блокчейне можно хранить хэш данных, которые мы помещаем off-chain или ещё какие-то доказательства их неизменности. Есть концепция цифровой подписи. Короче, придумать что-то можно.
@viktorcortez5706
@viktorcortez5706 2 жыл бұрын
Проходил обучение, где были 3 адреса монет заданы в коде. А что делать, если нужно иметь возможность поттягивать 3 адреса из списка 100 монет наример ?
@AlexErmashev
@AlexErmashev Жыл бұрын
А существует ли какие-нибудь автоматические решения по проверке оптимизации кода (плагины к visual studio к примеру)? Проверять в ручную это достаточно нудное дело
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
Про такое не слышал. Какую-то оптимизацию делает компилятор, но и нам тоже нужно об этом заботиться.
@ghettoar2529
@ghettoar2529 2 жыл бұрын
Спасибо за урок! Возник следующий вопрос. Как я понимаю, цену для газа мы выставляем сами, так почему бы не договориться с неким майнером, чтобы напрямую передавать ему необработанную транзацию и он обработал бы ее за 0 wei. Проблема будет в том, что нельзя утверждать, что он сможет первым решить задачу POW?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Ну майнеров много, им распределяются эти транзакции сами. В теории что-то такое придумать можно, конечно, но в обще случае проблематично
@markchigrin5668
@markchigrin5668 2 жыл бұрын
Странно, что в solidity нет constexpr и inline. Кажется, что многое можно оптимизировать компилятором
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Нет, ну вообще он умеет кое-чего оптимизировать. И насколько знаю модификаторы как раз inline вставляются
@liminitka
@liminitka 2 жыл бұрын
Спасибо большое за урок! Такой вопрос, а в solidity есть тип данных который хранит дату? Мне бы хотелось реализовать функцию заморозки средств до определенного момента
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Нет, встроенного типа нет, там block.timestamp есть, но он возвращает uint, нужно как-то самостоятельно конвертировать
@sadpay
@sadpay 2 жыл бұрын
Очень хорошо объясняете, спасибо! Есть вот такой вопрос по оптимизации, с которым столкнулся на практике. При осуществлении покупки (функция payable) происходит очень много считываний данных, причем чем больше пользователей в системе, тем больше считываний (связано с древовидной структурой, которую приходится обходить при каждой покупке). Причем по итогу изменяется только одно значение в маппинге. Как можно оптимизировать данный процесс? Я знаю, что есть так называемый паттерн проксирующих контрактов. Может быть, стоит вынести storage данные и функции чтения в отдельный контракт, который будет вызываться основным контрактом и получать уже посчитанный результат? Ведь функции чтения бесплатные
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Сходу сказать сложно. Стоит только учитывать, что функции чтения бесплатны при непосредственном вызове. Если же эти функции вызываются в рамках платной транзакции, то они тоже становятся платными. Да, там не очень большая стоимость, но всё же. Возможно, имеет смысл вообще пересмотреть хранение данных?.. Не исключено, что можно оптимизировать сам алгоритм
@sadpay
@sadpay 2 жыл бұрын
@@IlyaBodrovKrukowski можно, конечно , оптимизировать алгоритм, но идея в целом общая, даже не к моей конкретно ситуации. Просто если мы имеем какой-то сложный алгоритм расчета, не меняющий данные, не рациональнее ли вынести его в отдельный смартконтракт? Таким образом, мы будем иметь отдельный смартконтракт с логикой, который будет возвращать уже вычисленную информацию. И получается, что вместо сохранения в блоке транзакций (именно transaction, а не call) всех вызовов на чтение и других штук, мы сохраняем только инфу про вызов сторонней функции (call) и изменение переменной. Мне кажется, это бы сильно оптимизировало стоимость по газу для любых контрактов. Если я правильно понимаю, такой подход называют проксирующим. Правда нигде не пишут про экономию газа
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@@sadpay Такая история есть, только обычно это в другом контексте упоминается. Впрочем, последнее время я встречаю мнения, что прокси-контракты - это антипаттерн и вообще плохая идея.Оптимизаций по газу особенных я тут не вижу, если честно
@sadpay
@sadpay 2 жыл бұрын
@@IlyaBodrovKrukowski понял. Спасибо за ответы!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@@sadpay Ну, вот просто к примеру: у нас в школе MCS как раз недавно выступал эксперт из одной компании, которая занимается криптой. И вот как раз он упоминал, что уже прокси особо не используется и вообще считаются так себе решением. Но я честно хочу сказать, что так абстрактно судить сложно. Но всё же особых бонусов я не вижу. Да, в традиционных языках имеет смысл вынести логику в другой класс, в другой метод. Но тут всё-таки история иная, и к этому надо привыкать, увы
@Уважаемыйпользователь-ю9к
@Уважаемыйпользователь-ю9к Жыл бұрын
Здравствуйте! Не подскажете что за приложение справа и как его подключить?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
Добрый день! Это hardhat, его можно установить довольно легко, а потом подключить в remix через плагин. kzbin.info/www/bejne/fXWZl61ra5KWe7M - тут всё видео можно не смотреть, только установку
@maxrozhkov2671
@maxrozhkov2671 Жыл бұрын
Кому мы платим газ за обработку если на эфириуме больше нет майнеров, а за развертывание узлов ничего не платят?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
Майнеров нет, зато есть валидаторы, к примеру ethereum.org/en/developers/docs/consensus-mechanisms/pos/
@korg2
@korg2 2 жыл бұрын
Очень круто, что каждый пример посмотрели в стоимости газа, теперь хоть порядок чисел в оптимизации понятен! Конечно, жду урок с применением популярных библиотек (OpenZeppelin наверное?). И еще вопрос такой, можно попросить 2-3 задачи от тебя для практики? Т.к. 9 уроков просмотрено, все доступно и понятно (имея опыт на питоне и паскале), но не понятно с чего начинать практическую работу и как правильно начать "набивать руку"? я вступил в группу в ФБ солидити разработчиков, там пару раз в день кто-то спрашивает помощи по коду и в некоторых случаях я даже мог бы помочь, но думаю этой практики недостаточно :)
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Да, про стандартные библиотеки тоже надо бы. Что касается задачи, пожалуйста: сделать контракт-аукцион (по принципу "английский аукцион", то есть когда нужно делать всё более и более высокие ставки, перебивая другие). При развёртывании контракта указываем название товаара, изначальную цену и адрес продавца (кому потом деньги начислять). Продавец может быть владельцем контракта. Затем сделать функцию "ставка", которая принимает определённую сумму денег от потенциального покупателя. Ставка должна быть больше текущей цены, тк суть аукциона в том, чтобы "перебить" ставку другого. Аукцион может закончиться либо по какому-то условию, либо если продавец вызвал функцию "закончить", либо по какому-то ещё принципу. В этот момент больше ставок уже делать нельзя, а продавец получает свои деньги. Нужно подумать также о том, что люди, чьи ставки "перебили", должны иметь возможность забрать деньги обратно. В идеале, написать для этого контракта тесты. В одном из следующих уроков, возможно, посмотрим, как это сделать. Текст задачи продублирую также в закреплённом комментарии.
@korg2
@korg2 2 жыл бұрын
@@IlyaBodrovKrukowski спасибо, понятная задача! Окончание аукыиона можно сделать не ранее чем 100 блоков с момента последней ставки, например
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@@korg2 Можно, но это не очень надёжно тк не очень ясно, когда это конкретно произойдёт (особенно, людям, которые не до конца знают принципы работы блокчейна) - подумайте ещё о варианте "по времени" (block.timestamp). Ну, хотя это просто вариант
@korg2
@korg2 2 жыл бұрын
Аукцион сделал. Самый простой, он просто когда получает ставку выше - предыдущую возвращает обратно. Потому на балансе контракта всегда только максимальная ставка. И вывести можно только после msg.timestamp > какого-то значения. Можно еще задачку?)
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@@korg2 Тоже самое, но голландский аукцион. При создании указываем товар и МАКСИМАЛЬНУЮ цену. Каждую секунду цена должна падать, например, на 1 wei (или любое другое значение). Сделать функцию, которая возвращает актуальную цену на данный момент. А также функцию, через которую можно "купить" товар по ТЕКУЩЕЙ цене. Учесть, что пока идёт транзакция, то цена за эти 1-2 секунды ещё упадёт, поэтому разницу нужно вернуть покупателю на аккаунт. Как только вызвана функция "купить", аукцион должен закончиться.
@timurkash
@timurkash 2 жыл бұрын
Solidity - сплошной антипаттерн с точки зрения функционального программирования!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
А это и не функциональный язык Но вообще да, тут есть свои чудеса
СТРИМ! Solidity и Ethereum, урок #10 | Практика
1:21:45
Real Man relocate to Remote Controlled Car 👨🏻➡️🚙🕹️ #builderc
00:24
Человек паук уже не тот
00:32
Miracle
Рет қаралды 4,1 МЛН
PIZZA or CHICKEN // Left or Right Challenge
00:18
Hungry FAM
Рет қаралды 15 МЛН
Accessing Private Data | Hack Solidity (0.6)
17:13
Smart Contract Programmer
Рет қаралды 20 М.
Hardhat, Ethers.js, Rinkeby, Alchemy, Etherscan
30:56
Ilya Krukowski
Рет қаралды 5 М.