Ազատություն · Հաքինգ և հակառակը

Blockchain մաս 3: Բլոկների աշխատանքը և չհաստատված տրանզակցիաների pool

Նախորդ գրառման մեջ նշեցի, որ տրանզակցիաները մինչև blockchain-ում գրանցվելը սկզբում ավելանում են հատուկ բլոկներում՝ չհաստատված տրանզակցիաների փուլ (pool): Եթե փաստացի արդեն ունենք կազմված տռանզակցիա, այդ դեպքում ինչի՞ համար են այս միջնորդ բլոկները։ ինչո՞ւ միանգամից չգրանցենք blockchain-ում։

Քանի որ բոլորս էլ գիտենք, որ համացանցում A կետից B կետ տվյալներ փոխանցելուց նրանց կարող են հասնել տարբեր ժամանակներում և տարբեր ճանապարհներով։ Սրա վրա կարող է ազդել ցանցի արագությունը, ցանցում մոտակա ռաութերների քանակը և այլն։ Նույն wallet-ից երկու տարբեր փոխանցումներ կարող են գնալ տարբեր ճանապարհներով, նույնիսկ այն դեպքում, երբ ստացող կողմը նույն հաշիվն է։ Հետևաբար երկու տռանզակցիա կատարելուց շատ մեծ հավանականությամբ կարող է երկրորդը ավելի շուտ հասնել քան առաջինը։ Այս խնդրի պատճառով կարող է առաջանալ երկակի սպառում։ Նույն գումարը ուղարկենք միանգամից երկու տարբեր հաշիվներին, որի մասին նրանք չեն էլ կարող պատկերացնել։ Սա կոպեկ չի, որ ձեռքից ձեռք փոխանցվի։ Միասնական ցանցը ունի իր դժվարությունները։

Ինչպե՞ս ստուգենք, որ մի տրանզակցիան կատարվել է մյուսից շուտ։ Ապակենտրոնացված ցանցում, որտեղ ոչ ոքի չի կարելի վստահել, այս խնդիրը շատ խիստ է դրված։ Խնդրենք ուղարկողին, տրանզակցիայի մեջ ներառել նաև փոխանցման ժամը, այդպես ե՞ք կարծում։ Բայց հիշեք՝ ոչ ոքի չի կարելի վստահել, այդ թվում և ուղարկողին։ Տարբեր համակարգիչներում ժամերը միանշանակ տարբեր են լինելու և չենք կարող երաշխավորել նրանց սինխրոն աշխատանքը։ Ինչպես արդեն գիտեք, blockchain-ի կրկնօրինակը բոլորը պահում են իրենց մոտ, պահում ենք մեր համակարգիչներում և ամենքս վստահում ենք միայն մեր blockchain-ին։

Վերադառնանք անպատասխան հարցին։ Ինչպե՞ս համոզվենք, որ մի տրանզակցիան կատարվել է մյուսից շուտ կամ ուշ։

Պատասխանը պարզ է։ Ոչ մի կերպ։

Չկա եղանակ, որով կարող ենք ստուգել տրանզակցիաների կատարման ժամանակը ապակենտրոնացված ցանցում։ Եվ որպես այս խնդրի լուծում, Սատոշի Նակամոտոն առաջարկեց նոր գաղափար և ինչքան էլ տարօրինակ է, գաղափարը ստացավ պարզ անուն՝ «բլոկ»։

ԲԼՈԿ։ Բլոքչեյնի հիմքը։

Ցանցում աշխատող համակարգիչները, ընդհանուր pool-ից վերցնում են կամայական տրանզակցիաներ, որը իրենց դուր է գալիս։ Սովորաբար նրանք, որից ունեն առավել բարձր տոկոսներ։ Վերցնում են այնքան, մինչև ընդհանուր ծավալը հասնի նախապես որոշված սահմանին։ Բիթքոինի դեպքում բլոկի սահմանը կազմում է 1 MB, իսկ Bitcoin Cash-ի դեպքում՝ 8 MB։

Օրինակ Ethereum-ի դեպքում մի քիչ բարդ է։ Այնտեղ տրանզակցիաների քանակը կախված է հաշվարկված բարդությունից, ներառյալ smart contract֊ները։ Բայց գաղափարը չի փոխվում՝ կա սահմանված լիմիտ։

Ամբողջ blockchain-ը փաստացի իրենից ներկայացնում է այսպիսի բլոկների հավաքածու, որտեղ ամեն մեկը կապվում է նախորդի հետ։ Այժմ blockchain-ի ընդհանուր ծավալը հասնում է մի քանի հարյուր գեգաբայթի և պետք է տեղադրված լինի բոլորի մոտ։ Դե եթե միայն տրանզակցիաներ եք անում պարտադիր չի քաշել։ Blockchain-ը ներբեռնվում է ցանցում մոտակա մյուս համակարգիչներից, ինչպես օրինակ ներբեռնում եք ձեր սիրած սերիալը (օրինակ Սանտա Բարբարան ։Ճ ) տորրենտի միջողով (երևի բոլորդ օգտվել եք տորրենտից)։

Համակարգիչը pool-ից տրանզակցիանրը հավաքելով սկսում է կազմել ունիկալ ցուցակ, ճիշտն ինչպես առաջին գրառման մեջ գրատախտակը։ Ցուցակը կազմվում է ծառի տեսքով, զույգերով հեշավորվում, հետո արդյունքը էլի զույգերով հեշավորվում և այդպես մինչև արդյունքում ստացվի մի հեշ՝ ծառի արմատը։

Ի՞նչ առավելություն ունի ծառի տեսքով պահելը։ Քանի որ այս դեպքում ստանում ենք հնարավորություն բլոկից ջնջելու անպետք տրանզակցիաները։ Տվյալ դեպքում ջնջելու պրոցեսը կկատարվի շատ արագ։

Հեշերի ծառի մասին մանրամասն տեղեկություն կարդացեք վիկիում՝ Merkle tree

Մեր համակարգչը արդեն գիտի իր blockchain-ի վերջին բլոկի տեղը։ Նրան մնում է տրանզակցիաները հեշը ավելացնել բլոկում, ընդհանուր նորից հեշտավորել և տեղեկացնել մյուսներին։ «Տեսեք, ես սարքել եմ նոր բլոկ, եկեք ավելացնենք բոլորս blockchain-ում»։

Մյուսներին մնում է ստուգել, արդյոք բլոկը պատրաստվել է բոլոր օրենքներին համապատասխան և կողքից խցկված տրանզակցիաներ չկան և իհարկե վերջում ավելացնել իրենց մոտ։ Արդյունքում տրանզակցիաները հաստատվեցին իսկ blockchain-ի ծավալը ավելացավ մեկ բլոկով։

Ընտիրա չէ՞ ։Դ

Չէ իրականում էդքան էլ ընտիր չի։ Միաժամանակ կարող են իրար փոխանցվել մեկից ավել բլոկներ։ Դե քանի որ արդեն մի քանի անգամ նշեցի, որ ոչ մեկին պետք չէ վստահել, ուրեմն պիտի ինչ֊որ կերպ ստուգենք, թե ով է առաջինը ավարտել բլոկի պատրաստումը։

Դրա համար բլոկ ստեղծող համակարգչի առաջ դրվեց մի նոր խնդիր։ Նրանք պետք է լուծեն բարդ մաթեմատիկական խնդիր, որը նրանցից կխլի որոշ ժամանակ։

Ինչպես համալսարանում, երբ կուրսով լուծում էինք քննության թեսթը, շատ քիչ էր լինում դեպքեր, երբ նույնիսկ գերազանցիկները ամբողջությամբ լուծում էին թեսթը (Ես ծույլիկների մեջ եմ եղել, ընդհանրապես չեմ լուծել ։Ճ )։

Բայց եթե մարդու համար դժվար առաջադրանքը կարող է անլուծելի մնալ, ապա համակարգչի դեպքում ընդհամենը ժամանակի խնդիր է (Դե հա մարդու համար էլ է ժամանակի խնդիր, բայց շատ չխորանանք 😛 )։ Խնդիրը կայանում է հետևյալում։ Նրանք պետք է գեներացնեն այնպիսի սիմվոլների շարք (nonce), որպեսզի բլոկի հեշին գումարելուց ստացված հեշի առաջին 10 սիմվոլները ստացվեն զրոներ (իրականում չեմ հիշում 10 նիշ էր թե ինչքան, բայց գաղափարը էսա)։ Հենց սա էլ այն մաթեմատիկական խնդիրն է, որը պետք է լուծեն բոլոր համակարգիչները, որպեսզի բլոկը ավելացնեն blockchain-ում։ Տարբեր կրիպտոարժույթների դեպքում խնդիրները կարող են տարբեր լինել (կախված է կրիպտոարժույթը սարքողի ֆանտազիայից ։Դ )։

Դե հաջորդ փոսթով էլ կներկայացնեմ մայնինգի գաղափարը, որի մեջ «թաթափվել» են գրեթե բոլորը էս վերջերս։