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

Ethash

பக்கம் கடைசியாகப் புதுப்பிக்கப்பட்டது: 15 ஏப்ரல், 2026

Ethash என்பது Ethereum இன் proof-of-work மைனிங் அல்காரிதமாக இருந்தது. Proof-of-work இப்போது முற்றிலும் நிறுத்தப்பட்டுள்ளது, மேலும் Ethereum இப்போது அதற்குப் பதிலாக proof-of-stake ஐப் பயன்படுத்தி பாதுகாக்கப்படுகிறது. The Merge, proof-of-stake மற்றும் staking பற்றி மேலும் படிக்கவும். இந்தப் பக்கம் வரலாற்று ஆர்வத்திற்காக மட்டுமே!

Ethash என்பது Dagger-Hashimoto அல்காரிதத்தின் மாற்றியமைக்கப்பட்ட பதிப்பாகும். Ethash proof-of-work என்பது மெமரி ஹார்டு (memory hard) (opens in a new tab) ஆகும், இது அல்காரிதத்தை ASIC-எதிர்ப்பு கொண்டதாக மாற்றும் என்று கருதப்பட்டது. Ethash ASIC-கள் இறுதியில் உருவாக்கப்பட்டன, ஆனால் proof-of-work நிறுத்தப்படும் வரை GPU மைனிங் ஒரு சாத்தியமான விருப்பமாகவே இருந்தது. மற்ற Ethereum அல்லாத proof-of-work நெட்வொர்க்குகளில் பிற நாணயங்களை மைனிங் செய்ய Ethash இன்னும் பயன்படுத்தப்படுகிறது.

Ethash எவ்வாறு செயல்படுகிறது?

நான்ஸ் (nonce) மற்றும் பிளாக் ஹெடரைப் பொறுத்து ஒரு நிலையான வளத்தின் துணைக்குழுக்களைத் தேர்ந்தெடுக்க வேண்டிய proof of work அல்காரிதம் மூலம் மெமரி ஹார்டுனஸ் (Memory hardness) அடையப்படுகிறது. இந்த வளம் (சில ஜிகாபைட் அளவு கொண்டது) DAG என்று அழைக்கப்படுகிறது. DAG ஒவ்வொரு 30000 பிளாக்குகளுக்கும் மாற்றப்படுகிறது, இது எபோக் (epoch) எனப்படும் ~125 மணிநேர சாளரம் (தோராயமாக 5.2 நாட்கள்) ஆகும், மேலும் இதை உருவாக்க சிறிது நேரம் எடுக்கும். DAG பிளாக் உயரத்தை மட்டுமே சார்ந்து இருப்பதால், அதை முன்கூட்டியே உருவாக்க முடியும், ஆனால் அவ்வாறு செய்யாவிட்டால், ஒரு பிளாக்கை உருவாக்க கிளையன்ட் இந்த செயல்முறையின் இறுதி வரை காத்திருக்க வேண்டும். கிளையன்ட்கள் முன்கூட்டியே DAG-களை உருவாக்கி கேச் (cache) செய்யாவிட்டால், ஒவ்வொரு எபோக் மாற்றத்தின் போதும் நெட்வொர்க் பெரிய பிளாக் தாமதத்தை சந்திக்க நேரிடும். proof-of-work-ஐ சரிபார்க்க DAG உருவாக்கப்பட வேண்டியதில்லை என்பதை நினைவில் கொள்ளவும், இது அடிப்படையில் குறைந்த CPU மற்றும் சிறிய மெமரி இரண்டையும் கொண்டு சரிபார்க்க அனுமதிக்கிறது.

அல்காரிதம் எடுக்கும் பொதுவான வழிமுறை பின்வருமாறு:

  1. ஒவ்வொரு பிளாக்கிற்கும் ஒரு சீட் (seed) உள்ளது, அது அந்தப் புள்ளி வரை உள்ள பிளாக் ஹெடர்களை ஸ்கேன் செய்வதன் மூலம் கணக்கிடப்படலாம்.
  2. சீடிலிருந்து, ஒருவர் 16 MB சூடோரேண்டம் கேச் (pseudorandom cache)-ஐ கணக்கிடலாம். லைட் கிளையன்ட்கள் கேச்-ஐ சேமிக்கின்றன.
  3. கேச்-லிருந்து, நாம் ஒரு 1 GB தரவுத்தொகுப்பை (dataset) உருவாக்க முடியும், இதில் தரவுத்தொகுப்பில் உள்ள ஒவ்வொரு உருப்படியும் கேச்-லிருந்து ஒரு சிறிய எண்ணிக்கையிலான உருப்படிகளை மட்டுமே சார்ந்துள்ளது என்ற பண்பு உள்ளது. முழு கிளையன்ட்கள் மற்றும் மைனர்கள் தரவுத்தொகுப்பை சேமிக்கின்றனர். தரவுத்தொகுப்பு காலப்போக்கில் நேர்கோட்டில் வளர்கிறது.
  4. மைனிங் என்பது தரவுத்தொகுப்பின் சீரற்ற துண்டுகளை எடுத்து அவற்றை ஒன்றாக ஹாஷ் செய்வதை உள்ளடக்கியது. உங்களுக்குத் தேவையான தரவுத்தொகுப்பின் குறிப்பிட்ட பகுதிகளை மீண்டும் உருவாக்க கேச்-ஐப் பயன்படுத்துவதன் மூலம் குறைந்த மெமரியுடன் சரிபார்ப்பைச் செய்யலாம், எனவே நீங்கள் கேச்-ஐ மட்டுமே சேமிக்க வேண்டும்.

பெரிய தரவுத்தொகுப்பு ஒவ்வொரு 30000 பிளாக்குகளுக்கும் ஒருமுறை புதுப்பிக்கப்படுகிறது, எனவே மைனரின் பெரும்பாலான முயற்சி தரவுத்தொகுப்பைப் படிப்பதாகவே இருக்கும், அதில் மாற்றங்களைச் செய்வதாக இருக்காது.

வரையறைகள்

நாங்கள் பின்வரும் வரையறைகளைப் பயன்படுத்துகிறோம்:

'SHA3' இன் பயன்பாடு

Ethereum இன் மேம்பாடு SHA3 தரநிலையின் மேம்பாட்டுடன் ஒத்துப்போனது, மேலும் தரநிலைப்படுத்தல் செயல்முறை இறுதி செய்யப்பட்ட ஹாஷ் அல்காரிதத்தின் பேடிங்கில் (padding) தாமதமான மாற்றத்தைச் செய்தது, இதனால் Ethereum இன் "sha3_256" மற்றும் "sha3_512" ஹாஷ்கள் நிலையான sha3 ஹாஷ்கள் அல்ல, ஆனால் மற்ற சூழல்களில் பெரும்பாலும் "Keccak-256" மற்றும் "Keccak-512" என்று குறிப்பிடப்படும் ஒரு மாறுபாடாகும். விவாதத்தைப் பார்க்கவும், எ.கா., இங்கே (opens in a new tab), இங்கே (opens in a new tab), அல்லது இங்கே (opens in a new tab).

கீழே உள்ள அல்காரிதத்தின் விளக்கத்தில் "sha3" ஹாஷ்கள் குறிப்பிடப்பட்டுள்ளதால், தயவுசெய்து அதை நினைவில் கொள்ளவும்.

அளவுருக்கள்

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

தரவுத்தொகுப்பு மற்றும் கேச் அளவு மதிப்புகளின் அட்டவணைகள் பின்னிணைப்பில் வழங்கப்பட்டுள்ளன.

கேச் உருவாக்கம்

இப்போது, கேச்-ஐ உருவாக்குவதற்கான செயல்பாட்டைக் குறிப்பிடுகிறோம்:

கேச் உற்பத்தி செயல்முறையானது முதலில் 32 MB மெமரியை வரிசையாக நிரப்புவதை உள்ளடக்கியது, பின்னர் Strict Memory Hard Hashing Functions (2014) (opens in a new tab) இலிருந்து Sergio Demian Lerner இன் RandMemoHash அல்காரிதத்தின் இரண்டு பாஸ்களை (passes) செய்கிறது. இதன் வெளியீடு 524288 64-பைட் மதிப்புகளின் தொகுப்பாகும்.

தரவு ஒருங்கிணைப்பு செயல்பாடு

சில சந்தர்ப்பங்களில் XOR-க்கு மாற்றாக FNV ஹாஷ் (opens in a new tab)-ஆல் ஈர்க்கப்பட்ட அல்காரிதத்தைப் பயன்படுத்துகிறோம். FNV-1 விவரக்குறிப்பு பகா எண்ணை ஒரு பைட்டுடன் (octet) பெருக்குவதற்கு மாறாக, முழு 32-பிட் உள்ளீட்டுடன் பகா எண்ணைப் பெருக்குகிறோம் என்பதை நினைவில் கொள்ளவும்.

FNV_PRIME = 0x01000193

def fnv(v1, v2):
    return ((v1 * FNV_PRIME) ^ v2) % 2**32

தயவுசெய்து கவனிக்கவும், மஞ்சள் தாள் (yellow paper) கூட fnv-ஐ v1*(FNV_PRIME ^ v2) எனக் குறிப்பிட்டாலும், தற்போதைய அனைத்து செயலாக்கங்களும் மேற்கண்ட வரையறையையே தொடர்ந்து பயன்படுத்துகின்றன.

முழு தரவுத்தொகுப்பு கணக்கீடு

முழு 1 GB தரவுத்தொகுப்பில் உள்ள ஒவ்வொரு 64-பைட் உருப்படியும் பின்வருமாறு கணக்கிடப்படுகிறது:

அடிப்படையில், 256 சூடோரேண்டமாக தேர்ந்தெடுக்கப்பட்ட கேச் நோடுகளிலிருந்து தரவை இணைத்து, தரவுத்தொகுப்பு நோடைக் கணக்கிட அதை ஹாஷ் செய்கிறோம். முழு தரவுத்தொகுப்பும் பின்னர் இதன்படி உருவாக்கப்படுகிறது:

def calc_dataset(full_size, cache):
    return [calc_dataset_item(cache, i) for i in range(full_size // HASH_BYTES)]

முதன்மை லூப் (Main loop)

இப்போது, ஒரு குறிப்பிட்ட ஹெடர் மற்றும் நான்ஸிற்கான (nonce) நமது இறுதி மதிப்பை உருவாக்குவதற்காக முழு தரவுத்தொகுப்பிலிருந்தும் தரவை ஒருங்கிணைக்கும் முக்கிய "hashimoto" போன்ற லூப்பைக் குறிப்பிடுகிறோம். கீழே உள்ள குறியீட்டில், header என்பது துண்டிக்கப்பட்ட (truncated) பிளாக் ஹெடரின் RLP பிரதிநிதித்துவத்தின் SHA3-256 ஹாஷைக் குறிக்கிறது, அதாவது mixHash மற்றும் nonce புலங்களைத் தவிர்த்த ஹெடர். nonce என்பது பிக்-எண்டியன் (big-endian) வரிசையில் உள்ள 64 பிட் கையொப்பமிடப்படாத முழு எண்ணின் எட்டு பைட்டுகள் ஆகும். எனவே nonce[::-1] என்பது அந்த மதிப்பின் எட்டு-பைட் லிட்டில்-எண்டியன் (little-endian) பிரதிநிதித்துவமாகும்:

அடிப்படையில், நாங்கள் 128 பைட்டுகள் அகலமுள்ள ஒரு "மிக்ஸ் (mix)"-ஐப் பராமரிக்கிறோம், மேலும் முழு தரவுத்தொகுப்பிலிருந்து 128 பைட்டுகளைத் தொடர்ந்து வரிசையாகப் பெற்று, அதை மிக்ஸுடன் இணைக்க fnv செயல்பாட்டைப் பயன்படுத்துகிறோம். 128 பைட்டுகள் தொடர்ச்சியான அணுகல் பயன்படுத்தப்படுகிறது, இதனால் அல்காரிதத்தின் ஒவ்வொரு சுற்றும் எப்போதும் RAM இலிருந்து ஒரு முழுப் பக்கத்தைப் பெறுகிறது, இது ASIC-கள் கோட்பாட்டளவில் தவிர்க்கக்கூடிய translation lookaside buffer தவறுகளைக் குறைக்கிறது.

இந்த அல்காரிதத்தின் வெளியீடு விரும்பிய இலக்கிற்குக் கீழே இருந்தால், நான்ஸ் செல்லுபடியாகும். முடிவில் sha3_256 இன் கூடுதல் பயன்பாடு, குறைந்தபட்சம் ஒரு சிறிய அளவிலான வேலை செய்யப்பட்டுள்ளது என்பதை நிரூபிக்க வழங்கக்கூடிய ஒரு இடைநிலை நான்ஸ் இருப்பதை உறுதி செய்கிறது என்பதை நினைவில் கொள்ளவும்; இந்த விரைவான வெளிப்புற PoW சரிபார்ப்பை anti-DDoS நோக்கங்களுக்காகப் பயன்படுத்தலாம். இதன் முடிவு ஒரு சார்பற்ற, 256-பிட் எண் என்பதற்கான புள்ளிவிவர உத்தரவாதத்தை வழங்கவும் இது உதவுகிறது.

மைனிங்

மைனிங் அல்காரிதம் பின்வருமாறு வரையறுக்கப்படுகிறது:

def mine(full_size, dataset, header, difficulty):
    # ஒரே இலக்கத்தில் ஹாஷுடன் ஒப்பிடுவதற்கு இலக்கை பூஜ்ஜியத்தால் நிரப்பவும்
    target = zpad(encode_int(2**256 // difficulty), 64)[::-1]
    from random import randint
    nonce = randint(0, 2**64)
    while hashimoto_full(full_size, dataset, header, nonce) > target:
        nonce = (nonce + 1) % 2**64
    return nonce

சீட் ஹாஷை வரையறுத்தல்

கொடுக்கப்பட்ட பிளாக்கின் மேல் மைனிங் செய்யப் பயன்படுத்தப்படும் சீட் ஹாஷைக் கணக்கிட, பின்வரும் அல்காரிதத்தைப் பயன்படுத்துகிறோம்:

 def get_seedhash(block):
     s = '\x00' * 32
     for i in range(block.number // EPOCH_LENGTH):
         s = serialize_hash(sha3_256(s))
     return s

மென்மையான மைனிங் மற்றும் சரிபார்ப்பிற்கு, எதிர்கால சீட்ஹாஷ்கள் மற்றும் தரவுத்தொகுப்புகளை ஒரு தனி த்ரெட்டில் (thread) முன்கூட்டியே கணக்கிட பரிந்துரைக்கிறோம் என்பதை நினைவில் கொள்ளவும்.

மேலும் படிக்க

உங்களுக்கு உதவிய சமூக வளம் பற்றி தெரியுமா? இந்தப் பக்கத்தைத் திருத்தி அதைச் சேர்க்கவும்!

பின்னிணைப்பு

மேலே உள்ள பைதான் விவரக்குறிப்பைக் குறியீடாக இயக்க நீங்கள் ஆர்வமாக இருந்தால், பின்வரும் குறியீடு முன்னொட்டாகச் சேர்க்கப்பட வேண்டும்.

தரவு அளவுகள்

பின்வரும் லுக்அப் அட்டவணைகள் (lookup tables) தரவு அளவுகள் மற்றும் கேச் அளவுகளின் தோராயமாக 2048 அட்டவணைப்படுத்தப்பட்ட எபோக்களை வழங்குகின்றன.

இந்தக் கட்டுரை பயனுள்ளதாக இருந்ததா?