Ruka hadi kwenye maudhui makuu

Kuelewa Maelezo ya EVM ya Waraka wa Manjano

evm
Kati
qbzzt
15 Mei 2022
18 dakika za kusoma

Waraka wa Manjano (inafunguka katika kichupo kipya) ni maelezo rasmi ya Ethereum. Isipokuwa pale ambapo imerekebishwa na mchakato wa EIP, ina maelezo kamili ya jinsi kila kitu kinavyofanya kazi. Imeandikwa kama karatasi ya kihisabati, ambayo inajumuisha istilahi ambazo watengenezaji programu wanaweza wasizizoee. Katika waraka huu unajifunza jinsi ya kuusoma, na kwa ugani nyaraka zingine za kihisabati zinazohusiana.

Waraka wa Manjano Upi?

Kama karibu kila kitu kingine katika Ethereum, Waraka wa Manjano hubadilika kadiri muda unavyopita. Ili kuweza kurejelea toleo mahususi, nilipakia toleo la sasa wakati wa kuandika (inafunguka katika kichupo kipya). Nambari za sehemu, ukurasa, na mlinganyo ninazotumia zitarejelea toleo hilo. Ni wazo zuri kuwa nayo wazi katika dirisha tofauti wakati unasoma waraka huu.

Kwa nini EVM?

Waraka wa manjano wa asili uliandikwa mwanzoni kabisa mwa maendeleo ya Ethereum. Inaelezea utaratibu wa makubaliano wa asili unaotegemea Uthibitisho wa Kazi (PoW) ambao ulitumiwa hapo awali kulinda mtandao. Hata hivyo, Ethereum ilizima Uthibitisho wa Kazi (PoW) na kuanza kutumia mwafaka unaotegemea Uthibitisho wa Dau (PoS) mnamo Septemba 2022. Mafunzo haya yataangazia sehemu za waraka wa manjano zinazofafanua Mashine Pepe ya Ethereum (EVM). EVM haikubadilishwa na mpito kwenda kwenye Uthibitisho wa Dau (PoS) (isipokuwa kwa thamani ya kurejesha ya msimbo wa operesheni wa DIFFICULTY).

9 Muundo wa utekelezaji

Sehemu hii (uk. 14-16) inajumuisha sehemu kubwa ya ufafanuzi wa EVM.

Neno hali ya mfumo linajumuisha kila kitu unachohitaji kujua kuhusu mfumo ili kuuendesha. Katika kompyuta ya kawaida, hii inamaanisha kumbukumbu, yaliyomo kwenye rejista, n.k.

Mashine ya Turing (inafunguka katika kichupo kipya) ni muundo wa kimahesabu. Kimsingi, ni toleo lililorahisishwa la kompyuta, ambalo limethibitishwa kuwa na uwezo sawa wa kuendesha hesabu ambazo kompyuta ya kawaida inaweza (kila kitu ambacho kompyuta inaweza kuhesabu mashine ya Turing inaweza kuhesabu na kinyume chake). Muundo huu hurahisisha kuthibitisha nadharia mbalimbali kuhusu kile kinachoweza na kisichoweza kuhesabika.

Neno Turing-kamili (inafunguka katika kichupo kipya) linamaanisha kompyuta inayoweza kuendesha hesabu sawa na mashine ya Turing. Mashine za Turing zinaweza kuingia kwenye vitanzi visivyo na mwisho, na EVM haiwezi kwa sababu itaishiwa na gesi, kwa hivyo ni nusu-Turing-kamili tu.

9.1 Mambo ya Msingi

Sehemu hii inatoa mambo ya msingi ya EVM na jinsi inavyolinganishwa na miundo mingine ya kimahesabu.

Mashine ya staki (inafunguka katika kichupo kipya) ni kompyuta inayohifadhi data za kati si kwenye rejista, bali kwenye staki (inafunguka katika kichupo kipya). Huu ndio usanifu unaopendelewa kwa mashine pepe kwa sababu ni rahisi kutekeleza ikimaanisha kuwa hitilafu, na udhaifu wa kiusalama, haziwezekani sana kutokea. Kumbukumbu katika staki imegawanywa katika maneno ya biti 256. Hii ilichaguliwa kwa sababu inafaa kwa shughuli kuu za kificho za Ethereum kama vile uheshiji wa Keccak-256 na hesabu za tao la duaradufu. Ukubwa wa juu zaidi wa staki ni vipengee 1024 (1024 x biti 256). Wakati misimbo ya operesheni inatekelezwa kwa kawaida hupata vigezo vyake kutoka kwenye staki. Kuna misimbo ya operesheni mahususi kwa ajili ya kupanga upya vipengele katika staki kama vile POP (huondoa kipengee kutoka juu ya staki), DUP_N (hunakili kipengee cha N katika staki), n.k.

EVM pia ina nafasi tete inayoitwa kumbukumbu ambayo hutumika kuhifadhi data wakati wa utekelezaji. Kumbukumbu hii imepangwa katika maneno ya baiti 32. Maeneo yote ya kumbukumbu huanzishwa kwa sifuri. Ikiwa utatekeleza msimbo huu wa Yul (inafunguka katika kichupo kipya) ili kuongeza neno kwenye kumbukumbu, itajaza baiti 32 za kumbukumbu kwa kujaza nafasi tupu katika neno na sifuri, yaani, inaunda neno moja - na sifuri katika maeneo 0-29, 0x60 hadi 30, na 0xA7 hadi 31.

mstore(0, 0x60A7)

mstore ni mojawapo ya misimbo ya operesheni mitatu ambayo EVM hutoa kwa ajili ya kuingiliana na kumbukumbu - hupakia neno kwenye kumbukumbu. Mengine mawili ni mstore8 ambayo hupakia baiti moja kwenye kumbukumbu, na mload ambayo huhamisha neno kutoka kwenye kumbukumbu hadi kwenye staki.

EVM pia ina muundo tofauti wa hifadhi isiyo tete ambayo hudumishwa kama sehemu ya hali ya mfumo - kumbukumbu hii imepangwa katika safu za maneno (kinyume na safu za baiti zinazoweza kushughulikiwa na neno katika staki). Hifadhi hii ndipo mikataba huweka data ya kudumu - mkataba unaweza tu kuingiliana na hifadhi yake yenyewe. Hifadhi imepangwa katika ramani za ufunguo-thamani.

Ingawa haijatajwa katika sehemu hii ya Waraka wa Manjano, ni muhimu pia kujua kuna aina ya nne ya kumbukumbu. Data za mwito ni kumbukumbu ya kusoma tu inayoweza kushughulikiwa na baiti inayotumika kuhifadhi thamani iliyopitishwa na kigezo cha data cha muamala. EVM ina misimbo ya operesheni mahususi ya kudhibiti calldata. calldatasize hurejesha ukubwa wa data. calldataload hupakia data kwenye staki. calldatacopy hunakili data kwenye kumbukumbu.

Usanifu wa kawaida wa Von Neumann (inafunguka katika kichupo kipya) huhifadhi msimbo na data katika kumbukumbu sawa. EVM haifuati kiwango hiki kwa sababu za kiusalama - kushiriki kumbukumbu tete hufanya iwezekane kubadilisha msimbo wa programu. Badala yake, msimbo huhifadhiwa kwenye hifadhi.

Kuna matukio mawili tu ambapo msimbo unatekelezwa kutoka kwenye kumbukumbu:

Neno utekelezaji wa kipekee linamaanisha ubaguzi unaosababisha utekelezaji wa mkataba wa sasa kusimama.

9.2 Muhtasari wa ada

Sehemu hii inaelezea jinsi ada za gesi zinavyohesabiwa. Kuna gharama tatu:

Gharama ya msimbo wa operesheni

Gharama ya asili ya msimbo wa operesheni mahususi. Ili kupata thamani hii, tafuta kikundi cha gharama cha msimbo wa operesheni katika Kiambatisho H (uk. 29, chini ya mlinganyo (329)), na utafute kikundi cha gharama katika mlinganyo (326). Hii inakupa chaguo la kukokotoa la gharama, ambalo katika hali nyingi hutumia vigezo kutoka Kiambatisho G (uk. 28).

Kwa mfano, msimbo wa operesheni wa CALLDATACOPY (inafunguka katika kichupo kipya) ni mwanachama wa kikundi Wcopy. Gharama ya msimbo wa operesheni kwa kikundi hicho ni Gverylow+Gcopy×⌈μs[2]÷32⌉. Tukiangalia Kiambatisho G, tunaona kwamba vigezo vyote viwili ni 3, ambayo inatupa 3+3×⌈μs[2]÷32⌉.

Bado tunahitaji kufumbua usemi ⌈μs[2]÷32⌉. Sehemu ya nje kabisa, ⌈ <value> ⌉ ni chaguo la kukokotoa la dari (ceiling function), chaguo la kukokotoa ambalo likipewa thamani hurejesha nambari kamili ndogo zaidi ambayo bado si ndogo kuliko thamani hiyo. Kwa mfano, ⌈2.5⌉ = ⌈3⌉ = 3. Sehemu ya ndani ni μs[2]÷32. Tukiangalia sehemu ya 3 (Mikataba) kwenye uk. 3, μ ni hali ya mashine. Hali ya mashine inafafanuliwa katika sehemu ya 9.4.1 kwenye uk. 15. Kulingana na sehemu hiyo, mojawapo ya vigezo vya hali ya mashine ni s kwa ajili ya staki. Tukiweka yote pamoja, inaonekana kwamba μs[2] ni eneo #2 katika staki. Tukiangalia msimbo wa operesheni (inafunguka katika kichupo kipya), eneo #2 katika staki ni ukubwa wa data katika baiti. Tukiangalia misimbo mingine ya operesheni katika kikundi Wcopy, CODECOPY (inafunguka katika kichupo kipya) na RETURNDATACOPY (inafunguka katika kichupo kipya), pia ina ukubwa wa data katika eneo lile lile. Kwa hivyo ⌈μs[2]÷32⌉ ni idadi ya maneno ya baiti 32 yanayohitajika kuhifadhi data inayokiliwa. Tukiweka kila kitu pamoja, gharama ya asili ya CALLDATACOPY (inafunguka katika kichupo kipya) ni gesi 3 jumlisha 3 kwa kila neno la data inayokiliwa.

Gharama ya kuendesha

Gharama ya kuendesha msimbo tunaouita.

Gharama ya kupanua kumbukumbu

Gharama ya kupanua kumbukumbu (ikiwa ni lazima).

Katika mlinganyo 326, thamani hii imeandikwa kama Cmemi')-Cmemi). Tukiangalia sehemu ya 9.4.1 tena, tunaona kwamba μi ni idadi ya maneno katika kumbukumbu. Kwa hivyo μi ni idadi ya maneno katika kumbukumbu kabla ya msimbo wa operesheni na μi' ni idadi ya maneno katika kumbukumbu baada ya msimbo wa operesheni.

Chaguo la kukokotoa Cmem linafafanuliwa katika mlinganyo 328: Cmem(a) = Gmemory × a + ⌊a2 ÷ 512⌋. ⌊x⌋ ni chaguo la kukokotoa la sakafu (floor function), chaguo la kukokotoa ambalo likipewa thamani hurejesha nambari kamili kubwa zaidi ambayo bado si kubwa kuliko thamani hiyo. Kwa mfano, ⌊2.5⌋ = ⌊2⌋ = 2. Wakati a < √512, a2 < 512, na matokeo ya chaguo la kukokotoa la sakafu ni sifuri. Kwa hivyo kwa maneno 22 ya kwanza (baiti 704), gharama hupanda kwa mstari kulingana na idadi ya maneno ya kumbukumbu yanayohitajika. Zaidi ya hatua hiyo ⌊a2 ÷ 512⌋ ni chanya. Wakati kumbukumbu inayohitajika ni kubwa vya kutosha gharama ya gesi inalingana na mraba wa kiasi cha kumbukumbu.

Kumbuka kwamba mambo haya huathiri tu gharama ya asili ya gesi - haizingatii soko la ada au vidokezo kwa wathibitishaji ambavyo huamua ni kiasi gani mtumiaji wa mwisho anahitajika kulipa - hii ni gharama ghafi tu ya kuendesha operesheni fulani kwenye EVM.

Soma zaidi kuhusu gesi.

9.3 Mazingira ya utekelezaji

Mazingira ya utekelezaji ni tuple, I, ambayo inajumuisha taarifa ambazo si sehemu ya hali ya mnyororo wa vitalu au EVM.

KigezoMsimbo wa operesheni wa kufikia dataMsimbo wa Solidity wa kufikia data
IaADDRESS (inafunguka katika kichupo kipya)address(this)
IoORIGIN (inafunguka katika kichupo kipya)tx.origin
IpGASPRICE (inafunguka katika kichupo kipya)tx.gasprice
IdCALLDATALOAD (inafunguka katika kichupo kipya), n.k.msg.data
IsCALLER (inafunguka katika kichupo kipya)msg.sender
IvCALLVALUE (inafunguka katika kichupo kipya)msg.value
IbCODECOPY (inafunguka katika kichupo kipya)address(this).code
IHNyanja za kichwa cha kizuizi, kama vile NUMBER (inafunguka katika kichupo kipya) na DIFFICULTY (inafunguka katika kichupo kipya)block.number, block.difficulty, n.k.
IeKina cha staki ya mwito kwa ajili ya miito kati ya mikataba (ikiwa ni pamoja na uundaji wa mkataba)
IwJe, EVM inaruhusiwa kubadilisha hali, au inaendeshwa kwa uthabiti

Vigezo vingine vichache ni muhimu ili kuelewa sehemu iliyosalia ya sehemu ya 9:

KigezoImefafanuliwa katika sehemuMaana
σ2 (uk. 2, mlinganyo 1)Hali ya mnyororo wa vitalu
g9.3 (uk. 14)Gesi iliyosalia
A6.1 (uk. 9)Hali ndogo iliyokusanywa (mabadiliko yaliyopangwa kwa wakati muamala unapokamilika)
o9.3 (uk. 14)Pato - matokeo yaliyorejeshwa katika kesi ya muamala wa ndani (wakati mkataba mmoja unaita mwingine) na miito ya kutazama vipengele (unapouliza tu taarifa, kwa hivyo hakuna haja ya kusubiri muamala)

9.4 Muhtasari wa utekelezaji

Sasa kwa kuwa tuna mambo yote ya awali, hatimaye tunaweza kuanza kufanyia kazi jinsi EVM inavyofanya kazi.

Milinganyo 146-151 inatupa masharti ya awali ya kuendesha EVM:

AlamaThamani ya awaliMaana
μggGesi iliyosalia
μpc0Kihesabu programu, anwani ya maagizo yanayofuata ya kutekeleza
μm(0, 0, ...)Kumbukumbu, iliyoanzishwa kwa sifuri zote
μi0Eneo la juu zaidi la kumbukumbu lililotumika
μs()Staki, hapo awali tupu
μoPato, seti tupu hadi na isipokuwa tusimame ama kwa data ya kurejesha (RETURN (inafunguka katika kichupo kipya) au REVERT (inafunguka katika kichupo kipya)) au bila hiyo (STOP (inafunguka katika kichupo kipya) au SELFDESTRUCT (inafunguka katika kichupo kipya)).

Mlinganyo 152 unatuambia kuna masharti manne yanayowezekana katika kila hatua ya wakati wakati wa utekelezaji, na nini cha kufanya nayo:

  1. Z(σ,μ,A,I). Z inawakilisha chaguo la kukokotoa ambalo hujaribu ikiwa operesheni inaunda mpito wa hali batili (tazama kusimama kwa kipekee). Ikiwa inatathminiwa kuwa Kweli, hali mpya inafanana na ya zamani (isipokuwa gesi inachomwa) kwa sababu mabadiliko hayajatekelezwa.
  2. Ikiwa msimbo wa operesheni unaotekelezwa ni REVERT (inafunguka katika kichupo kipya), hali mpya ni sawa na hali ya zamani, baadhi ya gesi inapotea.
  3. Ikiwa mlolongo wa shughuli umekamilika, kama inavyoonyeshwa na RETURN (inafunguka katika kichupo kipya)), hali inasasishwa hadi hali mpya.
  4. Ikiwa hatuko katika mojawapo ya masharti ya mwisho 1-3, endelea kuendesha.

9.4.1 Hali ya Mashine

Sehemu hii inaelezea hali ya mashine kwa undani zaidi. Inabainisha kuwa w ni msimbo wa operesheni wa sasa. Ikiwa μpc ni chini ya ||Ib||, urefu wa msimbo, basi baiti hiyo (Ibpc]) ni msimbo wa operesheni. Vinginevyo, msimbo wa operesheni unafafanuliwa kama STOP (inafunguka katika kichupo kipya).

Kwa kuwa hii ni mashine ya staki (inafunguka katika kichupo kipya), tunahitaji kufuatilia idadi ya vipengee vilivyotolewa (δ) na kusukumwa ndani (α) na kila msimbo wa operesheni.

9.4.2 Kusimama kwa Kipekee

Sehemu hii inafafanua chaguo la kukokotoa la Z, ambalo hubainisha wakati tuna usitishaji usio wa kawaida. Hili ni chaguo la kukokotoa la Boolean (inafunguka katika kichupo kipya), kwa hivyo linatumia kwa ajili ya 'au' ya kimantiki (inafunguka katika kichupo kipya) na kwa ajili ya 'na' ya kimantiki (inafunguka katika kichupo kipya).

Tuna kusimama kwa kipekee ikiwa mojawapo ya masharti haya ni kweli:

  • μg < C(σ,μ,A,I) Kama tulivyoona katika sehemu ya 9.2, C ni chaguo la kukokotoa ambalo hubainisha gharama ya gesi. Hakuna gesi ya kutosha iliyosalia ili kufidia msimbo wa operesheni unaofuata.

  • δw=∅ Ikiwa idadi ya vipengee vilivyotolewa kwa ajili ya msimbo wa operesheni haijafafanuliwa, basi msimbo wa operesheni wenyewe haujafafanuliwa.

  • || μs || < δw Upungufu wa staki, hakuna vipengee vya kutosha kwenye staki kwa ajili ya msimbo wa operesheni wa sasa.

  • w = JUMP ∧ μs[0]∉D(Ib) Msimbo wa operesheni ni JUMP (inafunguka katika kichupo kipya) na anwani si JUMPDEST (inafunguka katika kichupo kipya). Miruko ni halali tu wakati lengwa ni JUMPDEST (inafunguka katika kichupo kipya).

  • w = JUMPI ∧ μs[1]≠0 ∧ μs[0] ∉ D(Ib) Msimbo wa operesheni ni JUMPI (inafunguka katika kichupo kipya), sharti ni kweli (sio sifuri) kwa hivyo mruko unapaswa kutokea, na anwani si JUMPDEST (inafunguka katika kichupo kipya). Miruko ni halali tu wakati lengwa ni JUMPDEST (inafunguka katika kichupo kipya).

  • w = RETURNDATACOPY ∧ μs[1]+μs[2]>|| μo || Msimbo wa operesheni ni RETURNDATACOPY (inafunguka katika kichupo kipya). Katika msimbo huu wa operesheni kipengele cha staki μs[1] ni kigezo cha kusoma kutoka kwenye bafa ya data ya kurejesha, na kipengele cha staki μs[2] ni urefu wa data. Sharti hili hutokea unapojaribu kusoma zaidi ya mwisho wa bafa ya data ya kurejesha. Kumbuka kwamba hakuna sharti sawa kwa ajili ya data za mwito au kwa msimbo wenyewe. Unapojaribu kusoma zaidi ya mwisho wa bafa hizo unapata sifuri tu.

  • || μs || - δw + αw > 1024

    Mzidio wa staki. Ikiwa kuendesha msimbo wa operesheni kutasababisha staki ya zaidi ya vipengee 1024, sitisha.

  • ¬Iw ∧ W(w,μ) Je, tunaendesha kwa uthabiti (¬ ni ukanushaji (inafunguka katika kichupo kipya) na Iw ni kweli tunaporuhusiwa kubadilisha hali ya mnyororo wa vitalu)? Ikiwa ndivyo, na tunajaribu operesheni ya kubadilisha hali, haiwezi kutokea.

    Chaguo la kukokotoa W(w,μ) linafafanuliwa baadaye katika mlinganyo 159. W(w,μ) ni kweli ikiwa mojawapo ya masharti haya ni kweli:

    • w ∈ {CREATE, CREATE2, SSTORE, SELFDESTRUCT} Misimbo hii ya operesheni hubadilisha hali, ama kwa kuunda mkataba mpya, kuhifadhi thamani, au kuharibu mkataba wa sasa.

    • LOG0≤w ∧ w≤LOG4 Ikiwa tunaitwa kwa uthabiti hatuwezi kutoa maingizo ya logi. Misimbo ya operesheni ya logi yote iko katika masafa kati ya LOG0 (A0) (inafunguka katika kichupo kipya) na LOG4 (A4) (inafunguka katika kichupo kipya). Nambari baada ya msimbo wa operesheni wa logi inabainisha ni mada ngapi ingizo la logi lina.

    • w=CALL ∧ μs[2]≠0 Unaweza kuita mkataba mwingine unapokuwa thabiti, lakini ukifanya hivyo huwezi kuhamisha ETH kwake.

  • w = SSTORE ∧ μg ≤ Gcallstipend Huwezi kuendesha SSTORE (inafunguka katika kichupo kipya) isipokuwa uwe na gesi zaidi ya Gcallstipend (iliyofafanuliwa kama 2300 katika Kiambatisho G).

9.4.3 Uhalali wa Lengwa la Mruko

Hapa tunafafanua rasmi misimbo ya operesheni ya JUMPDEST (inafunguka katika kichupo kipya) ni nini. Hatuwezi tu kutafuta thamani ya baiti 0x5B, kwa sababu inaweza kuwa ndani ya PUSH (na kwa hivyo ni data na sio msimbo wa operesheni).

Katika mlinganyo (162) tunafafanua chaguo la kukokotoa, N(i,w). Kigezo cha kwanza, i, ni eneo la msimbo wa operesheni. Cha pili, w, ni msimbo wa operesheni wenyewe. Ikiwa w∈[PUSH1, PUSH32] inamaanisha msimbo wa operesheni ni PUSH (mabano ya mraba yanafafanua masafa yanayojumuisha ncha). Ikiwa ni hivyo msimbo wa operesheni unaofuata uko kwenye i+2+(w−PUSH1). Kwa PUSH1 (inafunguka katika kichupo kipya) tunahitaji kusonga mbele kwa baiti mbili (PUSH yenyewe na thamani ya baiti moja), kwa PUSH2 (inafunguka katika kichupo kipya) tunahitaji kusonga mbele kwa baiti tatu kwa sababu ni thamani ya baiti mbili, n.k. Misimbo mingine yote ya operesheni ya EVM ina urefu wa baiti moja tu, kwa hivyo katika hali zingine zote N(i,w)=i+1.

Chaguo hili la kukokotoa linatumika katika mlinganyo (161) kufafanua DJ(c,i), ambayo ni seti (inafunguka katika kichupo kipya) ya malengwa yote halali ya mruko katika msimbo c, kuanzia na eneo la msimbo wa operesheni i. Chaguo hili la kukokotoa linafafanuliwa kwa kujirudia. Ikiwa i≥||c||, inamaanisha kwamba tuko mwishoni au baada ya mwisho wa msimbo. Hatutapata malengwa yoyote zaidi ya mruko, kwa hivyo rejesha tu seti tupu.

Katika hali zingine zote tunaangalia msimbo uliosalia kwa kwenda kwenye msimbo wa operesheni unaofuata na kupata seti kuanzia hapo. c[i] ni msimbo wa operesheni wa sasa, kwa hivyo N(i,c[i]) ni eneo la msimbo wa operesheni unaofuata. Kwa hivyo DJ(c,N(i,c[i])) ni seti ya malengwa halali ya mruko inayoanzia kwenye msimbo wa operesheni unaofuata. Ikiwa msimbo wa operesheni wa sasa si JUMPDEST, rejesha tu seti hiyo. Ikiwa ni JUMPDEST, ijumuishwe kwenye seti ya matokeo na urejeshe hiyo.

9.4.4 Kusimama kwa kawaida

Chaguo la kukokotoa la kusimama H, linaweza kurejesha aina tatu za thamani.

  • Ikiwa hatuko katika msimbo wa operesheni wa kusimama, rejesha , seti tupu. Kwa kawaida, thamani hii inatafsiriwa kama uongo wa Boolean.
  • Ikiwa tuna msimbo wa operesheni wa kusimama ambao hautoi pato (ama STOP (inafunguka katika kichupo kipya) au SELFDESTRUCT (inafunguka katika kichupo kipya)), rejesha mlolongo wa baiti za ukubwa wa sifuri kama thamani ya kurejesha. Kumbuka kwamba hii ni tofauti sana na seti tupu. Thamani hii inamaanisha kuwa EVM ilisimama kweli, tu hakuna data ya kurejesha ya kusoma.
  • Ikiwa tuna msimbo wa operesheni wa kusimama ambao hutoa pato (ama RETURN (inafunguka katika kichupo kipya) au REVERT (inafunguka katika kichupo kipya)), rejesha mlolongo wa baiti uliobainishwa na msimbo huo wa operesheni. Mlolongo huu unachukuliwa kutoka kwenye kumbukumbu, thamani iliyo juu ya staki (μs[0]) ni baiti ya kwanza, na thamani baada yake (μs[1]) ni urefu.

H.2 Seti ya maagizo

Kabla ya kwenda kwenye kifungu kidogo cha mwisho cha EVM, 9.5, hebu tuangalie maagizo yenyewe. Yamefafanuliwa katika Kiambatisho H.2 ambacho kinaanza kwenye uk. 30. Chochote ambacho hakijabainishwa kama kinachobadilika na msimbo huo mahususi wa operesheni kinatarajiwa kubaki vile vile. Vigezo vinavyobadilika vinabainishwa na kama <kitu>′.

Kwa mfano, hebu tuangalie msimbo wa operesheni wa ADD (inafunguka katika kichupo kipya).

ThamaniMnemonicδαMaelezo
0x01ADD21Operesheni ya kujumlisha.
μ′s[0] ≡ μs[0] + μs[1]

δ ni idadi ya thamani tunazotoa kutoka kwenye staki. Katika kesi hii mbili, kwa sababu tunajumlisha thamani mbili za juu.

α ni idadi ya thamani tunazosukuma nyuma. Katika kesi hii moja, jumla.

Kwa hivyo juu ya staki mpya (μ′s[0]) ni jumla ya juu ya staki ya zamani (μs[0]) na thamani ya zamani iliyo chini yake (μs[1]).

Badala ya kupitia misimbo yote ya operesheni kwa "orodha inayochosha macho", Makala haya yanaelezea tu misimbo ya operesheni inayoleta kitu kipya.

ThamaniMnemonicδαMaelezo
0x20KECCAK25621Kokotoa heshi ya Keccak-256.
μ′s[0] ≡ KEC(μms[0] . . . (μs[0] + μs[1] − 1)])
μ′i ≡ M(μis[0],μs[1])

Huu ni msimbo wa operesheni wa kwanza unaofikia kumbukumbu (katika kesi hii, kusoma tu). Hata hivyo, inaweza kupanuka zaidi ya mipaka ya sasa ya kumbukumbu, kwa hivyo tunahitaji kusasisha μi. Tunafanya hivi kwa kutumia chaguo la kukokotoa la M lililofafanuliwa katika mlinganyo 330 kwenye uk. 30.

ThamaniMnemonicδαMaelezo
0x31BALANCE11Pata salio la akaunti iliyotolewa.
...

Anwani ambayo salio lake tunahitaji kupata ni μs[0] mod 2160. Juu ya staki ni anwani, lakini kwa sababu anwani ni biti 160 tu, tunakokotoa thamani ya modulo (inafunguka katika kichupo kipya) 2160.

Ikiwa σ[μs[0] mod 2160] ≠ ∅, inamaanisha kwamba kuna taarifa kuhusu anwani hii. Katika kesi hiyo, σ[μs[0] mod 2160]b ni salio la anwani hiyo. Ikiwa σ[μs[0] mod 2160] = ∅, inamaanisha kwamba anwani hii haijaanzishwa na salio ni sifuri. Unaweza kuona orodha ya nyanja za taarifa za akaunti katika sehemu ya 4.1 kwenye uk. 4.

Mlinganyo wa pili, A'a ≡ Aa ∪ {μs[0] mod 2160}, unahusiana na tofauti ya gharama kati ya ufikiaji wa hifadhi ya joto (hifadhi ambayo imefikiwa hivi karibuni na ina uwezekano wa kuhifadhiwa kwenye kache) na hifadhi baridi (hifadhi ambayo haijafikiwa na ina uwezekano wa kuwa katika hifadhi ya polepole ambayo ni ghali zaidi kuirejesha). Aa ni orodha ya anwani zilizofikiwa hapo awali na muamala, ambazo kwa hivyo zinapaswa kuwa nafuu kufikia, kama ilivyofafanuliwa katika sehemu ya 6.1 kwenye uk. 9. Unaweza kusoma zaidi kuhusu mada hii katika EIP-2929 (inafunguka katika kichupo kipya).

ThamaniMnemonicδαMaelezo
0x8FDUP161617Nakili kipengee cha 16 cha staki.
μ′s[0] ≡ μs[15]

Kumbuka kwamba ili kutumia kipengee chochote cha staki, tunahitaji kukitoa, ambayo inamaanisha tunahitaji pia kutoa vipengee vyote vya staki vilivyo juu yake. Katika kesi ya DUP<n> (inafunguka katika kichupo kipya) na SWAP<n> (inafunguka katika kichupo kipya), hii inamaanisha kulazimika kutoa na kisha kusukuma hadi thamani kumi na sita.

9.5 Mzunguko wa utekelezaji

Sasa kwa kuwa tuna sehemu zote, hatimaye tunaweza kuelewa jinsi mzunguko wa utekelezaji wa EVM unavyorekodiwa.

Mlinganyo (164) unasema kwamba kutokana na hali:

  • σ (hali ya kimataifa ya mnyororo wa vitalu)
  • μ (hali ya EVM)
  • A (hali ndogo, mabadiliko yatakayotokea wakati muamala unapokamilika)
  • I (mazingira ya utekelezaji)

Hali mpya ni (σ', μ', A', I').

Milinganyo (165)-(167) inafafanua staki na mabadiliko ndani yake kutokana na msimbo wa operesheni (μs). Mlinganyo (168) ni mabadiliko katika gesi (μg). Mlinganyo (169) ni mabadiliko katika kihesabu programu (μpc). Hatimaye, milinganyo (170)-(173) inabainisha kwamba vigezo vingine vinabaki vile vile, isipokuwa vibadilishwe waziwazi na msimbo wa operesheni.

Kwa hili EVM inafafanuliwa kikamilifu.

Hitimisho

Nukuu za kihisabati ni sahihi na zimeruhusu Waraka wa Manjano kubainisha kila undani wa Ethereum. Hata hivyo, ina baadhi ya mapungufu:

Labda kwa sababu hizi, maelezo mapya ya tabaka la mwafaka (inafunguka katika kichupo kipya) yameandikwa katika Python. Kuna maelezo ya tabaka la utekelezaji katika Python (inafunguka katika kichupo kipya), lakini hayajakamilika. Hadi na isipokuwa Waraka wa Manjano wote pia utafsiriwe kwa Python au lugha sawa, Waraka wa Manjano utaendelea kutumika, na inasaidia kuweza kuusoma.