rends_east
🔥 Выводим депозиты.
Недавно мы провели аудит смарт-контрактов проекта webdom. Среди найденных багов один был наивысшего приоритета — Critical. Что мы нашли?
Для многих из видов контрактов (аукционы, продажи доменов, etc) webdom предусмотрели возможность закрытия сделки не только с помощью internal, но и через external сообщение. То есть любой желающий может обратиться на контракт по external интерфейсу и уведомить его, что все условия сделки выполнены, пора ее исполнять. Это крайне полезно, например, для аукционов, когда время аукциона может выйти, но без внешнего вызова смарт-контракт сам не сможет реализовать окончание сделки.
Что такое external сообщение? Когда вы делаете свап на @bidask, ваш wallet контракт посылает internal сообщение от себя к пулу ликвидности. Но сам wallet контракт вызывается external сообщением, которое вы подписываете в кошельке. Любая цепочка транзакций в TON вызвана сообщением, которое приходит извне блокчейна — оно и называется external.
Следующий закономерный вопрос — почему злой Пескарь не может послать на мой wallet контракт 100 миллиардов external сообщений, чтобы сжечь на газ блокчейна мой 1 миллиард TON? Для этого предусмотрена защита — у каждого external вызова есть бесплатные 10000 газа (это 0.004 TON). Этот газ может быть потрачен без списания с аккаунта. Он тратится, например, на проверку подписи wallet контрактом. Если подпись верна, то контракт вызывает инструкцию acceptExternalMessage. Даже если злой Пескарь будет слать на ваш кошелек сообщения, то все они не будут приниматься контрактом, пока у злого Пескаря не появится ваш приватный ключ.
С webdom всё интереснее. Аукцион может завершить кто угодно. Это означает, что контракт всегда принимает external сообщение. В таком случае очень важно, чтобы любое external сообщение обрабатывалось корректно после того, как вызовется acceptExternalMessage. Иначе можно будет послать сообщение с ошибкой, контракт его примет, потратит свой газ, а аукцион не закроется — и продолжать так
26 · 2.4K ·