Ethereum qanday ishlaydi, baribir?

Manba: r / ethereum

Kirish

Siz Ethereum blockchain haqida eshitgansiz, bu nima ekanligini bilasizmi yoki yo'qmi. So'nggi paytlarda juda ko'p yangiliklar, shu jumladan ba'zi yirik jurnallarning muqovalarida, lekin agar Ethereum-ning aniq asosiga ega bo'lmasangiz, bu maqolalarni o'qish g'iybatga o'xshashi mumkin. Xo'sh, bu nima? Aslida, raqamli tranzaktsiyalarning doimiy reestrini yuritadigan ochiq ma'lumotlar bazasi. Muhimi, ushbu ma'lumotlar bazasi uni saqlash va himoya qilish uchun biron bir markaziy hokimiyatni talab qilmaydi. Buning o'rniga u "ishonchsiz" tranzaktsion tizim sifatida ishlaydi - bu tizim boshqa shaxslar bilan bir-biriga yoki boshqa birlariga ishonishni talab qilmasdan tengdoshlari bilan "tengdosh" operatsiyalarini amalga oshiradigan tizim.

Hali ham chalkashmisiz? Ushbu post shu erda joylashgan. Mening maqsadim Ethereumning texnik darajada, murakkab matematik yoki qo'rqinchli ko'rinadigan formulalarsiz qanday ishlashini tushuntirish. Agar siz dasturchi bo'lmasangiz ham, umid qilamanki, siz hech bo'lmaganda ushbu texnikani yaxshiroq bilib olasiz. Agar ba'zi qismlar juda texnik va buzib tashlash qiyin bo'lsa, bu juda yaxshi! Har bir mayda-chuyda narsalarni tushunishning hojati yo'q. Men faqat keng miqyosdagi narsalarni tushunishga e'tibor berishni tavsiya qilaman.
 
Ushbu yozuvda keltirilgan ko'plab mavzular sariq qog'ozda muhokama qilingan tushunchalarning bo'linishi. Ethereumni tushunishni osonlashtirish uchun o'z tushuntirishlarim va diagrammalarimni qo'shdim. Texnik sinovdan o'tishga jur'at etganlar, shuningdek Ethereum sariq qog'ozini o'qishlari mumkin.

Qani boshladik!

Blokchain ta'rifi

Blokchain - bu "umumiy holatga ega bo'lgan kriptografik jihatdan xavfsiz tranzaktsion mashina." Uni buzib tashlaymiz.

  • "Kriptografik jihatdan xavfsiz" degani, raqamli valyutani yaratish murakkab matematik algoritmlar bilan ta'minlangan, ularni sindirish juda qiyin. Xavfsizlik devori haqida o'ylang. Ular tizimni aldashni deyarli imkonsiz qiladi (masalan, soxta bitimlar tuzish, tranzaktsiyalarni o'chirish va h.k.)
  • "Tranzaktsion singleton mashinasi" shuni anglatadiki, tizimda barcha operatsiyalar uchun javobgar bo'lgan mashinaning bitta kanonik nusxasi mavjud. Boshqacha qilib aytganda, hamma ishonadigan yagona global haqiqat mavjud.
  • "Umumiy holat bilan" degani bu qurilmada saqlangan davlat hamma uchun ochiq va ochiq ekanligini anglatadi.

Ethereum ushbu blockchain paradigmasini amalga oshiradi.

Ethereum blockchain paradigmasini tushuntirdi

Ethereum blockchain aslida bitimga asoslangan davlat mashinasidir. Kompyuter fanida davlat mashinasi bir qator kirishlarni o'qiydigan va shu kirishlarga asoslanib yangi holatga o'tadigan narsaga ishora qiladi.

Ethereum-ning davlat mashinasida biz "genezis holati" dan boshlaymiz. Bu tarmoqdagi har qanday operatsiyalardan oldin bo'sh shiferga o'xshaydi. Tranzaktsiyalar bajarilganda, bu genezis qandaydir yakuniy holatga o'tadi. Har qanday vaqtda, bu yakuniy holat Ethereumning hozirgi holatini anglatadi.

Ethereum shtati millionlab bitimlarga ega. Ushbu bitimlar "bloklar" ga guruhlangan. Blokda bir nechta tranzaktsiyalar mavjud va har bir blok oldingi blok bilan birlashtirilgan.

Bir holatdan ikkinchisiga o'tish uchun, bitim haqiqiy bo'lishi kerak. Bitim haqiqiy deb hisoblanishi uchun u tog'-kon sifatida tanilgan tekshirish jarayonidan o'tishi kerak. Tog'-kon - bu tugunlar guruhi (ya'ni kompyuterlar) hisoblash operatsiyalari blokini yaratish uchun o'zlarining mablag 'sarflashidir.

O'zini konchi deb e'lon qilgan har qanday tugun blokni yaratishga va tasdiqlashga harakat qilishi mumkin. Dunyo bo'ylab ko'plab konchilar bir vaqtning o'zida bloklarni yaratishga va tasdiqlashga harakat qilmoqdalar. Har bir konchi blokchainga blokni topshirishda matematik "isbot" beradi va bu isbot kafolat vazifasini bajaradi: agar isbot mavjud bo'lsa, blok haqiqiy bo'lishi kerak.

Blokni asosiy blockchain-ga qo'shish uchun konchi boshqa raqobatchi konchilarga qaraganda tezroq isbotlashi kerak. Har bir blokni konchilar tomonidan matematik isbot bilan ta'minlash jarayoni "ish isboti" deb nomlanadi.

Yangi blokni tasdiqlagan konchi ushbu ishni bajarganligi uchun ma'lum miqdorda mukofotlanadi. Bu qanday qiymat? Ethereum blockchain "Ether" deb nomlangan ichki raqamli tokendan foydalanadi. Har bir konchi blokni isbotlaganida, yangi Ether tokenslari ishlab chiqariladi va mukofotlanadi.

Siz hayron bo'lishingiz mumkin: hamma bitta bloklar zanjiriga yopishib qolishiga nima kafolat beradi? O'z bloklarini zanjirini yaratishga qaror qilgan konchilar guruhi yo'qligiga qanday amin bo'lishimiz mumkin?

Avvalroq, biz blockchain-ni yakka tartibdagi operatsion singleton mashinasi sifatida belgiladik. Ushbu ta'rifdan foydalanib, biz hozirgi to'g'ri holatni hamma qabul qilishi kerak bo'lgan yagona global haqiqat ekanligini tushunishimiz mumkin. Bir nechta holatlarga (yoki zanjirlarga) ega bo'lish butun tizimni buzadi, chunki qaysi davlat to'g'ri bo'lganligi to'g'risida kelishib bo'lmaydi. Agar zanjirlar bir-biridan ajraladigan bo'lsa, bitta zanjirda 10 ta, ikkinchisida 20 ta va boshqa birida 40 tangaga ega bo'lishingiz mumkin. Ushbu stsenariyda qaysi zanjir eng "to'g'ri" ekanligini aniqlab bo'lmaydi.

Ko'p yo'llar paydo bo'lganda, "vilkalar" paydo bo'ladi. Biz odatda vilkalardan saqlanishni xohlaymiz, chunki ular tizimni buzadi va odamlarni qaysi zanjirga "ishonishlarini" tanlashga majbur qiladi.

Qaysi yo'l eng to'g'ri ekanligini aniqlash va bir nechta zanjirlarning oldini olish uchun Ethereum "GHOST protokoli" deb nomlangan mexanizmdan foydalanadi.

"GHOST" = "Ko'zga ko'ringan eng og'ir ochko'z"

Oddiy qilib aytganda, GHOST protokoli biz eng ko'p hisoblangan yo'lni tanlashimiz kerakligini aytadi. Bu yo'lni aniqlashning bir usuli - bu joriy yo'ldagi bloklarning umumiy sonini (genezis blokini hisobga olmaganda) ifodalovchi eng yangi blok raqamidan foydalanish ("barglar bloki"). Blok raqami qanchalik baland bo'lsa, yo'l uzoqroq bo'ladi va bargni olishga kirishish kerak bo'lgan kuch ko'proq bo'ladi. Ushbu asoslardan foydalanish hozirgi holatning kanonik versiyasini kelishib olishimizga imkon beradi.

Endi siz blockchain nima ekanligini 10 000 metrlik sharhni olganingizdan so'ng, Ethereum tizimining tarkibiy qismlariga chuqurroq kirib boraylik:

  • hisoblar
  • davlat
  • gaz va to'lovlar
  • bitimlar
  • bloklar
  • bitimni bajarish
  • qazib olish
  • ish isboti

Ishni boshlashdan oldin bitta eslatma: X-ning "xeshi" ni aytganda, men Ethereum foydalanadigan KECCAK-256 xeshini nazarda tutaman.

Hisoblar

Ethereumning global "umumiy holati" bir-biri bilan xabarlarni yuborish doirasi bilan o'zaro ta'sirlasha oladigan ko'plab kichik ob'ektlardan ("hisoblar") iborat. Har bir hisobda u bilan bog'liq holat va 20 baytlik manzil mavjud. Ethereum-dagi manzil - bu har qanday hisobni aniqlash uchun ishlatiladigan 160 bitli identifikator.

Hisoblarning ikki turi mavjud:

  • Xususiy kalitlar tomonidan boshqariladigan va ular bilan bog'liq hech qanday kod bo'lmagan tashqi hisoblar.
  • Shartnoma kodlari tomonidan boshqariladigan va ular bilan bog'liq kodlarga ega bo'lgan kontrakt hisobvaraqlari.

Tashqi hisoblar va boshqalar

Tashqi hisob va shartnoma hisoblari o'rtasidagi tub farqni tushunish muhimdir. Tashqi hisob qaydnomasi o'z shaxsiy kalitidan foydalangan holda bitim tuzish va imzolash orqali boshqa tashqi hisob raqamlariga yoki kontraktning boshqa hisob raqamlariga xabarlarni yuborishi mumkin. Ikkala tashqi hisob qaydnomalari o'rtasidagi xabar shunchaki qiymatni uzatishdir. Ammo tashqi hisob raqamidan kontrakt hisobvarag'iga yuboriladigan xabar shartnoma hisob-kitob kodini faollashtiradi, bu unga turli xil amallarni bajarishga imkon beradi (masalan, tokenlarni o'tkazish, ichki xotiraga yozish, yangi tokenlarni zarb qilish, ba'zi hisob-kitoblarni amalga oshirish, yangi shartnomalar tuzish va hk).

Tashqi hisoblardan farqli o'laroq, shartnoma hisobvaraqlari yangi tranzaktsiyalarni mustaqil ravishda boshlashi mumkin emas. Buning o'rniga, kontrakt hisobvaraqlari faqat ular tomonidan amalga oshirilgan boshqa operatsiyalarga (tashqi hisobdan yoki boshqa shartnoma hisobvarag'idan) javoban operatsiyalarni bekor qilishi mumkin. Shartnomadan shartnoma bo'yicha qo'ng'iroqlar haqida "Bitimlar va xabarlar" bo'limida ko'proq bilib olamiz.

Shuning uchun, Ethereum blockchain-da yuzaga keladigan har qanday harakat tashqi boshqariladigan hisoblardan chiqarilgan operatsiyalar orqali har doim harakatga keltiriladi.

Hisob holati

Hisob holati to'rt turdan iborat bo'lib, ular hisob turidan qat'iy nazar mavjud:

  • nonce: agar hisob tashqi hisob bo'lsa, bu raqam hisobning manzilidan yuborilgan tranzaktsiyalar sonini anglatadi. Agar hisob shartnoma hisobvarag'i bo'lsa, bu hisob tomonidan tuzilgan shartnomalar sonini anglatadi.
  • balans: ushbu manzilga tegishli Wei soni. Eterda 1e + 18 Wei mavjud.
  • storageRoot: Merkle Patrisiya daraxtining ildiz tugunidan iborat bo'lgan hash (keyinroq Merkle daraxtlarini tushuntiramiz). Ushbu daraxt ushbu hisob qaydnomasi saqlash tarkibidagi xeshlarni kodlaydi va standart holatda bo'sh.
  • codeHash: Ushbu hisobning EVM (Ethereum Virtual Machine - bundan keyinroq) kodining xeshi. Shartnoma hisobvaraqlari uchun, bu kodini yuvib yuboradigan va codeHash sifatida saqlanadigan kod. Tashqi hisoblar uchun codeHash maydoni bo'sh satrning xeshidir.

Jahon davlati

OK, shuning uchun biz Ethereumning global holati hisob manzillari va hisob holatlari o'rtasidagi xaritadan iboratligini bilamiz. Ushbu xarita Merkle Patrisia daraxti deb nomlanuvchi ma'lumotlar strukturasida saqlanadi.

Merkle daraxti (yoki "Merkle trie" deb ham ataladi) - bu tugunlar to'plamidan tashkil topgan ikkilik daraxt turi:

  • daraxtning pastki qismidagi juda ko'p sonli barg tugunlari, ularda asosiy ma'lumotlar mavjud
  • oraliq tugunlar to'plami, bu erda har bir tugun o'zining ikkita bola tugunlarining xeshidir
  • daraxtning tepasini ifodalovchi ikkita bola tugunidan iborat bo'lgan bitta ildiz tugun

Daraxtning pastki qismidagi ma'lumotlar biz saqlamoqchi bo'lgan ma'lumotlarni bo'laklarga bo'linib, keyin bo'laklarni chelaklarga bo'lish orqali, va har bir chelakning xeshini olib, qolgan xeshlarning umumiy soni bo'lmaguncha xuddi shu jarayonni takrorlash orqali hosil bo'ladi. faqat bitta: ildiz hash.

Ushbu daraxt ichida saqlanadigan har bir qiymat uchun kalit bo'lishi kerak. Daraxtning tugunidan boshlab, kalit barg tugunlarida saqlanadigan mos keladigan qiymatga erishish uchun qaysi bola tuguniga rioya qilish kerakligini aytishi kerak. Ethereum-da, davlat daraxti uchun kalit / qiymat xaritasi har bir hisob uchun balans, nonce, codeHash va storageRoot-ni o'z ichiga olgan manzillar va ular bilan bog'liq hisoblar o'rtasida bo'ladi (saqlashRoot o'zi daraxt).

Manba: Ethereum oq qog'oz

Xuddi shu trie tuzilishi tranzaktsiyalar va tushumlarni saqlash uchun ham ishlatiladi. Aniqroq aytganda, har bir blokda uchta turli xil Merkle trie tuzilishining ildiz tugunining xeshini saqlaydigan "sarlavha" mavjud, shu jumladan:

  1. Davlat tri
  2. Tranzaktsiyalar tri
  3. Qabul kvotalari

Ushbu ma'lumotlarning barchasini Merkle-da samarali saqlash qobiliyati Ethereum-da biz "engil mijozlar" yoki "yorug'lik tugunlari" deb nomlanadigan narsa uchun foydalidir. Shuni yodda tutingki, blokchain bir nechta tugun tomonidan ushlab turiladi. Kengroq aytganda, ikkita tugun mavjud: to'liq tugunlar va engil tugunlar.

To'liq arxiv tuguni to'liq zanjirni yuklab olish orqali blokchainni sinxronlashtiradi, genezis blokidan hozirgi bosh blokgacha, ichida mavjud bo'lgan barcha operatsiyalarni bajaradi. Odatda, konchilar to'liq arxiv tugunini saqlaydilar, chunki ular qazib olish jarayoni uchun buni qilishlari kerak. Bundan tashqari, har bir operatsiyani bajarmasdan to'liq tugunni yuklab olish mumkin. Qanday bo'lmasin, har qanday to'liq tugun butun zanjirni o'z ichiga oladi.

Ammo tugun har qanday operatsiyani bajarishi yoki tarixiy ma'lumotlarni osongina so'rashi kerak bo'lmasa, butun zanjirni saqlashning hojati yo'q. Bu erda yorug'lik tugunining kontseptsiyasi paydo bo'ladi. To'liq zanjirni yuklab olish va saqlash va barcha operatsiyalarni bajarish o'rniga, yorug'lik tugunlari faqat sarlavhalar zanjirini, genezis blokidan hozirgi boshgacha, hech qanday operatsiyalarni amalga oshirmasdan yoki bajarmasdan. har qanday bog'liq holatni olish. Yorug'lik tugunlari uch marta urinishni o'z ichiga olgan blokli sarlavhalarga kirish imkoniga ega bo'lganligi sababli, ular hali ham osonlik bilan tranzaktsiyalar, hodisalar, balanslar va hokazolar to'g'risida tekshirilishi mumkin bo'lgan javoblarni yaratishi va olishlari mumkin.

Buning sababi shundaki, Merkle daraxtidagi xeshlar yuqoriga ko'tariladi - agar zararli foydalanuvchi soxta bitimni Merkle daraxtining tagiga almashtirishga harakat qilsa, bu o'zgarish yuqoridagi tugunning xeshini o'zgartiradi, bu esa yuqoridagi tugunning heshi va hokazo, oxir oqibat daraxt ildizini o'zgartirmaguncha.

Ma'lumotni tekshirishni istagan har qanday tugun buni amalga oshirish uchun "Merkle proof" deb nomlangan narsani ishlatishi mumkin. Merkle isboti quyidagilardan iborat:

  1. Tekshirilishi kerak bo'lgan ma'lumotlar to'plami va ularning tarkibi
  2. Daraxtning ildiz qobig'i
  3. "Dallanma" (barcha sheriklar urug'lar poxakdan ildizgacha ko'tariladi)

Dalilni o'qigan har bir kishi ushbu novda uchun xeshning daraxtga nisbatan muttasil ekanligiga ishonch hosil qilishi mumkin va shuning uchun berilgan kesma aslida daraxtda ekanligiga ishonch hosil qilishi mumkin.

Xulosa qilib aytganda, Merkle Patrisia daraxtidan foydalanishning foydasi shundaki, ushbu strukturaning ildiz tugunlari daraxtda saqlanadigan ma'lumotlarga kriptografik jihatdan bog'liq va shuning uchun ildiz tugunining xeshini ushbu ma'lumot uchun xavfsiz identifikator sifatida ishlatish mumkin. Blok sarlavhasi davlatning ildiz xeshini, bitimlarni va tushumlar daraxtlarini o'z ichiga olganligi sababli, har qanday tugun Ethereum shtatining kichik bir qismini to'liq holatni saqlashga hojat qoldirmasdan tasdiqlashi mumkin, bu esa hajmi bo'yicha cheklanmagan bo'lishi mumkin.

Gaz va to'lov

Ethereumda juda muhim tushunchalardan biri to'lovlar tushunchasi. Ethereum tarmog'ida tranzaktsiya natijasida yuzaga keladigan har bir hisob-kitob uchun haq olinadi - bepul tushlik yo'q! Ushbu to'lov "gaz" nominatsiyasida to'lanadi.

Gaz - bu ma'lum bir hisoblash uchun zarur bo'lgan to'lovlarni o'lchash uchun ishlatiladigan birlik. Gaz narxi bu har bir birlik uchun sarflashga tayyor bo'lgan Eter miqdoridir va "gwei" da o'lchanadi. "Wei" Eterning eng kichik birligidir, bu erda 1 Vey 1 Eterni ifodalaydi. Bitta gwei - 1 000 000 000 Vey.

Har bir operatsiya bilan, jo'natuvchi gaz limiti va gaz narxini belgilaydi. Gaz narxi va gaz limiti mahsuloti, jo'natuvchi bitimni amalga oshirish uchun to'lashga tayyor bo'lgan Wei maksimal miqdorini anglatadi.

Masalan, aytaylik, yuboruvchi gaz uchun limitni 50 000 va gaz narxini 20 gwi qilib belgilagan. Bu shuni anglatadiki, jo'natuvchi ushbu operatsiyani bajarish uchun kamida 50,000 x 20 gwei = 1,000,000,000,000,000 Wei = 0.001 Eter sarflashga tayyor.

Gaz limiti jo'natuvchi pulni sarflashga tayyor bo'lgan maksimal gazni anglatishini unutmang. Agar ularning hisobidagi balansda bu maksimal miqdorni qoplash uchun etarlicha bo'lsa, ular borish yaxshi. Jo'natuvchi bitim tugaganidan keyin ishlatilmagan gaz uchun dastlabki narx bo'yicha qaytariladi.

Agar jo'natuvchi bitimni amalga oshirish uchun zarur bo'lgan gazni etkazib bermasa, bitim "tugadi" va haqiqiy emas deb hisoblanadi. Bunday holda, tranzaktsiyalarni qayta ishlash bekor qilinadi va har qanday holat o'zgarishi bekor qilinadi, shunda biz Ethereum holatidan oldin bitimga qaytamiz. Bunga qo'shimcha ravishda, tranzaktsiyaning muvaffaqiyatsizligi to'g'risida yozuv yoziladi, bunda qaysi bitim amalga oshirilganligi va qaerda bajarilmaganligi ko'rsatiladi. Mashina benzin tugashidan oldin hisob-kitoblarni bajarishga ko'p vaqt sarflaganligi sababli, mantiqan, gazning hech biri jo'natuvchiga qaytarilmaydi.

Bu gaz puli qayerga ketadi? Yuboruvchi tomonidan gaz uchun sarflangan barcha pullar "benefitsiariy" manziliga yuboriladi, odatda u konchilar manzili hisoblanadi. Konchilar hisob-kitoblarni amalga oshirish va bitimlarni tekshirish uchun kuch sarflashgani uchun, konchilar mukofot sifatida gaz haqini oladilar.

Odatda, gazni etkazib beruvchisi to'lashga tayyor bo'lgan narx qancha yuqori bo'lsa, qazib oluvchi bu bitimdan kelib chiqadigan qiymatdan shuncha ko'p bo'ladi. Shunday qilib, konchilar ko'proq tanlov qilishlari mumkin. Shu tarzda, konchilar o'zlari tekshirishlari yoki e'tiborsiz qoldirmoqchi bo'lgan operatsiyalarini tanlashlari mumkin. Yuboruvchilarni qanday gaz narxini belgilashga yo'naltirish uchun, konchilar bitimlarni amalga oshiradigan minimal gaz narxini reklama qilish imkoniyatiga egalar.

Saqlash uchun to'lov ham bor

Hisoblash bosqichlari uchun to'lash uchun nafaqat gaz ishlatiladi, balki undan foydalanish uchun to'lash uchun ham foydalaniladi. Saqlash uchun umumiy to'lov ishlatilgan 32 baytning eng kichigi bilan mutanosibdir.

Saqlash uchun to'lovlarning ba'zi bir nuans jihatlari mavjud. Masalan, ko'paytirilgan saqlash barcha tugunlardagi Ethereum davlat ma'lumotlar bazasi hajmini oshirgani sababli, saqlanadigan ma'lumotlarning hajmini ozgina saqlashga turtki bo'ladi. Shuning uchun, agar operatsiyani saqlashdagi yozuvni tozalaydigan qadam bo'lsa, ushbu operatsiyani bajarish uchun to'lov olinadi va saqlash joyini bo'shatish uchun to'lov qaytariladi.

To'lovlarning maqsadi nima?

Ethereum ishining muhim jihati shundaki, tarmoq tomonidan bajariladigan har bir operatsiya bir vaqtning o'zida har bir to'liq tugun tomonidan amalga oshiriladi. Biroq, Ethereum virtual mashinasida hisoblash bosqichlari juda qimmat. Shuning uchun Ethereum aqlli shartnomalari oddiy ishlarni bajarish uchun, masalan, oddiy ishbilarmonlik mantig'ini ishlatish yoki imzolarni tekshirish va boshqa kriptografik ob'yektlar, tarmoqni buzishi mumkin bo'lgan fayllarni saqlash, elektron pochta yoki kompyuterni o'rganish kabi murakkabroq foydalanishdan ko'ra ko'proq foydalidir. To'lovlarni kiritish foydalanuvchilarni tarmoqni haddan tashqari oshirib yuborishdan saqlaydi.

Ethereum Turingning to'liq tilidir. (Qisqasi, Turing mashinasi har qanday kompyuter algoritmini taqlid qila oladigan mashinadir (Turing mashinalari bilan tanish bo'lmaganlar uchun buni va buni tekshirib ko'ring). Bu ko'chirishga imkon beradi va Ethereumni to'xtab qolish muammosiga sezgir qiladi, bu sizning muammoingiz. Agar dastur cheksiz ishlay oladimi yoki yo'qligini aniqlay olmaydi Agar to'lovlar bo'lmaganda, yovuz aktyor operatsiyani bajarish davomida cheksiz pastadirni bajarib, hech qanday oqibatlarsiz tarmoqni buzishga urinishi mumkin.Shunday qilib, to'lovlar tarmoqni ataylab hujumlardan himoya qiladi.

Siz o'ylashingiz mumkin: "nima uchun biz ham saqlash uchun pul to'lashimiz kerak?" Xo'sh, xuddi Ethereum tarmog'idagi hisoblash kabi, butun tarmoq yukni o'z zimmasiga olishi kerak.

Transaction va xabarlar

Biz ilgari Ethereum bitimlarga asoslangan davlat mashinasi ekanligini aytib o'tgan edik. Boshqacha qilib aytganda, turli xil hisoblar o'rtasida amalga oshiriladigan bitimlar Ethereum global holatini bir holatdan ikkinchisiga o'tkazadigan narsa.

Eng asosiy ma'noda, tranzaksiya - bu tashqi egalik hisob qaydnomasi tomonidan yaratilgan, seriya qilingan va keyin blockchainga topshiriladigan kriptografik imzo qo'yilgan qo'llanma.

Bitimlarning ikki turi mavjud: xabarlarni qo'ng'iroq qilish va shartnoma tuzish (ya'ni yangi Ethereum shartnomalarini yaratadigan bitimlar).
 
 Barcha bitimlar turidan qat'iy nazar quyidagi tarkibiy qismlarni o'z ichiga oladi:

  • nonce: jo'natuvchi tomonidan yuborilgan bitimlar sonini hisoblash.
  • gasPrice: jo'natuvchining bitimni amalga oshirish uchun zarur bo'lgan gaz birligi uchun to'lashga tayyor bo'lgan Wei soni.
  • gasLimit: jo'natuvchi ushbu bitimni amalga oshirish uchun to'lashga tayyor bo'lgan maksimal gaz miqdori. Ushbu miqdor har qanday hisoblash amalga oshirilishidan oldin oldindan to'lanadi.
  • Qabul qiluvchining manzili. Shartnoma tuzadigan tranzaktsiyada shartnoma hisob qaydnomasi manzili hali mavjud emas va shuning uchun bo'sh qiymat ishlatiladi.
  • qiymati: jo'natuvchidan qabul qiluvchiga o'tkazilishi kerak bo'lgan Wei miqdori. Shartnoma tuzish bitimida bu qiymat yangi yaratilgan shartnoma hisobvarag'idagi boshlang'ich balans bo'lib xizmat qiladi.
  • v, r, s: tranzaktsiyani yuboruvchini aniqlaydigan imzoni yaratish uchun ishlatiladi.
  • ташаббус (faqat shartnoma tuzish operatsiyalari uchun mavjud): yangi shartnoma hisobini boshlash uchun foydalaniladigan EVM kod bo'lagi. init faqat bir marta ishga tushiriladi va undan keyin o'chirib tashlanadi. Birinchi marta ishga tushirilganda, u shartnoma hisob qaydnomasi bilan doimiy bog'liq bo'lgan kod parchasi bo'lgan hisob kodining asosiy kodini qaytaradi.
  • ma'lumotlar (faqat qo'ng'iroqlar uchun mavjud bo'lgan ixtiyoriy maydon): kirish qo'ng'irog'i ma'lumotlari (ya'ni parametrlar). Masalan, agar aqlli shartnoma domenni ro'yxatdan o'tkazish xizmati bo'lib xizmat qilsa, ushbu shartnomaga qo'ng'iroq qilish domen va IP-manzil kabi kirish maydonlarini kutishi mumkin.

Biz "Hisoblar" bo'limida tranzaktsiyalar - ham qo'ng'iroq qo'ng'iroqlari, ham shartnomalar tuzish bo'yicha operatsiyalar - har doim tashqi hisob raqamlari tomonidan boshlanib, blockchainga topshirilishini bilib oldik. Bu haqda o'ylashning yana bir usuli shundaki, bitimlar tashqi dunyoni Ethereum ichki holatiga olib keladigan narsa.

Ammo bu shartnomalar boshqa shartnomalar bilan gaplasha olmaydi degani emas. Ethereum shtatining global doirasidagi shartnomalar shu doiradagi boshqa shartnomalar bilan gaplashishi mumkin. Buni "kontraktlar" orqali "xabarlar" yoki "ichki tranzaktsiyalar" orqali amalga oshirish usuli. Biz xabarlar yoki ichki tranzaktsiyalarni tranzaktsiyalarga o'xshash deb o'ylashimiz mumkin, va asosiy farq tashqi hisoblar tomonidan yaratilmagan. Buning o'rniga ular shartnomalar asosida ishlab chiqariladi. Ular virtual ob'ektlar bo'lib, ular tranzaktsiyalardan farqli o'laroq, seriyalanmaydi va faqat Ethereum ijro etish muhitida mavjud.

Bitta kontrakt ichki shartnomani boshqa shartnomaga yuborganda, qabul qiluvchi shartnoma hisobvarag'ida mavjud bo'lgan kod bajariladi.

Ta'kidlash kerak bo'lgan muhim narsa shundaki, ichki bitimlar yoki xabarlarda gasLimit mavjud emas. Buning sababi shundaki, gaz limiti asl tranzaktsiyaning tashqi yaratuvchisi tomonidan aniqlanadi (ya'ni ba'zi tashqi hisoblar). Tashqi hisob qaydnomasi o'rnatgan gaz limiti tranzaktsiyani amalga oshirish uchun etarlicha yuqori bo'lishi kerak, shu jumladan ushbu bitim natijasida yuzaga kelgan har qanday qo'shimcha buyruqlar, masalan, kontrakt bo'yicha shartnoma xabarlari. Agar tranzaktsiyalar va xabarlar zanjirida ma'lum bir xabarning bajarilishi tugagan bo'lsa, demak, ushbu xabar ijrosi, shuningdek, bajarilish natijasida kelib chiqqan keyingi xabarlar ham qaytariladi. Ammo, ota-ona ijrosi orqaga qaytishi shart emas.

Bloklar

Barcha bitimlar "bloklar" ga birlashtirilgan. Blokchain bir-biriga zanjirlangan bir qator bloklarni o'z ichiga oladi.

Ethereum-da, blok quyidagilardan iborat:

  • blok sarlavhasi
  • ushbu blokka kiritilgan bitimlar to'plami to'g'risidagi ma'lumotlar
  • Joriy blok ommerlari uchun boshqa blok sarlavhalari to'plami.

Ommer tushuntirdi

"Ommer" nima degani? Ommer - bu blok hozirgi ota-onaning ota-onasiga teng keladigan blokdir. Keling, ommerlar nima uchun ishlatilishini va nima uchun blokda ommerlar uchun blok sarlavhalari mavjudligini ko'rib chiqamiz.

Ethereum-ning qurilishi tufayli, bloklash vaqtlari Bitcoin (~ 10 daqiqa) kabi boshqa blokchainlarga qaraganda ancha past (~ 15 soniya). Bu operatsiyani tezroq bajarishga imkon beradi. Biroq, blokirovkaning qisqaroq vaqtlarining salbiy tomonlaridan biri shundaki, raqobatdosh blok echimlari konchilar tomonidan topiladi. Ushbu raqobatchi bloklar "etim bloklar" deb ham ataladi (ya'ni qazib olingan bloklar uni asosiy zanjirga aylantirmaydi).

Ommerlarning maqsadi bu etim bloklarni o'z ichiga olgani uchun konchilarni mukofotlashga yordam berishdir. Konchilar tarkibiga kiradigan omurlar "haqiqiy" bo'lishi kerak, ya'ni bu blokning oltinchi avlodi yoki undan kichikroq degan ma'noni anglatadi. Olti boladan keyin eskirgan etim bloklarga murojaat qilish mumkin emas (chunki eski operatsiyalarni bajarish biroz qiyinlashadi).

Ommer bloklari to'liq blokdan kichikroq mukofot oladi. Shunday bo'lsa-da, konchilar uchun bu yetim qolgan bloklarni qo'shish va mukofotni olish uchun hali ham biron bir rag'bat mavjud.

Blok sarlavhasi

Bir lahzaga bloklarga qaytaylik. Oldin aytib o'tganimizdek, har bir blokda "sarlavha" bloki mavjud, ammo bu aniq nima?
 
 Blok sarlavhasi - blokning quyidagi qismlaridan iborat qismi.

  • parentHash: bu ota-ona sarlavhasining xeshidir (shu sababli blok "zanjir" ni o'rnatadi)
  • ommersHash: mavjud ommerlar ro'yxatidagi xesh
  • benefitsiar: ushbu blokni qazib olish uchun to'lovlarni oladigan hisob manzili
  • stateRoot: davlat trie-ning ildiz tugunining xeshi (davlat trie sarlavhada saqlanganligini va engil mijozlar davlat to'g'risida biron-bir ma'lumotni tekshirishni osonlashtirishini bilib olganimizni eslang)
  • транзакцияларRoot: bu blokda sanab o'tilgan barcha operatsiyalarni o'z ichiga olgan trie-ning ildiz tugmachasi
  • ReceiptsRoot: bu blokda sanab o'tilgan barcha tranzaktsiyalarning kvititlarini o'z ichiga olgan trie-ning ildiz tugmachasi.
  • logsBloom: Bloom filtri (ma'lumotlarning tuzilishi), bu log ma'lumotlaridan iborat
  • qiyinchilik: ushbu blokning qiyinchilik darajasi
  • raqam: joriy blok soni (genezis blokida nol soni mavjud; blok raqami har bir keyingi blok uchun 1 ga ko'payadi)
  • gasLimit: har bir blok uchun joriy gaz limiti
  • gasUsed: ushbu blokda bitimlar tuzishda ishlatilgan gazning umumiy summasi
  • vaqt belgisi: blokning boshlanishining uniks belgisi
  • extraData: ushbu blokka tegishli qo'shimcha ma'lumotlar
  • mixHash: nesh bilan birlashganda, ushbu blok etarlicha hisoblash amalga oshirilganligini isbotlaydigan hash
  • nonce: aralashtirish ,Hash bilan birlashganda, ushbu blok etarlicha hisoblash amalga oshirilganligini isbotlaydi

Har bir blok sarlavhasida uchta trie tuzilmasi qanday mavjudligiga e'tibor bering:

  • holat (davlatRoot)
  • bitimlar (bitimlarRoot)
  • tushumlar (qabul qilishRoot)

Ushbu trie tuzilmalari, biz ilgari muhokama qilgan Merkle Patrisiya urinishlaridan boshqa narsa emas.

Bundan tashqari, yuqoridagi tavsifdan aniqlab olishga arziydigan bir nechta atamalar mavjud. Keling, ko'rib chiqamiz.

Jurnallar

Ethereum jurnallarga turli xil tranzaktsiyalar va xabarlarni kuzatish imkonini beradi. Shartnoma, u kirmoqchi bo'lgan "voqealar" ni aniqlab, aniq jurnalni yaratishi mumkin.

Jurnal yozuvida quyidagilar mavjud:

  • ro'yxatga oluvchining qayd hisobi manzili,
  • ushbu bitim tomonidan amalga oshiriladigan turli tadbirlarni aks ettiradigan mavzular seriyasi va
  • ushbu voqealar bilan bog'liq har qanday ma'lumotlar.

Jurnallar gullaydigan filtrda saqlanadi, bu esa cheksiz jurnal ma'lumotlarini samarali saqlaydi.

Bitim bo'yicha kvitansiya

Sarlavhada saqlangan jurnallar tranzaksiya kvitantsiyasida joylashgan jurnal ma'lumotlaridan kelib chiqadi. Do'konda biror narsa sotib olganingizda kvitansiyani olganingiz singari, Ethereum har bir operatsiya uchun kvitansiya hosil qiladi. Siz kutganingizdek, har bir kvitansiyada tranzaktsiya to'g'risida ma'lum ma'lumotlar mavjud. Ushbu kvitansiya quyidagilardan iborat:

  • blok raqami
  • blokli xesh
  • bitim xesh
  • joriy bitim tomonidan ishlatiladigan gaz
  • joriy tranzaktsiya amalga oshirilgandan keyin joriy blokda ishlatiladigan jami gaz
  • joriy operatsiyani bajarish paytida yaratilgan jurnallar
  • ..va hokazo

Bloklash qiyinligi

Blokning "qiyinligi" bloklarni tekshirish uchun ketadigan vaqtga muvofiqlikni ta'minlash uchun ishlatiladi. Genezis bloki 131,072 qiyinchilikka ega va undan keyingi har bir blokning qiyinligini hisoblash uchun maxsus formuladan foydalaniladi. Agar ma'lum bir blok oldingi blokdan tezroq tekshirilsa, Ethereum protokoli bu blokning qiyinchiliklarini oshiradi.

Blokning qiyinligi noncega ta'sir qiladi, bu blokni qazib olishda hisoblash uchun ishlaydigan algoritmdan foydalanib hisoblash kerak.

Blokning qiyinligi va nonce o'rtasidagi bog'liqlik quyidagicha matematik tarzda rasmiylashtiriladi:

bu erda Hd qiyinchilik.

Qiyinchilik darajasiga mos keladigan noncezni topishning yagona usuli bu barcha imkoniyatlarni sanab o'tish uchun ishlaydigan isbot algoritmidan foydalanishdir. Yechimni topish uchun kutilgan vaqt qiyinchilik bilan mutanosib bo'ladi - qiyinchilik qancha yuqori bo'lsa, nonni topish shuncha qiyin bo'ladi va shuning uchun blokni tekshirish qanchalik qiyin bo'lsa, bu yangi tekshiruvni o'tkazish vaqtini oshiradi. blok. Shunday qilib, blokning qiyinligini sozlash orqali, protokol blokni tekshirish uchun qancha vaqt kerakligini sozlashi mumkin.

Agar boshqa tomondan, tekshirish muddati sekinlashayotgan bo'lsa, protokol qiyinchilikni kamaytiradi. Shu tarzda, tasdiqlash vaqti doimiy stavkani ushlab turish uchun sozlanadi - o'rtacha har 15 sekundda bitta blok.

Bitimni bajarish

Ethereum protokolining eng murakkab qismlaridan biriga keldik: bitimni bajarish. Aytaylik, siz tranzaktsiyani Ethereum tarmog'iga qayta yuborasiz. Ethereum holatini sizning tranzaktsiyangizga kiritish uchun nima bo'ladi?

Birinchidan, barcha operatsiyalar bajarilishi uchun dastlabki talablarga javob berishi kerak. Bularga quyidagilar kiradi:

  • Bitim to'g'ri formatlangan RLP bo'lishi kerak. "RLP" "Rekursiv uzunlik prefiksi" degan ma'noni anglatadi va ikkilik ma'lumotlarning joylashtirilgan qatorlarini kodlash uchun ishlatiladigan ma'lumot formatidir. RLP - bu Ethereum ob'ektlarni seriyalashtirish uchun foydalanadigan format.
  • Amalga oshirilgan imzo.
  • Amaliy operatsiya nonce. Eslatib o'tamiz, hisobni ochmaslik - bu hisob qaydnomasidan yuborilgan bitimlar soni. Yaroqli bo'lishi uchun, o'tkazma bekor qilgich jo'natuvchining hisobvarag'iga teng bo'lishi kerak.
  • Tranzaktsiyaning gaz limiti tranzaksiya uchun ishlatiladigan ichki gazga teng yoki undan ko'p bo'lishi kerak. Ichki gaz tarkibiga quyidagilar kiradi:
  1. bitimni amalga oshirish uchun oldindan belgilangan 21000 gaz narxi
  2. bitim bilan yuborilgan ma'lumotlar uchun gaz uchun to'lov (har bir bayt ma'lumot uchun yoki 4 nolga teng kod, va har bir nol bo'lmagan bayt ma'lumotlar yoki kod uchun 68 gaz)
  3. agar bitim shartnoma tuzadigan bitim bo'lsa, qo'shimcha 32000 gaz
  • Jo'natuvchining hisobidagi qoldiq "oldindan to'lash" gazni to'lashi kerak bo'lgan xarajatlarni qoplash uchun etarlicha Eterga ega bo'lishi kerak. Oldindan gaz narxini hisoblash juda oddiy: birinchidan, bitimning gaz limiti gazning maksimal narxini aniqlash uchun bitimning gaz narxiga ko'paytiriladi. Keyin ushbu maksimal xarajat jo'natuvchidan oluvchiga o'tkaziladigan umumiy qiymatga qo'shiladi.

Agar bitim amal qilish uchun yuqoridagi barcha talablarga javob bersa, biz keyingi bosqichga o'tamiz.

Birinchidan, biz amalga oshirilgan xarajatlarni jo'natuvchining balansidan ushlab qolamiz va joriy tranzaktsiyani hisobga olish uchun jo'natuvchining hisob raqamidagi pulni 1 ga ko'paytiramiz. Shu nuqtada, ishlatilgan ichki gazni olib tashlagan holda, tranzit uchun umumiy gaz limiti sifatida qolgan gazni hisoblashimiz mumkin.

Keyinchalik, operatsiya bajarila boshlaydi. Bitimni amalga oshirish davomida Ethereum "podstansiya" ni kuzatib boradi. Ushbu podstansiya bitim tugaganidan so'ng darhol kerak bo'ladigan operatsiya davomida to'plangan ma'lumotlarni qayd etishning bir usuli hisoblanadi. Xususan, unda quyidagilar mavjud:

  • O'z-o'zini yo'q qilish to'plami: bitim tugagandan so'ng o'chiriladigan hisoblar to'plami (agar mavjud bo'lsa).
  • Jurnallar seriyasi: virtual mashinaning kod ijrosi arxivlangan va indekslanadigan nazorat punktlari.
  • To'lovni qaytarish balansi: operatsiyadan keyin jo'natuvchining hisob raqamiga qaytarilishi kerak bo'lgan summa. Biz Ethereum-dagi saqlash pulni talab qilishini va yuboruvchidan saqlash uchun tozalashni qaytarganligini qanday eslaganimizni eslaysizmi? Ethereum buni qaytarib berish hisoblagichi yordamida kuzatib boradi. To'lovni qaytarish hisoblagichi noldan boshlanadi va har safar shartnoma biror narsani yo'q qilganda ortadi.

Keyinchalik, tranzaksiya talab qiladigan turli xil hisoblashlar qayta ishlanadi.

Bitim tomonidan talab qilingan barcha qadamlar bajarilgach va yaroqsiz holat mavjud deb taxmin qilinmasa, davlat jo'natuvchiga qaytarilishi kerak bo'lgan foydalanilmagan gaz miqdorini aniqlaydi. Ishlatilmagan gazga qo'shimcha ravishda, jo'natuvchiga biz yuqorida tavsiflagan "qaytarib berish balansi" dan ba'zi to'lovlar qaytariladi.

Yuboruvchi pulni qaytargandan so'ng:

  • Gaz uchun Eter minerga beriladi
  • tranzaksiyada ishlatiladigan gaz blok gaz hisoblagichiga qo'shiladi (blokdagi barcha bitimlar ishlatgan gazning umumiy miqdorini hisobga oladi va blokni tekshirishda foydalidir)
  • o'zini o'zi yo'q qilish to'plamidagi barcha hisoblar (agar mavjud bo'lsa) o'chiriladi

Va nihoyat, biz yangi holat va bitim tomonidan yaratilgan jurnallar to'plamini qoldirdik.

Endi biz tranzaktsiyalarni amalga oshirish asoslarini ko'rib chiqdik, keling, shartnoma tuzish operatsiyalari va xabar qo'ng'iroqlari o'rtasidagi ba'zi farqlarni ko'rib chiqaylik.

Shartnoma tuzish

Eslatib o'tamiz, Ethereum-da hisoblarning ikki turi mavjud: shartnoma hisobvaraqlari va tashqi hisoblar. Bitim "shartnoma tuzish" deganda, biz bitim maqsadi yangi shartnoma hisobini yaratish degan ma'noni anglatadi.

Yangi shartnoma hisobini yaratish uchun avval maxsus formuladan foydalangan holda yangi hisob qaydnomasi manzilini e'lon qilamiz. Keyin yangi qayd hisobini quyidagilar bilan boshlaymiz:

  • Nensni nolga sozlash
  • Agar jo'natuvchi bitim bilan ma'lum miqdordagi Eterni qiymat sifatida yuborgan bo'lsa, hisob balansini ushbu qiymatga o'rnatadi
  • Ushbu yangi hisobning qo'shilgan qiymatini jo'natuvchining balansidan ushlab qolish
  • Xotirani bo‘sh qo‘yish
  • Shartnoma kodiniHashni bo'sh satrning xeshi sifatida belgilash

Hisobni dastlabki holatga keltirgandan so'ng, biz tranzaktsiya bilan yuborilgan boshlang'ich kodidan foydalanib, haqiqatan ham hisob yaratamiz (boshlang'ich kodni yangilash uchun "O'tkazmalar va xabarlar" bo'limiga qarang). Ushbu boshlang'ich kodni bajarish paytida sodir bo'ladigan narsalar turlicha. Shartnoma tuzuvchisiga qarab, u hisobning saqlanishini yangilaydi, boshqa kontrakt qayd yozuvlarini yaratishi, boshqa xabarlarni qo'ng'iroq qilishi va h.k.

Shartnomani boshlash uchun kod bajarilganligi sababli, u gazdan foydalanadi. Bitimga qolgan gazga qaraganda ko'proq gaz sarflashga ruxsat berilmaydi. Agar shunday bo'lsa, ijro etishdan tashqaridagi istisno va chiqishga ta'sir qiladi. Agar bitim gazdan tashqari istisno tufayli kelib chiqsa, u holda bitim tuzilishidan oldin darhol ushbu holat qaytariladi. Yuboruvchiga ishlamay qolgandan oldin sarflangan gaz qaytarib berilmaydi.

Booo hoo.

Ammo, agar jo'natuvchi bitim bilan biron bir Eter qiymatini yuborgan bo'lsa, shartnomani tuzish muvaffaqiyatsiz bo'lsa ham, Eter qiymati qaytarib beriladi. Eh!

Agar initsializatsiya kodi muvaffaqiyatli bajarilsa, shartnomani tuzishning yakuniy qiymati to'lanadi. Bu saqlash qiymati va tuzilgan shartnoma kodining miqdoriga mutanosibdir (yana, bepul tushlik yo'q!) Agar ushbu yakuniy narxni to'lash uchun etarli miqdordagi gaz qolmasa, u holda bitim yana gazdan tashqari istisno e'lon qiladi va abortlar.

Agar barchasi yaxshi bo'lsa va biz buni istisnosiz qilsak, qolgan barcha ishlatilmagan gaz tranzaktsiyaning asl yuboruvchisiga qaytariladi va endi o'zgargan holat saqlanib qolishi mumkin!

Bora-bora!

Xabar qo'ng'iroqlar

Xabar qo'ng'irog'ining bajarilishi bir nechta farqlarga ega bo'lgan shartnomani tuzishga o'xshaydi.

Yangi hisoblar yaratilmagani sababli, qo'ng'iroqni amalga oshirish hech qanday kodni o'z ichiga olmaydi. Shu bilan birga, u ma'lumotlarni kiritishni o'z ichiga olishi mumkin, agar ushbu operatsiyani jo'natuvchi taqdim etgan bo'lsa. Bir marta bajarilgandan so'ng, xabar qo'ng'iroqlari chiqish ma'lumotlarini o'z ichiga olgan qo'shimcha tarkibiy qismga ega, bundan keyingi ma'lumotlarga ehtiyoj bo'lsa, foydalaniladi.

Shartnomani tuzishda bo'lgani kabi, agar qo'ng'iroqni bajarish, agar u ishlamay qolganligi yoki tranzaktsiya yaroqsiz bo'lganligi sababli chiqsa (masalan, toshib ketish, noto'g'ri o'tish yoki yaroqsiz ko'rsatma), ishlatilgan gazning hech biri asl chaqiruvchiga qaytarilmaydi. . Buning o'rniga, foydalanilmagan qolgan barcha gazlar sarflanadi va balansni topshirishdan oldin holat tiklanadi.

Ethereum-ning so'nggi yangilanishiga qadar, tizim siz bergan barcha gazni iste'mol qilmasdan, bitimni bajarilishini to'xtatish yoki qaytarish uchun hech qanday yo'l yo'q edi. Masalan, siz shartnoma tuzgan deb ayting, agar qo'ng'iroq qiluvchiga biron bir bitimni amalga oshirish huquqi berilmagan bo'lsa, u xato qildi. Ethereum-ning oldingi versiyalarida qolgan gaz hali ham iste'mol qilinadi va jo'natuvchiga hech qanday gaz qaytarilmaydi. Ammo Vizantiya yangilanishida yangi "qaytarish" kodi mavjud bo'lib, u shartnomani bajarilishini to'xtatish va qolgan o'zgarishlarni qaytarmasdan, qolgan gazni sarf qilmasdan qaytarish imkoniyatini beradi. Agar qaytarilish tufayli tranzaktsiya amalga oshirilsa, foydalanilmagan gaz jo'natuvchiga qaytariladi.

Bajarish modeli

Hozircha, biz tranzaktsiyaning boshidan oxirigacha bajarilishi kerak bo'lgan bir qator qadamlar haqida bildik. Endi biz operatsiyani VM ichida qanday amalga oshirilishini ko'rib chiqamiz.

Amaliyotlarni qayta ishlashni amalga oshiradigan protokolning qismi Ethereum o'zining virtual mashinasi bo'lib, Ethereum Virtual Machine (EVM) deb nomlanadi.

EVM - bu yuqorida aytib o'tilganidek Turing to'liq virtual mashinasi. EVM-ning yagona cheklovi shundan iboratki, odatda Turing to'liq komplekti dastgohi bu EVMning ichi gaz bilan bog'langanligidir. Shunday qilib, bajarilishi mumkin bo'lgan hisoblashning umumiy miqdori, berilgan gaz miqdori bilan cheklangan.

Manba: CMU

Bundan tashqari, EVM stakka asoslangan arxitekturaga ega. Stack mashinasi bu vaqtinchalik qiymatlarni ushlab turish uchun oxirgi kirish, birinchi chiqish stackidan foydalanadigan kompyuter.

EVM-dagi har bir ustunning o'lchami 256 bitli bo'lib, stakanda maksimal hajmi 1024 bo'ladi.

EVM-da xotira mavjud, unda elementlar so'zli manzilli bayt qatori sifatida saqlanadi. Xotira o'zgaruvchan, ya'ni doimiy emas.

EVM-da saqlash joyi mavjud. Xotiradan farqli o'laroq, saqlash o'zgaruvchan emas va tizim holatining bir qismi sifatida saqlanadi. EVM dastur kodini faqat maxsus ko'rsatmalar orqali kirish mumkin bo'lgan virtual ROM-da alohida saqlaydi. Shu tarzda, EVM odatiy fon Neumann arxitekturasidan farq qiladi, unda dastur kodi xotirada yoki saqlashda saqlanadi.

EVM ham o'z tiliga ega: "EVM bytecode". Siz yoki men kabi bir dasturchi Ethereum-da ishlaydigan aqlli shartnomalarni yozganda, biz odatda kodni qattiqlik kabi yuqori darajadagi tilda yozamiz. Keyin biz EVM tushunadigan EVM baytekodiga kompilyatsiya qilishimiz mumkin.

Xo'sh, endi ijro etilmoqda

Muayyan hisoblashni amalga oshirishdan oldin protsessor quyidagi ma'lumotlarning mavjudligini va haqiqiyligini tekshiradi:

  • Tizim holati
  • Hisoblash uchun qolgan gaz
  • Amalga oshirilayotgan kodga ega bo'lgan hisob qaydnomasi manzili
  • Ushbu ijroni amalga oshirgan operatsiyani jo'natuvchining manzili
  • Kodni bajarilishiga olib kelgan hisobning manzili (asl yuboruvchidan farq qilishi mumkin)
  • Ushbu ijroni boshlagan bitimning gaz narxi
  • Ushbu ijro uchun ma'lumotlarni kiritish
  • Qiymat (Wei-da) joriy hisobning bir qismi sifatida ushbu hisob qaydnomasiga o'tdi
  • Amalga oshiriladigan mashina kodi
  • Joriy blokning sarlavhasi
  • Ushbu xabarning qo'ng'irog'i yoki shartnomani tuzish chuqurligi

Amaliyot boshlanishida xotira va stack bo'sh va dastur hisoblagichi nolga teng.

Kompyuter: 0 STACK: [] MEM: [], saqlash: {}

Keyin EVM operatsiyani rekursiv ravishda bajaradi, har bir pastadir uchun tizim holati va mashina holatini hisoblab chiqadi. Tizim holati shunchaki Ethereumning global holatidir. Mashina holati quyidagilardan iborat:

  • gaz mavjud
  • dastur hisoblagichi
  • xotira tarkibi
  • xotiradagi so'zlarning faol soni
  • suyakka tarkibi.

Stack elementlari qo'shiladi yoki seriyaning chap qismidan chiqariladi.

Har bir tsiklda qolgan gazdan tegishli gaz miqdori kamayadi va dastur hisoblagichlari ko'payadi.

Har bir pastadir oxirida uchta imkoniyat mavjud:

  1. Mashina favqulodda holatga keladi (masalan, gaz yo'q, noto'g'ri ko'rsatmalar, suyakka ega bo'lmagan buyumlar, 1024 dan oshiq ustunlar, JUMP / JUMPI yaroqsiz ob'ektlar va hokazo) va shuning uchun barcha o'zgartirishlar bekor qilinishi kerak
  2. Keyingi ketma-ketlikni qayta ishlash davom etmoqda
  3. Mashina boshqariladigan to'xtashga etadi (bajarish jarayoni oxirida)

Agar ijro etish favqulodda holatga olib kelmasa va "boshqariladigan" yoki normal to'xtashga erishilsa, mashina natijaviy holatni, shu bajarilishdan so'ng qolgan gazni, qo'shilgan podstansiyani va natijada hosil bo'ladi.

Jiyan. Ethereumning eng murakkab qismlaridan birini bosib o'tdik. Agar siz ushbu qismni to'liq anglamagan bo'lsangiz ham, bu yaxshi. Agar siz juda chuqur darajada ishlamasangiz, shafqatsiz ijro etish tafsilotlarini tushunishingiz shart emas.

Blok qanday yakunlanadi

Va nihoyat, ko'plab bitimlar bloki qanday yakunlanishini ko'rib chiqamiz.

"Yakunlangan" deganimizda, bu blok yangi yoki mavjudligiga qarab ikki xil narsani anglatishi mumkin. Agar bu yangi blok bo'lsa, biz ushbu blokni qazib olish uchun talab qilinadigan jarayon haqida gapiramiz. Agar u mavjud blok bo'lsa, unda biz blokni tekshirish jarayoni haqida gapiramiz. Har ikki holda ham, blokni "yakunlash" uchun to'rtta talab mavjud:
 
1) ommerlarni tekshiring (yoki agar qazib olishni aniqlasangiz)
 Blok sarlavhasidagi har bir ommer haqiqiy sarlavha bo'lishi kerak va ushbu blokning oltinchi avlodida bo'lishi kerak.
 
2) bitimlarni tekshirish (yoki agar qazib olishni aniqlasangiz)
Blokdagi gasUsed raqam blokda sanab o'tilgan tranzaktsiyalarda ishlatiladigan jami gazga teng bo'lishi kerak. (Eslatib o'tamiz, tranzaktsiyani amalga oshirayotganda, biz blokdagi barcha hisob-kitoblarni hisobga olamiz, bu blokdagi barcha bitimlar ishlatgan gazning umumiy miqdorini hisobga oladi).
 
3) Mukofotlarni qo'llang (faqat qazib olishda)
Blokni qazib olish uchun benefitsiarning manzili 5 Eter beriladi. (Ethereum EIP-649 taklifiga binoan, 5 ETHning ushbu mukofoti yaqinda 3 ETHgacha kamayadi). Bundan tashqari, har bir ombor uchun, hozirgi blokning foydalanuvchisi joriy blok mukofotining 1/32 qismiga ega bo'ladi. Va nihoyat, ommer blok (lar) dan foyda oluvchiga ma'lum miqdorda mukofot beriladi (bu qanday hisoblanishi bo'yicha maxsus formulalar mavjud).
 
 4) holatni tekshirish va (yoki agar qazib olish bo'lsa, haqiqiyligini hisoblang) tekshiring
Barcha tranzaktsiyalar va natijada yuzaga kelgan o'zgarishlar o'zgarganligiga ishonch hosil qiling, so'ngra yangi natijani blokirovka mukofoti yakuniy tranzaktsiyaning natijaviy holatiga qo'llangandan so'ng belgilang. Tasdiqlash ushbu yakuniy holatni sarlavhada saqlanadigan holatni tekshirish orqali amalga oshiriladi.

Ishning kon dalili

"Bloklar" bo'limida blokning qiyinligi tushunchasi qisqacha ko'rib chiqilgan. Qiyinchiliklarni blokirovka qilishga imkon beradigan algoritmga Proof of Work (PoW) deyiladi.

Ethereum-ning ishlashni isbotlash algoritmi "Ethash" (ilgari Dagger-Xashimoto sifatida tanilgan) deb nomlangan.

Algoritm rasmiy ravishda quyidagicha aniqlanadi:

bu erda m - mixHash, n - nonce, Hn - yangi blokning sarlavhasi (hisoblash kerak bo'lgan nonce va mixHash tarkibiy qismlaridan tashqari), Hn - bu blok sarlavhasining nensi va d - bu DAG, bu esa katta ma'lumotlar to'plami.

"Bloklar" bo'limida biz blok sarlavhasida mavjud bo'lgan turli xil narsalar haqida suhbatlashdik. Ushbu tarkibiy qismlardan ikkitasi mixHash va nonce deb nomlandi. Siz eslashingiz mumkin:

  • mixHash - bu hans, bu nonce bilan birlashganda, ushbu blok etarlicha hisoblash amalga oshirilganligini isbotlaydi
  • nonce bu mixHash bilan birlashganda, ushbu blok etarlicha hisoblash amalga oshirilganligini isbotlaydigan hash

PoW funktsiyasi ushbu ikki narsani baholash uchun ishlatiladi.

MixHash va nonce ni PoW funktsiyasi yordamida qanday aniq hisoblash biroz murakkab va biz uni alohida postda chuqurroq o'rganishimiz mumkin. Ammo yuqori darajada, u quyidagicha ishlaydi:

Har bir blok uchun «urug '» hisoblanadi. Bu urug 'har bir "davr" uchun har xil, har bir davr 30000 blokdan iborat. Birinchi davr uchun urug '32 bayt noldan iborat seriyaning xeshidir. Har bir keyingi davr uchun bu oldingi urug 'xeshining xeshidir. Ushbu urug 'yordamida tugun soxta tasodifiy "keshni" hisoblashi mumkin.

Ushbu kesh nihoyatda foydalidir, chunki u ilgari ushbu maqolada muhokama qilgan "yorug'lik tugunlari" tushunchasini beradi. Yengil tugunlarning maqsadi - ba'zi bir tugunlarga butun blockchain ma'lumotlarini saqlash yukisiz tranzaksiyani samarali tekshirish imkoniyatini berish. Yorug'lik tugmasi faqat ushbu keshga asoslangan tranzaktsiyalarning haqiqiyligini tekshirishi mumkin, chunki kesh tekshirish kerak bo'lgan maxsus blokni qayta tiklaydi.

Keshdan foydalanib, tugun DAG "ma'lumotlar to'plamini" yaratishi mumkin, bu erda ma'lumotlar to'plamidagi har bir element keshdagi tasodifiy tanlangan tanlangan elementlarning oz soniga bog'liq. Konchi bo'lish uchun siz ushbu to'liq ma'lumotlar to'plamini yaratishingiz kerak; barcha to'liq mijozlar va konchilar ushbu ma'lumot bazasini saqlaydilar va vaqt o'tishi bilan ma'lumotlar to'planib boradi.

Shunda konchilar tasodifiy ma'lumotlar to'plamining qismlarini olishlari va ularni matematik funktsiya yordamida "mixHash" ga qo'shishlari mumkin. Chiqarilgan mahsulot kutilayotgan quvvat darajasidan past bo'lgunga qadar konchi bir necha marta mixHash yaratadi. Chiqish ushbu talabga javob berganda, bu nonce haqiqiy deb hisoblanadi va blok zanjirga qo'shilishi mumkin.

Konchilik xavfsizlik mexanizmi sifatida
 Umuman olganda, dasturning maqsadi kriptografik jihatdan xavfsiz tarzda, ba'zi bir mahsulotni ishlab chiqarish uchun hisoblashning ma'lum bir qismi sarf qilinganligini isbotlash (ya'ni, nonce). Buning sababi, barcha imkoniyatlarni sanab o'tishdan tashqari, talab qilinadigan darajadan past bo'lgan nensni topishning yaxshiroq usuli yo'q. Qayta-qayta hash funktsiyasini qo'llash natijalari bir tekis taqsimotga ega va biz shuni amin bo'lishimiz mumkinki, bunday bo'shliqni topish uchun vaqt o'rtacha qiyinchilik darajasiga bog'liq. Qiyinchilik qanchalik yuqori bo'lsa, nonsozni hal qilish uchun ko'proq vaqt talab etiladi. Shu tarzda, PoW algoritmi blockchain xavfsizligini ta'minlash uchun ishlatiladigan qiyinchilik tushunchasiga ma'no beradi.

Blockchain xavfsizligi deganda nimani tushunasiz? Bu oddiy: biz hammaga ishonadigan blockchainni yaratmoqchimiz. Ushbu maqolada ilgari muhokama qilganimizdek, agar bir nechta zanjirlar mavjud bo'lsa, foydalanuvchilar ishonchni yo'qotadilar, chunki ular qaysi "zanjir" haqiqiyligini aniqlay olmaydilar. Bir guruh foydalanuvchilar blockchain-da saqlanadigan asosiy holatni qabul qilishi uchun bizga bir guruh odamlar ishonadigan yagona kanonik blockchain kerak.

PoW algoritmi aynan shunday qiladi: kelajakda ma'lum bir blockchain kanonik bo'lib qolishini ta'minlaydi, bu esa buzg'unchi uchun tarixning ma'lum bir qismini (masalan, tranzaktsiyalarni o'chirish yoki soxta bitimlar tuzish orqali) yangi bloklarni yaratish uchun juda qiyin qiladi. yoki vilka ushlab turing. Avval ularning bloklari tekshirilishi uchun, tajovuzkor tarmoqdagi har kimdan ko'ra tezkor ravishda muammoni hal qilishi kerak, shunda tarmoq ularning zanjiri eng og'ir zanjir deb hisoblaydi (biz ilgari aytib o'tgan GHOST protokoli tamoyillariga asoslanib). Agar tajovuzkor 51% hujum deb nomlanadigan stsenariyni tarmoq konining quvvatining yarmidan ko'pini tashkil qilmasa, bu mumkin emas.

Kon boyliklarni taqsimlash mexanizmi sifatida

Xavfsiz blockchainni taqdim etishdan tashqari, PoW shuningdek, ushbu xavfsizlikni ta'minlash uchun hisob-kitoblarini sarflaydiganlarga boylikni tarqatishning bir usuli hisoblanadi. Eslatib o'tamiz, konchi blok qazish uchun mukofot oladi, shu jumladan:

  • "yutib olgan" blok uchun 5 eter statik blok mukofoti (yaqinda 3 eterga o'zgartiriladi)
  • blokga kiritilgan tranzaktsiyalar orqali blok ichida sarflangan gazning narxi
  • blokning bir qismi sifatida ommerni qo'shganingiz uchun qo'shimcha mukofot

Xavfsizlik va boylikni taqsimlash uchun PoW konsensus mexanizmidan foydalanish uzoq muddatli istiqbolda barqaror bo'lishini ta'minlash uchun Ethereum ushbu ikki xususiyatni o'zlashtirishga intiladi:

  • Uni iloji boricha ko'proq odamlarga ochib bering. Boshqacha qilib aytganda, algoritmni ishlatish uchun odamlarga ixtisoslashgan yoki kamdan-kam jihozlar kerak emas. Buning maqsadi boylikni taqsimlash modelini imkon qadar ochiq qilishdir, shunda har bir kishi Eter evaziga har qanday miqdorda hisoblash quvvatini taqdim etishi mumkin.
  • Har qanday bitta tugun (yoki kichik to'plam) uchun nomutanosib foyda olish imkoniyatini kamaytiring. Nomutanosib foyda keltiradigan har qanday tugun tugunning kanonik blockchainni aniqlashga katta ta'sir ko'rsatishini anglatadi. Bu muammoli, chunki u tarmoq xavfsizligini pasaytiradi.

Bitcoin blockchain tarmog'ida yuqorida keltirilgan ikkita xususiyatga bog'liq ravishda yuzaga keladigan bitta muammo shundaki, PoW algoritmi SHA256 hash funktsiyasi. Ushbu turdagi funktsiyaning kamchiliklari shundaki, uni ASICs deb nomlanuvchi ixtisoslashgan apparat yordamida ancha samarali hal qilish mumkin.

Ushbu muammoni yumshatish uchun Ethereum o'zining PoW algoritmini (Ethhash) ketma-ket xotiraga aylantirishni tanladi. Bu shuni anglatadiki, algoritm ishlab chiqilgan bo'lib, nensni hisoblash juda ko'p xotira va tarmoqli kengligini talab qiladi. Katta xotira talablari kompyuterga bir vaqtning o'zida bir nechta bo'shliqlarni kashf qilish uchun o'z xotirasidan parallel ravishda foydalanishni qiyinlashtiradi va yuqori tarmoqli kengligi talablari hatto juda tezkor kompyuter uchun ham bir vaqtning o'zida bir nechta nonni kashf etishni qiyinlashtiradi. Bu markazlashtirish xavfini kamaytiradi va tekshiruvni amalga oshiradigan tugunlar uchun yanada yuqori darajadagi o'yin maydonini yaratadi.

Ta'kidlash kerak bo'lgan narsa shundaki, Ethereum PoW konsensus mexanizmidan "ustunlik manbai" deb nomlangan narsaga o'tmoqda. Umid qilamanki, bu kelajakdagi xabarda kashf etishimiz mumkin bo'lgan dahshatli mavzu.

Xulosa

... Jiy! Siz buni oxirigacha qildingiz. Umid qilaman?

Bilaman, bu xabarda juda ko'p narsalarni o'rganish kerak. Agar nima bo'layotganini to'liq tushunish uchun sizga ko'p marotaba o'qish kerak bo'lsa, bu juda yaxshi. Men shaxsan Ethereum sariq qog'ozini, oq qog'ozni va kod bazasining turli qismlarini nima bo'layotganini bilishdan oldin ko'p marta o'qiganman.

Shunga qaramay, ushbu sharhni sizga foydali deb umid qilaman. Agar biron bir xato yoki xato topsangiz, sizga shaxsiy eslatma yozishingizni yoki to'g'ridan-to'g'ri sharhlarda qoldirishingizni istardim. Hammasiga qarayman, va'da beraman;)

Va men insonman (ha, bu haqiqat) va men xato qilaman. Men ushbu xabarni jamiyat manfaati uchun bepul yozishga vaqt ajratdim. Shunday ekan, iltimos, ortiqcha mulohaza qilmasdan fikr-mulohazangizda konstruktiv bo'ling.

[1] https://github.com/ethereum/yellowpaper