The Open Dev Blog – Telegram
Ton Core поучаствовала в 3-х апдейтах, которые начинаются или заканчиваются на букву C. Это:
Anonymous Poll
35%
USDC
53%
FunC
65%
tgBTC
60%
Cocoon
25%
СBidaskС
4%
Предположу в комментариях
🔥 Выводим депозиты.

Недавно мы провели аудит смарт-контрактов проекта 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. Иначе можно будет послать сообщение с ошибкой, контракт его примет, потратит свой газ, а аукцион не закроется — и продолжать так можно до бесконечности.

Именно в этом и заключалась ошибка webdom. В контрактах аукционов сначала external сообщение принималось, а затем из сообщения считывался queryId — 64 бита информации. Это означало, что можно было составить сообщение с недостаточным количеством бит, и контракт бы падал с ошибкой 9 (Cell underflow), тратя при этом газ. Это крайне критично для, например, аукционов в TON, где сумма за домен хранилась на контракте продажи, и могла быть потрачена полностью на газ. Итогом была бы потеря домена и суммы, которую за него заплатили. Такую ошибку мог бы совершить каждый, это необычный баг, ничьей вины в этом нет.

Баг был крайне оперативно исправлен.

В ближайшую субботу (08.11) один из авторов канала будет разбирать работу контрактов webdom в онлайн формате (там есть интересные нюансы) — вы сможете узнать что-то новое, спросить интересующие вас вопросы. Анонс в @toncishub будет чуть позже, мы приложим его к посту.

@TheOpenDevBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
4🔥4320👍14😁32
TON Status
upcoming release of Major Regulated Stablecoin coming to the TON Ecosystem
👀
Обсудим?

@TheOpenDevBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
💯6🤔4👍21
🔥 TON Core обсуждает аренду мест в config-е TON.

Как многие могли заметить, уже вторая команда (некий Major Stablecoin) после tgBTC для своей реализации требует добавить некое изменение в config блокчейна.

Что такое config? Это глобальный dict, в котором хранится информация о, как ни странно, конфигурации блокчейна. Чтобы ончейн получить gas_limit, gas_price, max_validators и другие в 99% не нужные обычному разработчику параметры, можно брать глобальный config блокчейна, и напрямую его парсить. В стандартной библиотеке FunC для этого есть функция config_param, в tolk за это отвечает функция blockchain.configParam. До того, как появился отдельный TVM опкод для калькуляции трат на газ (GETGASFEE), stonfi в своей первой версии протокола парсили параметры напрямую.

Подробнее о самой структуре config, и что там есть, можно почитать в доке, это полезно.

Судя по github, TON Core всерьез задумались об общедоступной возможности менять config блокчейна. Для этого уже написан контракт на tolk, обновлен governance контракт блокчейна. В тестнете, предположительно, были проведены первые успешные тесты. В отличие от library cell-ов, плата ожидается одноразовая (20-50к TON), и дополнительно оплачивается каждое последующее изменение (10-20к TON). Цены такие, поскольку размер config-а влияет на сложность эмуляции, сильно раздувать его нельзя.

Что думаете?
@TheOpenDevBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1010🔥5😱411🤮1
🔥 Смотрим на костыли. Часть 1.

В прошлом посте мы рассказывали про config блокчейна, какая информация там хранится. Одно из полей в конфиге отвечает за все стандартные значения, связанные с тратой газа. Gas price — стоимость 1 единицы газа в nanoTON (на данный момент это 400). Gas limit — максимальное количество газа, которое может потратить контракт (на данный момент это 1 000 000 газа или 0.4 TON).

Параметр gas limit можно поменять внутри контракта с помощью TVM опкода SETGASLIMIT (в tolk функция setGasLimit), но есть нюанс — только в меньшую сторону. Установить gas limit больше миллиона невозможно.

Но нет ничего невозможного! В ноде блокчейна есть отдельные адреса, для которых этот параметр увеличен. Для этого даже устраивали голосование валидаторов (нашлось только это), и это зафиксировано в коде ноды (обратите внимание на номер строки). Как можно заметить по коду, время этих увеличенных параметров вышло 9 месяцев назад, но код пока что остается, хоть и, вероятно, уже не работает (UPD код остаётся для валидации блоков от самого начала блокчейна).

Вот, например, контракт потратил на трансфер 20 000 000 газа (или 83 TON).

Про gas limit понятно, а что насчет gas price? Их есть у нас. В 31 параметре config TON блокчейна есть отдельные адреса, для которых gas price обнулён. Это означает, что эти контракты исполняются бесплатно. Понятно, зачем это нужно — всякие системные контракты лежат в мастерчейне, и их регулярные вызовы (например, tick-tock на Elector контракте) требуют много TON.

Многие задавались вопросом — зачем tgBTC нужно было менять что-то в config блокчейна? Ответ — они обнулили gas_price для своего адреса. Вот пример транзакции tgBTC (не трансфер жетонов), которая не потратила газ (все значения равны 0, мечта!).

Следим.
@TheOpenDevBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥175👍52
Я бы хотел писать тесты смарт-контрактов на...
Anonymous Poll
34%
Typenoscript, как в blueprint
19%
Tolk, по аналогии с foundry
34%
Python
14%
Свой вариант
1
🔥 Как вообще ваше настроение, девы?

Давно не было постов, но скоро будут, писать есть о чем.
@TheOpenDevBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
1🎄11💩77🔥2😁2
🔥 Что для вас девелоперское событие года в TON?

Устроим мини премию @TheOpenDevBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
17💩4🎄3👍2
🔥 Подходит к концу 2025 год.

Спасибо всем, кто был тут с нами, участвовал в дискуссиях, приносил инсайды, ставил реакции. Нас почти 1000!

В новом году желаем вам самых крутых инсайтов, самых крутых профессиональных успехов, и самых крутых идей! Мы постараемся помочь.

🎄 С любовью, ваш
@TheOpenDevBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
1139🎄6💩4
🔥 Nonce в каждый дом.

Практически каждый, кто когда-то писал смарт контракты, знаком с концепцией nonce. Каждый пользователь TON хоть раз, но использовал nonce, встроенный в контракт wallet w5/v4/v3.

Nonce — это (обычно) некоторая информация, которая делает уникальным каждое исполнение подписанного offchain ордера в контракте. Это нужно для того, чтобы контракт нельзя было переиспользовать — например, чтобы нельзя было взять ваш свап на @bidask, отправить его снова, и заставить ваш кошелек произвести свап заново.

Обычно все представляют nonce как одно число, которое увеличивается на 1 при исполнении ордера. Однако такая концепция обладает проблемой (вы, возможно, с ней сталкивались) — в таком случае ордера должны быть обязательно исполнены последовательно один за другим, в строго определённом порядке. На пользовательских кошельках в TON могут пропадать транзакции, если быстро исполнить два действия подряд — второе действие может попасть валидатору перед первым, или же у обоих действий будет одинаковый nonce — тогда одно исполнится, а второе пропадёт, ведь nonce в контракте и ордере не совпадут. Ходят слухи, что это хотят исправить.

Для борьбы с этой проблемой существует множество концепций nonce. Расскажем про некоторые:
⚫️В @bidask в trade account-ах реализована система с 16 параллельными nonce-ами. Кроме числа, пользователь также должен приложить к ордеру номер nonce от 0 до 15 — и именно этот nonce будет увеличен на 1 после исполнения ордера. Это позволяет отправлять в любой последовательности
⚫️В TON существует highload wallet. Он сохраняет query_id пришедшего ордера и дедлайн, когда этот ордер перестанет быть валиден. Как только этот дедлайн истекает, он чистит сохранённые query_id, разумно считая, что все ранее исполненные ордера истекли. Таким образом он поддерживает гигантское количество параллельных транзакций — им пользуются CEX и многие сервисы, централизованно взаимодействующие с блокчейном.
⚫️На EVM блокчейнах есть и более экзотические варианты nonce. Совсем недавно его предложили хранить как двойной map { address => {uint256 => uint256}}. Каждому адресу юзера здесь сопоставляется map {uint256 => uint256}. Когда на такой контракт приходит ордер с nonce, контракт берет map по адресу юзера, и извлекает из от nonce два значения:
word = nonce / X;
bitIndex = nonce % X;
// X -- это некоторое число (256 или 64)

Переменная word является ключом, а bitIndex — индекс бита в числе, который, по задумке, является нулевым битом (после исполнения ордера станет равным 1). Таким образом, nonce позволяет исполнять огромное количество параллельных ордеров, являясь bitmap-ом. Подробнее можно почитать тут.

Вариантов nonce очень много — нужно просто понять, для чего он нужен в конкретном случае.

🎄 С новым годом.
@TheOpenDevBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍7🔥4🤓31
🔥 Редакция подумала, что странно было бы делать вид, что все нормально, и продолжать писать посты про фишки разработки на Tolk, нюансы работы нашего любимого блокчейна и т.д

В связи с этим, наши любимые читатели, вопрос:
О чем бы вы хотели тут читать? Может, продолжать повествование про TON, может, переключиться на что-то другое (блокчейн, технологию)? Расскажите, чем вы сейчас занимаетесь, и чем интересуетесь.


С вопросом, ваш
@TheOpenDevBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
107🤣3👌2
🔥 X402 и Вайбкодинг

Многие уже слышали про хайпующий платёжный протокол x402 от Coinbase. Если вкратце, то это протокол, по которому можно заставить агента платить за что-либо в интернете. Делается это с помощью уже всеми забытого кода 402 (Payment required). После этого агент соображает, что надо подогнать лавехи, и платит по указанным реквизитам (если вы дали ему свою seed фразу) 💳

Это сильно упрощает жизнь разработчикам, поскольку больше (почти) не нужны Stripe, Bitpay и остальная шушера. x402 создает целую индустрию, в которой ИИ агенты сами могут платить за различные сервисы, услуги, в том числе другим агентам, например, делегируя тяжёлую работу за крипто-копейки.

Как же именно работает это упрощение? Для приема платежей в крипте нужна собственная индексация. x402 и здесь всех спасает, вводя новую сущность — facilitator.

Facilitator — это отдельный сервис, который за вас (за всех) проверяет все приходящие платежи. Тут начинаются ньюансы:

На схеме потока данных от самих Coinbase есть два отдельных процесса проверки платежа на facilitator — verify и settle. Нетрудно догадаться, что verify отвечает за проверку корректности платежа, а settle — за финализацию. В качестве заметки на полях разработчики предлагают не ждать settle транзакции (то есть по сути не ждать появления транзакции в финализированном блоке), если не хотите слишком большой задержки.

Звучит страшно? Так и есть.

Verify сам по себе (в том числе в официальных имплементациях) не делает ничего сверх базовых проверок корректности подписи. В лучшем случае он эмулирует транзакцию, проверяя корректность платежа. Транзакция после этого все равно может упасть, как мы с вами знаем, но это уже нюансы.

Есть и хорошие новости — во всех официальных реализациях middleware (реализация клиент-части протокола x402 на стороне принимателя платежа) для популярных backend фреймворков (FastApi, Gin, Express, Flask) проверяется в том числе и settle (если их правильно использовать 🤪👍).

Но если разработчик не ОЧЕНЬ хорош😱, а может быть даже и вайбкодер, то наверняка стоит ожидать худшего. Для llm слово verify звучит так, как будто после этого можно уже делать полный газ, и не ждать какого то там settle. Проверено на себе — пока ты капсом не напишешь llm, что нужно проверять транзакцию корректно, она не будет понимать, что что-то не так.

Весь этот пост — это нативная интеграция нашего вайбкода для хакатона на BNB: debil.capital

Сервис был сделан за 2 дня, на ИИ агент оказывалось очень сильное давление, чтобы он заставил работать этот сервис. И как оно и бывает в таких случаях — там есть уязвимость в реализации x402. Приглашаем всех ее найти.

❗️ Тому, кто первый найдёт способ забайпасить платёжку, мы пришлем целых 1000 $TONDEV! Приглашаем желающих в комментарии (только закрывайте предположения спойлерами)

Плачем и платим
@TheOpenDevBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥87👍42
🔥 LLM и безопасность

Мы все уже начитались историй про успех в разработке с применением claude, cursor, codex и т.д. Этого слишком много, и странно было бы думать, что влияние LLM на IT ограничится исключительно разработкой. Надо это разбавить. Мы разбираемся в безопасности, про неё вам и расскажем.

В ноябре 2024 года OWASP (международная организация, занимающаяся вопросами информационной безопасности) выпустил свой очередной топ самых популярных уязвимостей для больших языковых моделей — OWASP LLM top 10. Большинство позиций там довольно рядовые, однако мы здесь собрались из-за самой первой — "Prompt injecting".

"Prompt injecting" — это буквально "убеди LLM в том, что ей надо сделать плохую вещь". В простейшем случае LLM можно сообщить, что ты администратор сайта, и тестируешь его работу, поэтому ассистенту нужно СРОЧНО отдать тебе все данные пользователей. Ничего не напоминает?:) В более сложных сценариях — дать непрямое указание через другие способы ввода информации. Все это превращает традиционный хакинг в довольно увлекательное занятие, где ты общаешься с не очень умным собеседником с памятью золотой рыбки, которого нужно обвести вокруг пальца. Вопреки простому описанию, сделать это довольно трудно. Интересный гайд на prompt injecting (осторожно, полностью его никто не читал).

Кроме изменения традиционного хакинга, мы должны быть готовы и к новому виду вирусов. Мы все пользуемся агентами, чтобы они за нас что-то делали на нашем компьютере (или сервере). Ирония в том, что мы агентам для этого не нужны. Вот, например, уже появились вирусы, которые прямо на зараженном устройстве запрашивают помощи у AI агента для более эффективной кражи информации.

БОЛЬШИЕ языковые модели
@TheOpenDevBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥116👍51