InVM - изнутри о Web3
405 subscribers
46 photos
5 files
74 links
Про тонкости работы Defi в EVM-блокчейнах глазами solidity разработчика.

Админ @zerofuz
Download Telegram
Команда etherscan добавила расширение «Node Tracker», что в ней интересного:
// Держите в уме, что запуск одной ноды стоит от 500$ на aws в месяц
// erigon
https://github.com/ledgerwatch/erigon клиент хранит данные емче geth, новые блоки с задержкой.

ethereum 6040936 нод в p2p сети
Топ 2 страны US 56%, DE 14%
Официальный клиент ноды geth (на golang) занимает 60% от запущенных нод
Erigon 14%
Q-client 14% (Что это такое?)

bsc 451534 нод в p2p сети
Топ 3 страны US 54%, Ireland 14%, DE 11%.
bsc-geth официальный клиент (форк geth) занимает 43%
erigon клиент 56%

polygon 55035 нод в p2p сети
Топ 3 страны US 52%, DE 30%, FR 4%
bor оффициальный клиент (форк geth) заимает 71%
erigon 20%
0.7% нод запущено счастливчиками на windows 😄

gnosis 30784 нод в p2p сети
Топ 3 страны US 41%, DE 16%, FR 5%
Nethermind (C# оффициальный клиент) занимает 97%

Заметки:
1. erigon значительно вырос за последний год. Авторы из СНГ
2. Большая доля erigon сигнализирует об интересе в data mining из archival node, когда хранится ВСЯ история транзакций, счет идет на ТераБайты. Например AML сканерам будет дешевле содержать erigon, чем geth
3. Децентрализация по гео слабая, около половины нод в US.
4. Децентрализация по провайдерам нод точно не лучше. Большинство приходится на aws, google cloud, azure.
5. «Node Tracker» фича прикольная, но делает легче сбор ip адресов нод для последующего сканирования на открытые порты, поиск валидаторов с недостаточной защитой и абуз мощностей, если открыты rpc порты (как для metamask короче)
6. «Эта ж сколько бабок тратится на столько запущенных нод»
#HACK
Произошла спланированная атака на sandwith MEV ботов. ~25kk$

Коротко:
- Атакующие стали валидаторами и создали токен пару недель назад.
- Отправили выгодную транзакцию свапа в мемпуле и арб боты перехватили ее (тоесть в бандле смайнится быстрее чем в публичном мемпуле) и отправили бандл (mevTx1, targetTx, mevTx2), все поверхностные проверки что бандл прибыльный пройдены.
- Этот бандл попал на майнинг блока к атакующему валидатору (например валидатор подключен к flashbots)
- Валидатор подменил target на обратное направление свапа, сделав mevTx2 убыточной
- Смайнил блок

Стоимость атаки:
- 32eth(валидатор)
- Создание токена с ликвидностью 10k-500k$
- Подобрать такое соотношение ликвидности и размера свапа, чтобы sandwith боты вливали млн$ чтобы извлечь выгоду из «очевидно прибыльной транзакции»

Источник:
https://twitter.com/PeckShieldAlert/status/1642787345366941697
#HACK

Sushiswap RouterProcessor2 контракт скомпроментирован, атакующие могут распоряжаться средствами, которые разрешено тратить контракту.
В сети eth 0x044b75f554b886a065b9567891e45c79542d7357, и других сетях.

Один из вариантов проверить, не дал ли кошелек лишний апрув, так: https://etherscan.io/tokenapprovalchecker , ввести адрес кошелька и посмотреть его approvals, подозрительные отключить.

Для исполнения атаки нужен собственный контракт, который обащается к RouterProcessor2.uniswapV3SwapCallback

Источник: https://twitter.com/peckshield/status/1644907207530774530?s=20
#HACK
Разберемся, безопасен ли токен grimace в догечейне, который активно продвигают.
Смарт-контракт не верифицирован в сканере, поэтому проверим по-другому.

На dexscreener и dextools есть и покупки и продажи. Простейший ханипот отпадает, но что, если внутри кода есть метод на отключение продаж?

Goplus не поддерживает dogechain
decompile.tools не поддерживает dogechain

Повышаем ставки

Код контракта из сканнера вставляем в ethervm.io, подозрительных функций не видно, но может внутри одной из функций будет триггер? Например, если вызвать .transfer с конкретным большим числом, то это отключит возможность продавать.
- Пойдем с конца, легче найти tx.log Transfer
- Перевод завершается по Transfer(address,address,uint256) 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
- func_052F - функция перевода токенов, в нее входят из .transfer и .transferFrom
- 0xa9059cbb - transfer(address,uint256)
- 0x23b872dd - transferFrom(address,address,uint256)
- При беглом осмотре подозрительного кода не видно

panoramix
Все выглядит хорошо, кроме .name() и .symbol() (вывод panoramix в первом комментарии)
В ethervm.io аналогично

Посмотрим как выглядят функции в контрактах с верифицированным кодом (предоставленный .sol файл скомпилировался в конретный байткод на стороне сканера bscscan и поэтому сканер показывает исходный код)

wbnb (panoramix код в комментах)
Все функции хорошо читаются, подвоха точно нет, но интересующие функции отличаются от grimace, пропускаем.

pepeai (panoramix код в комментах)
.name() и .symbol() внешне совпадают с кодом от grimace, у pepeai код верифнут. Следовательно, grimace методы тоже надежные.

Можно было подойти с другой стороны, разместить код из dogechain в avax/polygon сети и пройтись более человечными анализаторами, но это слишком просто)

Выводы:
- Код контракта полностью безопасен
- Grimace основан на версии компилятора 0.8.16 как и pepeai
- Остаются риски с влиянием на цену крупными холдерами токенов, но где такого нет? 😄
Когда стоит задача прочитать tx.data, не всегда известно abi, чтобы правильно выделить аргументы.

Быстрое решение - размечать аргументы под каждый случай.

samczsun опубликовал abi-guesser

Но есть два недостатка:
1. Typescript. Адептам python тяжело интегрироваться
2. Определяет только тип аргументов, но не сопоставляет их из коробки. Без погружения в контекст на это уйдет время.

Представляю решение этих проблем: abi-guesser-webserver
1. Локальный вебсервер принимает http запросы
2. Основная логика базируется на творении samczsun плюс обработка tx.data в одной функции
3. С pm2 кластерами можно задействовать всю мощь процессора.
4. Поддерживаются запросы корзинами, в один http запрос закинуть тысячу tx.data

Разберем транзакцию свапа 0xb17b0e039100160b91cd5262737bb41057609ee7b66f6afa3337b5ebbbe51510
Фото1: Сырые данные
Фото2: Аргументы на основе abi
Фото3: Ответ вебсервера, abi не используется.
kibbleswap (на dogechain) перестал работать, их веб-интерфейс зависит от собственного rpc, который упал.

В связи с этим торги токенами замерли.

Сделал скрипт, как можно поиграться с ценой grimace, пока у остальных игроков пингануло :D

https://github.com/0fuz/swap-univ2-tokens

Следить за ценой тут https://dexscreener.com/dogechain/0x1aad352a2190b399bb3cfd4d5e4b0bf6efa33c0e
*Когда лень описывать тарифную сетку
Наверняка уже видели картинки как вся крипта просела на -20% в виде шариков, такое видно на cryptobubbles.net

Визуализировать холдеров по объему токенов, например pepe в сети eth (по-умолчанию справа есть скрытые кошельки)
Есть автор, который хорошо объясняет сложные вещи, например как устроен вывод стейков из эфира.

Чтобы не делать двойную работу по переводу и публикации уже готово материала, предлагаю ознакомиться с его блогом finematics.com.

Видео отличаются по смысловой нагрузке, поэтому с переводом могут помочь субтитры ютуба или алиса в яндекс.браузере
Когда видно ошибку Fail и не понятно, что вообще случилось при майнинге транзакции, можно поседеть и сесть на антидепрессанты, но можно этого избежать, если посмотреть расширенное исполнение транзакции в tenderly.

Или когда tx.logs не достаточно для понимания контекста исполнения транзакции.

Такой функционал становится доступен с помощью перевыполнения смайненой транзакции в более детальном режим с 'traces=true'

Когда это полезно:
- Транзакция получила revert и не понятно, где искать ошибку. В таком случае получится увидеть контракт, который сделал revert и если там открытый исходный код, то даже строку revert'a. Пример свап где нет деталей ошибки tenderly;bscscan но видно в tenderly (фото2,фото3)
- Как устроен, например, минт nft по вызовам функций tenderly;bscscan (фото4)

Это основной, но не единственный, функционал у tenderly. Еще есть
- tx simulator
- alerts
- web3 gateway
- web3 hooks
rpc.csv
1.4 KB
RPC - remote procedure call, внешне, это ссылка вида https://... или wss://… Криптокошельки через rpc связываются с блокчейном.

Есть две ценовых модели у платных rpc провайдеров:
- Плата за обработанные запросы. Можно абузить rpc-batch-call и 1inch-multicall :D
- Плата за нагрузку (CU=compute units).

Тренд1: поверх классических библиотек web3|ethers провайдеры стремятся сделать на их основе свои супер-пупер SDK, с расчетом, что пользователям позже станет очень больно переносить код с SDK.

Тренд2: новые провайдеры готовы давать качественный сервис намного дешевле.

Хобби проекты все еще могут обойтись бесплатными провайдерами плюс proxy-rotation и мультиакки на рпц.

Проектам посерьезнее, но с низкой нагрузкой на rpc - подходят все варианты.

Проектам еще более мощным, модель CU не подходит, и остается оплата за запросы или содержание собственных нод.

Небольшое исследование провайдеров прикрепил в .csv файле
В bsc через 10 000 блоков (~8 часов) произойдет хардфорк Hertz (эфировские EIP Berlin,London)

Некоторые из изменений:
- BEP-231 (EIP-2930), фича accessList для контрактов. Идея в том, чтобы заранее передать адреса, которые читать несколько раз, для экономии газа
- BEP-227 (EIP-3198) внедрение basefee опкода, одна из ступеней сделать как в eth, что есть tx.type=2 и baseFeePerGas, maxPriorityFeePerGas
- BEP-212 (EIP-3529) selfdestruct теперь не делает кешбек, от которого зависят chi, gst2

После применения хардфорка появится DynamicFee(1559) тип транзакций, аналогичные уже есть в eth чейне