முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்

மஞ்சள் அறிக்கையின் EVM விவரக்குறிப்புகளைப் புரிந்துகொள்ளுதல்

evm
இடைநிலை
qbzzt
15 மே, 2022
15 நிமிட வாசிப்பு

மஞ்சள் அறிக்கை (opens in a new tab) என்பது எத்திரியத்திற்கான முறையான விவரக்குறிப்பாகும். EIP செயல்முறையால் திருத்தப்பட்ட இடங்களைத் தவிர, அனைத்தும் எவ்வாறு செயல்படுகின்றன என்பதற்கான சரியான விளக்கத்தை இது கொண்டுள்ளது. இது ஒரு கணிதக் கட்டுரையாக எழுதப்பட்டுள்ளது, இதில் நிரலாளர்களுக்குப் பரிச்சயமில்லாத சொற்கள் இருக்கலாம். இந்தக் கட்டுரையில் அதை எவ்வாறு வாசிப்பது என்பதையும், அதன் நீட்சியாகத் தொடர்புடைய பிற கணிதக் கட்டுரைகளை எவ்வாறு வாசிப்பது என்பதையும் நீங்கள் கற்றுக்கொள்வீர்கள்.

எந்த மஞ்சள் அறிக்கை?

எத்திரியத்தில் உள்ள மற்ற அனைத்தையும் போலவே, மஞ்சள் அறிக்கையும் காலப்போக்கில் உருவாகிறது. ஒரு குறிப்பிட்ட பதிப்பைக் குறிப்பிடுவதற்காக, எழுதும் நேரத்தில் இருந்த தற்போதைய பதிப்பை நான் பதிவேற்றியுள்ளேன். நான் பயன்படுத்தும் பிரிவு, பக்கம் மற்றும் சமன்பாட்டு எண்கள் அந்தப் பதிப்பையே குறிக்கும். இந்த ஆவணத்தை வாசிக்கும்போது அதை வேறொரு சாளரத்தில் திறந்து வைத்திருப்பது நல்லது.

ஏன் EVM?

அசல் மஞ்சள் அறிக்கை எத்திரியத்தின் வளர்ச்சியின் தொடக்கத்திலேயே எழுதப்பட்டது. பிணையத்தைப் பாதுகாப்பதற்காக முதலில் பயன்படுத்தப்பட்ட அசல் பணிச் சான்று (PoW) அடிப்படையிலான ஒருமித்த வழிமுறையை இது விவரிக்கிறது. இருப்பினும், எத்திரியம் செப்டம்பர் 2022 இல் பணிச் சான்று முறையை நிறுத்திவிட்டு, உரிமைச் சான்று (PoS) அடிப்படையிலான ஒருமித்த கருத்தைப் பயன்படுத்தத் தொடங்கியது. இந்த வழிகாட்டி எத்திரியம் மெய்நிகர் இயந்திரத்தை வரையறுக்கும் மஞ்சள் அறிக்கையின் பகுதிகளில் கவனம் செலுத்தும். உரிமைச் சான்று முறைக்கு மாறியதால் EVM மாறவில்லை (DIFFICULTY செயல்பாட்டுக் குறியீட்டின் திரும்பப் பெறும் மதிப்பைத் தவிர).

9 செயலாக்க மாதிரி

இந்தப் பிரிவு (பக். 12-14) EVM இன் பெரும்பாலான வரையறைகளை உள்ளடக்கியது.

கணினி நிலை (system state) என்ற சொல், கணினியை இயக்குவதற்கு நீங்கள் தெரிந்துகொள்ள வேண்டிய அனைத்தையும் உள்ளடக்கியது. ஒரு வழக்கமான கணினியில், இது நினைவகம், பதிவேடுகளின் உள்ளடக்கம் போன்றவற்றைக் குறிக்கிறது.

ஒரு டியூரிங் இயந்திரம் (Turing machine) (opens in a new tab) என்பது ஒரு கணக்கீட்டு மாதிரியாகும். அடிப்படையில், இது ஒரு கணினியின் எளிமைப்படுத்தப்பட்ட பதிப்பாகும், இது ஒரு சாதாரண கணினி செய்யக்கூடிய அதே கணக்கீடுகளைச் செய்யும் திறனைக் கொண்டிருப்பதாக நிரூபிக்கப்பட்டுள்ளது (ஒரு கணினி கணக்கிடக்கூடிய அனைத்தையும் ஒரு டியூரிங் இயந்திரம் கணக்கிட முடியும், அதேபோல நேர்மாறாகவும்). எதைக் கணக்கிட முடியும் மற்றும் எதைக் கணக்கிட முடியாது என்பது பற்றிய பல்வேறு தேற்றங்களை நிரூபிக்க இந்த மாதிரி எளிதாக்குகிறது.

டியூரிங்-முழுமையானது (Turing-complete) (opens in a new tab) என்ற சொல், டியூரிங் இயந்திரத்தைப் போலவே அதே கணக்கீடுகளை இயக்கக்கூடிய ஒரு கணினியைக் குறிக்கிறது. டியூரிங் இயந்திரங்கள் முடிவிலி சுழல்களில் (infinite loops) சிக்கிக்கொள்ளலாம், ஆனால் EVM-ஆல் அவ்வாறு முடியாது, ஏனெனில் அதன் எரிவாயு தீர்ந்துவிடும், எனவே இது ஒரு பகுதி-டியூரிங்-முழுமையானது (quasi-Turing-complete) மட்டுமே.

9.1 அடிப்படைகள்

இந்தப் பிரிவு EVM இன் அடிப்படைகளையும், பிற கணக்கீட்டு மாதிரிகளுடன் அது எவ்வாறு ஒப்பிடப்படுகிறது என்பதையும் வழங்குகிறது.

ஒரு ஸ்டாக் இயந்திரம் (stack machine) (opens in a new tab) என்பது இடைநிலைத் தரவைப் பதிவேடுகளில் அல்லாமல், ஒரு ஸ்டாக்கில் (stack) (opens in a new tab) சேமிக்கும் கணினியாகும். மெய்நிகர் இயந்திரங்களுக்கு இதுவே விரும்பப்படும் கட்டமைப்பாகும், ஏனெனில் இதைச் செயல்படுத்துவது எளிது, அதாவது பிழைகள் மற்றும் பாதுகாப்பு பாதிப்புகள் ஏற்படுவதற்கான வாய்ப்புகள் மிகக் குறைவு. ஸ்டாக்கில் உள்ள நினைவகம் 256-பிட் சொற்களாகப் பிரிக்கப்பட்டுள்ளது. கெக்காக்-256 ஹாஷ் செய்தல் மற்றும் நீள்வட்ட வளைவு கணக்கீடுகள் போன்ற எத்திரியத்தின் முக்கிய கிரிப்டோகிராஃபிக் செயல்பாடுகளுக்கு இது வசதியாக இருப்பதால் இது தேர்ந்தெடுக்கப்பட்டது. ஸ்டாக்கின் அதிகபட்ச அளவு 1024 உருப்படிகள் (1024 x 256 பிட்கள்) ஆகும். செயல்பாட்டுக் குறியீடுகள் செயல்படுத்தப்படும்போது, அவை வழக்கமாக அவற்றின் அளவுருக்களை ஸ்டாக்கிலிருந்து பெறுகின்றன. ஸ்டாக்கில் உள்ள கூறுகளை மறுசீரமைப்பதற்காகவே பிரத்யேகமாக POP (ஸ்டாக்கின் மேலிருந்து உருப்படியை அகற்றும்), DUP_N (ஸ்டாக்கில் உள்ள N-ஆவது உருப்படியை நகலெடுக்கும்) போன்ற செயல்பாட்டுக் குறியீடுகள் உள்ளன.

EVM-இல் நினைவகம் (memory) எனப்படும் ஒரு தற்காலிக இடமும் உள்ளது, இது செயலாக்கத்தின் போது தரவைச் சேமிக்கப் பயன்படுகிறது. இந்த நினைவகம் 32-பைட் சொற்களாக ஒழுங்கமைக்கப்பட்டுள்ளது. அனைத்து நினைவக இடங்களும் பூஜ்ஜியமாகத் தொடங்கப்படுகின்றன. நினைவகத்தில் ஒரு சொல்லைச் சேர்க்க இந்த Yul (opens in a new tab) குறியீட்டை நீங்கள் இயக்கினால், அது சொல்லில் உள்ள காலி இடத்தை பூஜ்ஜியங்களால் நிரப்புவதன் மூலம் 32 பைட்டுகள் நினைவகத்தை நிரப்பும், அதாவது, இது ஒரு சொல்லை உருவாக்குகிறது - 0-29 இடங்களில் பூஜ்ஜியங்களுடனும், 30-இல் 0x60 உடனும், 31-இல் 0xA7 உடனும்.

mstore(0, 0x60A7)

நினைவகத்துடன் தொடர்புகொள்வதற்கு EVM வழங்கும் மூன்று செயல்பாட்டுக் குறியீடுகளில் mstore ஒன்றாகும் - இது ஒரு சொல்லை நினைவகத்தில் ஏற்றுகிறது. மற்ற இரண்டு mstore8 ஆகும், இது ஒரு பைட்டை நினைவகத்தில் ஏற்றுகிறது, மற்றும் mload ஆகும், இது ஒரு சொல்லை நினைவகத்திலிருந்து ஸ்டாக்கிற்கு நகர்த்துகிறது.

EVM-இல் கணினி நிலையின் ஒரு பகுதியாகப் பராமரிக்கப்படும் ஒரு தனி நிலையான சேமிப்பக (storage) மாதிரியும் உள்ளது - இந்த நினைவகம் சொல் வரிசைகளாக (ஸ்டாக்கில் உள்ள சொல்-முகவரியிடக்கூடிய பைட் வரிசைகளுக்கு மாறாக) ஒழுங்கமைக்கப்பட்டுள்ளது. இந்தச் சேமிப்பகத்தில்தான் ஒப்பந்தங்கள் நிலையான தரவை வைத்திருக்க முடியும் - ஒரு ஒப்பந்தம் அதன் சொந்தச் சேமிப்பகத்துடன் மட்டுமே தொடர்புகொள்ள முடியும். சேமிப்பகம் திறவுகோல்-மதிப்பு (key-value) மேப்பிங்குகளாக ஒழுங்கமைக்கப்பட்டுள்ளது.

மஞ்சள் அறிக்கையின் இந்தப் பிரிவில் இது குறிப்பிடப்படவில்லை என்றாலும், நான்காவது வகையான நினைவகம் இருப்பதையும் தெரிந்துகொள்வது பயனுள்ளதாக இருக்கும். அழைப்புத் தரவு (Calldata) என்பது ஒரு பரிவர்த்தனையின் data அளவுருவுடன் அனுப்பப்படும் மதிப்பைச் சேமிக்கப் பயன்படும் பைட்-முகவரியிடக்கூடிய படிக்க-மட்டுமேயான நினைவகமாகும். calldata ஐ நிர்வகிப்பதற்கு EVM குறிப்பிட்ட செயல்பாட்டுக் குறியீடுகளைக் கொண்டுள்ளது. calldatasize தரவின் அளவைத் திருப்பித் தருகிறது. calldataload தரவை ஸ்டாக்கில் ஏற்றுகிறது. calldatacopy தரவை நினைவகத்தில் நகலெடுக்கிறது.

நிலையான வான் நியூமன் கட்டமைப்பு (Von Neumann architecture) (opens in a new tab) குறியீட்டையும் தரவையும் ஒரே நினைவகத்தில் சேமிக்கிறது. பாதுகாப்புக் காரணங்களுக்காக EVM இந்தத் தரநிலையைப் பின்பற்றுவதில்லை - தற்காலிக நினைவகத்தைப் பகிர்வது நிரல் குறியீட்டை மாற்றுவதை சாத்தியமாக்குகிறது. அதற்குப் பதிலாக, குறியீடு சேமிப்பகத்தில் சேமிக்கப்படுகிறது.

நினைவகத்திலிருந்து குறியீடு செயல்படுத்தப்படும் இரண்டு நிகழ்வுகள் மட்டுமே உள்ளன:

  • ஒரு ஒப்பந்தம் மற்றொரு ஒப்பந்தத்தை உருவாக்கும்போது (CREATE (opens in a new tab) அல்லது CREATE2 (opens in a new tab) ஐப் பயன்படுத்தி), ஒப்பந்த ஆக்கிக்கான குறியீடு நினைவகத்திலிருந்து வருகிறது.
  • எந்தவொரு ஒப்பந்தத்தையும் உருவாக்கும்போது, ஆக்கிக் குறியீடு இயங்குகிறது, பின்னர் உண்மையான ஒப்பந்தத்தின் குறியீட்டுடன் திரும்புகிறது, இதுவும் நினைவகத்திலிருந்தே வருகிறது.

விதிவிலக்கான செயலாக்கம் (exceptional execution) என்ற சொல், தற்போதைய ஒப்பந்தத்தின் செயலாக்கத்தை நிறுத்தும் ஒரு விதிவிலக்கைக் குறிக்கிறது.

9.2 கட்டணங்களின் கண்ணோட்டம்

எரிவாயு கட்டணங்கள் எவ்வாறு கணக்கிடப்படுகின்றன என்பதை இந்தப் பிரிவு விளக்குகிறது. இதில் மூன்று செலவுகள் உள்ளன:

செயல்பாட்டுக் குறியீட்டுச் செலவு

குறிப்பிட்ட செயல்பாட்டுக் குறியீட்டின் உள்ளார்ந்த செலவு. இந்த மதிப்பைப் பெற, பின்னிணைப்பு H-இல் (ப. 28, சமன்பாடு (327)-இன் கீழ்) செயல்பாட்டுக் குறியீட்டின் செலவுக் குழுவைக் கண்டறியவும், மேலும் சமன்பாடு (324)-இல் செலவுக் குழுவைக் கண்டறியவும். இது உங்களுக்கு ஒரு செலவுச் சார்பை (cost function) வழங்குகிறது, இது பெரும்பாலான சந்தர்ப்பங்களில் பின்னிணைப்பு G-இலிருந்து (ப. 27) அளவுருக்களைப் பயன்படுத்துகிறது.

எடுத்துக்காட்டாக, CALLDATACOPY (opens in a new tab) செயல்பாட்டுக் குறியீடு Wcopy குழுவின் உறுப்பினராகும். அந்தக் குழுவிற்கான செயல்பாட்டுக் குறியீட்டுச் செலவு Gverylow+Gcopy×⌈μs[2]÷32⌉ ஆகும். பின்னிணைப்பு G-ஐப் பார்க்கும்போது, இரண்டு மாறிலிகளும் 3 என்பதைக் காண்கிறோம், இது நமக்கு 3+3×⌈μs[2]÷32⌉ ஐத் தருகிறது.

நாம் இன்னும் ⌈μs[2]÷32⌉ என்ற கோவையைத் தீர்க்க வேண்டும். வெளிப்புறப் பகுதியான ⌈ <value> ⌉ என்பது சீலிங் சார்பு (ceiling function) ஆகும், இது ஒரு மதிப்பைக் கொடுத்தால், அந்த மதிப்பை விடச் சிறியதாக இல்லாத மிகச்சிறிய முழு எண்ணைத் திருப்பித் தரும் சார்பாகும். எடுத்துக்காட்டாக, ⌈2.5⌉ = ⌈3⌉ = 3. உட்புறப் பகுதி μs[2]÷32 ஆகும். ப. 3-இல் உள்ள பிரிவு 3-ஐப் (மரபுகள்) பார்க்கும்போது, μ என்பது இயந்திர நிலையாகும். இயந்திர நிலை ப. 13-இல் உள்ள பிரிவு 9.4.1-இல் வரையறுக்கப்பட்டுள்ளது. அந்தப் பிரிவின்படி, இயந்திர நிலை அளவுருக்களில் ஒன்று ஸ்டாக்கிற்கான s ஆகும். இவை அனைத்தையும் ஒன்றாக இணைத்துப் பார்க்கும்போது, μs[2] என்பது ஸ்டாக்கில் உள்ள இடம் #2 என்று தோன்றுகிறது. செயல்பாட்டுக் குறியீட்டைப் (opens in a new tab) பார்க்கும்போது, ஸ்டாக்கில் உள்ள இடம் #2 என்பது பைட்டுகளில் உள்ள தரவின் அளவாகும். Wcopy குழுவில் உள்ள பிற செயல்பாட்டுக் குறியீடுகளான CODECOPY (opens in a new tab) மற்றும் RETURNDATACOPY (opens in a new tab) ஆகியவற்றைப் பார்க்கும்போது, அவையும் அதே இடத்தில் தரவின் அளவைக் கொண்டுள்ளன. எனவே ⌈μs[2]÷32⌉ என்பது நகலெடுக்கப்படும் தரவைச் சேமிக்கத் தேவையான 32 பைட் சொற்களின் எண்ணிக்கையாகும். அனைத்தையும் ஒன்றாக இணைத்துப் பார்க்கும்போது, CALLDATACOPY (opens in a new tab) இன் உள்ளார்ந்த செலவு 3 எரிவாயு மற்றும் நகலெடுக்கப்படும் தரவின் ஒவ்வொரு சொல்லுக்கும் 3 ஆகும்.

இயங்கும் செலவு

நாம் அழைக்கும் குறியீட்டை இயக்குவதற்கான செலவு.

நினைவகத்தை விரிவுபடுத்துவதற்கான செலவு

நினைவகத்தை விரிவுபடுத்துவதற்கான செலவு (தேவைப்பட்டால்).

சமன்பாடு 324-இல், இந்த மதிப்பு Cmemi')-Cmemi) என எழுதப்பட்டுள்ளது. பிரிவு 9.4.1-ஐ மீண்டும் பார்க்கும்போது, μi என்பது நினைவகத்தில் உள்ள சொற்களின் எண்ணிக்கை என்பதைக் காண்கிறோம். எனவே μi என்பது செயல்பாட்டுக் குறியீட்டிற்கு முன் நினைவகத்தில் உள்ள சொற்களின் எண்ணிக்கை மற்றும் μi' என்பது செயல்பாட்டுக் குறியீட்டிற்குப் பின் நினைவகத்தில் உள்ள சொற்களின் எண்ணிக்கை ஆகும்.

Cmem சார்பு சமன்பாடு 326-இல் வரையறுக்கப்பட்டுள்ளது: Cmem(a) = Gmemory × a + ⌊a2 ÷ 512⌋. ⌊x⌋ என்பது தரைச் சார்பு (floor function) ஆகும், இது ஒரு மதிப்பைக் கொடுத்தால், அந்த மதிப்பை விடப் பெரியதாக இல்லாத மிகப்பெரிய முழு எண்ணைத் திருப்பித் தரும் சார்பாகும். எடுத்துக்காட்டாக, ⌊2.5⌋ = ⌊2⌋ = 2. a < √512 ஆக இருக்கும்போது, a2 < 512 ஆகும், மேலும் தரைச் சார்பின் முடிவு பூஜ்ஜியமாகும். எனவே முதல் 22 சொற்களுக்கு (704 பைட்டுகள்), தேவையான நினைவகச் சொற்களின் எண்ணிக்கையுடன் செலவு நேர்கோட்டில் உயர்கிறது. அந்தப் புள்ளியைத் தாண்டி ⌊a2 ÷ 512⌋ நேர்மறையானது. தேவையான நினைவகம் போதுமான அளவு அதிகமாக இருக்கும்போது, எரிவாயு செலவு நினைவக அளவின் வர்க்கத்திற்கு விகிதாசாரமாக இருக்கும்.

குறிப்பு: இந்தக் காரணிகள் உள்ளார்ந்த எரிவாயு செலவை மட்டுமே பாதிக்கின்றன - ஒரு இறுதிப் பயனர் எவ்வளவு செலுத்த வேண்டும் என்பதைத் தீர்மானிக்கும் கட்டணச் சந்தை அல்லது மதிப்பீட்டாளர்களுக்கான உதவிக்குறிப்புகளை இது கணக்கில் எடுத்துக்கொள்வதில்லை - இது EVM-இல் ஒரு குறிப்பிட்ட செயல்பாட்டை இயக்குவதற்கான மூலச் செலவு மட்டுமே.

எரிவாயு பற்றி மேலும் படிக்கவும்.

9.3 செயலாக்கச் சூழல்

செயலாக்கச் சூழல் என்பது ஒரு டியூப்பிள் (tuple), I ஆகும், இது தொகுதிச்சங்கிலி நிலை அல்லது EVM இன் பகுதியாக இல்லாத தகவல்களை உள்ளடக்கியது.

அளவுருதரவை அணுகுவதற்கான செயல்பாட்டுக் குறியீடுதரவை அணுகுவதற்கான Solidity குறியீடு
IaADDRESS (opens in a new tab)address(this)
IoORIGIN (opens in a new tab)tx.origin
IpGASPRICE (opens in a new tab)tx.gasprice
IdCALLDATALOAD (opens in a new tab), etc.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
IHNUMBER (opens in a new tab) மற்றும் DIFFICULTY (opens in a new tab) போன்ற தொகுதித் தலைப்புப் புலங்கள்block.number, block.difficulty, etc.
Ieஒப்பந்தங்களுக்கு இடையிலான அழைப்புகளுக்கான அழைப்பு ஸ்டாக்கின் ஆழம் (ஒப்பந்த உருவாக்கம் உட்பட)
IwEVM நிலையை மாற்ற அனுமதிக்கப்படுகிறதா, அல்லது அது நிலையாக இயங்குகிறதா

பிரிவு 9-இன் மீதமுள்ள பகுதியைப் புரிந்துகொள்ள வேறு சில அளவுருக்கள் அவசியமாகும்:

அளவுருவரையறுக்கப்பட்டுள்ள பிரிவுபொருள்
σ2 (ப. 2, சமன்பாடு 1)தொகுதிச்சங்கிலியின் நிலை
g9.3 (ப. 13)மீதமுள்ள எரிவாயு
A6.1 (ப. 8)திரட்டப்பட்ட துணைநிலை (பரிவர்த்தனை முடிவடையும் போது திட்டமிடப்பட்ட மாற்றங்கள்)
o9.3 (ப. 13)வெளியீடு - உள் பரிவர்த்தனையின் போது (ஒரு ஒப்பந்தம் மற்றொன்றை அழைக்கும் போது) மற்றும் காட்சிச் சார்புகளுக்கான அழைப்புகளின் போது (நீங்கள் தகவலை மட்டுமே கேட்கிறீர்கள், எனவே பரிவர்த்தனைக்காகக் காத்திருக்கத் தேவையில்லை) திரும்பப் பெறப்பட்ட முடிவு

9.4 செயலாக்கக் கண்ணோட்டம்

இப்போது அனைத்து ஆரம்பக் கட்டத் தகவல்களும் கிடைத்துவிட்டதால், EVM எவ்வாறு செயல்படுகிறது என்பதை நாம் இறுதியாகப் பார்க்கத் தொடங்கலாம்.

சமன்பாடுகள் 137-142 EVM ஐ இயக்குவதற்கான ஆரம்ப நிபந்தனைகளை நமக்குத் தருகின்றன:

குறியீடுஆரம்ப மதிப்புபொருள்
μggமீதமுள்ள எரிவாயு
μpc0நிரல் கவுண்டர், செயல்படுத்த வேண்டிய அடுத்த அறிவுறுத்தலின் முகவரி
μm(0, 0, ...)நினைவகம், அனைத்தும் பூஜ்ஜியங்களாகத் தொடங்கப்பட்டது
μi0பயன்படுத்தப்பட்ட மிக உயர்ந்த நினைவக இடம்
μs()ஸ்டாக், ஆரம்பத்தில் காலியாக உள்ளது
μoவெளியீடு, திரும்பப் பெறும் தரவுடன் (RETURN (opens in a new tab) அல்லது REVERT (opens in a new tab)) அல்லது அது இல்லாமல் (STOP (opens in a new tab) அல்லது SELFDESTRUCT (opens in a new tab)) நாம் நிறுத்தும் வரை வெற்றுத் தொகுப்பாக இருக்கும்.

செயலாக்கத்தின் போது ஒவ்வொரு நேரத்திலும் நான்கு சாத்தியமான நிபந்தனைகள் உள்ளன என்பதையும், அவற்றுடன் என்ன செய்ய வேண்டும் என்பதையும் சமன்பாடு 143 நமக்குக் கூறுகிறது:

  1. Z(σ,μ,A,I). Z என்பது ஒரு செயல்பாடு தவறான நிலை மாற்றத்தை உருவாக்குகிறதா என்பதைச் சோதிக்கும் ஒரு சார்பைக் குறிக்கிறது (விதிவிலக்கான நிறுத்தத்தைப் பார்க்கவும்). இது True என மதிப்பிடப்பட்டால், புதிய நிலை பழையதைப் போலவே இருக்கும் (எரிவாயு எரிக்கப்படுவதைத் தவிர) ஏனெனில் மாற்றங்கள் செயல்படுத்தப்படவில்லை.
  2. செயல்படுத்தப்படும் செயல்பாட்டுக் குறியீடு REVERT (opens in a new tab) ஆக இருந்தால், புதிய நிலை பழைய நிலையைப் போலவே இருக்கும், சிறிது எரிவாயு இழக்கப்படும்.
  3. RETURN (opens in a new tab) மூலம் குறிக்கப்படுவது போல, செயல்பாடுகளின் வரிசை முடிவடைந்தால், நிலை புதிய நிலைக்குப் புதுப்பிக்கப்படும்.
  4. நாம் 1-3 இறுதி நிபந்தனைகளில் ஒன்றில் இல்லை என்றால், தொடர்ந்து இயக்கவும்.

9.4.1 இயந்திர நிலை

இந்தப் பிரிவு இயந்திர நிலையை இன்னும் விரிவாக விளக்குகிறது. w என்பது தற்போதைய செயல்பாட்டுக் குறியீடு என்பதை இது குறிப்பிடுகிறது. μpc ஆனது குறியீட்டின் நீளமான ||Ib|| ஐ விடக் குறைவாக இருந்தால், அந்த பைட் (Ibpc]) செயல்பாட்டுக் குறியீடாகும். இல்லையெனில், செயல்பாட்டுக் குறியீடு STOP (opens in a new tab) என வரையறுக்கப்படுகிறது.

இது ஒரு ஸ்டாக் இயந்திரம் (opens in a new tab) என்பதால், ஒவ்வொரு செயல்பாட்டுக் குறியீட்டாலும் வெளியேற்றப்பட்ட (δ) மற்றும் உள்ளே தள்ளப்பட்ட (α) உருப்படிகளின் எண்ணிக்கையை நாம் கண்காணிக்க வேண்டும்.

9.4.2 விதிவிலக்கான நிறுத்தம்

இந்தப் பிரிவு Z சார்பை வரையறுக்கிறது, இது எப்போது அசாதாரணமான நிறுத்தம் ஏற்படுகிறது என்பதைக் குறிப்பிடுகிறது. இது ஒரு பூலியன் (Boolean) (opens in a new tab) சார்பாகும், எனவே இது தர்க்கரீதியான OR-க்கு  (opens in a new tab) மற்றும் தர்க்கரீதியான AND-க்கு  (opens in a new tab) ஐப் பயன்படுத்துகிறது.

இந்த நிபந்தனைகளில் ஏதேனும் ஒன்று உண்மையாக இருந்தால் நமக்கு ஒரு விதிவிலக்கான நிறுத்தம் ஏற்படும்:

  • μg < C(σ,μ,A,I) பிரிவு 9.2-இல் நாம் பார்த்தபடி, C என்பது எரிவாயு செலவைக் குறிப்பிடும் சார்பாகும். அடுத்த செயல்பாட்டுக் குறியீட்டை ஈடுகட்டப் போதுமான எரிவாயு மீதமில்லை.

  • δw=∅ ஒரு செயல்பாட்டுக் குறியீட்டிற்காக வெளியேற்றப்பட்ட உருப்படிகளின் எண்ணிக்கை வரையறுக்கப்படவில்லை என்றால், செயல்பாட்டுக் குறியீடே வரையறுக்கப்படவில்லை என்று பொருள்.

  • || μs || < δw ஸ்டாக் அண்டர்ஃப்ளோ (Stack underflow), தற்போதைய செயல்பாட்டுக் குறியீட்டிற்கு ஸ்டாக்கில் போதுமான உருப்படிகள் இல்லை.

  • w = JUMP ∧ μs[0]∉D(Ib) செயல்பாட்டுக் குறியீடு JUMP (opens in a new tab) ஆகும் மற்றும் முகவரி ஒரு JUMPDEST (opens in a new tab) அல்ல. இலக்கு ஒரு JUMPDEST (opens in a new tab) ஆக இருக்கும்போது மட்டுமே தாவல்கள் (Jumps) செல்லுபடியாகும்.

  • w = JUMPI ∧ μs[1]≠0 ∧ μs[0] ∉ D(Ib) செயல்பாட்டுக் குறியீடு JUMPI (opens in a new tab) ஆகும், நிபந்தனை உண்மையாக (பூஜ்ஜியமற்றது) இருப்பதால் தாவல் நிகழ வேண்டும், மேலும் முகவரி ஒரு JUMPDEST (opens in a new tab) அல்ல. இலக்கு ஒரு JUMPDEST (opens in a new tab) ஆக இருக்கும்போது மட்டுமே தாவல்கள் செல்லுபடியாகும்.

  • w = RETURNDATACOPY ∧ μs[1]+μs[2]>|| μo || செயல்பாட்டுக் குறியீடு RETURNDATACOPY (opens in a new tab) ஆகும். இந்தச் செயல்பாட்டுக் குறியீட்டில் ஸ்டாக் உறுப்பு μs[1] என்பது திரும்பப் பெறும் தரவு இடையகத்தில் (return data buffer) வாசிப்பதற்கான ஆஃப்செட் (offset) ஆகும், மேலும் ஸ்டாக் உறுப்பு μs[2] என்பது தரவின் நீளமாகும். திரும்பப் பெறும் தரவு இடையகத்தின் முடிவைத் தாண்டி நீங்கள் வாசிக்க முயற்சிக்கும்போது இந்த நிபந்தனை ஏற்படுகிறது. அழைப்புத் தரவு அல்லது குறியீட்டிற்கு இதே போன்ற நிபந்தனை இல்லை என்பதைக் கவனியுங்கள். அந்த இடையகங்களின் முடிவைத் தாண்டி நீங்கள் வாசிக்க முயற்சிக்கும்போது உங்களுக்குப் பூஜ்ஜியங்கள் மட்டுமே கிடைக்கும்.

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

    ஸ்டாக் அளவுமீறல் (Stack overflow). செயல்பாட்டுக் குறியீட்டை இயக்குவது 1024 உருப்படிகளுக்கு மேல் உள்ள ஸ்டாக்கை உருவாக்கினால், கைவிடவும்.

  • ¬Iw ∧ W(w,μ) நாம் நிலையாக இயங்குகிறோமா (¬ என்பது மறுப்பு (opens in a new tab) மற்றும் தொகுதிச்சங்கிலி நிலையை மாற்ற நாம் அனுமதிக்கப்படும்போது Iw உண்மையாக இருக்கும்)? அப்படியானால், நாம் நிலையை மாற்றும் செயல்பாட்டை முயற்சிக்கிறோம் என்றால், அது நடக்காது.

    W(w,μ) சார்பு பின்னர் சமன்பாடு 150-இல் வரையறுக்கப்பட்டுள்ளது. இந்த நிபந்தனைகளில் ஏதேனும் ஒன்று உண்மையாக இருந்தால் W(w,μ) உண்மையாக இருக்கும்:

    • w ∈ {CREATE, CREATE2, SSTORE, SELFDESTRUCT} இந்தச் செயல்பாட்டுக் குறியீடுகள் ஒரு புதிய ஒப்பந்தத்தை உருவாக்குவதன் மூலமாகவோ, ஒரு மதிப்பைச் சேமிப்பதன் மூலமாகவோ அல்லது தற்போதைய ஒப்பந்தத்தை அழிப்பதன் மூலமாகவோ நிலையை மாற்றுகின்றன.

    • LOG0≤w ∧ w≤LOG4 நாம் நிலையாக அழைக்கப்பட்டால் பதிவு உள்ளீடுகளை வெளியிட முடியாது. பதிவுச் செயல்பாட்டுக் குறியீடுகள் அனைத்தும் LOG0 (A0) (opens in a new tab) மற்றும் LOG4 (A4) (opens in a new tab) ஆகியவற்றுக்கு இடையிலான வரம்பில் உள்ளன. பதிவுச் செயல்பாட்டுக் குறியீட்டிற்குப் பின் உள்ள எண், பதிவு உள்ளீடு எத்தனை தலைப்புகளைக் கொண்டுள்ளது என்பதைக் குறிப்பிடுகிறது.

    • w=CALL ∧ μs[2]≠0 நீங்கள் நிலையாக இருக்கும்போது மற்றொரு ஒப்பந்தத்தை அழைக்கலாம், ஆனால் அவ்வாறு செய்தால் அதற்கு ETH ஐப் பரிமாற்றம் செய்ய முடியாது.

  • w = SSTORE ∧ μg ≤ Gcallstipend உங்களிடம் Gcallstipend (பின்னிணைப்பு G-இல் 2300 என வரையறுக்கப்பட்டுள்ளது) எரிவாயுவை விட அதிகமாக இல்லாவிட்டால் SSTORE (opens in a new tab) ஐ இயக்க முடியாது.

9.4.3 தாவல் இலக்கின் செல்லுபடியாகும் தன்மை

இங்கே நாம் JUMPDEST (opens in a new tab) செயல்பாட்டுக் குறியீடுகள் என்ன என்பதை முறையாக வரையறுக்கிறோம். நாம் 0x5B என்ற பைட் மதிப்பை மட்டும் தேட முடியாது, ஏனெனில் அது ஒரு PUSH-க்குள் இருக்கலாம் (எனவே அது தரவு, செயல்பாட்டுக் குறியீடு அல்ல).

சமன்பாடு (153)-இல் நாம் N(i,w) என்ற சார்பை வரையறுக்கிறோம். முதல் அளவுரு, i, செயல்பாட்டுக் குறியீட்டின் இருப்பிடமாகும். இரண்டாவது, w, செயல்பாட்டுக் குறியீடாகும். w∈[PUSH1, PUSH32] ஆக இருந்தால், செயல்பாட்டுக் குறியீடு ஒரு PUSH என்று பொருள் (சதுர அடைப்புக்குறிகள் இறுதிப்புள்ளிகளை உள்ளடக்கிய வரம்பை வரையறுக்கின்றன). அப்படியானால் அடுத்த செயல்பாட்டுக் குறியீடு i+2+(w−PUSH1)-இல் இருக்கும். PUSH1 (opens in a new tab) க்கு நாம் இரண்டு பைட்டுகள் (PUSH மற்றும் ஒரு பைட் மதிப்பு) முன்னேற வேண்டும், PUSH2 (opens in a new tab) க்கு நாம் மூன்று பைட்டுகள் முன்னேற வேண்டும், ஏனெனில் அது இரண்டு பைட் மதிப்பு, மற்றும் பல. மற்ற அனைத்து EVM செயல்பாட்டுக் குறியீடுகளும் ஒரு பைட் நீளம் கொண்டவை, எனவே மற்ற எல்லா சந்தர்ப்பங்களிலும் N(i,w)=i+1 ஆகும்.

இந்தச் சார்பு சமன்பாடு (152)-இல் DJ(c,i) ஐ வரையறுக்கப் பயன்படுகிறது, இது செயல்பாட்டுக் குறியீட்டு இருப்பிடம் i-இல் தொடங்கி, குறியீடு c-இல் உள்ள அனைத்துச் செல்லுபடியாகும் தாவல் இலக்குகளின் தொகுப்பாகும் (set) (opens in a new tab). இந்தச் சார்பு சுழல்நிலையாக (recursively) வரையறுக்கப்பட்டுள்ளது. i≥||c|| ஆக இருந்தால், நாம் குறியீட்டின் முடிவில் அல்லது அதற்குப் பிறகு இருக்கிறோம் என்று பொருள். நாம் இனி எந்தத் தாவல் இலக்குகளையும் கண்டுபிடிக்கப் போவதில்லை, எனவே வெற்றுத் தொகுப்பைத் திருப்பித் தரவும்.

மற்ற எல்லா சந்தர்ப்பங்களிலும், அடுத்தச் செயல்பாட்டுக் குறியீட்டிற்குச் சென்று அதிலிருந்து தொடங்கும் தொகுப்பைப் பெறுவதன் மூலம் குறியீட்டின் மீதமுள்ள பகுதியைப் பார்க்கிறோம். c[i] என்பது தற்போதைய செயல்பாட்டுக் குறியீடாகும், எனவே N(i,c[i]) என்பது அடுத்தச் செயல்பாட்டுக் குறியீட்டின் இருப்பிடமாகும். எனவே DJ(c,N(i,c[i])) என்பது அடுத்தச் செயல்பாட்டுக் குறியீட்டில் தொடங்கும் செல்லுபடியாகும் தாவல் இலக்குகளின் தொகுப்பாகும். தற்போதைய செயல்பாட்டுக் குறியீடு ஒரு JUMPDEST ஆக இல்லாவிட்டால், அந்தத் தொகுப்பை மட்டும் திருப்பித் தரவும். அது JUMPDEST ஆக இருந்தால், அதை முடிவுத் தொகுப்பில் சேர்த்து அதைத் திருப்பித் தரவும்.

9.4.4 சாதாரண நிறுத்தம்

நிறுத்தும் சார்பு H, மூன்று வகையான மதிப்புகளைத் திருப்பித் தரலாம்.

  • நாம் ஒரு நிறுத்தச் செயல்பாட்டுக் குறியீட்டில் இல்லை என்றால், வெற்றுத் தொகுப்பான ஐத் திருப்பித் தரவும். மரபுப்படி, இந்த மதிப்பு பூலியன் false எனப் பொருள் கொள்ளப்படுகிறது.
  • வெளியீட்டை உருவாக்காத நிறுத்தச் செயல்பாட்டுக் குறியீடு நம்மிடம் இருந்தால் (STOP (opens in a new tab) அல்லது SELFDESTRUCT (opens in a new tab)), பூஜ்ஜிய பைட் அளவுள்ள வரிசையைத் திரும்பப் பெறும் மதிப்பாகத் திருப்பித் தரவும். இது வெற்றுத் தொகுப்பிலிருந்து மிகவும் வேறுபட்டது என்பதைக் கவனியுங்கள். இந்த மதிப்பு EVM உண்மையில் நின்றது என்பதைக் குறிக்கிறது, வாசிப்பதற்குத் திரும்பப் பெறும் தரவு எதுவும் இல்லை.
  • வெளியீட்டை உருவாக்கும் நிறுத்தச் செயல்பாட்டுக் குறியீடு நம்மிடம் இருந்தால் (RETURN (opens in a new tab) அல்லது REVERT (opens in a new tab)), அந்தச் செயல்பாட்டுக் குறியீட்டால் குறிப்பிடப்பட்ட பைட்டுகளின் வரிசையைத் திருப்பித் தரவும். இந்த வரிசை நினைவகத்திலிருந்து எடுக்கப்படுகிறது, ஸ்டாக்கின் மேற்புறத்தில் உள்ள மதிப்பு (μs[0]) முதல் பைட்டாகும், அதற்குப் பின் உள்ள மதிப்பு (μs[1]) நீளமாகும்.

H.2 அறிவுறுத்தல் தொகுப்பு

EVM இன் இறுதித் துணைப்பிரிவான 9.5-க்குச் செல்வதற்கு முன், அறிவுறுத்தல்களைப் பார்ப்போம். அவை ப. 29-இல் தொடங்கும் பின்னிணைப்பு H.2-இல் வரையறுக்கப்பட்டுள்ளன. அந்தக் குறிப்பிட்ட செயல்பாட்டுக் குறியீட்டுடன் மாறுவதாகக் குறிப்பிடப்படாத எதுவும் அப்படியே இருக்கும் என்று எதிர்பார்க்கப்படுகிறது. மாறும் மாறிகள் <something>′ எனக் குறிப்பிடப்படுகின்றன.

எடுத்துக்காட்டாக, ADD (opens in a new tab) செயல்பாட்டுக் குறியீட்டைப் பார்ப்போம்.

மதிப்புநினைவூட்டிδαவிளக்கம்
0x01ADD21கூட்டல் செயல்பாடு.
μ′s[0] ≡ μs[0] + μs[1]

δ என்பது ஸ்டாக்கிலிருந்து நாம் வெளியேற்றும் மதிப்புகளின் எண்ணிக்கையாகும். இந்தச் சந்தர்ப்பத்தில் இரண்டு, ஏனெனில் நாம் முதல் இரண்டு மதிப்புகளைக் கூட்டுகிறோம்.

α என்பது நாம் மீண்டும் உள்ளே தள்ளும் மதிப்புகளின் எண்ணிக்கையாகும். இந்தச் சந்தர்ப்பத்தில் ஒன்று, அதாவது கூடுதல்.

எனவே புதிய ஸ்டாக்கின் மேற்புறம் (μ′s[0]) என்பது பழைய ஸ்டாக்கின் மேற்புறம் (μs[0]) மற்றும் அதற்குக் கீழே உள்ள பழைய மதிப்பு (μs[1]) ஆகியவற்றின் கூடுதலாகும்.

அனைத்துச் செயல்பாட்டுக் குறியீடுகளையும் ஒரு "சலிப்பூட்டும் பட்டியலாகப்" பார்ப்பதற்குப் பதிலாக, இந்தக் கட்டுரை புதிதாக ஒன்றை அறிமுகப்படுத்தும் செயல்பாட்டுக் குறியீடுகளை மட்டுமே விளக்குகிறது.

மதிப்புநினைவூட்டிδαவிளக்கம்
0x20KECCAK25621கெக்காக்-256 ஹாஷைக் கணக்கிடுங்கள்.
μ′s[0] ≡ KEC(μms[0] . . . (μs[0] + μs[1] − 1)])
μ′i ≡ M(μis[0],μs[1])

நினைவகத்தை அணுகும் முதல் செயல்பாட்டுக் குறியீடு இதுவாகும் (இந்தச் சந்தர்ப்பத்தில், படிக்க-மட்டுமே). இருப்பினும், இது நினைவகத்தின் தற்போதைய வரம்புகளுக்கு அப்பால் விரிவடையக்கூடும், எனவே நாம் μi ஐப் புதுப்பிக்க வேண்டும். ப. 29-இல் உள்ள சமன்பாடு 328-இல் வரையறுக்கப்பட்டுள்ள M சார்பைப் பயன்படுத்தி இதைச் செய்கிறோம்.

மதிப்புநினைவூட்டிδαவிளக்கம்
0x31BALANCE11கொடுக்கப்பட்ட கணக்கின் இருப்பைப் பெறுங்கள்.
...

நாம் இருப்பைக் கண்டறிய வேண்டிய முகவரி μs[0] mod 2160 ஆகும். ஸ்டாக்கின் மேற்புறம் முகவரியாகும், ஆனால் முகவரிகள் 160 பிட்கள் மட்டுமே என்பதால், நாம் மதிப்பை 2160 மாடுலோ (modulo) (opens in a new tab) எனக் கணக்கிடுகிறோம்.

σ[μs[0] mod 2160] ≠ ∅ ஆக இருந்தால், இந்த முகவரி பற்றிய தகவல் உள்ளது என்று பொருள். அப்படியானால், σ[μs[0] mod 2160]b என்பது அந்த முகவரிக்கான இருப்பாகும். σ[μs[0] mod 2160] = ∅ ஆக இருந்தால், இந்த முகவரி தொடங்கப்படவில்லை மற்றும் இருப்பு பூஜ்ஜியமாகும் என்று பொருள். ப. 4-இல் உள்ள பிரிவு 4.1-இல் கணக்குத் தகவல் புலங்களின் பட்டியலை நீங்கள் காணலாம்.

இரண்டாவது சமன்பாடு, A'a ≡ Aa ∪ {μs[0] mod 2160}, வார்ம் சேமிப்பகத்தை (சமீபத்தில் அணுகப்பட்ட மற்றும் தேக்ககப்படுத்தப்பட்டிருக்கக்கூடிய சேமிப்பகம்) அணுகுவதற்கும் கோல்ட் சேமிப்பகத்தை (அணுகப்படாத மற்றும் மீட்டெடுக்க அதிகச் செலவாகும் மெதுவான சேமிப்பகத்தில் இருக்கக்கூடிய சேமிப்பகம்) அணுகுவதற்கும் இடையிலான செலவு வேறுபாட்டுடன் தொடர்புடையது. Aa என்பது பரிவர்த்தனையால் முன்பு அணுகப்பட்ட முகவரிகளின் பட்டியலாகும், எனவே ப. 8-இல் உள்ள பிரிவு 6.1-இல் வரையறுக்கப்பட்டுள்ளபடி, இதை அணுகுவது மலிவானதாக இருக்க வேண்டும். இந்தத் தலைப்பைப் பற்றி EIP-2929 (opens in a new tab) இல் நீங்கள் மேலும் படிக்கலாம்.

மதிப்புநினைவூட்டிδαவிளக்கம்
0x8FDUP16161716-ஆவது ஸ்டாக் உருப்படியை நகலெடுங்கள்.
μ′s[0] ≡ μs[15]

எந்தவொரு ஸ்டாக் உருப்படியையும் பயன்படுத்த, நாம் அதை வெளியேற்ற வேண்டும், அதாவது அதன் மேல் உள்ள அனைத்து ஸ்டாக் உருப்படிகளையும் நாம் வெளியேற்ற வேண்டும் என்பதைக் கவனியுங்கள். DUP<n> (opens in a new tab) மற்றும் SWAP<n> (opens in a new tab) ஆகியவற்றின் விஷயத்தில், பதினாறு மதிப்புகள் வரை வெளியேற்றி பின்னர் உள்ளே தள்ள வேண்டும் என்று பொருள்.

9.5 செயலாக்கச் சுழற்சி

இப்போது நம்மிடம் அனைத்துப் பகுதிகளும் இருப்பதால், EVM இன் செயலாக்கச் சுழற்சி எவ்வாறு ஆவணப்படுத்தப்பட்டுள்ளது என்பதை நாம் இறுதியாகப் புரிந்துகொள்ளலாம்.

சமன்பாடு (155) கொடுக்கப்பட்ட நிலையைக் கூறுகிறது:

  • σ (உலகளாவிய தொகுதிச்சங்கிலி நிலை)
  • μ (EVM நிலை)
  • A (துணைநிலை, பரிவர்த்தனை முடிவடையும் போது நிகழ வேண்டிய மாற்றங்கள்)
  • I (செயலாக்கச் சூழல்)

புதிய நிலை (σ', μ', A', I') ஆகும்.

சமன்பாடுகள் (156)-(158) ஸ்டாக்கையும், ஒரு செயல்பாட்டுக் குறியீட்டால் (μs) அதில் ஏற்படும் மாற்றத்தையும் வரையறுக்கின்றன. சமன்பாடு (159) என்பது எரிவாயுவில் ஏற்படும் மாற்றமாகும் (μg). சமன்பாடு (160) என்பது நிரல் கவுண்டரில் ஏற்படும் மாற்றமாகும் (μpc). இறுதியாக, சமன்பாடுகள் (161)-(164) செயல்பாட்டுக் குறியீட்டால் வெளிப்படையாக மாற்றப்படாவிட்டால், பிற அளவுருக்கள் அப்படியே இருக்கும் என்பதைக் குறிப்பிடுகின்றன.

இதன் மூலம் EVM முழுமையாக வரையறுக்கப்படுகிறது.

முடிவுரை

கணிதக் குறியீடு துல்லியமானது மற்றும் எத்திரியத்தின் ஒவ்வொரு விவரத்தையும் குறிப்பிட மஞ்சள் அறிக்கையை அனுமதித்துள்ளது. இருப்பினும், இதில் சில குறைபாடுகள் உள்ளன:

  • இதை மனிதர்களால் மட்டுமே புரிந்துகொள்ள முடியும், அதாவது இணக்கச் சோதனைகள் (compliance tests) (opens in a new tab) கைமுறையாக எழுதப்பட வேண்டும்.
  • நிரலாளர்கள் கணினிக் குறியீட்டைப் புரிந்துகொள்கிறார்கள். அவர்கள் கணிதக் குறியீட்டைப் புரிந்துகொள்ளலாம் அல்லது புரிந்துகொள்ளாமலும் இருக்கலாம்.

ஒருவேளை இந்தக் காரணங்களுக்காக, புதிய கருத்தொருமிப்பு அடுக்கு விவரக்குறிப்புகள் (opens in a new tab) Python-இல் எழுதப்பட்டிருக்கலாம். Python-இல் செயலாக்க அடுக்கு விவரக்குறிப்புகள் (opens in a new tab) உள்ளன, ஆனால் அவை முழுமையடையவில்லை. முழு மஞ்சள் அறிக்கையும் Python அல்லது அதைப் போன்ற ஒரு மொழிக்கு மொழிபெயர்க்கப்படும் வரை, மஞ்சள் அறிக்கை தொடர்ந்து சேவையில் இருக்கும், மேலும் அதைப் படிக்க முடிவது உதவியாக இருக்கும்.