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

எத்ஹாஷ்

எத்ஹாஷ் என்பது எத்திரியத்தின் பணிச் சான்று (PoW) சுரங்கப்பணி அல்காரிதமாக இருந்தது. பணிச் சான்று இப்போது முற்றிலும் நிறுத்தப்பட்டுள்ளது, மேலும் எத்திரியம் இப்போது அதற்குப் பதிலாக உரிமைச் சான்று (PoS) மூலம் பாதுகாக்கப்படுகிறது. ஒருங்கிணைப்பு, உரிமைச் சான்று மற்றும் பங்குவைத்தல் பற்றி மேலும் படிக்கவும். இந்தப் பக்கம் வரலாற்று ஆர்வத்திற்காக மட்டுமே!

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

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

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

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

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

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

வரையறைகள்

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

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

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

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

அளவுருக்கள்

எத்ஹாஷின் தற்காலிக சேமிப்பு மற்றும் தரவுத்தொகுப்பிற்கான அளவுருக்கள் தொகுதி எண்ணைப் பொறுத்தது. தற்காலிக சேமிப்பு அளவு மற்றும் தரவுத்தொகுப்பு அளவு இரண்டும் நேரியல் முறையில் வளர்கின்றன; இருப்பினும், சுழற்சி நடத்தைக்கு வழிவகுக்கும் தற்செயலான ஒழுங்குமுறைகளின் அபாயத்தைக் குறைப்பதற்காக, நேரியல் முறையில் வளரும் வரம்பிற்குக் கீழே உள்ள மிக உயர்ந்த பகா எண்ணை (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

தயவுசெய்து கவனிக்கவும், மஞ்சள் அறிக்கை கூட 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)]

முதன்மை லூப்

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

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

இந்த அல்காரிதத்தின் வெளியீடு விரும்பிய இலக்கிற்குக் கீழே இருந்தால், நான்ஸ் செல்லுபடியாகும். முடிவில் sha3_256 இன் கூடுதல் பயன்பாடு, குறைந்தபட்சம் ஒரு சிறிய அளவிலான வேலை செய்யப்பட்டுள்ளது என்பதை நிரூபிக்க வழங்கக்கூடிய ஒரு இடைநிலை நான்ஸ் இருப்பதை உறுதி செய்கிறது என்பதை நினைவில் கொள்ளவும்; இந்த விரைவான வெளிப்புற PoW சரிபார்ப்பை 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) முன்கூட்டியே கணக்கிடப் பரிந்துரைக்கிறோம் என்பதை நினைவில் கொள்ளவும்.

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

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

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

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

தரவு அளவுகள்

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