TGViewer
Channel Public Channel
DEV: Рубиновые тона

DEV: Рубиновые тона

@dev_in_ruby_colors

Анонсы новых видео о программировании (Ruby/Rails, Solidity/Ethereum, Python, JS и не только), практические советы, обзор полезных инструментов и новости из мира IT
Subscribers
3.28K
Photos
156
Videos
2
Links
1.1K

Showing posts older than #611 · Back to latest

Older Posts 20 shown
Post #610 1.2K
Друзья, как вы знаете, я большой фанат 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
Post #609 1.1K
Post #608 1.47K
Итак, друзья, хотел всё-таки поздравить всех с наступающим. В общем-то, мы уже всё подробно обсудили в стриме "итоги года", так что тут не буду повторяться. Берегите себя и будьте здоровы.

Ну, и небольшой музыкальный трек от нас. Записан он был буквально за день, в целом получился некий ambient. Скоро увидимся! https://youtu.be/mkWfwDC6WRw
YouTube Sailing A'Viking | Folkearth cover Sailing A'Viking performed by Ravens Die Laughing, Folkearth cover.
  • 👍 12
  • ❤ 3
  • 👌 1
Post #607 1.34K
John Doe поделился ссылкой https://www.npmjs.com/package/hardhat-storage-layout - это решение выгружает "схему" storage для контракта.

Кстати говоря, работает эта штука элементарно, любой желающий может воспроизвести что-то подобное. Они читают артефакт, смотрят 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
  • 👍 7
Post #606 1.25K
И тогда любители JS зашумели, завопили, ибо были они несовершенны... Пардон, это не из той книги и не того автора.

В общем, если вы хотите в 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
Post #605 1.41K
Post #604 1.38K
Post #603 1.42K
Друзья, для всех недавно присоединившихся (и только начавших изучать разработку) напоминаю, что Git и сервисы вроде GitHub - это очень важные инструменты для любого программиста. Так что некоторое время назад мы с моим "учеником" подготовили видео, где за 50 минут рассказывается об основах Git и показываются принципы работы с GitHub https://www.youtube.com/watch?v=TjPhGD0XQ4I
YouTube Git и GitHub для "самых маленьких" | Настройка и основные принципы работы с примерами В этом видео мы рассмотрим систему Git и сервис GitHub, пользоваться которыми должен уметь каждый разработчик. Мы узнаем, зачем эти решения нужны, как они работают и как их правильно настроить. Посмотрим на практике как создать репозитарий, сделать коммиты…
  • 👍 22
  • ❤ 7
  • 🔥 2
  • 👌 2
Post #602 1.17K
Итак, друзья, обещанный стрим AMA наконец-то состоится вечером 25 декабря. Отвечу на ваши вопросы (можно заранее присылать в этот тред), просто пообщаемся, подведём некие итоги и, так сказать, поздравим друг друга с наступающим 2023. Увидимся! https://youtu.be/HV2Qty7dL-A
YouTube СТРИМ! Итоги 2022 года, ask me anything, общение В рамках этого стрима мы просто пообщаемся, я отвечу на вопросы по разным темам и подведу итоги этого года. Станьте спонсором канала, и вы получите доступ к эксклюзивным бонусам: https://www.youtube.com/channel/UCN2waErKU52T_41pGgUimXw/join Boosty: http…
  • ❤ 9
  • 👍 6
  • 🔥 2
Post #601 1.23K
В общем, мы немного ещё почудили с нейронкой и я попросил написать мне песню в жанре хэви-метал про воина с большим мечом, который отправляется сразиться с драконом и завоевать славу. Если честно, то у многих групп примерно такие тексты и есть 😂

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
Post #600 1.25K
В этом уроке по Solidity мы узнаем, как подписывать сообщения оффчейн с помощью закрытого ключа пользователя. Также мы узнаем, как с помощью ecrecover "восстанавливать" подписывающего из сообщения и с помощью этого механизма реализуем сценарий, когда за перевод денежных средств платит не отправитель, а получатель. https://www.youtube.com/watch?v=QODPMaUlrLw
YouTube Solidity и Ethereum, урок #40 | ecrecover, подпись оффчейн/проверка подписи, платежи без газа ХОТИТЕ СТАТЬ РАЗРАБОТЧИКОМ Solidity, узнать об Ethereum, блокчейне и многом другом ещё больше?! Мои друзья из GUIDE DAO (бывшая школа MCS) предлагают скидку 0,1 ETH на ВСЕ СВОИ БУТКЕМЫ ПО КРИПТЕ! Материалы этих буткемов подготовлены мной и другими специалистами:…
  • ❤ 15
  • 🔥 8
  • 👍 1
  • 👏 1
Post #599 1.07K
Отвечая на вопрос по следам двух прошлых уроков про байткод: что именно происходит при попытке использования delegatecall? Иными словами, что там в байткоде?

Ответ очень простой: ничего особенного 😄 По факту, это можно проверить самостоятельно с подобными контрактами

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
Post #598 975
В общем, ради развлечения немного пошутковал с нейросетью (тред). Началось с того, что я спросил, что делает конкретный байткод, на что получил ответ "да фиг его знает"
  • 🤣 8
Post #597 1.05K
Post #596 1.04K
Post #595 1.07K
Друзья, предварительно: завтра вечером в районе 21-22 UTC+3 будет стрим по Solidity и байткоду. Посмотрим, как вызываются функции, какие там опкоды и особенности. Думаю, будет интересно 😄
  • 🔥 18
  • 👍 3
Post #593 1.23K
Post #592 1.37K
Культурные типажи (модель Льюиса)
  • 🤔 4
  • ❤‍🔥 3
  • 👍 2
  • ⚡ 1
  • 🔥 1
Post #591 1.27K
В этом месяце состоялась годовщина нашего фотопроекта "Легенды Оссиании", которому исполнилось пять лет. В рамках проекта мы выпустили некоторое количество фотокомиксов - как серьёзных, так и смешных (сюжет всего этого безобразия писал ваш покорный слуга). К сожалению, политическая ситуация не позволяет нам продолжать работу (участники проекта живут в разных странах), но хотя бы есть, что вспомнить. Эта страница фотокомикса, пожалуй, наиболее любимая и в целом наиболее личная (как и вся эта и последующая части). На создание всей этой истории ушло какое-то легендарное количество времени, но результат получился вполне приличным. Ссылка здесь https://vk.com/ossiania_legends (постоянные читатели и так её уже видели). Ну, а мы с вами скоро увидимся, ибо в этом месяце планируется аж три стрима по разным темам. Берегите себя.
  • 👍 8
  • 🍾 3
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →