Ruka kwenda kwenye maudhui makuu

Kuelewa Vigezo vya EVM vya Karatasi ya Njano

evm
Intermediate
qbzzt
15 Mei 2022
17 minute read

Karatasi ya Njano (opens in a new tab) ndicho kigezo rasmi cha Ethereum. Isipokuwa pale inapofanyiwa marekebisho na mchakato wa EIP, ina maelezo kamili ya jinsi kila kitu kinavyofanya kazi. Imeandikwa kama karatasi ya kihisabati, ambayo inajumuisha istilahi ambazo waandaaji wa programu wanaweza wasizifahamu. Katika karatasi hii unajifunza jinsi ya kuisoma, na kwa nyongeza karatasi zingine zinazohusiana za kihisabati.

Karatasi ya Njano ipi?

Kama karibu kila kitu kingine katika Ethereum, Karatasi ya Njano hubadilika kadri muda unavyopita. Ili kuweza kurejelea toleo maalum, nilipakia toleo la sasa wakati wa kuandika. Nambari za sehemu, ukurasa, na milinganyo ninazotumia zitarejelea toleo hilo. Ni wazo zuri kuifungua kwenye dirisha tofauti unaposoma waraka huu.

Kwa nini EVM?

Karatasi ya njano ya asili iliandikwa mwanzoni kabisa mwa maendeleo ya Ethereum. Inaelezea utaratibu wa makubaliano wa asili unaotegemea uthibitisho-wa-kazi ambao ulitumiwa hapo awali kulinda mtandao. Hata hivyo, Ethereum ilizima uthibitisho-wa-kazi na kuanza kutumia makubaliano yanayotegemea uthibitisho-wa-hisa mnamo Septemba 2022. Mafunzo haya yatazingatia sehemu za karatasi ya njano zinazofafanua Mashine Halisi ya Ethereum. EVM haikubadilika kutokana na mpito wa kwenda kwenye uthibitisho-wa-hisa (isipokuwa kwa thamani ya kurudisha ya opcode ya DIFFICULTY).

9 Mfumo wa utekelezaji

Sehemu hii (uk. 12-14) inajumuisha ufafanuzi mwingi wa EVM.

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

Mashine ya Turing (opens in a new tab) ni mfumo wa kikokotozi. Kimsingi, ni toleo lililorahisishwa la kompyuta, ambalo limethibitishwa kuwa na uwezo sawa wa kufanya makokotoo kama kompyuta ya kawaida (kila kitu ambacho kompyuta inaweza kukokotoa, mashine ya Turing inaweza kukokotoa na kinyume chake). Mfumo huu hurahisisha kuthibitisha nadharia mbalimbali kuhusu kile kinachoweza na kisichoweza kukokotolewa.

Neno Turing-complete (opens in a new tab) linamaanisha kompyuta inayoweza kufanya makokotoo sawa na mashine ya Turing. Mashine za Turing zinaweza kuingia kwenye mizunguko isiyo na kikomo, na EVM haiwezi kwa sababu ingeishiwa na gesi, kwa hivyo ni quasi-Turing-complete pekee.

9.1 Misingi

Sehemu hii inatoa misingi ya EVM na jinsi inavyolinganishwa na mifumo mingine ya kikokotozi.

Mashine ya mrundikano (opens in a new tab) ni kompyuta inayohifadhi data za kati si katika rejista, bali katika mrundikano (opens in a new tab). Huu ndio usanifu unaopendelewa kwa mashine halisi kwa sababu ni rahisi kutekeleza ikimaanisha kuwa hitilafu, na udhaifu wa kiusalama, haviwezekani sana. Kumbukumbu katika mrundikano imegawanywa katika maneno ya biti-256. Hii ilichaguliwa kwa sababu inafaa kwa shughuli za msingi za kriptografia za Ethereum kama vile uhashishaji wa Keccak-256 na makokotoo ya mzingo duaradufu. Ukubwa wa juu wa mrundikano ni vipengee 1024 (biti 1024 x 256). Wakati opcode zinapotekelezwa kwa kawaida hupata vigezo vyao kutoka kwenye mrundikano. Kuna opcode mahususi za kupanga upya vipengele katika mrundikano kama vile POP (huondoa kipengee kutoka juu ya mrundikano), DUP_N (kipengee cha N' kilichorudiwa katika mrundikano), 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 yanaanzishwa hadi sifuri. Ukiitekeleza 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 sufuri, yaani, inaunda neno moja - lenye sufuri katika maeneo 0-29, 0x60 hadi 30, na 0xA7 hadi 31.

1mstore(0, 0x60A7)

mstore ni moja ya opcode tatu ambazo EVM hutoa kwa ajili ya kuingiliana na kumbukumbu - hupakia neno kwenye kumbukumbu. Nyingine mbili ni mstore8 ambayo hupakia baiti moja kwenye kumbukumbu, na mload ambayo huhamisha neno kutoka kwenye kumbukumbu hadi kwenye mrundikano.

EVM pia ina mfumo tofauti wa hifadhi isiyo tete ambao hudumishwa kama sehemu ya hali ya mfumo - kumbukumbu hii imepangwa katika safu za maneno (kinyume na safu za baiti zinazoweza kushughulikiwa na maneno kwenye mrundikano). Hifadhi hii ndipo mikataba huhifadhi data za kudumu - mkataba unaweza tu kuingiliana na hifadhi yake yenyewe. Hifadhi imepangwa katika ramani za thamani muhimu.

Ingawa haijatajwa katika sehemu hii ya Karatasi ya Njano, ni muhimu pia kujua kuna aina ya nne ya kumbukumbu. Calldata ni kumbukumbu ya kusoma tu inayoweza kushughulikiwa na baiti inayotumiwa kuhifadhi thamani iliyopitishwa na kigezo cha data cha muamala. EVM ina opcode maalum za kudhibiti calldata. calldatasize hurudisha ukubwa wa data. calldataload hupakia data kwenye mrundikano. calldatacopy hunakili data kwenye kumbukumbu.

Usanifu wa kawaida wa Von Neumann (opens in a new tab) huhifadhi msimbo na data katika kumbukumbu moja. EVM haifuati kiwango hiki kwa sababu za kiusalama - kushiriki kumbukumbu tete hufanya iwezekane kubadilisha msimbo wa programu. Badala yake, msimbo huhifadhiwa kwenye hifadhi.

Kuna visa viwili tu ambavyo msimbo hutekelezwa kutoka kwa kumbukumbu:

  • Wakati mkataba unaunda mkataba mwingine (kwa kutumia CREATE (opens in a new tab) au CREATE2 (opens in a new tab)), msimbo wa mjenzi wa mkataba hutoka kwenye kumbukumbu.
  • Wakati wa uundaji wa mkataba wowote, msimbo wa mjenzi huendeshwa na kisha hurudi na msimbo wa mkataba halisi, pia kutoka kwenye kumbukumbu.

Neno utekelezaji wa kipekee linamaanisha tukio la kipekee linalosababisha utekelezaji wa mkataba wa sasa kusitishwa.

9.2 Muhtasari wa ada

Sehemu hii inaeleza jinsi ada za gesi zinavyokokotolewa. Kuna gharama tatu:

Gharama ya opcode

Gharama ya asili ya opcode maalum. Ili kupata thamani hii, pata kikundi cha gharama cha opcode katika Kiambatisho H (uk. 28, chini ya mlinganyo (327)), na pata kikundi cha gharama katika mlinganyo (324). Hii inakupa kazi ya gharama, ambayo katika hali nyingi hutumia vigezo kutoka Kiambatisho G (uk. 27).

Kwa mfano, opcode CALLDATACOPY (opens in a new tab) ni mwanachama wa kikundi Wnakala. Gharama ya opcode kwa kikundi hicho ni Gchinichini+Gnakala×⌈μs[2]÷32⌉. Tukiangalia Kiambatisho G, tunaona kwamba vibaki vyote viwili ni 3, ambayo inatupa 3+3×⌈μs[2]÷32⌉.

Bado tunahitaji kufafanua usemi ⌈μs[2]÷32⌉. Sehemu ya nje kabisa, ⌈ <thamani> ⌉ ni kazi ya dari, kazi ambayo ikipewa thamani hurudisha 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 imefafanuliwa katika sehemu ya 9.4.1 kwenye uk. 13. Kulingana na sehemu hiyo, moja ya vigezo vya hali ya mashine ni s kwa ajili ya mrundikano. Tukiweka yote pamoja, inaonekana kwamba μs[2] ni eneo #2 kwenye mrundikano. Tukiangalia opcode (opens in a new tab), eneo #2 kwenye mrundikano ni ukubwa wa data katika baiti. Tukiangalia opcode zingine katika kikundi Wnakala, CODECOPY (opens in a new tab) na RETURNDATACOPY (opens in a new tab), pia zina ukubwa wa data katika eneo lile lile. Kwa hivyo ⌈μs[2]÷32⌉ ni idadi ya maneno ya baiti 32 yanayohitajika kuhifadhi data inayakiliwa. 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 inayakiliwa.

Gharama ya kuendesha

Gharama ya kuendesha msimbo tunaouita.

Kupanua gharama ya kumbukumbu

Gharama ya kupanua kumbukumbu (ikiwa ni lazima).

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

Kazi Cmem imefafanuliwa katika mlinganyo wa 326: Cmem(a) = Gkumbukumbu × a + ⌊a2 ÷ 512⌋. ⌊x⌋ ni kazi ya sakafu, kazi ambayo ikipewa thamani hurudisha nambari kamili kubwa zaidi ambayo bado si kubwa kuliko thamani. Kwa mfano, ⌊2.5⌋ = ⌊2⌋ = 2. Wakati a < √512, a2 < 512, na matokeo ya kazi ya sakafu ni sifuri. Kwa hivyo kwa maneno 22 ya kwanza (baiti 704), gharama huongezeka kwa mstari na idadi ya maneno ya kumbukumbu yanayohitajika. Zaidi ya hapo ⌊a2 ÷ 512⌋ ni chanya. Wakati kumbukumbu inayohitajika ni ya juu vya kutosha gharama ya gesi ni sawia na mraba wa kiasi cha kumbukumbu.

Kumbuka kwamba vipengele hivi huathiri tu gharama ya gesi ya asili - 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 jozi, I, inayojumuisha taarifa ambazo si sehemu ya hali ya mnyororo wa bloku au EVM.

KigezoOpcode ya kufikia dataMsimbo wa Solidity wa kufikia data
IaADDRESS (opens in a new tab)anwani(this)
IoORIGIN (opens in a new tab)tx.origin
IpGASPRICE (opens in a new tab)tx.gasprice
IdCALLDATALOAD (opens in a new tab), nk.msg.data
IsCALLER (opens in a new tab)msg.sender
IvCALLVALUE (opens in a new tab)msg.value
IbCODECOPY (opens in a new tab)address(this).code
IHSehemu za kichwa cha bloku, kama vile NUMBER (opens in a new tab) na DIFFICULTY (opens in a new tab)block.number, block.difficulty, nk.
IeKina cha mrundikano wa simu kwa simu kati ya mikataba (pamoja na uundaji wa mkataba)
IwJe, EVM inaruhusiwa kubadilisha hali, au inaendeshwa kitakwimu

Vigezo vingine vichache ni muhimu kuelewa salio la sehemu ya 9:

KigezoImefafanuliwa katika sehemuMaana
σ2 (uk. 2, mlinganyo 1)Hali ya mnyororo wa bloku
g9.3 (uk. 13)Gesi iliyobaki
A6.1 (uk. 8)Hali ndogo iliyokusanywa (mabadiliko yaliyopangwa kwa wakati muamala unapoisha)
o9.3 (uk. 13)Matokeo - matokeo yaliyorudishwa katika kisa cha muamala wa ndani (wakati mkataba mmoja unapopiga simu mwingine) na simu za kutazama kazi (wakati unauliza tu habari, kwa hivyo hakuna haja ya kusubiri muamala)

9.4 Muhtasari wa utekelezaji

Sasa kwa kuwa tuna matayarisho yote, hatimaye tunaweza kuanza kufanyia kazi jinsi EVM inavyofanya kazi.

Milinganyo 137-142 inatupa hali za awali za kuendesha EVM:

AlamaThamani ya awaliMaana
μggGesi iliyobaki
μpc0Kaunta ya programu, anwani ya maagizo yafuatayo ya kutekeleza
μm(0, 0, ...)Kumbukumbu, iliyoanzishwa kwa sufuri zote
μi0Eneo la juu zaidi la kumbukumbu lililotumika
μs()Mrundikano, awali ulikuwa tupu
μoMatokeo, seti tupu hadi na isipokuwa tusimame ama na data ya kurudi (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 hali nne zinazowezekana wakati wowote wakati wa utekelezaji, na nini cha kufanya nazo:

  1. Z(σ,μ,A,I). Z inawakilisha kazi inayojaribu ikiwa operesheni inaunda mpito wa hali batili (tazama kusitishwa kwa kipekee). Ikiwa itatathmini kuwa Kweli, hali mpya ni sawa na ile ya zamani (isipokuwa gesi inachomwa) kwa sababu mabadiliko hayajatekelezwa.
  2. Ikiwa opcode inayotekelezwa ni REVERT (opens in a new tab), hali mpya ni sawa na hali ya zamani, gesi fulani inapotea.
  3. Ikiwa mfuatano wa operesheni umekamilika, kama inavyoonyeshwa na RETURN (opens in a new tab)), hali inasasishwa kuwa hali mpya.
  4. Ikiwa hatuko katika mojawapo ya hali za mwisho 1-3, endelea kuendesha.

9.4.1 Hali ya Mashine

Sehemu hii inaeleza hali ya mashine kwa undani zaidi. Inabainisha kuwa w ni opcode ya sasa. Ikiwa μpc ni chini ya ||Ib||, urefu wa msimbo, basi baiti hiyo (Ibpc]) ni opcode. Vinginevyo, opcode inafafanuliwa kama STOP (opens in a new tab).

Kwa kuwa hii ni mashine ya mrundikano (opens in a new tab), tunahitaji kufuatilia idadi ya vipengee vilivyotolewa (δ) na kusukumwa ndani (α) na kila opcode.

9.4.2 Kusitishwa kwa Kipekee

Sehemu hii inafafanua kazi ya Z, ambayo inabainisha wakati tuna usitishwaji usio wa kawaida. Hii ni kazi ya Boolean (opens in a new tab), kwa hivyo hutumia kwa mantiki au (opens in a new tab) na kwa mantiki na (opens in a new tab).

Tuna usitishwaji wa kipekee ikiwa mojawapo ya hali hizi ni kweli:

  • μg < C(σ,μ,A,I) Kama tulivyoona katika sehemu ya 9.2, C ni kazi inayobainisha gharama ya gesi. Hakuna gesi ya kutosha iliyobaki kufunika opcode inayofuata.

  • δw=∅ Ikiwa idadi ya vipengee vilivyotolewa kwa opcode haijafafanuliwa, basi opcode yenyewe haijafafanuliwa.

  • || μs || < δw Mrundikano chini ya mtiririko, hakuna vipengee vya kutosha katika mrundikano kwa opcode ya sasa.

  • w = JUMP ∧ μs[0]∉D(Ib) Opcode ni JUMP (opens in a new tab) na anwani si JUMPDEST (opens in a new tab). Miruko ni halali tu wakati lengo ni JUMPDEST (opens in a new tab).

  • w = JUMPI ∧ μs[1]≠0 ∧ μs[0] ∉ D(Ib) Opcode ni JUMPI (opens in a new tab), hali ni kweli (sio sifuri) kwa hivyo mruko unapaswa kutokea, na anwani si JUMPDEST (opens in a new tab). Miruko ni halali tu wakati lengo ni JUMPDEST (opens in a new tab).

  • w = RETURNDATACOPY ∧ μs[1]+μs[2]>|| μo || Opcode ni RETURNDATACOPY (opens in a new tab). Katika opcode hii kipengele cha mrundikano μs[1] ni kukabiliana na kusoma kutoka kwenye bafa ya data ya kurudi, na kipengele cha mrundikano μs[2] ni urefu wa data. Hali hii hutokea unapojaribu kusoma zaidi ya mwisho wa bafa ya data ya kurudi. Kumbuka kuwa hakuna hali sawa kwa calldata au kwa msimbo wenyewe. Unapojaribu kusoma zaidi ya mwisho wa bafa hizo unapata tu sifuri.

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

    Kufurika kwa mrundikano. Ikiwa kuendesha opcode kutasababisha mrundikano wa zaidi ya vipengee 1024, sitisha.

  • ¬Iw ∧ W(w,μ) Je, tunaendesha kitakwimu (¬ ni ukanushaji (opens in a new tab) na Iw ni kweli tunaporuhusiwa kubadilisha hali ya mnyororo wa bloku)? Ikiwa ndivyo, na tunajaribu operesheni ya kubadilisha hali, haiwezi kutokea.

    Kazi W(w,μ) imefafanuliwa baadaye katika mlinganyo wa 150. W(w,μ) ni kweli ikiwa mojawapo ya hali hizi ni kweli:

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

    • LOG0≤w ∧ w≤LOG4 Ikiwa tunaitwa kitakwimu hatuwezi kutoa maingizo ya kumbukumbu. Opcode za kumbukumbu zote ziko katika safu kati ya LOG0 (A0) (opens in a new tab) na LOG4 (A4) (opens in a new tab). Nambari baada ya opcode ya kumbukumbu inabainisha ni mada ngapi ingizo la kumbukumbu lina.

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

  • w = SSTORE ∧ μg ≤ Gcallstipend Huwezi kuendesha SSTORE (opens in a new tab) isipokuwa uwe na zaidi ya Gcallstipend (iliyofafanuliwa kama 2300 katika Kiambatisho G) gesi.

9.4.3 Uhalali wa Lengo la Mruko

Hapa tunafafanua rasmi ni zipi opcode za 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 si opcode).

Katika mlinganyo (153) tunafafanua kazi, N(i,w). Kigezo cha kwanza, i, ni eneo la opcode. Ya pili, w, ni opcode yenyewe. Ikiwa w∈[PUSH1, PUSH32] hiyo inamaanisha opcode ni PUSH (mabano ya mraba hufafanua safu inayojumuisha ncha za mwisho). Ikiwa kisa hicho opcode inayofuata iko 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, nk. Opcode zingine zote za EVM zina urefu wa baiti moja tu, kwa hivyo katika visa vingine vyote N(i,w)=i+1.

Kazi hii inatumiwa katika mlinganyo (152) kufafanua DJ(c,i), ambayo ni seti (opens in a new tab) ya malengo yote halali ya mruko katika msimbo c, kuanzia na eneo la opcode i. Kazi hii inafafanuliwa kwa kujirudia. Ikiwa i≥||c||, hiyo inamaanisha kuwa tuko mwisho au baada ya mwisho wa msimbo. Hatutapata malengo mengine yoyote ya mruko, kwa hivyo rudisha tu seti tupu.

Katika visa vingine vyote tunaangalia salio la msimbo kwa kwenda kwenye opcode inayofuata na kupata seti kuanzia hapo. c[i] ni opcode ya sasa, kwa hivyo N(i,c[i]) ni eneo la opcode inayofuata. DJ(c,N(i,c[i])) kwa hivyo ni seti ya malengo halali ya mruko inayoanzia kwenye opcode inayofuata. Ikiwa opcode ya sasa si JUMPDEST, rudisha tu seti hiyo. Ikiwa ni JUMPDEST, ijumuishwe kwenye seti ya matokeo na urudishe hiyo.

9.4.4 Kusitishwa kwa kawaida

Kazi ya kusitisha H, inaweza kurudisha aina tatu za thamani.

  • Ikiwa hatuko katika opcode ya kusitisha, rudisha , seti tupu. Kwa mkataba, thamani hii inatafsiriwa kama Boolean ya uongo.
  • Ikiwa tuna opcode ya kusitisha ambayo haitoi matokeo (ama STOP (opens in a new tab) au SELFDESTRUCT (opens in a new tab)), rudisha mfuatano wa baiti za ukubwa sifuri kama thamani ya kurudi. Kumbuka kuwa hii ni tofauti sana na seti tupu. Thamani hii inamaanisha kuwa EVM kweli ilisitisha, ni kwamba tu hakuna data ya kurudi ya kusoma.
  • Ikiwa tuna opcode ya kusitisha ambayo inatoa matokeo (ama RETURN (opens in a new tab) au REVERT (opens in a new tab)), rudisha mfuatano wa baiti zilizobainishwa na opcode hiyo. Mfuatano huu unachukuliwa kutoka kwenye kumbukumbu, thamani iliyo juu ya mrundikano (μ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 kinachoanzia uk. 29. Chochote ambacho hakijabainishwa kuwa kinabadilika na opcode hiyo maalum kinatarajiwa kubaki vile vile. Vigezo vinavyobadilika vinabainishwa na kama <something>′.

Kwa mfano, hebu tuangalie opcode ya ADD (opens in a new tab).

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

δ ni idadi ya thamani tunazotoa kutoka kwenye mrundikano. Katika kisa hiki mbili, kwa sababu tunaongeza thamani mbili za juu.

α ni idadi ya thamani tunazosukuma nyuma. Katika kisa hiki moja, jumla.

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

Badala ya kupitia opcode zote kwa "orodha inayochosha macho", makala hii inaeleza tu opcode zinazoanzisha kitu kipya.

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

Hii ni opcode ya kwanza inayofikia kumbukumbu (katika kisa hiki, kusoma tu). Hata hivyo, inaweza kupanuka zaidi ya mipaka ya sasa ya kumbukumbu, kwa hivyo tunahitaji kusasisha μi. Tunafanya hivi kwa kutumia kazi ya M iliyofafanuliwa katika mlinganyo wa 328 kwenye uk. 29.

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

Anwani ambayo salio lake tunahitaji kupata ni μs[0] mod 2160. Juu ya mrundikano ni anwani, lakini kwa sababu anwani zina biti 160 tu, tunakokotoa thamani modulo (opens in a new tab) 2160.

Ikiwa σ[μs[0] mod 2160] ≠ ∅, inamaanisha kuwa kuna habari kuhusu anwani hii. Katika kisa hicho, σ[μ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 sehemu za habari 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 inawezekana kuhifadhiwa kwenye kache) na hifadhi ya baridi (hifadhi ambayo haijafikiwa na inawezekana kuwa katika hifadhi ya polepole ambayo ni ghali zaidi kuirejesha). Aa ni orodha ya anwani zilizofikiwa hapo awali na muamala, ambayo kwa hivyo inapaswa kuwa rahisi 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).

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

Kumbuka kuwa ili kutumia kipengee chochote cha mrundikano, tunahitaji kukitoa, ambayo inamaanisha tunahitaji pia kutoa vipengee vyote vya mrundikano vilivyo juu yake. Katika kisa cha 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 unavyoandikwa.

Mlinganyo (155) unasema kwamba ukipewa hali:

  • σ (hali ya mnyororo wa bloku wa kimataifa)
  • μ (hali ya EVM)
  • A (hali ndogo, mabadiliko ya kutokea wakati muamala unapoisha)
  • I (mazingira ya utekelezaji)

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

Milinganyo (156)-(158) inafafanua mrundikano na mabadiliko ndani yake kutokana na opcode (μs). Mlinganyo (159) ni mabadiliko ya gesi (μg). Mlinganyo (160) ni mabadiliko katika kaunta ya programu (μpc). Hatimaye, milinganyo (161)-(164) inabainisha kuwa vigezo vingine vinabaki vile vile, isipokuwa vimebadilishwa waziwazi na opcode.

Kwa hili EVM imefafanuliwa kikamilifu.

Hitimisho

Nukuu za kihisabati ni sahihi na imeruhusu Karatasi ya Njano kubainisha kila undani wa Ethereum. Hata hivyo, ina hasara kadhaa:

  • Inaweza kueleweka tu na wanadamu, ambayo inamaanisha kuwa majaribio ya kufuata (opens in a new tab) lazima yaandikwe kwa mkono.
  • Waandaaji wa programu wanaelewa msimbo wa kompyuta. Wanaweza au wasielewe nukuu za kihisabati.

Labda kwa sababu hizi, vigezo vipya vya safu ya makubaliano (opens in a new tab) vimeandikwa katika Python. Kuna vigezo vya safu ya utekelezaji katika Python (opens in a new tab), lakini havijakamilika. Hadi na isipokuwa Karatasi nzima ya Njano itafsiriwe pia kwa Python au lugha sawa, Karatasi ya Njano itaendelea kutumika, na ni muhimu kuweza kuisoma.

Ukurasa ulihaririwa mwisho: 1 Februari 2026

Umesaidika na mafunzo haya?