TGViewer
Из Solidity в AI и дальше Из Solidity в AI и дальше @solidityset · 2.49K subscribers
Post #1121 1.31K
Solidity hints. Часть 3

Постепенно выходим из состояния выходного дня и принимается за работу.

Вообще, не смотря на сезон отпусков и желания провести время где-то у моря, уже третий год - лето у меня самый загруженный период. Вот и сейчас на следующие 2,5 месяца у меня следующие планы:

1. Подготовить крутую практическую программу для 2 модуля курса;
2. Запустить 8 недельный курс на все лето;
3. Разобрать 4-5 defi проекта (пока в планах, Uniswap V3, Compound, Euler и DyDx);
4. Вывести на зарубежный рынок свой проект по пре-аудиту протоколов;
5. Закончить соло аудит;

И это еще не учитывая другие планы вне web3. В общем лето будет - ух!

Зато к осени уже будут новые знания и хороший "фундамент" для последующего рабочего года. Вы, кстати, тоже можете начать свое обучение и много преуспеть до следующего сезона.

А пока, возвращаемся к разбору пунктов из репо Chinmaya:

4. Using low level functions to call a contract = handing over control to it

Используя низкоуровневые функции для вызова контракта, вы фактически передаете контроль над исполнение функции другому человеку, который может оказаться злоумышленником.

Это, вероятно, один из самых популярных вопросов базовой безопасности смарт контрактов, который изучают начинающие аудиторы на различных CTF - capture the flag - задачки по взлому контрактов.

Например, следующий код с уязвимостью реентранси демонстрирует эту проблему:

mapping (address => uint) private userBalances;

function withdraw() public {
uint256 bal = userBalances[msg.sender];
require(bal > 0);

(bool sent,) = msg.sender.call{value: bal}("");
require(sent, "Failed to send Ether");

balances[msg.sender] = 0;
}


Есть некий маппинг, где хранятся балансы пользователей, и функция вывода средств с контракта. Мы вызываем низкоуровневый call на msg.sende и передаем всю сумму с баланса.

Отправителем транзакции вполне может оказаться смарт контракт, который "ловит" внешние вызовы в него через функции receive() или fallback(). И уже в них он может реализовать какую-либо хакерскую атаку, например:

    fallback() external payable {
if (address(etherStore).balance >= AMOUNT) {
etherStore.withdraw();
}
}


т.е. он "ловит" call функцию, и перенаправляет вызов обратно в контракт для вывода остальных средств. В итоге это приведет к опустошению первого контракта. А следовательно другие пользователи потеряют все свои активы.

Вообще, всегда нужно быть аккуратными с низкоуровневыми вызовами call() и delegatecall(), желательно не давая пользователям контролировать адрес, куда идет вызов.

Там есть и другие проблемы с такими функциями и о них можно почитать в подборке Solodit.xyz или узнать больше на Ютуб каналах, посвященных безопасности.

Будьте аккуратны!

#call #delegatecall
  • 👍 5
  • 🔥 2
  • ❤ 1
More from @solidityset
  1. Sep 22, 2026Какой язык программирования учить сейчас? На днях в Твиттере увидел небольшой пост о разви…
  2. Sep 18, 2026Интересная модель Jev Буквально пару дней назад в Твиттере многие начали обсуждение новой…
  3. Sep 14, 2026Графы повсюду Если вы также следите за новостями в мире ИИ, то наверняка уже все чаще встр…
  4. Sep 10, 2026GTA6, Cyberleek, блокчейн и безопасность Увидел несколько постов (тут и тут) про Cyberleek…
  5. Sep 9, 2026Работа с чистой энергией Дисклеймер Сегодня ава и название канала, наконец, поменялись. Я…
  6. Sep 9, 2026Channel name was changed to «Из Solidity в AI и дальше»
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 →