Iga jaotatud sĂŒsteemi kohta esitatav levinud kĂŒsimus mitte-tehniliselt inimeselt on "Kui palju tps on teie plokiahelas?". Kuid vastuseks antud number ei pruugi tegelikult olla see, mida kĂŒsija kuulda tahab. Tegelikult tahtis ta kĂŒsida, "kas teie plokiahel sobib minu Ă€rinĂ”uetele", ja need nĂ”uded ei ole lihtsalt ĂŒks number, vaid mitmed tingimused - sealhulgas vĂ”rgu taluvus, lĂ”pparve nĂ”uded, tehingute maht ja iseloom ning palju muid parameetreid. Seega on vastus kĂŒsimusele "Kui palju tps" tĂ”enĂ€oliselt mitte lihtne ja peaaegu kunagi mitte tĂ€ielik. Jaotatud sĂŒsteem, kus on kĂŒmneid ja sadu sĂ”lmi, mis teevad ĂŒsna keerulisi arvutusi, vĂ”ib olla tohutu hulga erinevates olekutes, mis on seotud vĂ”rgu oleku, plokiahela sisu, tehniliste tĂ”rgete, majandusprobleemide, rĂŒnnakute vĂ”rgu ja paljude muude pĂ”hjustega. Etapid, kus vĂ”ib esineda jĂ”udlusprobleeme, erinevad traditsioonilistest teenustest, ja server, mis tegutseb plokiahelas, on vĂ”rgu teenus, mis ĂŒhendab endas andmebaasi, veebiserveri ja torrent-klient jarollide, mis muudab selle ÀÀrmiselt keeruliseks koormuse profiilide osas kĂ”ikides alamsĂŒsteemides: protsessor, mĂ€lu, vĂ”rk, salvestus.
On tulnud vĂ€lja, et detsentraliseeritud vĂ”rgud ja plokiahelad on ĂŒsna spetsiifilised ja harjumatud tarkvaratooted kesksete tarkvaraarendajate jaoks. SeetĂ”ttu soovin tuua esile olulised aspektid detsentraliseeritud vĂ”rkude jĂ”udluse ja vastupidavuse kohta, lĂ€henemisviisid nende mÔÔtmiseks ja kitsaste kohtade leidmiseks. Uurime erinevaid jĂ”udlusprobleeme, mis piiravad plokiahela teenuse pakkumise kiirusen, ja tĂ€histame sellele tarkvarale iseloomulikke jooni.
Plokiahela kliendi teenuse pÀringu etapid
Kvaliteedi objektiivselt hindamiseks igasugustes keerukates teenustes tuleb arvesse vĂ”tta mitte ainult keskmisi vÀÀrtusi, vaid ka maksimaalseid/ minimaalseid vÀÀrtusi, mediaane ning persentiile. Teoreetiliselt on vĂ”imalik rÀÀkida 1000 tps-st mingisuguses plokiahelas, kuid kui 900 tehingut toimusid erakordselt kiiresti, samas kui 100 â "seiskusid" mitme sekundi jooksul, siis kĂ”igi tehingute kohta kogutud keskmine aeg ei pruugi olla aus nĂ€itaja kliendi jaoks, kes ei suutnud tehingut paar sekundi jooksul lĂ”pule viia. Ajanikud, mis on pĂ”hjustatud konsensuse ringide vahelejÀÀnud vĂ”i vĂ”rgu jagunemise tĂ”ttu, vĂ”ivad oluliselt halvendada teenust, mille teststandards nĂ€itas suurepĂ€rast jĂ”udlust.
Selliste kitsaskohtade tuvastamiseks on vajalik hĂ€sti mĂ”ista etappe, mille jooksul reaalsed plokiahelad vĂ”ivad kasutajate teenindamisel takistusi kogeda. Kirjeldame tehingute tarnimise, töötlemise ja uue plokiahela seisundi saamise tsĂŒklit, mille jĂ€rgi klient saab veenduda, et tema tehing on töödeldud ja arvesse vĂ”etud.
- tehing vormistatakse kliendi poolt
- tehing allkirjastatakse kliendi poolt
- klient valib ĂŒhe sĂ”lme ja saadab sinna oma tehingu
- klient liitub state database sÔlme uuendustega, oodates oma tehingu tÀitmise tulemusi
- sÔlm levitab tehingut p2p vÔrgus
- mitmed vĂ”i ĂŒks BP (block producer) töötlevad kogutud tehingud, uuendades state database
- BP koostab uue ploki, töötledes vajaliku arvu tehinguid
- BP levitab uut ploki p2p vÔrgus
- uus plokk toimetatakse sĂ”lme, millega klient ĂŒhendust vĂ”tab
- sÔlm uuendab state database
- sÔlm nÀeb kliendiga seotud uuendust ja saadab talle tehingu teate
Vaatame nĂŒĂŒd neid etappe lĂ€hemalt ja kirjeldame vĂ”imalikke jĂ”udlusprobleeme igal etapil. Erinevalt tsentraliseeritud sĂŒsteemidest kĂ€sitleme ka koodi tĂ€itmist vĂ”rgu klientide juures. Ăsna tihti, kui mÔÔdetakse tps-i, kogutakse tehingute töötlemise aega sĂ”lmedelt, mitte kliendilt â see pole just aus. Klient ei huvita, kui kiiresti sĂ”lm töötleb tema tehingut; tema jaoks on kĂ”ige olulisem hetk, mil usaldusvÀÀrne teave selle tehingu kohta, mis on lisatud plokiahelasse, talle kĂ€tte saadakse. Just see mÔÔdik on sisuliselt tehingu tĂ€itmise aeg. See tĂ€hendab, et erinevad kliendid, isegi saates sama tehingu, vĂ”ivad saada tĂ€iesti erinevaid aegu, mis sĂ”ltuvad kanalist, koormusest ja sĂ”lme lĂ€hedusega seotud teguritest. Seega on tĂ€iesti hĂ€davajalik mÔÔta seda aega klientide juures, kuna just seda parameetrit tuleb optimeerida.
Tehingu ettevalmistamine kliendi poolel
Alustame kahest esimesest punktist: tehingu loob ja allkirjastab klient. Ăllatuslikult vĂ”ib see olla ka blockchain'i jĂ”udluse kitsaskohaks kliendi vaatenurgast. See on ebatavaline tsentraliseeritud teenuste puhul, kus kĂ”ik arvutused ja andmeoperatsioonid vĂ”etakse enda kanda, jĂ€ttes kliendile vaid lĂŒhikese pĂ€ringu vormimise, mis suudab kĂŒsida suurt hulka andmeid vĂ”i arvutusi, saades valmis tulemuse. Blockchain'ides muutub kliendikood ĂŒha vĂ”imsamaks, samas kui blockchain'i tuum on ĂŒha kergem, ning massiivsed arvutusĂŒlesanded on tavaks anda kliendi tarkvarale. Blockchain'ides on olemas kliendid, kes vĂ”ivad ĂŒhe tehingu ette valmistamiseks aega kulutada (rÀÀkides erinevatest Merkle'i tĂ”enditest, lĂŒhikestest tĂ”enditest, threshold_allkirjadest ja muudest keerukatest operatsioonidest kliendi poolel). Hea nĂ€ide kerge on-chain valideerimise ja raskete tehingu ettevalmistuste kohta kliendi poolel on tĂ”end kuuluvusest loendisse, mis pĂ”hineb Merkle-puul. .
Samuti ei tohi unustada, et kliendi kood mitte ainult ei saada tehinguid plokiahelasse, vaid esmalt kĂŒsib plokiahela olekut â ja see tegevus vĂ”ib mĂ”jutada vĂ”rgu koormust ja plokiahela sĂ”lmi. Seega, mÔÔtmisi tehes, on mĂ”istlik simuleerida vĂ”imalikult tĂ€ielikult kliendi koodi kĂ€itumist. Isegi kui teie plokiahelas on tavalised kerged kliendid, kes panevad lihtsa digitaalse allkirja kĂ”ige lihtsamale varade edastamise tehingule, siis iga aastaga kasvab jĂ”udluse nĂ”udmine kliendil, krĂŒptoalgoritmid tugevnevad ja see protsessi osa vĂ”ib muutuda tulevikus tĂ”siseks pudelikaelakaiks. SeetĂ”ttu olge ettevaatlikud ja Ă€rge laske mööda olukorda, kus 3,5 sekundi vĂ€ltel kulub 2,5 sekundit tehingu ettevalmistamiseks ja allkirjastamiseks ning 1,0 sekundit saatmiseks vĂ”rku ja vastuse ootamiseks. Selle pudelikaela tekkimise riskide hindamiseks tuleb koguda metrikaid kliendi masinatelt, mitte ainult plokiahela sĂ”lmedelt.
Tehingu saatmine ja selle staatuse jÀlgimine
JĂ€rgmiseks sammuks on tehingu saatmine valitud plokiahelasĂ”lmesse ja selle staatuse saamine tehingute basseinile vastuvĂ”tmise osas. See etapp on sarnane tavaliste andmebaaside pĂ€ringutega, sĂ”lm peab tehingu kirja panema basseinile ja alustama teabe edastamist p2p vĂ”rgu kaudu. LĂ€henemine, millega hinnatakse jĂ”udlust, on siin sarnane traditsiooniliste Web API mikroteenuste töö hindamisega, samas kui plokiahelate tehingud saavad uuendusi ja vĂ”ivad aktiivselt oma staatust muuta. Ăldiselt vĂ”ib tehingute kohta teabe uuendamine mĂ”nedes plokiahelates toimuda mitu korda, nĂ€iteks ketaste harude vahel vahetamisel vĂ”i kui BP teatavad oma kavatsusest lisada tehing plokki. Seda basseini suurusele ja tehingute arvule kehtestatud piirangud vĂ”ivad mĂ”jutada plokiahela jĂ”udlust. Kui tehingute bassein on tĂ€idetud maksimaalse vĂ”imaliku suurusega vĂ”i ei mahutu operatiivmĂ€lu, vĂ”ib vĂ”rgu jĂ”udlus mĂ€rgatavalt langeda. Plokiahelad ei oma tsentraliseeritud vahendeid rĂ€mpssĂ”numite voogu kaitsta, ning kui plokiahel toetab suuri tehingute mahtusid ja madalaid tasusid, vĂ”ib see viia tehingute basseini ĂŒlevooluni â see on veel ĂŒks potentsiaalne jĂ”udluse kitsaskoht.
Plokiahelites saadab klient tehingu mis tahes soovitud plokiahelasĂ”lme, tehingu hash on tavaliselt kliendile teada juba enne saatmist, seega tuleb tal vaid saavutada ĂŒhendus ja pĂ€rast edastamist oodata, kuni plokiahel muudab oma seisundit, lisades tema tehingu. TĂ€hisena, et mÔÔtes 'tps' vĂ”ib saada tĂ€iesti erinevaid tulemusi erinevate viisil ĂŒhendamiseks plokiahelasĂ”lmega. See vĂ”ib olla tavaline HTTP RPC vĂ”i WebSocket, mis vĂ”imaldab rakendada 'subscribe' mustrit. Teisel juhul saab klient teavituse varem ning sĂ”lm sÀÀstab vĂ€hem ressursse (peamiselt mĂ€lu ja liiklust) tehingu oleku vastamiseks. SeetĂ”ttu tuleb 'tps' mÔÔtmisel arvesse vĂ”tta viisi, kuidas kliendid on ĂŒhendatud sĂ”lmedega. Seega, et hinnata selle bottleneck'i riske, peab plokiahela benchmark suutma emuleerida kliente nii WebSocketi kui ka HTTP RPC pĂ€ringutega, proportsioonides, mis vastavad tĂ”elistele vĂ”rkudele, ning samuti vahetama tehingute iseloomu ja nende suurust.
Selle bottleneck'i riski hindamiseks tuleb samuti koguda mÔÔtmisi klientide masinast, mitte ainult plokiahela sÔlmedelt.
Tehingute ja plokkide edastamine p2p-vÔrgus
Plokiahelites kasutatakse peer-to-peer (p2p) vĂ”rguĂŒhendust tehingute ja plokkide edastamiseks osalejate vahel. Tehingud levivad vĂ”rgus, alustades ĂŒhest sĂ”lmest, kuni nad jĂ”uavad peer'ide-block producer'ite juurde, kes pakivad tehingud plokkidesse ja levitavad uusi plokke kĂ”ikidele sĂ”lmedele vĂ”rgu kaudu sama p2p tehnoloogia abil. Enamiku kaasaegsete p2p vĂ”rkude aluseks on erinevad Kademlia protokolli modifikatsioonid. hea lĂŒhike ĂŒlevaade sellest protokollist, â artikkel erinevate mÔÔtmiste kohta BitTorrent vĂ”rgus, mille pĂ”hjal saab aru, et see tĂŒĂŒpi vĂ”rgud on keerulisemad ja vĂ€hem ettearvatavad kui rangelt konfigureeritud tsentraliseeritud teenuse vĂ”rk. Samuti, artikkel erinevate huvitavate mÔÔtmete mÔÔtmisest Ethereum'i sĂ”lmede jaoks.
LĂŒhidalt öeldes toetab iga peer sellistes vĂ”rkudes oma ainulaadset dĂŒnaamilist nimekirja teistest peer'idest, kellelt kĂŒsitakse teavet plokkide kohta, mis on aadressitud nende sisule. Kui peer saab pĂ€ringu, siis kas ta edastab vajaliku teabe vĂ”i edastab pĂ€ringu jĂ€rgmisele pseudo-juhuslikule peer'ile nimekirjast, ning pĂ€rast vastuse saamist edastab selle pĂ€rijale ja salvestab selle mĂ”neks ajaks vahemĂ€llu, andes selle teabe ploki jĂ€rgmine kord kiiremini. Nii satub populaarne teave paljude peer'ide vahemĂ€lludesse, samas kui vĂ€hem populaarne tĂ”rjutakse jĂ€rk-jĂ€rgult kĂ”rvale. Peer'id jĂ€lgivad, kes kellele kui palju teavet edastanud on, ning vĂ”rk pĂŒĂŒab aktiveerida aktiivseid jagajaid, tĂ”stes nende reitingut ja pakkudes neile kĂ”rgemat teenustaset, automaatselt kĂ”rvaldades mitteaktiivsed osalised peer'ide nimekirjadest.
Nii et, nĂŒĂŒd tuleb tehing levitada vĂ”rgus, et block-producerid nĂ€eksid seda ja saaksid selle blokki lisada. Nodo jagab aktiivselt uut tehingut kĂ”igile soovijatele ja kuulab vĂ”rku, oodates blokki, kuhu vajalikke tehingud ilmuvad, et teavitada ootavat klienti. Aeg, mille jooksul vĂ”rk edastab ĂŒksteisele teavet uute tehingute ja blokkide kohta p2p-vĂ”rkudes, sĂ”ltub vĂ€ga paljusid faktoreid: ausate ja aktiivsete (vĂ”rgupoolest) nodode arv, nende nodode vahemĂ€lu âsoojendamineâ, blokkide ja tehingute suurus, muudatuste iseloom, vĂ”rgu geograafia, nodode arv ja veel paljusid tegureid. Komplekssete mÔÔtmiste tegemine selliste vĂ”rkude töö tĂ”hususe kohta on keeruline, kuna tuleb samaaegselt hinnata pĂ€ringute töötlemise aega nii klientidelt kui ka peer-idelt (blockchain nodod). Probleemid mistahes p2p mehhanismis, vale andmete eemaldamine ja vahemĂ€lude haldamine, ebaefektiivne aktiivsete peer-ide haldamine ja paljusid muid tegureid vĂ”ivad pĂ”hjustada viivitusi, mis mĂ”jutavad kogu vĂ”rgu tĂ”husust, ja see kitsaskoht on kĂ”ige keerulisem analĂŒĂŒsimiseks, testimiseks ja tulemuste tĂ”lgendamiseks.
Plokiahelate ja staatuse andmebaasi vÀrskendamine
Blokeeringu töö kĂ”ige olulisem osa on konsensuse algoritm, mille rakendamine uutele, vĂ”rgu kaudu saadud plokkidele ja tehingute töötlemine, mille tulemused salvestatakse staatuse andmebaasi. Uue ploki lisamine ahelasse ja sellele jĂ€rgnev peamise ahela valimine peaks toimuma vĂ”imalikult kiiresti. Siiski, reaalses elus 'peaks' ei tĂ€henda 'töötab', ja vĂ”ib nĂ€iteks kujutleda olukorda, kus kaks pikka konkurentsivĂ”imelist ahelat vahetavad pidevalt ĂŒksteist, muutes tuhandete tehingute metaandmeid igal vahetusel ja viies pidevatesse olekute tagasipöördumisse staatuse andmebaasis. See etapp on pudelikaela mÀÀramisel lihtsalt mĂ”istetavam kui vĂ”rgup-tp kiht, kuna tehingute tĂ€itmine ja konsensuse algoritm on rangelt mÀÀratletud, ja siin on midagi mÔÔta lihtsam.
Peamine on mitte segi ajada selle etapi juhuslikku jĂ”udluse halvenemist vĂ”rgu probleemidega â sĂ”lmed edastavad aeglasemalt plokke ja teavet peamise ahela kohta ning vĂ€line klient vĂ”ib seda tĂ”lgendada kui aeglast vĂ”rku, kuigi probleem peitub hoopis teises kohas.
Selle etapi tÔhususe optimeerimiseks on kasulik koguda ja jÀlgida meetrikaid otse sÔlmedest, sealhulgas neid, mis puudutavad state-databasi uuendamist: blokimeetrite arv, nende suurus, tehingute arv, vahetuste arvu vahel forki ahelates, kehtetute blokkide arv, virtuaalmasina tööaeg, andmete fikseerimise aeg jne. See aitab eristada vÔrguprobleeme ahelate töötlemise algoritmide vigadest.
Virtuaalne masin, mis tegeleb tehingute töötlemisega, vĂ”ib olla kasulik teabeallikas, mis suudab optimeerida plokiahela toimimist. MĂ€lu eraldamise hulk, read/write kĂ€skude arv ja muud mÔÔdikud, mis puudutavad lepingu koodi tĂ€itmise efektiivsust, vĂ”ivad anda palju kasulikku teavet arendajatele. Samuti on nutilepingud programmid, mis tĂ€hendab, et nad vĂ”ivad teoreetiliselt tarbida ĂŒkskĂ”ik milliseid ressursse: cpu/mĂ€lu/vĂ”rk/salvestus, nii et tehingute töötlemine on ĂŒsna mÀÀramatu etapp, mis lisaks muutub oluliselt, kui liigelda versioonide vahel ja muuta lepingute koodi. SeetĂ”ttu on tehingute töötlemisega seotud mÔÔdikud samuti vajalikud plokiahela jĂ”udluse tĂ”husaks optimeerimiseks.
Kliendi teavitamine tehingu blokiahelasse lisamisest
See on viimane etapp kliendi teenuse saamisel plokiahelas; vĂ”rreldes teiste etappidega ei ole siin suuri kulutusi, kuid siiski tuleks arvesse vĂ”tta kliendile antava mahuka vastuse vĂ”imalust nodilt (nĂ€iteks nutileping, mis tagastab andmehulga). Igatahes on just see hetk kĂ”ige olulisem kĂŒsimusele "kui palju tps on teie plokiahelas?" kuna tĂ€pselt sellel hetkel fikseeritakse teenuse saamise aeg.
Siin peab alati olema saatmine kogu ajast, mis kulus kliendil plokiahelast vastuse ootamisele; just seda aega hakkab kasutaja ootama oma rakenduses kinnitust, ja selle optimeerimine on arendajate peamine ĂŒlesanne.
KokkuvÔte
SeetĂ”ttu saab kirjeldada plokiahelates toimuvaid operatsioonide tĂŒĂŒpe ning jagada need mitmesse kategooriasse:
- krĂŒptograafilised teisendused, tĂ”endite koostamine
- peer-to-peer vÔrgu loomine, tehingute ja plokkide replikatsioon
- tehingute töötlemine, nutilepingute tÀitmine
- muudatuste rakendamine plokiahelas olekubaasis, tehingute ja plokkide andmete uuendamine
- ainult lugemise pÀringud state andmebaasi, blockchain node API-d, tellimusteenused
Tegelikult on tĂ€napĂ€evaste blockchainide nodidele esitatud tehnilised nĂ”uded ÀÀrmiselt ranged â need vajavad kiireid CPU-sid krĂŒptograafiaks, suurt RAM-i mahtu state andmebaasi salvestamiseks ja kiireks juurdepÀÀsuks, vĂ”rguĂŒhendust, mis toetab suurt arvu samaaegselt avatud ĂŒhendusi, ning mahukat salvestust. Nende kĂ”rgete nĂ”udmiste ja erinevat tĂŒĂŒpi toimingute rohkuse tĂ”ttu vĂ”ib nodidel ressursid lĂ”puks otsa saada, ja siis vĂ”ib ĂŒkski eespool kĂ€sitletud etapp saada jĂ€rgmise kitsaskohaks kogu vĂ”rgu jĂ”udluses.
Plokke hÀÀlestamine ja tĂ”hususe hindamine nĂ”uab kĂ”igi nende aspektide arvestamist. Selleks tuleb koguda ja analĂŒĂŒsida mÔÔdikuid nii klientidelt kui ka vĂ”rgu sĂ”lmedelt, otsida nende vahelisi seoseid, hinnata teenuse tarnimise aega klientidele ning arvestada kĂ”iki pĂ”hivara: cpu/mĂ€lu/vĂ”rk/sĂ€ilitamine, mĂ”ista, kuidas neid kasutatakse ja kuidas nad ĂŒksteisega mĂ”jutavad. KĂ”ik see teeb erinevate plokiahelate kiirusvĂ”rdluse, nĂ€iteks "kui palju TPS-i", ÀÀrmiselt tĂ€namatuks tegevuseks, kuna olemas on tohutult erinevaid konfiguratsioone ja olekuid. Suurtes tsentraliseeritud sĂŒsteemides, sadade serverite klastrites, on need probleemid samuti keerulised ja nĂ”uavad erinevate mÔÔdikute kogumist, kuid plokiahelates, p2p vĂ”rkude, virtuaalmasinate, lepingu protsesside ja sisemise majanduse tĂ”ttu on vabaduse astmete arv palju suurem, mistĂ”ttu isegi testimine mĂ”nel serveril ei anna informatiivseid tulemusi ja nĂ€itab vaid ÀÀrmiselt umbmÀÀraseid vÀÀrtusi, mis on peaaegu reaalsusega seotud.
SeetĂ”ttu, kui töötame vĂ€lja plokiahela tuuma, kasutame jĂ”udluse hindamiseks ja kĂŒsimuse "kas see on parem kui eelmisel korral?" vastamiseks ĂŒsna keerulist tarkvara, mis orkestreerib plokiahela kĂ€ivitamist kĂŒmnete sĂ”lmede ja automaatse benchmark'i kĂ€ivitamisega ning mÔÔdikute kogumisega. Ilma nende andmeteta on protokollide parandamine, mis opereerivad mitme osalisega, erakordselt keeruline.
Nii et kui saad kĂŒsimuse "kui palju TPS on teie plokiahelas?", pakkuge vestluspartnerile teed ja tĂ€psustage, kas ta on valmis tutvuma kĂŒmne graafikuga ning kuulama kĂ”iki kolme plokiahelate jĂ”udlusprobleemide kasti ning teie ettepanekuid nende lahendamiseks...
Allikas: habr.com
