TON: Telegram Open Network. Частка 2: Блокчейны, шардаванне

TON: Telegram Open Network. Частка 2: Блокчейны, шардаванне

Дадзены тэкст - працяг серыі артыкулаў, у якіх я разглядаю структуру (меркавана) якая рыхтуецца да выхаду ў гэтым годзе размеркаванай сеткі Telegram Open Network (TON). У папярэдняй часткі я апісаў яе самы базавы ўзровень - спосаб узаемадзеяння вузлоў паміж сабой.

На ўсялякі выпадак нагадаю, што да распрацоўкі гэтай сеткі я дачынення не маю і ўвесь матэрыял запазычаць з адкрытай (хоць і неправеранай) крыніцы. дакумента (яшчэ да яго ёсць прыкладаецца брашура, якая выкладае сцісла асноўныя моманты), які з'явіўся ў канцы мінулага года. Аб'ём інфармацыі ў гэтым дакуменце, на мой погляд, сведчыць пра яго сапраўднасць, хаця ніякіх афіцыйных пацверджанняў таму няма.

Сёння паглядзім на асноўны кампанент TON – блокчейн.

базавыя паняцці

Рахунак (кошт). Нейкі набор дадзеных, які ідэнтыфікуецца 256-бітным лікам account_id (часцей за ўсё гэта публічны ключ уладальніка акаўнта). У базавым выпадку (гл. ніжэй нулявы воркчэйн), пад гэтымі дадзенымі маецца на ўвазе баланс карыстальніка. «Заняць» канкрэтны account_id можа хто заўгодна, але змяняць яго значэнне можна толькі па пэўных правілах.

Смарт-кантракт (смарт-кантракт). Па сутнасці - прыватны выпадак акаўнта, дапоўнены кодам смарт-кантракту і сховішчам яго зменных. Калі ў выпадку «кашалька» можна залічваць і спісваць грошы з яго па адносна простых і загадзя вызначаных правілах, то ў выпадку смарт-кантракта гэтыя правілы запісаныя ў выглядзе яго кода (на нейкай Т'юрынг-поўнай мове праграмавання).

Стан блокчэйна (state of blockchain). Сукупнасць станаў усіх акаўнтаў/смарт-кантрактаў (у абстрактным сэнсе - хэш-табліца, дзе ключамі з'яўляюцца ідэнтыфікатары акаўнтаў, а значэннямі - дадзеныя, якія захоўваюцца ў акаўнтах).

Паведамленне (паведамленне). Вышэй я ўжыў выраз «залічваць і спісваць грошы» - гэта прыватны прыклад паведамлення («перадаць N грам з акаўнта account_1 на рахунак account_2»). Відавочна, адправіць такое паведамленне можа толькі вузел, які валодае зачыненым ключом акаўнта. account_1 - і здольны пацвердзіць гэта подпісам. Вынікам дастаўкі такіх паведамленняў звычайнаму акаўнту з'яўляецца павелічэнне яго балансу, а смарт-кантракту - выкананне яго кода (які апрацуе прыём паведамлення). Зразумела, магчымыя і іншыя паведамленні (якія пераносяць не грашовыя сумы, а адвольныя дадзеныя паміж смарт-кантрактамі).

Транзакцыя (здзелка). Факт дастаўкі паведамлення называецца транзакцыяй. Транзакцыі змяняюць стан блокчэйна. Менавіта з транзакцый (запісаў аб дастаўцы паведамленняў) складаюцца блокі ў блокчэйне. У гэтым плане можна ўяўляць сабе стан блокчейна як інкрыментальную базу дадзеных - усе блокі з'яўляюцца "дыфамі", якія трэба прымяніць паслядоўна, каб атрымаць бягучы стан БД. Аб канкрэтыцы пакавання гэтых «дыфаў» (і аднаўленні поўнага стану па іх) пайдзе прамову ў наступным артыкуле.

Блокчейн у TON: што гэта і навошта?

Як згадвалася ў папярэднім артыкуле, блокчэйн - гэта структура дадзеных, элементы (блокі) якой упарадкаваны ў «ланцуг», і кожны наступны блок ланцуга змяшчае ў сабе хэш папярэдняга. У каментарах задалі пытанне: а навошта ўвогуле патрэбна такая структура дадзеных, калі ў нас ужо ёсць DHT — размеркаваная хэш-табліца? Відавочна, што нейкія дадзеныя можна захоўваць і ў DHT, але гэта падыходзіць толькі для не занадта "адчувальнай" інфармацыі. Балансы криптовалюты захоўваць у DHT нельга - у першую чаргу з-за адсутнасці праверак на цэласнасць. Уласна, уся складанасць структуры блокчейна вырастае дзеля прадухілення ўмяшанняў у захоўваемыя ў ім дадзеныя.

Аднак блокчейн ў TON выглядае яшчэ складаней, чым у большасці іншых размеркаваных сістэм – і на тое ёсць дзве прычыны. Першая - імкненне мінімізаваць патрэбнасць у форках. У традыцыйных криптовалютах усе параметры зададзены на пачатковым этапе і любая спроба іх змяніць прыводзіць фактычна да з'яўлення "альтэрнатыўнага сусвету криптовалюты". Другая прычына - падтрымка драбнення (шардынгу, шардзіравання) блокчейна. Блокчейн - структура, не здольная стаць менш з цягам часу; і звычайна кожны вузел, які адказвае за працаздольнасць сеткі, змушаны захоўваць яе цалкам. У традыцыйных (цэнтралізаваных) сістэмах для вырашэння падобных праблем прымяняецца шардаванне: частка запісаў у БД знаходзіцца на адным серверы, частка - на іншым, і г.д. У выпадку з криптовалютами такая функцыянальнасць пакуль што даволі рэдкая - у прыватнасці, з-за таго, што складана дадаць шардзіраванне ў сістэму, дзе яно не было запланавана першапачаткова.

Якім жа выявай TON плануе вырашыць абедзве вышэйапісаных праблемы?

Змесціва блокчэйна. Варкчэйны.

TON: Telegram Open Network. Частка 2: Блокчейны, шардаванне

У першую чаргу, пагаворым аб тым, што ж плануецца захоўваць у блокчейне. Захоўвацца там будуць станы акаўнтаў («кашалькоў» у базавым выпадку) і смарт-кантрактаў (для прастаты будзем лічыць, што гэта тое ж, што і акаўнты). Па сутнасці, гэта будзе звычайная хэш-табліца - ключамі ў ёй будуць ідэнтыфікатары. account_id, а значэннямі - структуры дадзеных, якія змяшчаюць у сабе такія рэчы, як:

  • баланс;
  • код смарт-кантракта (толькі для смарт-кантрактаў);
  • сховішча дадзеных смарт-кантракта (толькі для смарт-кантрактаў);
  • статыстыка;
  • (апцыянальна) публічны ключ для перакладаў з акаўнта, па змаўчанні account_id;
  • чарга выходных паведамленняў (сюды яны заносяцца для перасылкі атрымальніку);
  • спіс апошніх дастаўленых гэтаму акаўнту паведамленняў.

Як было сказана вышэй, непасрэдна блокі складаюцца з транзакцый – паведамленняў, дастаўленых розным акаўнтам account_id. Аднак акрамя account_id паведамлення ўтрымоўваюць таксама 32-бітнае поле workchain_id - Ідэнтыфікатар т.зв. воркчэйна (workchain, working blockchain). Гэта дазваляе мець некалькі незалежных сябар ад сябра блокчейнов з рознымі канфігурацыямі. Пры гэтым workchain_id = 0 лічыцца асаблівым выпадкам, нулявым воркчэйнам - менавіта змешчаныя ў ім балансы будуць адпавядаць криптовалюте TON (Grams). Верагодней за ўсё, на першых сітавінах іншых воркчейнов існаваць не будзе зусім.

Шардчэйны. Infinite Sharding Paradigm.

Але на гэтым рост колькасці блокчэйнаў не спыняецца. Разбярэмся з шардынгам. Уявім, што кожнаму акаўнту (account_id) вылучаны свой уласны блокчейн - у ім ляжаць усе прыходныя яму паведамленні - і станы ўсіх такіх блокчейнов захоўваюцца на асобных вузлах.

Вядома, гэта вельмі марнатраўна: хутчэй за ўсё, у кожны з гэтых шардчэйнаў (shardchain, shard blockchain) транзакцыі будуць паступаць вельмі рэдка, а магутных вузлоў спатрэбіцца шмат (забягаючы наперад, адзначу, што гаворка ідзе не проста аб кліентах на мабільных тэлефонах – а аб сур'ёзных серверах).

Таму шардчэйны аб'ядноўваюць у сабе акаўнты па двайковых прэфіксах іх ідэнтыфікатараў: калі шардчэйн мае прэфікс 0110, то ў яго патрапяць транзакцыі ўсіх account_id, якія пачынаюцца з гэтых лічбаў. Гэты shard_prefix можа мець даўжыню ад 0 да 60 біт - і галоўнае, што ён можа мяняцца дынамічна.

TON: Telegram Open Network. Частка 2: Блокчейны, шардаванне

Як толькі ў адзін з шардчэйнаў пачынае паступаць празмерна шмат транзакцый, якія працуюць над ім вузлы па загадзя вызначаных правілах "расшчапляюць" яго на два даччыных - іх прэфіксы будуць на адзін біт даўжэй (і для аднаго з іх гэты біт будзе роўны 0, а для іншага - 1). Напрыклад, shard_prefix = 0110b расшчапіцца на 01100b і 01101b. У сваю чаргу, калі два «суседніх» шардчейна пачнуць пачувацца досыць прывольна (на працягу некаторага часу), яны зноў зліюцца разам.

Такім чынам, шардыраванне робіцца "знізу ўверх" - мы мяркуем, што кожны акаўнт валодае сваім шардам, але яны - да пары да часу - "склеены" па прэфіксах. Гэта і мае на ўвазе пад сабой Infinite Sharding Paradigm (парадыгма бясконцага шаліравання).

Асобна хочацца падкрэсліць, што воркчэйны існуюць толькі віртуальна — насамрэч, workchain_id гэта частка ідэнтыфікатара канкрэтнага шардчэйна. Кажучы фармальнай мовай, кожны шардчэйн вызначаецца парай лікаў (workchain_id, shard_prefix).

Выпраўленне памылак. Вертыкальныя блокчейны.

Традыцыйна лічыцца, што любая транзакцыя ў блокчейне з'яўляецца "высечанай у камені". Аднак, у выпадку з TON прадугледжана магчымасць "перапісаць гісторыю" - у выпадку, калі нехта (т.зв. вузел-«рыбак») дакажа, што адзін з блокаў быў падпісаны некарэктна. У гэтым выпадку ў які адпавядае шардчейн дадаецца адмысловы які карэктуе блок, утрымоўвальны хэш самага выпраўляльнага блока (а не апошняга блока ў шардчейне). Прадстаўляючы шардчейн як ланцужок блокаў, выкладзеную па гарызанталі, можна сказаць, што які карэктуе блок падчапляецца да памылковага блока не направа, а зверху – таму лічыцца, што ён становіцца часткай маленькага «вертыкальнага блокчейна». Такім чынам, можна сказаць, што шардчейны з'яўляюцца двухмернымі блокчэйнамі.

TON: Telegram Open Network. Частка 2: Блокчейны, шардаванне

У выпадку, калі пасля памылковага блока на ўнесеныя ім змены спасылаліся наступныя блокі (г.зн., былі здзейснены новыя транзакцыі на аснове невалідных), да гэтых блокаў гэтак жа "зверху" дадаюцца якія карэктуюць. Калі блокі не закраналі «здзіўленую» інфармацыю, на іх гэтыя «карэктуючыя хвалі» не распаўсюджваюцца. Напрыклад, у ілюстрацыі вышэй некарэктнай была прызнана транзакцыя першага блока, якая павялічвае баланс акаўнта C - таму транзакцыя, якая памяншае баланс гэтага акаўнта ў трэцім блоку, таксама павінна быць анулявана, а па-над самым блокам закаммічны які карэктуе блок.

Трэба заўважыць - хоць якія карэктуюць блокі і адлюстроўваюцца размешчанымі «над» арыгінальнымі, фактычна яны будуць дапісаны ў канец адпаведнага блокчейна (туды, дзе павінны знаходзіцца храналагічна). Двухмернае размяшчэнне толькі паказвае, да якой кропкі ў блокчейне яны будуць «падчэпленыя» (пасродкам змешчанага ў іх хэша арыгінальнага блока).

Можна асобна пафіласофстваваць аб тым, наколькі добрым з'яўляецца рашэнне "мяняць мінулае". Здавалася б, калі мы дапушчаем магчымасць з'яўлення некарэктнага блока ў шардчейне, то нельга не дапусціць і магчымасці з'яўлення памылковага які карэктуе блока. Тут, наколькі я магу меркаваць, розніца ў колькасці вузлоў, якая павінна дасягнуць кансенсусу наконт новых блокаў — над кожным шардчэйнам будзе працаваць адносна невялікаяпрацоўная група» вузлоў (даволі часта якая змяняе свой склад), а ўнясенне карэкціруючых блокаў запатрабуе згоды наогул усіх вузлоў-валідатараў. Больш падрабязна пра валідатараў, працоўныя групы і іншыя ролі вузлоў я раскажу ў наступным артыкуле.

Адзін блокчэйн, каб кіраваць усімі

Вышэй пералічана шмат інфармацыі аб розных відах блокчейнов, якую саму па сабе таксама варта дзесьці захоўваць. У прыватнасці, размова аб наступных звестках:

  • аб колькасці і канфігурацыях воркчэйнаў;
  • аб колькасці шардчэйнаў і іх прэфіксах;
  • пра тое, якія вузлы ў дадзены момант адказныя за якія шардчэйны;
  • хэшы апошніх дададзеных блокаў ва ўсе шардчейны.

Як вы ўжо маглі здагадацца, усе гэтыя рэчы запісваюцца ў яшчэ адно сховішча-блокчэйн. майстарчэйн (masterchain, master blockchain). Дзякуючы наяўнасці ў яго блоках хэшаў ад блокаў усіх шардчэйнаў, ён робіць сістэму моцна звязанай. У тым ліку гэта азначае, што генерацыя новага блока ў майстэрні будзе адбывацца непасрэдна пасля генерацыі блокаў у шардчэйнах - чакаецца, што блокі ў шардчэйнах будуць з'яўляцца амаль адначасова прыкладна кожныя 5 секунд, а чарговы блок у майстэрні - праз секунду пасля гэтага.

Але хто ж будзе адказны за рэалізацыю ўсёй гэтай тытанічнай працы - за перасылку паведамленняў, выкананне смарт-кантрактаў, фармаванне блокаў у шардчэйнах і майстэрні, ды яшчэ і праверку блокаў на памылкі? Няўжо ўсё гэта будуць цішком рабіць тэлефоны мільёнаў карыстальнікаў з усталяваным на іх кліентам Тэлеграма? Ці, можа, каманда Дуровых адмовіцца ад ідэй дэцэнтралізацыі і гэта будуць рабіць іх сервера па-старому?

Насамрэч, ні той, ні іншы адказ не з'яўляецца правільным. Але палі гэтага артыкула імкліва заканчваюцца, таму размова аб розных ролях вузлоў (вы маглі ўжо заўважыць згадкі некаторых з іх), а таксама аб механіках іх працы пойдзе ўжо ў наступнай частцы.

Крыніца: habr.com

Дадаць каментар