DEV: Рубиновые тона – Telegram
DEV: Рубиновые тона
3.21K subscribers
144 photos
2 videos
8 files
981 links
Анонсы новых видео о программировании (Ruby/Rails, Solidity/Ethereum, Python, JS и не только), практические советы, обзор полезных инструментов и новости из мира IT
Download Telegram
Друзья, как насчёт устроить стрим в это воскресенье вечером и поговорить про ERC20? Особенно полезно будет для новичков. Ну, и другие вопросы тоже можно задавать - постараюсь ответить, если это в моей компетенции. 🤓
👍38
Ну, вот примерно поэтому я практически ничего не публикую на LinkedIn, кроме ссылок на видео. Ярмарка тщеславия. Кстати, стрим в воскресенье уже анонсирован на канале. Буду рад видеть всех.
👍11😁7🔥1
Итак, друзья, запись трансляции будет чуть позже (пока её YT обрабатывает), а вот коммит этого урока https://github.com/bodrovis-learning/Solidity-YT-Series/commit/06231cd6fc7435276c93e5b80567f00715dfb4d0

Почему не добавился токен в Metamask: я просто сделал глупую ошибку и при деплое забыл указать, в какую сетку разворачиваем. Команда должна быть такая: npx hardhat run noscripts\deploy --network localhost Тогда всё сработает - просто копируете второй адрес с экрана, добавляете в metamask и он подцепит имя токена и его символ, и там можно будет прямо через метамакс эти токены даже переводить (ну, сначала их купить только надо, отправив нужное кол-во wei на адрес самого магазина). Спасибо всем за вопросы и активное участие!
👍7
Нашёл старый проект на Ruby, который я использовал для работы с файлами MD, публикации на GitHub и конвертации их в PDF. В принципе, этот проект уже давно заброшен, но одна строка всё ещё полезна: она показывает, как с помощью pandoc и latex конвертировать md в pdf 😄 https://github.com/bodrovis/lessons_indexer/blob/master/lib/lessons_indexer/course.rb#L44=
😁2🤔1
Год 1999. Почему-то я хорошо помню именно его завершение. Уже наступила зима, и мы с моим товарищем сидим дома. Удивительно, как нас растащила жизнь, какими разными стали наши судьбы, но всё равно мы до сих держим связь... Мы играем в PlayStation - это последний писк моды. "Крутой" игрой тогда считается Quake II, которую портировали с PC. Хотя компьютер у нас уже тоже был, играть вдвоём возможным не представлялось, а вот на PS - пожалуйста. Я играю за зелёного солдата, а мой друг - за фиолетового. Это наши любимые цвета. Нужно собрать как можно больше "фрагов", хотя в режиме разделённого экрана это сложно, ведь каждый видит, что делает другой.

Помню, что тогда все почему-то страшно боялись "проблемы 2000". Сейчас, спустя почти 23 года, смешно об этом вспомнить, но в то время многие думали, что ровно в 00 часов 1 января 2000 года все компьютеры разом перестанут работать, потому что дата магическим образом "обнулится". Мало кто был в курсе, что дата-время хранится в формате "количество секунд с момента начали эпохи Unix 1 января 1970" (кстати, в один прекрасный момент переполнение всё-таки случится, но есть подозрение, что тогда эту проблему легко решат). Но вот забавно: в тот день во всём доме напрочь вырубилось всё электричество, испортив нам игру. Предположили, что компьютеры репетируют глобальное отключение на Новый год. Конечно же, ничего подобного не произошло и всё продолжило работать как и раньше.

Не сказать, что тогда было сильно весёлое время, но всё-таки мы встречали 2000--й в приподнятых чувствах (между прочим, новое тысячелетие начинается с 2001 :)). Хотелось верить, что уже очень скоро, как обещали в "Назад в будущее", у нас будут летающие скейты и вообще всякие фантастические штуки. Хотя, в каком-то смысле, чудеса действительно появились: голосовые помощники, криптовалюта, электромобили, электроскутеры для всех желающих...

По ощущениям, примерно тогда же (хотя, кажется, за 2-3 года до этого) на небе неожиданно показалась комета. Ни до этого, ни после я не видел ничего подобного. Была середина зимы и мы с дедом выходили ночью в заснеженное деревенское поле смотреть на звёздное небо. В городе ведь такого никогда не увидеть. Луна, россыпь маленьких точечек и огромная звезда с размытым хвостом, которая просто торчала практически на одном месте. Выглядело жутковато. Мы вдвоём, в тёплых шубах... Человек, который хорошо помнит ещё Вторую мировую, и я, которому придётся стать свидетелем ещё многих войн. Первая чеченская уже закончилась - на неё чуть не забрали отчима (он стал милиционером и потом мы боялись, что он погибнет при очередном теракте). Потом вторая, потом совершенно никому непонятное нападение на Грузию, аннексия Крыма, нападение на Украину... Кто мог поверить тогда в середине девяностых во что-то подобное? Мы ведь ездили в Крым каждый год с 1996 по 2006.... Доведётся ли съездить когда-нибудь ещё? Да и где теперь тот деревенский домик, где мы смотрели на звёздное небо?

Интересно, как давно это было и как это неожиданно вспомнилось. Что ощущается? Печаль. Печаль от несбывшихся надежд. Обычно ведь я чувствую себя на 17 лет максимум, но вот иногда почему хочется сказать "какой же я старый". Глупо, тем более, что я вообще не старый. Откуда мысли? Это всё могло быть, но этого не случилось. Лучшего будущего в глобальном смысле не случилось. Остались только какие-то песни из совсем другого времени. "Дождь" ДДТ, к примеру. Страны, в которой я родился, уже давным-давно нет ни на одной карте, института, который я закончил, тоже не существует. Скучаю ли я по всему этому? Уж точно не по стране из четырёх букв. Но тогда, в начале девяностых, мы любили запад - ну, во всяком случае, относились совсем иначе. "Ножки Буша". Полупьяный Ельцин, который смеётся вместе с этим самым Бушем над дурацкой шуткой. Дружба и очень короткий мир.
11👍7
Но чемоданное настроение не покидало меня долгие годы: я знал, что уеду при первой же возможности. Либо репатриация, с которой, правда были свои немалые сложности, либо другим способом. Уехать мне довелось задолго до всей нынешней ситуации... А теперь западом пугают детишек в РФ. Пугают "мной" и моими друзьями по всему миру. Вот так оно получилось.

Но не иметь возможности даже навестить немногих оставшихся родственников и знать, что ты, вероятно, не сможешь сделать этого ещё долгие годы, - это иногда тяжеловато. Что думали беженцы в 1917 году? Ещё месяцок-другой, и мы вернёмся. Но проходили годы, а вернулись единицы. Впрочем, это просто мысли вслух, ибо многим людям сейчас гораздо, гораздо хуже. До мая я всё ещё собираю пожертвования, и обязательно отправлю средства в один из выбранных благотворительных фондов - в очередной раз я могу лишь высказать восхищение Lokalise, которые собрали 600 с лишним тысяч евро на одном энтузиазме. У меня, конечно, такого охвата и таких ресурсов нет, но всё же. Своё отношение ко всему происходящему я высказывал уже много раз, да и речь сегодня не о нём.

Вероятно, вот статья по теме, хотя я никогда не интересовался, как эта комета называется. Я надеюсь, что вы в безопасности, где бы вы не находились. You are awesome. Скоро увидимся. https://ru.wikipedia.org/wiki/C/1995_O1_(%D0%A5%D0%B5%D0%B9%D0%BB%D0%B0_%E2%80%94_%D0%91%D0%BE%D0%BF%D0%BF%D0%B0)
16👍1
Для разработчиков Ruby, которые используют Lokalise API и OAuth 2, я рад представить новую библиотеку для omniauth. С её помощью запрашивать токены OAuth 2 стало ещё проще 😄 https://github.com/bodrovis/omniauth-lokalise
👍12
Не слишком весёлая история о том, как на контракте застряло почти 35 миллионов баксов. В один прекрасный день одна компания запустила аукцион по типу "голландского" (кстати, он очень похож на то, что писали мы, только посложнее). Только там можно было делать сразу несколько ставок, а проигравшим выплачивались деньги обратно , вот тут исходники, см. примерно с 500 строки, тк до этого идут всякие библиотеки https://etherscan.io/address/0xf42c318dbfbaab0eee040279c6a2588fa01a961d#code=
👍6
А суть здесь в чём. У этих ребят вышло так, что они неправильно учитывали кол-во ставок сделанных и вместо того, чтобы прибавлять общее кол-во ставок (от 1 до 3) делали всегда ++ то есть инкремент на 1. Это привело к тому, что одно условие всегда оказывалось ложным и деньги никогда нельзя было снять.

Это не говоря о том, что один умник заблочил процесс выплаты refund, тк отправил проигрышную ставку не с кошелька, а с контракта. В контракте у него функция receive, которая всегда возвращает ошибку. В итоге, так как рефанды делаются в цикле, в какой-то момент процесс застопорился из-за этой самой ошибки в receive. Вышло, что ни владельцы деньги снять не могут, ни участники, тк пока не выплачены рефанды, то и средства забрать нельзя https://twitter.com/0xInuarashi/status/1517676162138267648
😁6👍2😢1
Немного подробнее.

Если атакующий делает проигрышную ставку с контракта, а в контракте есть receive, которая всегда возвращает ошибку, то попытки возместить проигравшую ставку заведомо обречены. В коде возврат делался стандартным образом:

            if (refund > 0) {
(bool sent, ) = bidData.bidder.call{value: refund}("");
require(sent, "Failed to refund bidder");
}


А коль скоро возвратов много и их надо обрабатывать в цикле, то как только попадается адрес контракта злоумышленника, то и вся цепочка обрывается. Правда потом злоумышленник всё-таки вышел на связь и сказал, что просто хотел показать ненадёжность аукциона и этот блок убрал (у него в receive просто стояло элементарное условие вида "возвращать ошибку/не возвращать ошибку"). Если ошибку не возвращать, то просто пробрасывать принятые деньги на кошелёк атакующего, что вернуть свою ставку. Ну, либо там мог быть бесконечный цикл, вот пример https://twitter.com/0xInuarashi/status/1517677597978599425

Вроде бы, всё ок, то есть возвраты стали работать и участники аукциона свои деньги назад таки получили.

Но есть и другой неприятный момент. В коде для функции claimProjectFunds, которая выводила деньги на счёт устроителей, было условие refundProgress >= totalBids (то есть нужно, чтобы было выплачено возвратов столько, сколько было ставок, видимо) - только после этого сами владельцы контракта могут забрать вырученные средства, то есть победившие ставки.

Однако дополнительно была введена переменная bidIndex, которая тоже была связана с числом ставок. В функцию bid, приходила не только денежная сумма, а ещё и количество ставок (amount), которое могло варьироваться от 1 до 3. Но владельцы контракта это не учли и вместо того, чтобы написать bidIndex += amount написали bidIndex++ (ну, либо им надо было ещё одну переменную выделять на это).

А дальше самое интересное. В функции для обработки возвратов стояло ещё одно условие require(_refundProgress < _bidIndex, "Refunds already processed");. То есть кол-во возвратов не могло превышать кол-во bidIndex. Но если вспомнить, что bidIndex считается неправильно (а многие юзеры делали сразу много ставок), то refundProgress всегда будет меньше, чем totalBids (то есть кол-во ставок в принципе, которое как раз считалось правильно). А теперь мы вспомним условие в функции "забрать себе деньги за аукцион": require(refundProgress >= totalBids, "Refunds not yet processed");.

Фактически, это условие истинным не будет никогда, то есть устроители аукциона обманули самих себя, и деньги застряли на их же контракте.
👍9🔥4
DROP TABLE
😁8🔥1
😁202👍2