
See tekst on artikkel, kus ma kĂ€sitlen struktuuri (tĂ”enĂ€oliselt) sellel aastal vĂ€lja tuleva jaotatud vĂ”rgustiku Telegram Open Network (TON). kirjeldasin selle kĂ”ige baastaset â sĂ”lmede omavahelist suhtlemist.
Igaks juhuks meenutan, et ma ei ole seotud selle vĂ”rgu arendamisega ja kogu materjal on saadud avatud (kuigi kontrollimata) allikast â (millega on kaasas , mis lĂŒhidalt kokku vĂ”tab pĂ”hiaspektid), mis ilmus eelmisel aastal. Materjali maht selles dokumendis, minu arvates, viitab selle ehtsusele, kuigi ametlikke kinnitusi ei ole.
TĂ€na vaatame TON-i pĂ”hikomponenti â plokiahelat.
PÔhidokumendid
Konto (account). Teatud andmekogum, mida identifitseerib 256-bitine number account_id (enamasti on see konto omaniku avalik vĂ”ti). Baastasemel (vt allpool null plokiahel), nende andmete all mĂ”istetakse kasutaja taset. "Laenata" saab igaĂŒks, kuid selle vÀÀrtust saab muuta ainult kindlate reeglite jĂ€rgi. account_id Nutikas leping
smart-contract (). Sisuliselt on see konto erijuhtum, millele on lisatud nutika lepingu kood ja selle muutujate hoidla. Kui "rahakoti" puhul saab raha kontole kanda ja sealt vÀlja vÔtta suhteliselt lihtsate ja eelnevalt mÀÀratletud reeglite alusel, siis nutika lepingu puhul on need reeglid kirjas tema koodis (mÔnes Turingu tÀisvÔimes programmeerimiskeeles).Plokiahela olek
state of blockchain (). KĂ”igi kontode/nutika lepingute olekute kogum (abstraktses mĂ”ttes â hĂ€shtabel, kus vĂ”tmed on konto identifikaatorid ja vÀÀrtused on kontodes hoitavad andmed).). Ălalpool kasutasin vĂ€ljendit "kanda raha" â see on eriline nĂ€ide sĂ”numist ("kanda
Teade (messageN grammi kontolt account_1 kontole account_2 "). Ilmselgelt saadab sellise sĂ”numi vaid sĂ”lm, kellel on konto privaatvĂ”ti.»). Ilmselt vĂ”ib sellise sĂ”numi saata ainult sĂ”lm, millel on konto privaatvĂ”ti kontole â ja suudab seda kinnitada allkirjaga. Selliste sĂ”numite saatmise tulemuseks tavalisele kontole on selle tasakaalu suurenemine, samas kui nutilepingule toimub olemasoleva koodi tĂ€itmine (mis töötleb sĂ”numi vastuvĂ”tmist). Loomulikult on vĂ”imalikud ka muud sĂ”numid (mida kantakse, edastades mitte rahasummasid, vaid suvalisi andmeid nutilepingute vahel).
Tehing (tehing). SĂ”numi kohaletoimetamise fakti nimetatakse tehinguks. Tehingud muudavad plokiahela seisundit. Just tehingutest (sĂ”numite kohaletoimetamise registreerimise) koosnevad plokid plokiahelas. Sellest vaatepunktist vĂ”ib plokiahela seisundit kujutada kui inkrmenteerivat andmebaasi â kĂ”ik plokid on âdiffidâ, mis tuleb jĂ€rjestikulised rakendada, et saada praegune andmebaasi seisund. TĂ€psemalt nende âdiffideâ pakkimise kohta (ja tĂ€ieliku seisundi taastamise kohta nende pĂ”hjal) rÀÀgime jĂ€rgmises artiklis.
Plokiahel TONis: mis see on ja milleks seda vaja?
Nagu mainitud eelnevas artiklis, plokiahel on andmestruktuur, mille elemendid (plokid) on jĂ€rjestatud âahelasseâ ja iga jĂ€rgmine ahelaplokke sisaldab eelneva hĂ€sĆĄi. Kommentaarides esitati kĂŒsimus: miks on selline andmestruktuur ĂŒldse vajalik, kui meil on juba DHT â jaotatud hĂ€shtabel? On ilmne, et teatud andmeid saab salvestada ka DHT-s, kuid see sobib ainult mitte liiga âtundlikuleâ teabele. KrĂŒptorahade saldod ei saa DHT-sse salvestada â eelkĂ”ige seetĂ”ttu, et seal puuduvad kontrollid puutumatuse. Tegelikult tuleneb plokiahela struktuuri kogu keerukus selleks, et vĂ€ltida sekkumist selle salvestatud andmetesse.
Kuid plokiahel TONis nĂ€eb vĂ€lja isegi keerukam kui enamik teisi jaotatud sĂŒsteeme â ja sellel on kaks pĂ”hjust. Esiteks â soov minimeerida vajadust haakimiste. Traditsioonilistes krĂŒptovaluutades on kĂ”ik parameetrid mÀÀratud alguses ja iga nende muutmise katse viib tegelikult âalternatiivse krĂŒptovaluuta universumiâ loomiseni. Teine pĂ”hjus â toetada jaotamist (shardimist, jagamine) blokcheini. Blokcheyn on struktuur, mis ei suuda aja jooksul vĂ€heneda; ja tavaliselt peab iga sĂ”lme, mis vastutab vĂ”rgu töökorras hoidmise eest, selle tĂ€iesti hoidma. Traditsioonilistes (tsentraliseeritud) sĂŒsteemides kasutatakse sarnaste probleemide lahendamiseks lĂ”hestamist: osa andmetest andmebaasis on ĂŒhel serveril, teine osa teisel jne. KrĂŒptoraha puhul on selline funktsionaalsus senini ĂŒsna haruldane â eelkĂ”ige seetĂ”ttu, et on keeruline lisada lĂ”hestamist sĂŒsteemi, kus seda ei olnud algselt kavandatud.
Kuidas kavatseb TON lahendada mĂ”lemad ĂŒlaltoodud probleemid?
Blokcheini sisu. Workchains.

Esiteks rÀÀgime sellest, mida on plaanis blokcheinis hoida. Seal hoitakse kontode (algses juhtumis ârahakotidâ) ja nutilepingute olekuid (lihtsuse pĂ€rast arvame, et need on samad, mis kontod). Tegu on pĂ”himĂ”tteliselt tavalise hash-tabeliga â vĂ”titena on seal identifikaatorid account_id, vÀÀrtustena aga andmestruktuurid, milles sisalduvad sellised asjad nagu:
- saldo;
- nutilepingu kood (ainult nutilepingute puhul);
- nutilepingu andmehoidla (ainult nutilepingute puhul);
- statistika;
- (valikuline) avalik vĂ”ti kontolt ĂŒlekannete jaoks, vaikimisi account_id;
- vÀljuvate sÔnumite jÀrjekord (siia need kantakse saatmiseks adressaadile);
- viimasele sellele kontole edastatud sÔnumite nimekiri.
Nagu varem öeldud, koosnevad plokid otseselt tehingutest â sĂ”numitest, mis on edastatud erinevatele kontodele account_id. Kuid lisaks account_id-le sisaldavad sĂ”numid ka 32-bitist vĂ€lja workchain_id â identifikaator nii-öelda. workchain (workchain, töötav blokchaing). See vĂ”imaldab omada mitmeid omavahel sĂ”ltumatuid blokchaine erinevate konfigureeringutega. Samal ajal on workchain_id = 0 erijuhtum, nullworkchain â just selle saldo vastab TON (Grams) krĂŒptorahale. TĂ”enĂ€oliselt ei eksisteeri algusaegadel teisi workchain'e ĂŒldse.
Shardchains. LÔpmatu lÔhestamise paradigma.
Kuid blockchain'ide arvu kasv ei peatu siin. Vaatame shardimist. Kujutame ette, et igaĂŒhele (account_id) on eraldatud omaenda blockchain - seal on kĂ”ik tema saadetud sĂ”numid - ja kĂ”ikide selliste blockchain'ide olekud salvestatakse eraldi sĂ”lmedes.
Muidugi on see ĂŒsna raiskav: tĂ”enĂ€oliselt saab igasse neist shardchain'idesse (shardchain, shard blockchain) tehingud saavad vĂ€ga harva, ja palju jĂ”ulisi sĂ”lmi on vaja (rÀÀkinud ette, tuletan meelde, et jutt ei kĂ€i mitte lihtsalt mobiilsete klientide kohta - vaid tĂ”siste serverite kohta).
SeetĂ”ttu koondavad shardchain'id kontod oma identifikaatorite binaarsete prefikside jĂ€rgi: kui shardchain'il on prefiks 0110, siis kuuluvad sinna kĂ”ik account_id, mis algavad nende numbritega. See shard_prefix vĂ”ib olla pikkusega 0 kuni 60 bitti - ja mis peamine, see vĂ”ib dĂŒnaamiliselt muutuda.

Niipea, kui ĂŒhte shardchain'i hakkab jĂ”udma liiga palju tehinguid, siis selle kallal töötavad sĂ”lmed vastavalt eelnevalt mÀÀratletud reeglitele "lahutavad" selle kaheks tĂŒtarĂŒksuseks - nende prefiksid on ĂŒhe bitiga pikemad (ja ĂŒhele neist on see bit 0, teisele aga 1). NĂ€iteks, shard_prefix = 0110b lahustub 01100b ja 01101b. Omakorda, kui kaks "naaberriiki" shardchain'i hakkavad end piisavalt mugavalt tundma (mingi perioodi jooksul), siis nad liituvad taas ĂŒksiksuse.
Nii tehakse shardimine "alt ĂŒles" - me eeldame, et igal kontol on oma shard, kuid need on - kĂŒll hetkel - "liimitud" prefikside jĂ€rgi. See ongi see, mida tĂ€hendab Infinite Sharding Paradigm (lĂ”putu shardimise paradigma).
Erakordselt tahaks rÔhutada, et workchain'id eksisteerivad ainult virtuaalselt - tegelikult, workchain_id on see konkreetse shardchain'i identifikaatori osa. Formaalset keelt kasutades mÀÀratleb iga shardchain paar numbreid (workchain_id, shard_prefix).
Vigade parandamine. Vertikaalsed blockchain'id.
Traditsiooni kohaselt peetakse, et iga blockchain'is olev tehing on "kivisse raiutud". Siiski, TON'i korral on ette nĂ€htud vĂ”imalus "ajalugu ĂŒmber kirjutada" - juhul, kui keegi (nn "kalamehe" sĂ”lm) tĂ”estab, et ĂŒks plokk on allkirjastatud valesti. Sellisel juhul lisatakse vastavasse shard-ahelasse spetsiaalne parandav plokk, mis sisaldab parandatava ploki (mitte shard-ahela viimase ploki) hĂ€shti. Kujutades shard-ahelat horisontaalse plokkide ahelana, vĂ”ib öelda, et parandav plokk kinnitatakse vale ploki juurde mitte paremale, vaid ĂŒlevalt - seetĂ”ttu loetakse, et see muutub vĂ€ikese 'vertikaalse plokiahela' osaks. Seega vĂ”ib öelda, et shard-ahelad on kahemÔÔtmelised plokiahelad.

Juhul, kui vale ploki tehtud muudatustele viitasid sellele jĂ€rgnenud plokid (st valeandmete pĂ”hjal tehti uusi tehinguid), lisatakse ka nendele plokkidele 'ĂŒlevalt' parandavad plokid. Kui plokid ei puudutanud 'mĂ”jutatuid' andmeid, ei laiene need 'parandavad lained' neile. NĂ€iteks, nagu ĂŒlaltoodud joonisel, tunnistati esimese ploki tehing vale, mis suurendas konto C saldo - seetĂ”ttu peab ka selle konto saldo vĂ€hendav tehing kolmandas plokis olema tĂŒhistatud ja parandav plokk peab olema kirjutatud otse selle ploki peale.
Tuleb mÀrkida, et ehkki parandavad plokid kuvatakse 'originalide' kohal, kirjutatakse nad tegelikult vastava plokiahela lÔppu (seal, kus nad kronoloogiliselt paiknema peavad). KahemÔÔtmeline paigutus nÀitab vaid, millisele plokiahela punktile nad 'kinnitatakse' (kasutades nende algse ploki hÀshti).
VĂ”ib eraldi filosoofeerida selle ĂŒle, kui hea on otsus 'mineviku muutmine'. Tundub, et kui me lubame vale ploki tekkimist shard-ahelas, siis ei saa me vĂ€listada ka vale parandava ploki vĂ”imalust. Siin, kui ma Ă”igesti aru sain, on erinevus sĂ”lmede arvus, mis peavad uute plokkide ĂŒle konsensusele jĂ”udma - iga shard-ahela kallal töötab suhteliselt vĂ€iketöörĂŒhmsĂ”lmede (mis sageli muudavad oma koosseisu), samas kui parandavate plokkide lisamine nĂ”uab kĂ”igi kehtivate sĂ”lmedekonsensust. Rohkem rÀÀgin kehtijatest, töörĂŒhmades ja muudest sĂ”lmede rollidest jĂ€rgmises artiklis.
Ăks plokiahel, et kĂ”ike juhtida
Ălaltoodud on palju teavet erinevate plokiahelate tĂŒĂŒpide kohta, mida tuleb samuti kuskil salvestada. EelkĂ”ige rÀÀgime jĂ€rgmiste andmete kohta:
- töötajate arvu ja konfiguratsioonide kohta;
- ĆĄardhahelate arvu ja nende eesliidete kohta;
- millised sÔlmed vastutavad praegu milliste ƥardhahelate eest;
- viimati lisatud plokkide hash'id kÔikidesse ƥardhahelatesse.
Nagu te juba vĂ”isite arvata, salvestatakse kĂ”ik need asjad veel ĂŒhte plokiahelasse - meisterplokiahel (masterchain, master blockchain). TĂ€nu sellele, et selle plokkides on hash'id kĂ”igi ĆĄardhahelate plokkidest, muudab see sĂŒsteemi tugevalt ĂŒhendatuks. See tĂ€hendab ka, et uue ploki genereerimine meisterplokiahelas toimub otse pĂ€rast plokkide genereerimist ĆĄardhahelates - oodatakse, et plokid ĆĄardhahelates ilmuvad peaaegu samaaegselt iga viie sekundi tagant, ning jĂ€rgmine plokk meisterplokiahelas ilmub sekund pĂ€rast seda.
Aga kes on vastutav kogu selle titaanliku töö teostamise eest - sÔnumite edastamine, nutilepingute tÀitmine, plokkide genereerimine ƥardhahelates ja meisterplokiahelas, ning plokkide vigade kontrollimine? Kas kÔik seda teevad vaikselt miljonite kasutajate telefonid, millel on installitud Telegrami klient? VÔi loobub Durovi meeskond detsentraliseerimise ideedest ja teeb seda nende serverid vanamoodsalt?
Tegelikult ei ole kumbki vastus Ôige. Kuid selle artikli lehed lÔppevad kiiresti, seega on jutt erinevatest sÔlmede rollidest (te olete ehk juba mÔned neist mainimisi mÀrganud) ning nende töömehhanismidest jÀrgmises osas.
Allikas: habr.com
