DEV: Рубиновые тона – Telegram
DEV: Рубиновые тона
3.21K subscribers
144 photos
2 videos
8 files
981 links
Анонсы новых видео о программировании (Ruby/Rails, Solidity/Ethereum, Python, JS и не только), практические советы, обзор полезных инструментов и новости из мира IT
Download Telegram
Итак, друзья, запись трансляции будет чуть позже (пока её 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
А, и кстати: сегодня же день "Звёздных войн" 😄
🔥92👍1🎉1
Я всё ещё эпизодами дочитываю в очередной раз Тэффи и нашёл такой момент:

Портрет мой, нарисованный Репиным, получился какой-то волшебно-нежный, совсем неожиданный, не похожий на могучую лепку репинской кисти.
Он обещал его мне. Но ко мне он так и не попал. Был послан на выставку в Америку и, по словам Репина, застрял в таможне.
Мне неловко было расспрашивать и настаивать. Мне говорили:
— Он не хочет признаться, что продал его.
Все равно. Он пропал бы во время революции, как пропали все мои портреты и многие любимые мною вещи, без которых, казалось бы, и жить не стоило…


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

Когда-то, в другой жизни, я уехал практически без ничего. Сумка с компьютером, который спустя год всё равно пришлось собирать заново посреди ночи из тех запчастей, что удалось купить в срочном порядке, сумка с кошкой, стойка и микрофон, какой-то минимум одежды...

А потом как-то обживаешься, и в общем-то не скучаешь по тому, что осталось где-то там, от чего и так уже в душе давным-давно отказался. То же самое можно купить опять, это ведь не проблема. Вещей не жаль. Жаль людей.

И тут вспоминается Сапковский:

- Co ty mozesz wiedziec, Itka - miauknela cicho, zlowrogo kotka. - Zal? Moze i tak, zal mi ich. Zal mi dotyku ich rak. Zal mi szmeru ich oddechów, gdy spia. Zal mi ciepla ich kolan. Zal mi naszej muzyki, która, ledwo poznana, trace.


Действительно жаль. Когда теперь ещё увидимся?

Но остаётся работа, остаются мысли о том, что, насколько это возможно, мы можем делать мир лучше - хотя бы для кого-то. Отзывы зрителей - это лучшая награда.

А теперь почему-то вспоминается давнее турне по Италии и Франции, которое удалось устроить лет... хотел написать 5-6, но, кажется, уже 6-7 назад.

Тогда мы как раз и посетили Русское кладбище в пригороде Парижа, поклонились могиле Тэффи, Нуреева, участникам белого движения... К счастью, родственники помогли обустроиться, так что мы прожили во Франции почти неделю.

В один день зашли в какой-то бар и почему-то @ailura24 улетела с одного коктейля (алкоголя налили много?). Ходили по всему Версалю как два шатающихся дурака. Глупо ведь, а весело. Потом уже ночью гуляли все вместе, какие-то весёлые парижане кричали нам с балкона, приглашали на тусовку к ним домой.

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

В любом случае, не нужно опускать руки. Мы живы, мы здесь. Adsumus. Adsumus in nomine tuo.
👍17🤔2👎1🤯1😢1
Друзья, возник справедливый вопрос по атаке типа reentrancy и функциям transfer/send - являются ли они гарантией безопасности?

Так вот, reentrancy в теории может быть везде, где есть вызов сторонних контрактов. Желательно априори считать вызов сторонних неизвестных контрактов небезопасным.

Функции transfer/send действительно имеют жёсткий лимит по газу (2300), но и в него тоже можно уместиться и сделать что-нибудь нехорошее. Вообще-то, раньше transfer действительно считалась безопасной функцией (её и ввели для защиты от reentrancy), но только никто не учёл, что стоимости по газу могут меняться. Если раньше "втиснуться" в лимит 2300 особо было нельзя, то теперь вполне можно (стоимости упали). Например, вот тут немного подробнее https://immunebytes.com/transfer-in-solidity-why-you-should-stop-using-it/ Короче, нужно быть осторожными
👍12