Kuelewa Maelezo ya EVM ya Waraka wa Manjano
Waraka wa Manjano (opens in a new tab) 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. 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. 12-14) 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 (opens in a new tab) 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 (opens in a new tab) 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 (opens in a new tab) ni kompyuta inayohifadhi data za kati si kwenye rejista, bali kwenye staki (opens in a new tab). 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 (opens in a new tab) 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 (opens in a new tab) 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:
- Wakati mkataba unaunda mkataba mwingine (kwa kutumia
CREATE(opens in a new tab) auCREATE2(opens in a new tab)), msimbo wa konstrukta wa mkataba hutoka kwenye kumbukumbu. - Wakati wa uundaji wa mkataba wowote, msimbo wa konstrukta huendeshwa na kisha kurejea na msimbo wa mkataba halisi, pia 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. 28, chini ya mlinganyo (327)), na utafute kikundi cha gharama katika mlinganyo (324). Hii inakupa chaguo la kukokotoa gharama, ambalo mara nyingi hutumia vigezo kutoka Kiambatisho G (uk. 27).
Kwa mfano, msimbo wa operesheni CALLDATACOPY (opens in a new tab) ni mwanachama wa kikundi Wcopy. Gharama ya msimbo wa operesheni kwa kikundi hicho ni Gverylow+Gcopy×⌈μs[2]÷32⌉. Tukiangalia Kiambatisho G, tunaona kwamba viwango vyote viwili ni 3, ambayo inatupa 3+3×⌈μs[2]÷32⌉.
Bado tunahitaji kufafanua usemi ⌈μs[2]÷32⌉. Sehemu ya nje kabisa, ⌈ <value> ⌉ ni chaguo la kukokotoa la dari, chaguo la kukokotoa ambalo likipewa thamani hurejesha nambari kamili ndogo zaidi ambayo bado si ndogo kuliko thamani. 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. 13. 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 (opens in a new tab), eneo #2 katika staki ni ukubwa wa data katika baiti. Tukiangalia misimbo mingine ya operesheni katika kikundi Wcopy, CODECOPY (opens in a new tab) na RETURNDATACOPY (opens in a new tab), pia zina ukubwa wa data katika eneo sawa. Kwa hivyo ⌈μs[2]÷32⌉ ni idadi ya maneno ya baiti 32 yanayohitajika kuhifadhi data inayonakiliwa. Tukiweka kila kitu pamoja, gharama ya asili ya CALLDATACOPY (opens in a new tab) ni gesi 3 pamoja na 3 kwa kila neno la data inayonakiliwa.
Gharama ya kuendesha
Gharama ya kuendesha msimbo tunaouita.
- Katika kesi ya
CREATE(opens in a new tab) naCREATE2(opens in a new tab), konstrukta wa mkataba mpya. - Katika kesi ya
CALL(opens in a new tab),CALLCODE(opens in a new tab),STATICCALL(opens in a new tab), auDELEGATECALL(opens in a new tab), mkataba tunaouita.
Gharama ya kupanua kumbukumbu
Gharama ya kupanua kumbukumbu (ikiwa ni lazima).
Katika mlinganyo wa 324, thamani hii imeandikwa kama Cmem(μi')-Cmem(μi). 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 wa 326: Cmem(a) = Gmemory × a + ⌊a2 ÷ 512⌋. ⌊x⌋ ni chaguo la kukokotoa la sakafu, chaguo la kukokotoa ambalo likipewa thamani hurejesha nambari kamili kubwa zaidi ambayo bado si kubwa kuliko thamani. 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 na idadi ya maneno ya kumbukumbu yanayohitajika. Zaidi ya hatua hiyo ⌊a2 ÷ 512⌋ ni chanya. Wakati kumbukumbu inayohitajika ni ya juu 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.
9.3 Mazingira ya utekelezaji
Mazingira ya utekelezaji ni tuple, I, ambayo inajumuisha maelezo ambayo si sehemu ya hali ya mnyororo wa vitalu au EVM.
| Kigezo | Msimbo wa operesheni wa kufikia data | Msimbo wa Solidity wa kufikia data |
|---|---|---|
| Ia | ADDRESS (opens in a new tab) | address(this) |
| Io | ORIGIN (opens in a new tab) | tx.origin |
| Ip | GASPRICE (opens in a new tab) | tx.gasprice |
| Id | CALLDATALOAD (opens in a new tab), n.k. | msg.data |
| Is | CALLER (opens in a new tab) | msg.sender |
| Iv | CALLVALUE (opens in a new tab) | msg.value |
| Ib | CODECOPY (opens in a new tab) | address(this).code |
| IH | Nyanja za kichwa cha kizuizi, kama vile NUMBER (opens in a new tab) na DIFFICULTY (opens in a new tab) | block.number, block.difficulty, n.k. |
| Ie | Kina cha staki ya mwito kwa miito kati ya mikataba (ikiwa ni pamoja na uundaji wa mkataba) | |
| Iw | Je, EVM inaruhusiwa kubadilisha hali, au inaendeshwa kwa uthabiti |
Vigezo vingine vichache ni muhimu ili kuelewa sehemu iliyosalia ya 9:
| Kigezo | Imefafanuliwa katika sehemu | Maana |
|---|---|---|
| σ | 2 (uk. 2, mlinganyo 1) | Hali ya mnyororo wa vitalu |
| g | 9.3 (uk. 13) | Gesi iliyosalia |
| A | 6.1 (uk. 8) | Hali ndogo iliyokusanywa (mabadiliko yaliyopangwa kwa wakati muamala utakapokamilika) |
| o | 9.3 (uk. 13) | Pato - matokeo yaliyorejeshwa katika kesi ya muamala wa ndani (wakati mkataba mmoja unaita mwingine) na miito ya kutazama vipengele (wakati unauliza tu maelezo, 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 137-142 inatupa masharti ya awali ya kuendesha EVM:
| Alama | Thamani ya awali | Maana |
|---|---|---|
| μg | g | Gesi iliyosalia |
| μpc | 0 | Kihesabu programu, anwani ya maagizo yanayofuata ya kutekeleza |
| μm | (0, 0, ...) | Kumbukumbu, iliyoanzishwa kwa sifuri zote |
| μi | 0 | Eneo la juu zaidi la kumbukumbu lililotumika |
| μs | () | Staki, hapo awali tupu |
| μo | ∅ | Pato, seti tupu hadi na isipokuwa tusimame ama na data ya kurejesha (RETURN (opens in a new tab) au REVERT (opens in a new tab)) au bila hiyo (STOP (opens in a new tab) au SELFDESTRUCT (opens in a new tab)). |
Mlinganyo wa 143 unatuambia kuna masharti manne yanayowezekana katika kila hatua ya wakati wakati wa utekelezaji, na nini cha kufanya nayo:
Z(σ,μ,A,I). Z inawakilisha chaguo la kukokotoa ambalo hujaribu ikiwa operesheni inaunda mpito wa hali batili (tazama kusimama kwa kipekee). Ikiwa inatathmini kuwa Kweli, hali mpya inafanana na ya zamani (isipokuwa gesi inachomwa) kwa sababu mabadiliko hayajatekelezwa.- Ikiwa msimbo wa operesheni unaotekelezwa ni
REVERT(opens in a new tab), hali mpya ni sawa na hali ya zamani, baadhi ya gesi inapotea. - Ikiwa mlolongo wa shughuli umekamilika, kama inavyoonyeshwa na
RETURN(opens in a new tab)), hali inasasishwa hadi hali mpya. - 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 (Ib[μpc]) ni msimbo wa operesheni. Vinginevyo, msimbo wa operesheni unafafanuliwa kama STOP (opens in a new tab).
Kwa kuwa hii ni mashine ya staki (opens in a new tab), 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 (opens in a new tab), kwa hivyo linatumia ∨ kwa mantiki ya au (opens in a new tab) na ∧ kwa mantiki ya na (opens in a new tab).
Tuna usimamishaji wa 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 kufidia msimbo wa operesheni unaofuata.
-
δw=∅ Ikiwa idadi ya vipengee vilivyotolewa kwa msimbo wa operesheni haijafafanuliwa, basi msimbo wa operesheni wenyewe haujafafanuliwa.
-
|| μs || < δw Upungufu wa staki, hakuna vipengee vya kutosha katika staki kwa msimbo wa operesheni wa sasa.
-
w = JUMP ∧ μs[0]∉D(Ib) Msimbo wa operesheni ni
JUMP(opens in a new tab) na anwani siJUMPDEST(opens in a new tab). Miruko ni halali tu wakati lengwa niJUMPDEST(opens in a new tab). -
w = JUMPI ∧ μs[1]≠0 ∧ μs[0] ∉ D(Ib) Msimbo wa operesheni ni
JUMPI(opens in a new tab), sharti ni kweli (sio sifuri) kwa hivyo mruko unapaswa kutokea, na anwani siJUMPDEST(opens in a new tab). Miruko ni halali tu wakati lengwa niJUMPDEST(opens in a new tab). -
w = RETURNDATACOPY ∧ μs[1]+μs[2]>|| μo || Msimbo wa operesheni ni
RETURNDATACOPY(opens in a new tab). 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 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 (opens in a new tab) 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 wa 150. 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) (opens in a new tab) naLOG4(A4) (opens in a new tab). 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(opens in a new tab) isipokuwa uwe na gesi zaidi ya Gcallstipend (iliyofafanuliwa kama 2300 katika Kiambatisho G).
9.4.3 Uhalali wa Lengwa la Mruko
Hapa tunafafanua rasmi ni nini misimbo ya operesheni ya JUMPDEST (opens in a new tab). Hatuwezi tu kutafuta thamani ya baiti 0x5B, kwa sababu inaweza kuwa ndani ya PUSH (na kwa hivyo data na sio msimbo wa operesheni).
Katika mlinganyo (153) 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] hiyo inamaanisha msimbo wa operesheni ni PUSH (mabano ya mraba yanafafanua masafa yanayojumuisha ncha). Ikiwa hali hiyo msimbo wa operesheni unaofuata uko kwenye i+2+(w−PUSH1). Kwa PUSH1 (opens in a new tab) tunahitaji kusonga mbele kwa baiti mbili (PUSH yenyewe na thamani ya baiti moja), kwa PUSH2 (opens in a new tab) 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 (152) kufafanua DJ(c,i), ambayo ni seti (opens in a new tab) 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||, hiyo inamaanisha kuwa tuko kwenye 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. DJ(c,N(i,c[i])) kwa hivyo ni seti ya malengwa halali ya mruko inayoanza kwenye msimbo wa operesheni unaofuata. Ikiwa msimbo wa operesheni wa sasa si JUMPDEST, rejesha tu seti hiyo. Ikiwa ni JUMPDEST, ijumuise katika 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(opens in a new tab) auSELFDESTRUCT(opens in a new tab)), 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(opens in a new tab) auREVERT(opens in a new tab)), 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 hatujaenda kwenye kifungu kidogo cha mwisho cha EVM, 9.5, hebu tuangalie maagizo yenyewe. Yamefafanuliwa katika Kiambatisho H.2 ambacho kinaanza kwenye uk. 29. Chochote ambacho hakijabainishwa kama kinachobadilika na msimbo huo mahususi wa operesheni kinatarajiwa kubaki sawa. Vigezo vinavyobadilika vinabainishwa na kama <something>′.
Kwa mfano, hebu tuangalie msimbo wa operesheni wa ADD (opens in a new tab).
| Thamani | Mnemoni | δ | α | Maelezo |
|---|---|---|---|---|
| 0x01 | ADD | 2 | 1 | Operesheni 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 chini yake (μs[1]).
Badala ya kupitia misimbo yote ya operesheni kwa "orodha inayochosha macho", Makala haya yanaelezea tu misimbo hiyo ya operesheni inayoleta kitu kipya.
| Thamani | Mnemoni | δ | α | Maelezo |
|---|---|---|---|---|
| 0x20 | KECCAK256 | 2 | 1 | Kokotoa heshi ya Keccak-256. |
| μ′s[0] ≡ KEC(μm[μs[0] . . . (μs[0] + μs[1] − 1)]) | ||||
| μ′i ≡ M(μi,μs[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 wa 328 kwenye uk. 29.
| Thamani | Mnemoni | δ | α | Maelezo |
|---|---|---|---|---|
| 0x31 | BALANCE | 1 | 1 | Pata 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 (opens in a new tab) 2160.
Ikiwa σ[μs[0] mod 2160] ≠ ∅, inamaanisha kuwa kuna maelezo kuhusu anwani hii. Katika hali hiyo, σ[μs[0] mod 2160]b ni salio la anwani hiyo. Ikiwa σ[μs[0] mod 2160] = ∅, inamaanisha kuwa anwani hii haijaanzishwa na salio ni sifuri. Unaweza kuona orodha ya nyanja za maelezo ya 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 joto (hifadhi ambayo imefikiwa hivi karibuni na ina uwezekano wa kuwekwa kwenye kache) na hifadhi baridi (hifadhi ambayo haijafikiwa na ina uwezekano wa kuwa katika hifadhi ya polepole ambayo ni ghali zaidi kurejesha). 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. 8. Unaweza kusoma zaidi kuhusu mada hii katika EIP-2929 (opens in a new tab).
| Thamani | Mnemoni | δ | α | Maelezo |
|---|---|---|---|---|
| 0x8F | DUP16 | 16 | 17 | Nakili 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> (opens in a new tab) na SWAP<n> (opens in a new tab), 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 (155) unasema kwamba kutokana na hali:
- σ (hali ya kimataifa ya mnyororo wa vitalu)
- μ (hali ya EVM)
- A (hali ndogo, mabadiliko yatakayotokea wakati muamala utakapokamilika)
- I (mazingira ya utekelezaji)
Hali mpya ni (σ', μ', A', I').
Milinganyo (156)-(158) inafafanua staki na mabadiliko ndani yake kutokana na msimbo wa operesheni (μs). Mlinganyo (159) ni mabadiliko katika gesi (μg). Mlinganyo (160) ni mabadiliko katika kihesabu programu (μpc). Hatimaye, milinganyo (161)-(164) inabainisha kwamba vigezo vingine vinabaki sawa, 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:
- Inaweza kueleweka tu na binadamu, ambayo inamaanisha kwamba majaribio ya kufuata (opens in a new tab) lazima yaandikwe kwa mikono.
- Watengenezaji programu wanaelewa msimbo wa kompyuta. Wanaweza au wasielewe nukuu za kihisabati.
Labda kwa sababu hizi, maelezo mapya ya tabaka la mwafaka (opens in a new tab) yameandikwa katika Python. Kuna maelezo ya tabaka la utekelezaji katika Python (opens in a new tab), 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.