Добрый пиар
Новая рубрика – делюсь каналами про крипту, кого читаю.
Сегодня расскажу про канал Криптологическая экспедиция. Дима пишет про крипто разработку под Эфир, фишки Солидити и немного про оффсайт ивенты. Пишет не часто, но по делу. Рекомендую к подписке!
Новая рубрика – делюсь каналами про крипту, кого читаю.
Сегодня расскажу про канал Криптологическая экспедиция. Дима пишет про крипто разработку под Эфир, фишки Солидити и немного про оффсайт ивенты. Пишет не часто, но по делу. Рекомендую к подписке!
1👍4
SPAM
Чят, от имени бота обратной связи канала пришел спам тем, кто мне писал когда-то. На фото скрин со второго акка, также отписал подписчик.
Я пока не понимаю, как так получилось, бот был создан через @LivegramBot, запрошу их ТП.
На всякий случай, ничего не открывать, токены не покупать и тд.
Есть у кого-то мысли, как это возможно?
Чят, от имени бота обратной связи канала пришел спам тем, кто мне писал когда-то. На фото скрин со второго акка, также отписал подписчик.
Я пока не понимаю, как так получилось, бот был создан через @LivegramBot, запрошу их ТП.
На всякий случай, ничего не открывать, токены не покупать и тд.
Есть у кого-то мысли, как это возможно?
Web3 разработчик
SPAM Чят, от имени бота обратной связи канала пришел спам тем, кто мне писал когда-то. На фото скрин со второго акка, также отписал подписчик. Я пока не понимаю, как так получилось, бот был создан через @LivegramBot, запрошу их ТП. На всякий случай, ничего…
Проблема спама найдена
И это Livegram, который без спроса отправил сообщения тем, кто с ним общался.
Нашел новость на каком-то китайском сайте, это не только у нас такое.
В итогеLivegram был выброшен на помойку просто указал свой ТГ для контакта.
Желаю всем поменьше спамеров и продуктивной рабочей недели 🚀
И это Livegram, который без спроса отправил сообщения тем, кто с ним общался.
Нашел новость на каком-то китайском сайте, это не только у нас такое.
В итоге
Желаю всем поменьше спамеров и продуктивной рабочей недели 🚀
👍4
Если работаете с расчетами цен, делайте это…
Два раза в день, спина не будет болеть.
Понял, что когда пишу расчеты цен, у меня очень много времени занимает, смотря на переменную/функцию типа price/usdPrice/ethPrice, понять, какой тут base и quote токен.
Сегодня озарило – использовать везде нотацию price_base_quote (слово price в начале, далее base токен, quote токен в конце), например:
Сегодня работал и просто кайфанул, мозг разгрузился.
Надеюсь, и вам жизнь облегчит 🫶
Понял, что когда пишу расчеты цен, у меня очень много времени занимает, смотря на переменную/функцию типа price/usdPrice/ethPrice, понять, какой тут base и quote токен.
Сегодня озарило – использовать везде нотацию price_base_quote (слово price в начале, далее base токен, quote токен в конце), например:
price_eth_usd
– цена eth в usdprice_usdс_eth
– цена usdc в ethgetPriceToken0Eth
– получить цену token0 в eth.Сегодня работал и просто кайфанул, мозг разгрузился.
Надеюсь, и вам жизнь облегчит 🫶
👍6
Web3 разработчик
Если работаете с расчетами цен, делайте это… Два раза в день, спина не будет болеть. Понял, что когда пишу расчеты цен, у меня очень много времени занимает, смотря на переменную/функцию типа price/usdPrice/ethPrice, понять, какой тут base и quote токен.…
3 дня использую и кайфую.
Еще вывел удобную мнемонику
Также, не нужно думать, как вычислять цены через промежуточные, например
Не высшая математика, но позволяет делать меньше ошибок.
Еще вывел удобную мнемонику
price_x_y
= amount_y
/ amount_x
(второе делим на первое).Также, не нужно думать, как вычислять цены через промежуточные, например
price_x_y
= price_x_a
× price_a_b
× price_b_y
– соседние рядом стоящие переменные “схлапываются”, остается только то что в начале (`x`) и конце (`y`).Не высшая математика, но позволяет делать меньше ошибок.
Искусственный интеллект
Давайте расскажу, как использую ИИ в работе. Только конкретика - что делаю в Cursor:
– Написать простую утилитку с четко формализуемой логикой – "вот CSV файл с адресами токенов, залезь в блокчейн и скачай их имя и decimals".
– SQL запросы для простой аналитики по таблице – "вот таблица с юзерами и датой регистрации, напиши запрос, чтобы показать количество зареганых юзеров по месяцам".
– Код не работает/глючит/еще что-то – "дай идеи, почему …". Да, половина идей может быть полной ерундой, но какие-то очень полезны.
– Написать бойлерплейт – "вот таблица, сделай структуры данных под нее".
– Написать простой алгоритм – "отсортируй этот массив по полю А, если его нет то по Б, иначе С".
– Сохранить в константы кода адреса деплойментов - "вот веб-страница (указываю УРЛ), скачай адреса контрактов и сохрани в константы". Cursor лезет в интернет и скачивает!
– При рефакторинге мультиязычного приложения – "переведи эти строки на русский и сохрани в переменные".
– Быстро преобразовать данные со скрина – "вот тебе два скрина с данными, посчитай между ними разницу в процентах".
Что самое впечатляющее – я обленился настолько, что даю задания через скриншоты – "вот скриншот таблицы из БД, сделай структуру данных в TypeScript" – и он меня почти всегда понимает.
ИИ – однозначно классный рычаг. Не заменяя программиста, помогает делать "черновую" работу.
Давайте расскажу, как использую ИИ в работе. Только конкретика - что делаю в Cursor:
– Написать простую утилитку с четко формализуемой логикой – "вот CSV файл с адресами токенов, залезь в блокчейн и скачай их имя и decimals".
– SQL запросы для простой аналитики по таблице – "вот таблица с юзерами и датой регистрации, напиши запрос, чтобы показать количество зареганых юзеров по месяцам".
– Код не работает/глючит/еще что-то – "дай идеи, почему …". Да, половина идей может быть полной ерундой, но какие-то очень полезны.
– Написать бойлерплейт – "вот таблица, сделай структуры данных под нее".
– Написать простой алгоритм – "отсортируй этот массив по полю А, если его нет то по Б, иначе С".
– Сохранить в константы кода адреса деплойментов - "вот веб-страница (указываю УРЛ), скачай адреса контрактов и сохрани в константы". Cursor лезет в интернет и скачивает!
– При рефакторинге мультиязычного приложения – "переведи эти строки на русский и сохрани в переменные".
– Быстро преобразовать данные со скрина – "вот тебе два скрина с данными, посчитай между ними разницу в процентах".
Что самое впечатляющее – я обленился настолько, что даю задания через скриншоты – "вот скриншот таблицы из БД, сделай структуру данных в TypeScript" – и он меня почти всегда понимает.
ИИ – однозначно классный рычаг. Не заменяя программиста, помогает делать "черновую" работу.
👍12
Приватники текстом в .env файлах
Каюсь, делал это до недавнего времени. Даже видел, как лежат в открытом виде приватники от $100K кошельков в .env. Думаю, не надо объяснять, почему это опасно – простой сканер .env файлов может вытащить немалые деньги. А скамеров хватает.
Наконец, нашел час и разобрался. Оказывается, все есть в ethers. Идея – зашифровать приватник паролем и хранить его в env в зашифрованном виде. Приложение при запуске читает зашифрованный приватник и дешифрует паролем. Я пароль разместил в таблицу в БД – т.к. вероятность одновременной утечки БД и .env файла мала.
Итак, сначала шифруем приватник. Пароль выбираете сами.
Зашифрованный приватник выглядит так (в начале адрес кошеля, что удобно - сразу понятно от какого):
Это вставляете в .env. В БД записываете пароль.
Далее в приложении расшифровываете:
Просто как 1-2-3! Наслаждаемся тем, что сильно улучшили свою безопасность.
А как ваши приложения хранят приватники?
Каюсь, делал это до недавнего времени. Даже видел, как лежат в открытом виде приватники от $100K кошельков в .env. Думаю, не надо объяснять, почему это опасно – простой сканер .env файлов может вытащить немалые деньги. А скамеров хватает.
Наконец, нашел час и разобрался. Оказывается, все есть в ethers. Идея – зашифровать приватник паролем и хранить его в env в зашифрованном виде. Приложение при запуске читает зашифрованный приватник и дешифрует паролем. Я пароль разместил в таблицу в БД – т.к. вероятность одновременной утечки БД и .env файла мала.
Итак, сначала шифруем приватник. Пароль выбираете сами.
const wallet = new ethers.Wallet("PRIVATE_KEY");
const encryptedWalletString = await wallet.encrypt('PASSWORD');
console.log(encryptedWalletString);
Зашифрованный приватник выглядит так (в начале адрес кошеля, что удобно - сразу понятно от какого):
{"address":"32f04*****","id":"f0596bf7-**","version":3,"Crypto":{"cipher":"aes-128-ctr","cipherparams":{"iv":"***"},"ciphertext":"*****","kdf":"scrypt","kdfparams":{"salt":"***","n":131072,"dklen":32,"p":1,"r":8},"mac":"***"}}
Это вставляете в .env. В БД записываете пароль.
Далее в приложении расшифровываете:
const encrypted = process.env.WALLET_ENCRYPTED!;
const password = …. // load password from the DB
const wallet = (await ethers.Wallet.fromEncryptedJson(encrypted, password)).connect(
new ethers.JsonRpcProvider(process.env.RPC_URL),
);
Просто как 1-2-3! Наслаждаемся тем, что сильно улучшили свою безопасность.
А как ваши приложения хранят приватники?
👍7
Вот и лето прошло пришло
Давно не писал, а есть о чем рассказать:
Работаю в команде AI вайб-трединг бота SQDGN. Команда пушка, продукт тоже. Видение – персонализированный бот-помощник, который будет помогать ритейлуинвестировать выживать в суровом мире скамов и автотрейдингов. Данные из sqd.ai, децентрализованного "озера данных".
Опубликовали в опенсорс сервисы, чтобы вытаскивать данные по свопам/ценам на дексах, и трансферам / холдерам (все EVM, пока Mainnet/Base). Как Dune на минималках, только self-hosted и бесплатно. Данные пишем в Clickhouse.
Освоил Clickhouse (ex-Yandex) для обработки больших данных. Первый месяц хочется выбросить ноут в окно, потом начинаешь получать удовольствие 🙂 В планах написать практическую статью для быстрого старта в Clickhouse для тех, кто работал с OLTP базами. Если интересно, ставь огонь.
Всем хорошего крипто-лета!
Давно не писал, а есть о чем рассказать:
Работаю в команде AI вайб-трединг бота SQDGN. Команда пушка, продукт тоже. Видение – персонализированный бот-помощник, который будет помогать ритейлу
Опубликовали в опенсорс сервисы, чтобы вытаскивать данные по свопам/ценам на дексах, и трансферам / холдерам (все EVM, пока Mainnet/Base). Как Dune на минималках, только self-hosted и бесплатно. Данные пишем в Clickhouse.
Освоил Clickhouse (ex-Yandex) для обработки больших данных. Первый месяц хочется выбросить ноут в окно, потом начинаешь получать удовольствие 🙂 В планах написать практическую статью для быстрого старта в Clickhouse для тех, кто работал с OLTP базами. Если интересно, ставь огонь.
Всем хорошего крипто-лета!
🔥18👍1
Forwarded from dev.insuline.eth
gm! JS инфраструктура в очередной раз поддается атакам на криптанов.
В этот раз задели несколько старых системных JS пакетов – debug (357M установок в неделю) и chalk (299М установок в неделю) и пачку остальных, с помощью взлома Git одного из предыдуших мейнтейнеров. Можно прочитать полный репорт здесь от владельца взломанного аккаунта. Вкратце – взлом 2FA доступов к NPM через email.
Как это может задеть вас?
При обыкновенном подключении кошелька ничего без вашего ведома не произойдет.
Скрипт внедряется в любую страницу, содержащую JS код и проверяет наличие Ethereum кошельков (с помощью проверки `window.ethereum`), затем при попытке отправки любой транзакции через кошелек просто подменяет адрес получателя.
Уязвимым может оказаться буквально любой веб-сайт, который в течение последних пары часов обновлял свои зависимости и установил взломанную версию. На текущий момент с NPM уже удалили версию с багом
Кажется, что ближайшие пару дней лучше избегать подписи транзакций, либо быть максимально внимательным к адресу получения. Адрес злоумышленника –
Что сделать разработчикам?
Проверьте lock файлы, ведь взломанные пакеты по большей части служебные и могут не использоваться напрямую в проекте.
Учитывая то, что пакетов – много, лучше пройти grep c фильтром на строку кода:
Обфусцированный скрипт оставили здесь, а тут немного больше деталей, как он работает под капотом.
Issues с предупреждениями и больше технических деталей:
https://github.com/chalk/chalk/issues/656
https://github.com/debug-js/debug/issues/1005
но tbh пока выглядит как самая грустная атака, кошелек абсолютно пустой🥰
В этот раз задели несколько старых системных JS пакетов – debug (357M установок в неделю) и chalk (299М установок в неделю) и пачку остальных, с помощью взлома Git одного из предыдуших мейнтейнеров. Можно прочитать полный репорт здесь от владельца взломанного аккаунта. Вкратце – взлом 2FA доступов к NPM через email.
Как это может задеть вас?
При обыкновенном подключении кошелька ничего без вашего ведома не произойдет.
Скрипт внедряется в любую страницу, содержащую JS код и проверяет наличие Ethereum кошельков (с помощью проверки `window.ethereum`), затем при попытке отправки любой транзакции через кошелек просто подменяет адрес получателя.
Уязвимым может оказаться буквально любой веб-сайт, который в течение последних пары часов обновлял свои зависимости и установил взломанную версию. На текущий момент с NPM уже удалили версию с багом
Кажется, что ближайшие пару дней лучше избегать подписи транзакций, либо быть максимально внимательным к адресу получения. Адрес злоумышленника –
0xFc4a4858bafef54D1b1d7697bfb5c52F4c166976
Что сделать разработчикам?
Проверьте lock файлы, ведь взломанные пакеты по большей части служебные и могут не использоваться напрямую в проекте.
Учитывая то, что пакетов – много, лучше пройти grep c фильтром на строку кода:
grep -r "const _0x112" node_modules/
Обфусцированный скрипт оставили здесь, а тут немного больше деталей, как он работает под капотом.
Issues с предупреждениями и больше технических деталей:
https://github.com/chalk/chalk/issues/656
https://github.com/debug-js/debug/issues/1005
но tbh пока выглядит как самая грустная атака, кошелек абсолютно пустой
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Случай еще раз говорит о том, что сам по себе холодный кошелек не спасет, если не проверять на его экране адрес получателя, что рекомендую делать всегда
❤2
Давеча копнул ERC4337 account abstraction (на этот раз с серьезной задачей для проекта). Вообще, отправка userOp – довольно тривиальная задача (туториалы и реализации есть у Zerodev, Alchemy, etc), но я хотел немного странного. А именно, отправить несколько userOp от разных smart contract wallets, но в одной onchain транзакции. И вот тут, после многодневных плясок с бубном, пришлось реализовать сборку массива userOp прямо самостоятельно, и потом отправлять на EntryPoint как обычную транзу.
Времени заняло много, но в целом понравилось – неплохо разобрался как оно вообще работает. Кому интересно – сниппет.
Не исключаю, что изобрел велосипед, если что - тыкните.
А в целом, AA понравился хотя бы за то, что можно делать аппрув+трансфер в одной транзакции (тот самый Web3 UX LFG!).
Времени заняло много, но в целом понравилось – неплохо разобрался как оно вообще работает. Кому интересно – сниппет.
Не исключаю, что изобрел велосипед, если что - тыкните.
А в целом, AA понравился хотя бы за то, что можно делать аппрув+трансфер в одной транзакции (тот самый Web3 UX LFG!).
👍5