В этом уроке по Solidity мы с помощью дебаггера Remix будем разбирать байткод, который генерирует компилятор и который используется для деплоя контракта. Мы обсудим каждую отдельную инструкцию, каждый операционный код (opcode) и узнаем смысл и назначение этих инструкций. Таким образом мы поймём, как именно работает стек и память,что именно происходит в момент развёртывания нашего контракта и как передаются в конструктор аргументы и как они обрабатываются.
Это довольно длинный урок, на запись которого ушло весьма приличное время, так что надеюсь, он вам понравится. https://www.youtube.com/watch?v=pz8NeV6bo3E
Это довольно длинный урок, на запись которого ушло весьма приличное время, так что надеюсь, он вам понравится. https://www.youtube.com/watch?v=pz8NeV6bo3E
YouTube
Solidity и Ethereum, урок #38 | Разбор байткода, opcodes, деплой - идём на самый нижний уровень!
ХОТИТЕ СТАТЬ РАЗРАБОТЧИКОМ Solidity, узнать об Ethereum, блокчейне и многом другом ещё больше?!
Мои друзья из GUIDE DAO (бывшая школа MCS) предлагают скидку 0,1 ETH на ВСЕ СВОИ БУТКЕМЫ ПО КРИПТЕ! Материалы этих буткемов подготовлены мной и другими специалистами:…
Мои друзья из GUIDE DAO (бывшая школа MCS) предлагают скидку 0,1 ETH на ВСЕ СВОИ БУТКЕМЫ ПО КРИПТЕ! Материалы этих буткемов подготовлены мной и другими специалистами:…
👍25🔥16
Планируется саммит по Rails в начале следующего года. Правда интересных докладов там пока как-то не очень много, и, похоже, послушать их можно только за деньги (пусть и не очень большие) https://events.geekle.us/ruby
events.geekle.us
Ruby on Rails Global Summit'23
Anything, that you have to know about Ruby in 2023
👍6❤🔥1
Ну, что ж, первый месяц, когда я в кои-то веки за что-то плачу на Heroku (раньше если там и были платные проекты, то платил заказчик). Пока так
Charges
Amount
Application dynos $ 6.34
Add-on services $ 8.16
Subtotal: $ 14.50
Total:
$ 14.50
Простой dyno и БД. Ну, кое-какие дополнение для почты, логгинга, кэша остались бесплатными, что приятно.
Charges
Amount
Application dynos $ 6.34
Add-on services $ 8.16
Subtotal: $ 14.50
Total:
$ 14.50
Простой dyno и БД. Ну, кое-какие дополнение для почты, логгинга, кэша остались бесплатными, что приятно.
🤔3
В этом уроке по Ruby мы узнаем, как правильно тестировать ошибки, которые может вернуть сторонний сервис. Также мы добавим и настроим Rubocop для исправления стиля нашего кода и наконец-таки опубликуем финальную версию библиотеки на сайт rubygems, чтобы её могли использовать другие разработчики. https://www.youtube.com/watch?v=WLgSqsQCKHQ
YouTube
Ruby с нуля, урок #16 | Тестируем ошибки, Rubocop, публикуем наш gem
В этом уроке по Ruby мы узнаем, как правильно тестировать ошибки, которые может вернуть сторонний сервис. Также мы добавим и настроим Rubocop для исправления стиля нашего кода и наконец-таки опубликуем финальную версию библиотеки на сайт rubygems, чтобы её…
❤14❤🔥6👍2👌1
Ну, и последняя запись на сегодня. Нашёл забавное рекламное видео бородатых годов, где представлен всем известный "микроавтобус" RAF-977, что означает всего лишь Rīgas Autobusu Fabrika. Удивительно, снято ещё в шестидесятые, а места все знакомые - совсем не изменились. https://twitter.com/sovietvisuals/status/1588642492009824259
👍6🔥1
В следующий вторник у нас очередной выпуск нашей интеллектуальной игры, так что welcome - можно будет сыграть за команду зрителей 🤓 https://youtu.be/zmgjArEfXdw
YouTube
СТРИМ! Интеллектуальная игра MCS Answer: команда школы и зрителей против вредного ведущего
Наша традиционная игра MCS Answer: команда знатоков и зрителей против вредного ведущего!
Станьте спонсором канала, и вы получите доступ к эксклюзивным бонусам: https://www.youtube.com/channel/UCN2waErKU52T_41pGgUimXw/join
Boosty: https://boosty.to/bodrovis…
Станьте спонсором канала, и вы получите доступ к эксклюзивным бонусам: https://www.youtube.com/channel/UCN2waErKU52T_41pGgUimXw/join
Boosty: https://boosty.to/bodrovis…
👍3
В этом месяце состоялась годовщина нашего фотопроекта "Легенды Оссиании", которому исполнилось пять лет. В рамках проекта мы выпустили некоторое количество фотокомиксов - как серьёзных, так и смешных (сюжет всего этого безобразия писал ваш покорный слуга). К сожалению, политическая ситуация не позволяет нам продолжать работу (участники проекта живут в разных странах), но хотя бы есть, что вспомнить. Эта страница фотокомикса, пожалуй, наиболее любимая и в целом наиболее личная (как и вся эта и последующая части). На создание всей этой истории ушло какое-то легендарное количество времени, но результат получился вполне приличным. Ссылка здесь https://vk.com/ossiania_legends (постоянные читатели и так её уже видели). Ну, а мы с вами скоро увидимся, ибо в этом месяце планируется аж три стрима по разным темам. Берегите себя.
👍8🍾3
Готовность 6-7 минут :) https://youtu.be/zmgjArEfXdw
YouTube
СТРИМ! Интеллектуальная игра MCS Answer: команда школы и зрителей против вредного ведущего
Наша традиционная игра MCS Answer: команда знатоков и зрителей против вредного ведущего!
Станьте спонсором канала, и вы получите доступ к эксклюзивным бонусам: https://www.youtube.com/channel/UCN2waErKU52T_41pGgUimXw/join
Boosty: https://boosty.to/bodrovis…
Станьте спонсором канала, и вы получите доступ к эксклюзивным бонусам: https://www.youtube.com/channel/UCN2waErKU52T_41pGgUimXw/join
Boosty: https://boosty.to/bodrovis…
Сегодня просто музыка. Спокойной ночи https://www.youtube.com/watch?v=4S8oMP-nxeQ
YouTube
Sven i Rosengård
Provided to YouTube by The Orchard Enterprises
Sven i Rosengård · GARMARNA · HARDELIN EMMA VIKTORIA · OHN WESTMAN RICKARD NILS J · JON STEFAN MARKUS BRISLAND FERNER · S RINGQVIST GOTTE ANDREA · HOGLIN JENS TOMMY
Förbundet
℗ 2020 Season of Mist
Released…
Sven i Rosengård · GARMARNA · HARDELIN EMMA VIKTORIA · OHN WESTMAN RICKARD NILS J · JON STEFAN MARKUS BRISLAND FERNER · S RINGQVIST GOTTE ANDREA · HOGLIN JENS TOMMY
Förbundet
℗ 2020 Season of Mist
Released…
❤6
Друзья, предварительно: завтра вечером в районе 21-22 UTC+3 будет стрим по Solidity и байткоду. Посмотрим, как вызываются функции, какие там опкоды и особенности. Думаю, будет интересно 😄
🔥18👍3
Залетайте на стрим через три часа https://youtu.be/p2ZUQR-jCDA 😄
YouTube
СТРИМ! Solidity и Ethereum, урок #39 | Байткод, опкоды, вызов функций на низком уровне
ХОЧЕШЬ СТАТЬ РАЗРАБОТЧИКОМ Solidity, узнать об Ethereum, блокчейне и многом другом ещё больше?! Мои друзья из GUIDE DAO (бывшая школа MCS) предлагают скидку 10% на ВСЕ СВОИ БУТКЕМЫ ПО КРИПТЕ! Материалы этих буткемов подготовлены мной и другими специалистами:…
2 минуты до готовности https://youtu.be/p2ZUQR-jCDA
YouTube
СТРИМ! Solidity и Ethereum, урок #39 | Байткод, опкоды, вызов функций на низком уровне
ХОЧЕШЬ СТАТЬ РАЗРАБОТЧИКОМ Solidity, узнать об Ethereum, блокчейне и многом другом ещё больше?! Мои друзья из GUIDE DAO (бывшая школа MCS) предлагают скидку 10% на ВСЕ СВОИ БУТКЕМЫ ПО КРИПТЕ! Материалы этих буткемов подготовлены мной и другими специалистами:…
👍7
Отвечая на вопрос по следам двух прошлых уроков про байткод: что именно происходит при попытке использования delegatecall? Иными словами, что там в байткоде?
Ответ очень простой: ничего особенного 😄 По факту, это можно проверить самостоятельно с подобными контрактами
В дебаггере там будет куча не сильно интересных инструкций, которые делают всякие проверки, кодируют сигнатуру и подготавливают стек, но главные инструкции имеют номера 240 и 241 (это с оптимизацией 2000):
GAS - смотрит, что там по газу осталось, а DELEGATECALL использует значения из стека и определяет с их помощью байткод какого контракта надо выполнить, какой там селектор функции найти и какой аргумент в эту функцию передать. А дальше на DELEGATECALL можно просто нажать кнопку step into и guess what: вы прыгнете к байткоду другого контракта, где все инструкции начинаются опять с нуля, причём в начале будет уже знакомый набор
То есть пока крутится delegatecall, у него там своя атмосфера и своя память. В calldata же будет содержаться что-то такое
Это селектор функции callMe и 0x2a, что равно значению 42 в десятичном формате. То есть я просто в
Почему это можно делать? Потому что *читать* байткод чужого контракта нам никто не мешает, ведь в блокчейне всё публично. Значит мы в принципе можем взять код и его исполнить у себя. Что делать нельзя, так это напрямую что-то менять в чужом состоянии, забирать у кого-то деньги или вносить в байткод изменения, ясное дело.
Ну, а дальше опкоды будут очень похожи на то, что мы видели. Например, мы увидим
Опять как в уроке - он читает calldata и вычленяет оттуда селектор.
А потом
Ну то есть сравниваем селектор. А дальше там всё просто - он берёт из calldata аргумент и говорит
0 - это номер слота переменной
Последняя инструкция в рамках delegatecall:
Дальше он возвращается к исходному байткоду, там меряет returndatasize (чтобы понять вернула ли что-нибудь функция), проверяет require и просто говорит STOP, то есть транзакция завершается.
Иными словами, никакой магии особо нет: он прямо берёт чужой байткод и начинает его прогонять с самого начала, но только для своего контекста.
Ответ очень простой: ничего особенного 😄 По факту, это можно проверить самостоятельно с подобными контрактами
contract Target {
uint a;
function callMe(uint _a) external {
a = _a;
}
}
contract Demo {
uint a;
address to;
constructor(address _to) {
to = _to;
}
function doCall() external {
(bool success,) = to.delegatecall(
abi.encodeWithSignature("callMe(uint256)", 42)
);
require(success);
}
}В дебаггере там будет куча не сильно интересных инструкций, которые делают всякие проверки, кодируют сигнатуру и подготавливают стек, но главные инструкции имеют номера 240 и 241 (это с оптимизацией 2000):
GAS(0x5a)
DELEGATECALL (0xf4)
GAS - смотрит, что там по газу осталось, а DELEGATECALL использует значения из стека и определяет с их помощью байткод какого контракта надо выполнить, какой там селектор функции найти и какой аргумент в эту функцию передать. А дальше на DELEGATECALL можно просто нажать кнопку step into и guess what: вы прыгнете к байткоду другого контракта, где все инструкции начинаются опять с нуля, причём в начале будет уже знакомый набор
000 PUSH1 80 - LINE 5
002 PUSH1 40 - LINE 5
004 MSTORE - LINE 5
То есть пока крутится delegatecall, у него там своя атмосфера и своя память. В calldata же будет содержаться что-то такое
0xe73620c3000000000000000000000000000000000000000000000000000000000000002a
Это селектор функции callMe и 0x2a, что равно значению 42 в десятичном формате. То есть я просто в
a хочу положить 42. Этот код выполнится в контексте нашего же контракта, но вот память на момент вызова окажется как бы новой.Почему это можно делать? Потому что *читать* байткод чужого контракта нам никто не мешает, ведь в блокчейне всё публично. Значит мы в принципе можем взять код и его исполнить у себя. Что делать нельзя, так это напрямую что-то менять в чужом состоянии, забирать у кого-то деньги или вносить в байткод изменения, ясное дело.
Ну, а дальше опкоды будут очень похожи на то, что мы видели. Например, мы увидим
026 CALLDATALOAD - LINE 5
027 PUSH1 e0 - LINE 5
029 SHR - LINE 5
Опять как в уроке - он читает calldata и вычленяет оттуда селектор.
А потом
031 PUSH4 e73620c3 - LINE 5
036 EQ - LINE 5
Ну то есть сравниваем селектор. А дальше там всё просто - он берёт из calldata аргумент и говорит
057 PUSH1 00 -
059 SSTORE -
0 - это номер слота переменной
a в контракте Target, тк она там на самой первой позиции (потому что в момент компиляции контракта Target он знает, какой слот был у a). Но тк это выполняется в нашем контексте, то по факту *мы имеем ввиду нулевой слот в Demo*. Именно поэтому переменные должны быть перечислены в правильном порядке.Последняя инструкция в рамках delegatecall:
062 STOP - LINE 9
Дальше он возвращается к исходному байткоду, там меряет returndatasize (чтобы понять вернула ли что-нибудь функция), проверяет require и просто говорит STOP, то есть транзакция завершается.
Иными словами, никакой магии особо нет: он прямо берёт чужой байткод и начинает его прогонять с самого начала, но только для своего контекста.
👍14❤1🔥1
В этом уроке по Solidity мы узнаем, как подписывать сообщения оффчейн с помощью закрытого ключа пользователя. Также мы узнаем, как с помощью ecrecover "восстанавливать" подписывающего из сообщения и с помощью этого механизма реализуем сценарий, когда за перевод денежных средств платит не отправитель, а получатель. https://www.youtube.com/watch?v=QODPMaUlrLw
YouTube
Solidity и Ethereum, урок #40 | ecrecover, подпись оффчейн/проверка подписи, платежи без газа
ХОТИТЕ СТАТЬ РАЗРАБОТЧИКОМ Solidity, узнать об Ethereum, блокчейне и многом другом ещё больше?!
Мои друзья из GUIDE DAO (бывшая школа MCS) предлагают скидку 0,1 ETH на ВСЕ СВОИ БУТКЕМЫ ПО КРИПТЕ! Материалы этих буткемов подготовлены мной и другими специалистами:…
Мои друзья из GUIDE DAO (бывшая школа MCS) предлагают скидку 0,1 ETH на ВСЕ СВОИ БУТКЕМЫ ПО КРИПТЕ! Материалы этих буткемов подготовлены мной и другими специалистами:…
❤15🔥8👍1👏1
В общем, мы немного ещё почудили с нейронкой и я попросил написать мне песню в жанре хэви-метал про воина с большим мечом, который отправляется сразиться с драконом и завоевать славу. Если честно, то у многих групп примерно такие тексты и есть 😂
Увы, но на предложение создать группу я получил отказ
В общем, в интересное время живём.
Verse 1:
I am a warrior, armed with my sword
I'll fight for my honor, I'll fight for my lord
I'll face any challenge, no matter the cost
I'll conquer my fears, I'll never get lost
Chorus:
I am a warrior, I am unstoppable
I'll take on the dragon, I'll make it fall
I'll reach true glory, I'll stand tall
I am a warrior, I'll never fall
Verse 2:
The dragon is coming, its fire burning bright
I'll stand my ground, I'll fight with all my might
I'll swing my sword, I'll strike with all my force
I'll vanquish the beast, I'll stay on course
Chorus:
I am a warrior, I am unstoppable
I'll take on the dragon, I'll make it fall
I'll reach true glory, I'll stand tall
I am a warrior, I'll never fall
Bridge:
I'll take on the dragon, I won't back down
I'll fight till the end, I'll wear the crown
I am a warrior, I am unbreakable
I'll reach true glory, I am unstoppable
Chorus:
I am a warrior, I am unstoppable
I'll take on the dragon, I'll make it fall
I'll reach true glory, I'll stand tall
I am a warrior, I'll never fall
Увы, но на предложение создать группу я получил отказ
I'm glad you enjoyed the song! However, as an artificial intelligence, I don't have the ability to physically perform music or start a band.
В общем, в интересное время живём.
😁17👍11🔥1
Итак, друзья, обещанный стрим AMA наконец-то состоится вечером 25 декабря. Отвечу на ваши вопросы (можно заранее присылать в этот тред), просто пообщаемся, подведём некие итоги и, так сказать, поздравим друг друга с наступающим 2023. Увидимся! https://youtu.be/HV2Qty7dL-A
YouTube
СТРИМ! Итоги 2022 года, ask me anything, общение
В рамках этого стрима мы просто пообщаемся, я отвечу на вопросы по разным темам и подведу итоги этого года.
Станьте спонсором канала, и вы получите доступ к эксклюзивным бонусам: https://www.youtube.com/channel/UCN2waErKU52T_41pGgUimXw/join
Boosty: http…
Станьте спонсором канала, и вы получите доступ к эксклюзивным бонусам: https://www.youtube.com/channel/UCN2waErKU52T_41pGgUimXw/join
Boosty: http…
❤9👍6🔥2
Друзья, для всех недавно присоединившихся (и только начавших изучать разработку) напоминаю, что Git и сервисы вроде GitHub - это очень важные инструменты для любого программиста. Так что некоторое время назад мы с моим "учеником" подготовили видео, где за 50 минут рассказывается об основах Git и показываются принципы работы с GitHub https://www.youtube.com/watch?v=TjPhGD0XQ4I
YouTube
Git и GitHub для "самых маленьких" | Настройка и основные принципы работы с примерами
В этом видео мы рассмотрим систему Git и сервис GitHub, пользоваться которыми должен уметь каждый разработчик. Мы узнаем, зачем эти решения нужны, как они работают и как их правильно настроить. Посмотрим на практике как создать репозитарий, сделать коммиты…
👍22❤7🔥2👌2