Сегодня просто музыка. Спокойной ночи 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
Минут через 5 начнём, залетайте пообщаться 😄 https://www.youtube.com/watch?v=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
Финальная игра года, готовность 5 минут https://www.youtube.com/watch?v=4EoQ8xGYivA %)
YouTube
СТРИМ! Интеллектуальная игра MCS Answer, финальный выпуск 2022 года
Традиционная интеллектуальная игра MCS Answer, финальный выпуск 2022 года.
Станьте спонсором канала, и вы получите доступ к эксклюзивным бонусам: https://www.youtube.com/channel/UCN2waErKU52T_41pGgUimXw/join
Boosty: https://boosty.to/bodrovis
Patreon: h…
Станьте спонсором канала, и вы получите доступ к эксклюзивным бонусам: https://www.youtube.com/channel/UCN2waErKU52T_41pGgUimXw/join
Boosty: https://boosty.to/bodrovis
Patreon: h…
👍2
И тогда любители JS зашумели, завопили, ибо были они несовершенны... Пардон, это не из той книги и не того автора.
В общем, если вы хотите в JS делать mocks/stubs/spies, как в Ruby, то всё просто: можно использовать SinonJS. А затем можно делать заглушки для методов или даже заменять их:
Пример ннннада? Всё для вас https://github.com/lokalise/node-lokalise-api/commit/747ab8c8a9e7abae546fbdb252e8453dd9eccd26#diff-13ed311bf18c8fa8651f0ff4ac9f8dccbe799e9dc2d0b627197fc242c2fe6efbR22 😄
В общем, если вы хотите в JS делать mocks/stubs/spies, как в Ruby, то всё просто: можно использовать SinonJS. А затем можно делать заглушки для методов или даже заменять их:
sinon.replace(Class, "method", function () {
return "my val";
});Пример ннннада? Всё для вас https://github.com/lokalise/node-lokalise-api/commit/747ab8c8a9e7abae546fbdb252e8453dd9eccd26#diff-13ed311bf18c8fa8651f0ff4ac9f8dccbe799e9dc2d0b627197fc242c2fe6efbR22 😄
GitHub
Properly find and read package.json · lokalise/node-lokalise-api@747ab8c
Lokalise API v2 Node.js client. Contribute to lokalise/node-lokalise-api development by creating an account on GitHub.
👍10😱2
John Doe поделился ссылкой https://www.npmjs.com/package/hardhat-storage-layout - это решение выгружает "схему" storage для контракта.
Кстати говоря, работает эта штука элементарно, любой желающий может воспроизвести что-то подобное. Они читают артефакт, смотрят ABI
А потом просто тащат отткуда stateVariables https://github.com/aurora-is-near/hardhat-storage-layout/blob/main/src/storageLayout.ts#L63
Кстати говоря, работает эта штука элементарно, любой желающий может воспроизвести что-то подобное. Они читают артефакт, смотрят ABI
const storage =
artifactJsonABI.data.output?.contracts?.[sourceName]?.[contractName]
?.storageLayout?.storage;
А потом просто тащат отткуда stateVariables https://github.com/aurora-is-near/hardhat-storage-layout/blob/main/src/storageLayout.ts#L63
npm
npm: hardhat-storage-layout
Hardhat plugin for exporting the contract storage layout. Latest version: 0.1.7, last published: 3 years ago. Start using hardhat-storage-layout in your project by running `npm i hardhat-storage-layout`. There are 11 other projects in the npm registry using…
👍7
Итак, друзья, хотел всё-таки поздравить всех с наступающим. В общем-то, мы уже всё подробно обсудили в стриме "итоги года", так что тут не буду повторяться. Берегите себя и будьте здоровы.
Ну, и небольшой музыкальный трек от нас. Записан он был буквально за день, в целом получился некий ambient. Скоро увидимся! https://youtu.be/mkWfwDC6WRw
Ну, и небольшой музыкальный трек от нас. Записан он был буквально за день, в целом получился некий ambient. Скоро увидимся! https://youtu.be/mkWfwDC6WRw
YouTube
Sailing A'Viking | Folkearth cover
Sailing A'Viking performed by Ravens Die Laughing, Folkearth cover.
👍12❤3👌1
Ну, а пока всех отдыхают небольшое видео из онлайн-игры, где мы проводили концерт в новогоднюю ночь 😄 Скоро увидимся! https://www.youtube.com/watch?v=C4dnL-GLwl0
YouTube
"Hope, pt. 2" | New Year 2023 concert in LotrO
New Year 2023 concert "Hope pt. 2" in Lord of the Rings online performed by Northern Pride.
00:06 Lord of the Rings (symphony)
10:21 Dark Chest of Wonders (Nightwish)
14:33 Armata Strigoi (Powerwolf)
19:00 Barrels of Whiskey (The O'Reilleys and The Paddyhats)…
00:06 Lord of the Rings (symphony)
10:21 Dark Chest of Wonders (Nightwish)
14:33 Armata Strigoi (Powerwolf)
19:00 Barrels of Whiskey (The O'Reilleys and The Paddyhats)…
Друзья, как вы знаете, я большой фанат open source 🤪 Вот тут собраны разнообразные советы и соображения насчёт подобных проектов, которые помогут начать собственный проект и внести, так сказать, посильный вклад. https://un.curl.dev/
un.curl.dev
Uncurled - Uncurled
everything I know and learned about running and maintaining Open Source projects for three decades
👍19❤🔥5
Сегодня музыка. Melnās - означает буквально "чёрные", buras - паруса https://www.youtube.com/watch?v=v5hDhkVEboY
YouTube
Skyforger - Melnās Buras (OFFICIAL VIDEO)
Video "Melnās buras" (The Black Sails) from Skyforger album "Senprūsija" (Old Prussia).
See clip info, upcoming tour dates and song lyrics below.
▶ Stream/HQ download https://skyforger.bandcamp.com/album/senpr-sija
▶ Stream on Spotify https://open.sp…
See clip info, upcoming tour dates and song lyrics below.
▶ Stream/HQ download https://skyforger.bandcamp.com/album/senpr-sija
▶ Stream on Spotify https://open.sp…
👍5
Друзья, у меня возникла мысль сделать серию лекций (возможно, в формате стримов) по soft skills, тк все про них говорят и мало кто поясняет, в чём суть и зачем это надо. К примеру, публичные выступления, написание писем и сообщений на английском, работа в команде. В целом, это будет полезно всем. 🤓
🔥98👍6👏2
Что ж, раз идея оказалась удачной, то чего откладывать дело в долгий ящик. Давайте прямо завтра вечером и проведём первое занятие, 20:00 UTC+2 https://youtu.be/KyThNwSNPqU Welcome!
YouTube
Soft skills для всех #1 | Публичные выступления
Это новая серия, в рамках которой мы будем говорить о так называемых soft skills, требующихся любому специалисту. В первой лекции обсудим, в чём вообще суть soft skills и поговорим про публичные выступления.
Станьте спонсором канала, и вы получите доступ…
Станьте спонсором канала, и вы получите доступ…
👍16🔥4⚡3