Пацанский разбор кода блокчейна ТОН

Nikita Kolmogorov
Golden Borodutch
Published in
15 min readMay 29, 2019
ЯРОСТНО НАДРАЧИВАЛ РАДИОАКТИВНЫЙ ПЕПЕЛ

Стоит отметить, что все описанное ниже — это личное мнение автора, которое находится в полном соответствии с законами о Fair Use и Первой Поправкой. Это не торговый совет, а вся информация была собрана только из открытых источников.

Туточки еще я перевел на английский этот обзорчег, читаните, если русккий не шпрехаете.

Ночи в вечер, дорогие мои аристократы-читатели! Нашему Ревизору ICO из телевизора недавно попал в руки код-таки самого настоящего тестового блокчейна ТОН. В этой статье не будет мягкого разбора интерфейса, который Колян Дуров написал для унтерменшей отдельного отбора, которым лишь бы на кастомные версии ассемблера повтыкать. Похоже, ребята — матерые прогеры из 80-х или 90-х.

Примечание: в 80-е и 90-е на каждой галере было принято написать свой говно-вид ассемблера

Если вы пришли за простым обзором ТОНа, то вам не сюда. Это статья от говнокодера, который только и делает, что разбирает код, как часть своей профессии. Коли вам нужны разборы интерфейса языка Коли — тоды вам сюды. Там местный фраер уже разобрал по полочкам для мозговитых как использовать ТОН. Мы же сегодня окунемся с головой в детище супер-команды Дуровых, за которое выложили 1.7 ярда вечнозеленых.

Ридми

Ну шо у нас туточки? А здеся у нас замечательного вида легкий клиент-с, так сказатб. Особо ничего не нужно ожидать от файлов, судя по ремарке в README.txt — ведь “легкий” клиент подразумевает, что никакого особенного функционала по проверке всего блокчейна каждый раз не будет, как и не нужно будет выкачивать весь блокчейн (у эфирки уже 243 гига, ага, но пользоваться можно начать без синхронизации), обычно работа ведется по, так называемым, ивентам — или “событиям”, если на православной мове спикать.

Дальше по ридми нам трут в уши, как это всего лишь тестовый код, может быть неполным, не самым актуальным, и вообще перестать работать в какой-то момент, если что-то прямо ну уж очень радикальное изменится в реальном блокчейне. Стандартная инструкция от программистов к программистам. Ну и описалово по запуску и ремарка об использовании смарт-контрактов (что это делать можно).

Конфиг

Посмотрим, шо же нам разрешили менять. Заходим в ton-lite-client-test1.config.json и что же мы тут видим? Ключик для доступа в ноду, айпишник ноды, порт доступа, и ключ к ноде с типом ключа, да типом ноды. Спасибо хоть на том, что сделали тут json файлик, а не заставили нас переменные окружения запуливать, опта! Хотя ямлик был бы получше, мда. Судя по всему, у нас вообще будет легкий-легкий клиент, который будет просто подключаться по интерфейсу типа RPC в настоящую ноду, которая и находится по айпишнику 1137658550 . Эта надо будет настоящей, полной — вот ее код бы посмотреть! Ведь там же и виртуальная машинка будет, и исполнения кода смарт-контрактов, и вообще розовые поняши и радость вселенская (судя по вайтпепперу ТОНа).

Как так?

Файл HOWTO.txt уже показывает нам четкие инструкции о том, как же пользоваться блохчейном ТОНа, из чего состоят адреса, как компилировать смарт-контракты, переводить ГРАМы, получать тестовые монетки в тестнете.

Самый настоящий ТОН

Длиннющий документ ton.pdf на 140 страниц начинает уже малевать рил ток и заставляет синк эбаут зис. Постараюсь тут вам обрисовать основную картину происходящего.

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

Но на самом деле аккаунтчейны не существуют — они “виртуальные” и работают в рамках коллекций шардчейнов — воркчейнов. Как если у тебя блок сиг лежит под полкой на кухне. Каждая пачка — отдельная пачка сиг, но типа все сиги все равно в блоке, опта. Крач, пачка сиг — это конструкция, удобная для пацана, но для обычного фраера пузатого все плевать: что 10 пачек, что блок.

Единственный блок, который нужен настоящему пацану — это блок Беломорканала.
(с) Николай Дуров

А, еще шардчейны друг с другом могут переговариваться, как и воркчейны. И сообщения прыгают быстро, со скоростью света. Хочешь отправить сообщение из одного шардчейна в другой — опа! И сообщение мгновенно уже попадайет в следующий блох шардчейна назначения. Всего может быть дофигалион воркчейнов (2³²) и офигетькакмноголиард шардчейнов (2⁶⁰)в каждом воркчейне.

Еще такой момент судари и сударыни: воркчейны могут иметь хрень разную типа виртуальной машины для смарт-контрактов, структуру аккаунтов и тому подобное. Шардчейны же имеют хрень одинаковую — то есть логика типа машины для смарт-контрактов и типов аккаунтов одинакова в рамках одного воркчейна.

Воркчейн может создать любой ровный пацан, если пошлину заплатит в виде комиссий. Ну и группа валидаторов должна быть 2/3 чтобы стенка на стенку заставить отсосов (1/3 несогласных) прогнуться и начать работать с новым воркчейном, написать говнокода для обработки нового типа блох.

Шарды вообще тема забавная. Если слишком много четких ребят юзают один шард, то он может автоматом распасться на несколько шард. И наоборот, если шарды одного воркчейна говно и ими никто не пользуется, то они объединятся в более большое мега-говно. Таким образом ТОН обеспечивает скорость света для своих транзакций.

Телегамены забили себе воркчейн айди 0 — блатной номерок оставили для себя. Там и будут циркулировать ГРАМы.

ТОН — это платформа для создания блокчейнов. Первый созданный блокчейн — это циркулятор монеток ГРАМ со своими смарт-контрактами.

В ТОНе будут авторитеты — валидаторы — штук сто, что держат все районы. Чем больше бабла в ГРАМах, тем проще стать авторитетом. На каждом районе есть 1024 мелких валиадторов — шестерок этих авторитетов. Шохи выбираются случайным образом каждые 1024 блоков. Эти авторитеты выбирают из предложенных шестерками блоков самые четкие. Четкие блоки попадают в мейнчейн. Это батаны называют Пруф Оф Стейк. Совсем не блатное название. Если авторитет косячит или пытается захомячить чужое, то ему заточку в печень, либо штрафы и невозможность стать авторитетом на какое-то время.

Из-за того, что Дуровы держат все районы через своих авторитетов, есть шанс, что при форке мастерчейна, придется форкануть и часть районов (воркчейнов). То есть если у ТОН проблемы и им нужно менять прописку, то прописку придется менять и всем блохчейнам на основе ТОН.

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

Следующая часть документа — это просто описание блокчейнов, как базовое понятие. Ничего интересного ровному пацану.

Важно заметить, что все комиссии и награды авторитетам (валидаторам) будут выдаваться в ГРАМах, что называются тут блокчейном номер нуль или базовым блокчейном. То есть от ГРАМов никуда не скрыться ребятам.

У воркчейнов будет возможность иметь как платное, так и бесплатное хранилище данных. Платное — это как у Эфира, платишь за каждый чих, если хочешь менять общее хранилище данных (например, перевести ERC-20 токен куда-нибудь). Бесплатное можно будет установить — например, чтобы плата за перевод бабла с кошеля на кошель у криптовалюты типа ERC-20 токена была халявной — но если выше халявы поднимется цена перевода, то ты либо заплатишь, либо твой аккаунт с деньгами кровными удалят нафиг. Дуровы ожидают от авторитетов, что пустые аккаунты те будут подчищать бесплатно, ну, которые самовыпилятся при активности — но это необязательно и может быть будет кто бабло заносить и давать пацанам ровным, что настучали на фраера пустого.

По факту, каждый аккаунт в ТОН — это “актер”. “Актер” может получать сообщения и что-то с ними делать. Например, аккаунтом может быть смартконтракт, который фраеров всяких шлет в жопу, получая от них перевод. Обычные же пацаны, не смарт-контракты, шлют друг другу сообщения в виде переводов — сообщения пустые, поэтому накатанная малява не заставляет пацана двигаться, а только меняет его счет в общей кубышке.

Сообщения можно посылать и из ниоткуда — платить за газ им не надо, маленькое количество бензина выделено на эти пустышки-сообщения в каждом блоке. То есть можно отправить “Колян — ровный пацан” из ниоткуда, и Колян это получит. А на сердце у Коляна станет теплее.

ТОН нельзя майнить, перебирая всякое говно в уме типа хешей. В ТОН, вместо этого, есть авторитеты — валидаторы, которые запускают у себя код смарт-контрактов и хранят состояния блокчейнов. Вместо майнинг-пулов тут есть концепт номинаторов. Это микро-инвесторы, которые дают авторитету свои ГРАМы, чтобы он был еще авторитетнее и забирал из блохчейна больше бабла, которое потом делил бы с номинаторами. Но если авторитет потеряет свое бабло, номинаторы тоже будут кинуты и бабло свое потеряют. Алсо, если у авторитета не железо, а картофелина, которая не тянет даже крузис, то и бабла он будет получать меньше.

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

Ну а потом Дуровы вообще пишут, мол, а можно ли в ТОН залить лицокнигу? Отвечают: нет, дебилы, нельзя — это будет раз в 100 дороже текущей инфраструктуры закербергов. Похоже, задолбали их этим вопросов инвесторы, занесшие 1.7 ярдов.

И, конечно же, Николай не ищет легких путей. SSL? Да ну нафиг — MTProto. Простой или модифицированный UDP? Да ну нафиг — лучше написать свой протокол общения нод со своими инфраструктурой и шифрованием с блекджеком и дамами легкого поведения.

Помимо своего нового и блестящего протокола передачи данных и шифрования, Коле понадобилось сделать еще и собственную распределенную базу адресов членов сети ТОН. Ведь нельзя же использовать исковерканный IP, нет — нужно свой способ поиска нод сделать! Нет, претензий к четкому Коле нет, он делает то, что хочет — просто тут ну кажется оверкилом все, сорян.

В принципе, концепт известен любому, кто уже качал что-то с торрент-трекеров типа кинца нового или четкого музончега. Поиск пиров и все такое. Следующие 10 страниц пришлось объяснять, мол, как это все необычно работает.

Но особо клево, что TON сможет работать, как DNS сервер почти. То есть, в принципе, сайтик или сервис у себя поднял на компуктере ровный пацан, а в TON плюнул маляву со своим желанием принимать гостей в хату. Вот и гости смогут по маляве находит сервак ровного пацана. Как URL только 256-битная малява — Onion, опта!

Более того, Телеграмчик сможет точно так же, как ровный пацан, кинуть маляву в блохчейн, да все клиенты Тележеньки смогут автоматом находить новые узлы, с которыми общаться трафиком — ляпота же!

Следующая тема бумаги — это платежи. TON Payments во всей красе показывает свое личико. Описание начинается с вообще всех вариантов реализации, а потом показывают, какой хороший путь выбрали именно четкие пацаны с Телеграма.

Потом Колян пишет про сам ГРАМ. Всего будет создано 5 милиардов грамов. Купить их можно будет или у других людей, или у банкиров Телеграма, собственно говоря, у четких пацанов по цене сначала $0.1, а потом с увеличением по 1 милиардной бакса за каждую купленную монету. То есть первую монету продадут за $0.1, вторую за $0.100000001 и так далее.

Дуровы пишут, что, так как будет определенная цена покупки грамов, выше нее он торговаться не будет на рынке. А вот про то, что цена может всегда быть ниже — они не пишут. От резких падений валюта не застрахована, от резкого роста — вполне. Пишут, что, мол, начнут покупать ГРАМы в таком случае, чтобы те не падали — но мы-то мозговитые ребята и знаем, что деньги у Телеграма не бесконечные, чтобы поддерживать стабильную экономику.

На этом и заканчивается документ. Как-то так обрисовал я вам всю картину о том, о чем поведала нам крутая команда Тележеньки.

Фифт или новый Форс

Ах да, Колян и Ко разработали еще отдельный язык погромиста (или поГРАМиста ахах), который очень смахивает на Форс или Ассемблер здорового (или не очень) человека

Ну-с, пришло-с, время-с, разобрать-с файл-с fiftbase.pdf и возможности новомодного языка Fift. Только-только мы разобрались в Solidity от Витали, как теперь учить новый язык. СПАСИБО, КОЛЯ.

Но ладно, засовываем подальше свое самомнение и начинаем дайвить носом прямо в пучину этого ассембли-стайл языка. Стоит заметить, что Фифт был создан исключительно для описания смарт-контрактов в базовом блокчейне ТОН — в других воркчейнах возможно использование любой другой виртуальной машины и любого другого языка программирования. Ждем нормальный воркчейн, а не “вот это”.

Аргументом к сложности языка может быть что-то типа “нубье зато не вкурит и не будет засирать своим говном блокчейн” — отнюдь, за нубье это будут делать матерые профессионалы — они теперь точно так же будут заливать всякое дырявое говно, но с умными рожами. Чем сложнее язык, тем проще на нем написать дерьма. А фифт осилить могут лишь любители крестов, ассембли и БДСМ.

Хорошая тема — запускаться Фифт файлы умеют прямо из командной строки, да там же можно и в консольке побаловаться с интерпретатором. Вообще, Фифт — это прямо язык, который ух как не хочется нормальному пацану читать. Но когда попробуешь вникнуть, становится приятно, что программы можно почти всегда читать слева направо без проблем, не прыгая глазами. Однако уровни концентрации должны быть на максимуме, чтобы не пропускать детали.

Спрашивается: зачем было использовать подобную нотацию в языке программирования? Никому непонятно. Ведь все точно так же, как и в мейнстримных языках: хешмепы, массивы, лупы, переменные, функции. Отличие лишь в нотации — и она просто сводит с ума любого разработчика без особой причины на это.

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

А, ну и возможность напрямую фигачить в ассемблер меня порадовала. Дофига как это нужно будет перцам, которые просто децентрализованный леджер под свое очередное скам-ICO хотят запустить.

Фортран — это же почти Форт, да?

Спецификации блокчейна

Рассмотрим документ tblkch.pdf. ЕМОЕ ЕЩЕ 121 СТРАНИЦА! Я почти уверен, что кода команда ТОН написала меньше, чем документации — при том, на порядок-другой!

В принципе, особо ничего нового обыденному быку с района не увидеть в этом документе. Он предназначен для ботанов, которые будут сидеть и седеть от прочитанной документации. Как полагается, первая часть документа — чуть более полный пересказ (а местами и менее полный) файла ton.pdf. Все те же описания функций блокчейна ТОН, типов, возможностей, блоков.

Порадовал пример создания собственной криптовалюты на странице этак 29. Похоже, новые бетховены могут начать появляться отовсюду — лишь палкой от себя отбивай блохчейнеров злостных.

Весь документ — это, в прямом смысле слова, сухая документация по концептам ТОН. Есть список концептов — и у каждого из них пояснение. Шардинг — пояснение, как работает. Сплит или мерж — пояснение, как работает. Гиберкубический Рутинг — пояснение, как работает. И так далее.

В общем и целом, все достаточно логично и понятно. Особо никаких лупхоулов я найти не смог, описание кода не выглядит, как решето помойное — что, думаю, мы не сможем сказать о коде всякого разного рода смарт-контрактов, написанных на Фифте. В любом случае, туториалов и статей по Фифту будет еще туча, а документ по описанию внутренней работы блохчейна ТОН нужен будет лишь смельчакам, которые захотят спаунить собственный воркчейн.

Виртуальная Феррари (или Форд?)

Так-так-так, шо тут у нас в файлике tvm.pdf? Ах, да это описание виртуальной машины базового воркчейна ТОН, которая и будет запускать код смарт-контрактов на компуктерах валидаторов. И, да, 155 страниц спецификаций. Господи, зачем я взялся это читать?

В документе говорится о подноготной программы, которая берет ваш Фифт код и транслирует его прямо в CPU или GPU, что там используется. Тут все ну очень сильно смахивает на простой ассемблер — тут и регистры, и операторы похожие, и всему подобные вещи. Я это видел на курсе в универе, где мы собирали свой компилируемый язык программирования. Все так и делается, да.

Описание регистров, стака, типов данных, структур данных, как интерпретируются функции, какие есть доступные операции, постоянное хранилище данных и все тому подобное. Ей-Богу, я как будто опять читаю документацию LLVM какого-нибудь. Все одно, все похожее. Все, что можно делать Фифтом в этой виртуальной машине, описано в этом документе.

Никаких прорывных технологий. Это просто виртуальная машина, не более и не менее. Такая есть у Эфира и ЕОСа; да даже у Биткоина, но в урезанном, конечно, виде.

Кодирование

Ну, наконец-то я дочитал всю эту дикую документацию, обозвал себя официальным экспертом по блохчейну ТОН, можно и приступать к разбору самого кода легкого клиента.

Эс южуал, начну издалека. Код, в основном, написан на православных крестах, из формальной документации чуть меньше, чем почти ничего — только общие команды описали в файлике README, что не так плохо, так как есть тесты. А все мы знаем, что типы и тесты — лучшая документация, мужики (тян и дети дропнули читать этот обзор еще на первых двух недоматах). Лицензия LGPLv2 — если бабосики протухнут, то ТОН не при чем, что нормально для подобного рода проектов.

Пройдемся просто по папкам проекта и посмотрим, что у нас тут.

  • validator — подозреваю, что это модель данных для показа валидаторов в блок эксплорере
  • ton — тут находятся интерфейсы к самой ноде ТОНа, позволяют смотреть, что там с шардчейнами, блоками, адресами
  • tl — уже интереснее: всякие утилиты по конвертации из и в json, базовый класс TLObject
  • third-party — просто сторонние зависимости: abseil-cpp (улучшения для стандартной либы C++), crc32c (гугловская либа), rocksdb (key-value стор от фейсбука)
  • test — в этой папочке тесты, которые показывают, на что и способен клиент — а именно, смотреть, чо там происходит в блохчейне (фигня всякая с адресами, блоками, валидаторами, etc.)
  • terminal — просто интерфейс для пользования клиентом в терминале
  • tdutils — приятно осознавать, что даже у разработчиков ТОН есть папка, в которую напихано говнофункций, которые полезные, но пихнуть их куда-то в другое место не хочется: хелперы для буферов, гзипов, джейсонов, портов, хипов, энумерации всякие и тому подобный сброд
  • tdtl — подозреваю, что это (как и tl) — структуры данных для Фифта
  • tdnet — похоже на файлы связи с нодой ТОНа, тут можно и по udp, и по tcp, и по fd подключиться к ноде
  • tddb — подозреваю, что локальное хранилище данных, основанное на rocksdb
  • tdactor — ох, звучит многообещающе, актер — это ведь главная штука в ТОНе, можно глянуть в тестах, что он делает. Сразу замечаем уже существующую обещанную реализацию как промисов, так и мультипромисов.
  • crypto — реализация разного рода криптографических функций типа получения различных хешей, плюс компилятор Фифта и раздетая виртуальная машина! Похоже, нужная как-раз для компиляции смарт-контрактов. Отлично.
  • adnl — это тот самый туннель между клиентом и сервером, описанный в документации — похоже на простой аналог SSL по тому же стандартному TCP или UDP.

Как я и ожидал, так как это “легкий” клиент, ни майнинга, ни валидирования, ни особо каких-то функций тут нет (да и не должно быть, на самом деле). По факту, это просто обертка вокруг ноды ТОНа, которая висит где-то в облаке по указанному IP. Можно создавать адреса, смарт-контракты, кидать всякие сообщения и транзакции друг дружке на пиво и сиги — ну и горстка еще функций.

По коду особо-то ничего сказать и не могу. Стандартный такой С++ код, не лучший, что я читал, но и не самый плохой — на три с плюсом или четыре с минусом из пяти. Могли бы и притиером пройтись до того, как выкладывать в сеть. Хотя есть одна придирка — написано ну уж очень много кода на крестах ради простой обертки вокруг RPC ноды в облаке. Будем надеяться, что этот код послужит основой для более девелоперфрендли апи.

Хотя нет, все равно не пойму — если с нодой мы говорим по простому RPC, передавая простой JSON, то нафига писать этот крестовый клиент? Да напишите сразу норм веб-обертку под ноду, емое. Ну оставьте вы виртуальную машину и Фифт на крестах — сделайте нормальным пацанам обертку вокруг простого RPC ноды, а ADNL, который на крестах, тоже оберните в либу, как с тем же OpenSSL делают уже которое десятилетие.

Заключение

Хех, спасибо, что дочитал до конца, дорогой гость. Я рад тебя видеть здесь — ведь это значит, что я не успел тебя утомить. Выводов из обзора кода можно сделать немного:

  1. В сеть “утек” только код легкого клиента, обертки вокруг облачной ноды с полным функционалом
  2. Кода ноды и валидаторов еще нет, но было бы интересно глянуть; слейте его тоже плез
  3. Код ну очень сыровато выглядит — до релиза там явно далеко, но, может быть, это просто накиданая на коленке по бырому обертка вокруг ноды шоб показать можно было инвесторам, что не исключено
  4. Помимо любования своим адресом, запроса 20 ГРАМов на него и компилятора Фифта, особо нам больше ничего не показали, а хотелось бы и пейментс, и днс, и валидацию, и шардинг динамический пощупать — слюнки текут
  5. Фифт со своим польским синтаксисом — это ад дикий для обычного прогера, зачем было так переусложнять — не понятно, ведь язык вообще ни в чем не выигрывает у других новомодных хипстерских ЯП
  6. Мне очень понравилась документация ТОНа — правда, вообще каждый и четырех стоплюсстроничных документов; все очень просто, конкретно и подробно разобрано, ищется любой концепт быстро, как в энциклопедии — четко понятно, куда и как ТОН идет, что собираются сделать и какие технологии применять.

В общем, рано еще какие-либо выводы делать. Вот как только дойдет дело до нормального клиента для ТОНа, тогда сможем подумать. Но я все равно очень был рад возможности глянуть одним глазком, чем же там команда Телеграма занимается вместо работы над bot api (я в ярости, Войси уже который день испытывает проблемы).

А с вами был Никитка, автор канала Золото Бородача. Зайдите, подпишитесь — вдруг понравится и останетесь приятным подписчиком в нашем уютном коммьюнити умных людей. А еще у нас есть обзоры на ICO (Честные Обзоры — нам за них не платят), которые всегда выводят мошенников на чистую воду, буду признателен, если почитаете.

Ну и зажимайте кнопку хлопков около этой статьи — хлопать можно до 50 раз! Это очень помогает и мотивирует авторов писать больше. Спасибо вам большое! Арибидерчи, бразес унд систас.

--

--