Ruka hadi kwenye maudhui makuu
Change page

Ethash

Ethash ilikuwa algoriti ya uchimbaji wa uthibitishaji-wa-kazi ya Ethereum. Uthibitishaji-wa-kazi sasa umezimwa kabisa na Ethereum sasa inalindwa kwa kutumia uthibitishaji-wa-dau badala yake. Soma zaidi kuhusu Muungano, uthibitishaji-wa-dau na kusimamisha. Ukurasa huu ni kwa ajili ya maslahi ya kihistoria!

Ethash ni toleo lililobadilishwa la kanuni ya Dagger-Hashimoto. Uthibitishaji-wa-kazi wa Ethash ni ngumu kwa kumbukumbu (opens in a new tab), ambayo ilidhaniwa kufanya kanuni hiyo iwe sugu kwa ASIC. ASIC za Ethash hatimaye zilitengenezwa lakini uchimbaji wa GPU ulikuwa bado chaguo linalowezekana hadi uthibitishaji-wa-kazi ulipozimwa. Ethash bado inatumika kuchimba sarafu nyingine kwenye mitandao mingine isiyo ya Ethereum ya uthibitishaji-wa-kazi.

Je, Ethash hufanya kazi vipi?

Ugumu wa kumbukumbu unafikiwa kwa kanuni ya uthibitisho wa kazi inayohitaji kuchagua vijisehemu vya rasilimali isiyobadilika kutegemeana na nonce na kichwa cha bloku. Rasilimali hii (ukubwa wa gigabaiti chache) inaitwa DAG. DAG hubadilishwa kila baada ya bloku 30,000, dirisha la takriban saa 125 linaloitwa epoch (takriban siku 5.2) na huchukua muda kutengenezwa. Kwa kuwa DAG inategemea tu urefu wa bloku, inaweza kutengenezwa kabla, lakini kama sivyo wateja wanahitaji kusubiri hadi mwisho wa mchakato huu ili kutoa bloku. Ikiwa wateja hawatengenezi kabla na kuhifadhi DAG kabla ya wakati, mtandao unaweza kukumbwa na ucheleweshaji mkubwa wa bloku katika kila mabadiliko ya epoch. Kumbuka kwamba DAG haihitaji kutengenezwa ili kuthibitisha uthibitishaji-wa-kazi, kimsingi kuruhusu uthibitishaji na CPU ya chini na kumbukumbu ndogo.

Njia ya jumla ambayo kanuni huchukua ni kama ifuatavyo:

  1. Kuna mbegu ambayo inaweza kukokotolewa kwa kila bloku kwa kuchanganua vichwa vya bloku hadi kufikia hatua hiyo.
  2. Kutoka kwenye mbegu, mtu anaweza kukokotoa kache bandia ya nasibu ya MB 16. Wateja wepesi huhifadhi kache.
  3. Kutoka kwenye kache, tunaweza kutengeneza seti ya data ya GB 1, yenye sifa kwamba kila kipengee katika seti ya data kinategemea tu idadi ndogo ya vipengee kutoka kwenye kache. Wateja kamili na wachimbaji huhifadhi seti ya data. Seti ya data hukua sawasawa na wakati.
  4. Uchimbaji unahusisha kuchukua vipande vya nasibu vya seti ya data na kuviweka kwenye hashi pamoja. Uthibitishaji unaweza kufanywa na kumbukumbu ndogo kwa kutumia kache kutengeneza upya vipande maalum vya seti ya data unavyohitaji, hivyo unahitaji tu kuhifadhi kache.

Seti kubwa ya data husasishwa mara moja kila bloku 30,000, hivyo juhudi kubwa ya mchimbaji itakuwa kusoma seti ya data, sio kuifanyia mabadiliko.

Ufafanuzi

Tunatumia ufafanuzi ufuatao:

Matumizi ya 'SHA3'

Ukuzaji wa Ethereum ulienda sambamba na ukuzaji wa kiwango cha SHA3, na mchakato wa viwango ulifanya mabadiliko ya kuchelewa katika pedi ya kanuni ya mwisho ya hashi, hivi kwamba hashi za "sha3_256" na "sha3_512" za Ethereum si hashi za kawaida za sha3, bali ni lahaja ambayo mara nyingi hujulikana kama "Keccak-256" na "Keccak-512" katika miktadha mingine. Tazama mjadala, k.m., hapa (opens in a new tab), hapa (opens in a new tab), au hapa (opens in a new tab).

Tafadhali zingatia hilo kwani hashi za "sha3" zinarejelewa katika maelezo ya kanuni hapa chini.

Vigezo

Vigezo vya kache na seti ya data ya Ethash hutegemea nambari ya bloku. Ukubwa wa kache na ukubwa wa seti ya data vyote hukua sawasawa; hata hivyo, daima tunachukua nambari tasa ya juu zaidi chini ya kizingiti kinachokua sawasawa ili kupunguza hatari ya urudiaji wa bahati mbaya unaosababisha tabia ya mzunguko.

Majedwali ya thamani za ukubwa wa seti ya data na kache yametolewa katika kiambatisho.

Utengenezaji wa kache

Sasa, tunabainisha chaguo la kukokotoa la kutengeneza kache:

Mchakato wa utengenezaji wa kache unahusisha kwanza kujaza kumbukumbu ya MB 32 kwa mfuatano, kisha kufanya pasi mbili za kanuni ya RandMemoHash ya Sergio Demian Lerner kutoka Strict Memory Hard Hashing Functions (2014) (opens in a new tab). Tokeo ni seti ya thamani 524,288 za baiti 64.

Chaguo la kukokotoa la mkusanyiko wa data

Tunatumia kanuni iliyochochewa na hashi ya FNV (opens in a new tab) katika baadhi ya matukio kama mbadala usio wa ushirika wa XOR. Kumbuka kwamba tunazidisha nambari tasa na ingizo kamili la biti 32, kinyume na maelezo ya FNV-1 ambayo huzidisha nambari tasa na baiti moja (okteti) kwa zamu.

FNV_PRIME = 0x01000193

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

Tafadhali kumbuka, hata kama karatasi ya njano inabainisha fnv kama v1*(FNV_PRIME ^ v2), utekelezaji wote wa sasa unatumia ufafanuzi ulio hapo juu mara kwa mara.

Ukadiriaji kamili wa seti ya data

Kila kipengee cha baiti 64 katika seti kamili ya data ya GB 1 hukokotolewa kama ifuatavyo:

Kimsingi, tunachanganya data kutoka kwa nodi 256 za kache zilizochaguliwa kinasibu, na kuweka hiyo kwenye hashi ili kukokotoa nodi ya seti ya data. Seti nzima ya data kisha hutengenezwa na:

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

Kitanzi kikuu

Sasa, tunabainisha kitanzi kikuu kinachofanana na "hashimoto", ambapo tunakusanya data kutoka kwa seti kamili ya data ili kutoa thamani yetu ya mwisho kwa kichwa na nonce maalum. Katika msimbo ulio hapa chini, header inawakilisha hashi ya SHA3-256 ya uwakilishi wa RLP ya kichwa cha bloku kilichopunguzwa, yaani, cha kichwa bila kujumuisha sehemu za mixHash na nonce. nonce ni baiti nane za nambari kamili isiyo na alama ya biti 64 katika mpangilio wa big-endian. Kwa hivyo nonce[::-1] ni uwakilishi wa baiti nane wa little-endian wa thamani hiyo:

Kimsingi, tunadumisha "mchanganyiko" wenye upana wa baiti 128, na mara kwa mara tunachukua baiti 128 kwa mfuatano kutoka kwa seti kamili ya data na kutumia chaguo la kukokotoa la fnv kuiunganisha na mchanganyiko. Baiti 128 za ufikiaji wa mfuatano hutumika ili kila mzunguko wa kanuni daima uchukue ukurasa kamili kutoka kwa RAM, kupunguza makosa ya Translation Lookaside Buffer (TLB) ambayo kinadharia ASIC zingeweza kuepuka.

Ikiwa tokeo la kanuni hii liko chini ya lengo linalohitajika, basi nonce ni halali. Kumbuka kwamba matumizi ya ziada ya sha3_256 mwishoni yanahakikisha kwamba kuna nonce ya kati inayoweza kutolewa kuthibitisha kwamba angalau kiasi kidogo cha kazi kimefanyika; uthibitishaji huu wa haraka wa PoW wa nje unaweza kutumika kwa madhumuni ya kuzuia DDoS. Pia hutumika kutoa uhakikisho wa kitakwimu kwamba matokeo ni nambari isiyo na upendeleo, ya biti 256.

Uchimbaji

Kanuni ya uchimbaji inafafanuliwa kama ifuatavyo:

def mine(full_size, dataset, header, difficulty):
    # weka sifuri kwenye lengo ili kulinganisha na hashi kwenye tarakimu sawa
    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

Kufafanua hashi ya mbegu

Ili kukokotoa hashi ya mbegu ambayo itatumika kuchimba juu ya bloku fulani, tunatumia kanuni ifuatayo:

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

Kumbuka kwamba kwa uchimbaji na uthibitishaji rahisi, tunapendekeza kukokotoa kabla hashi za mbegu na seti za data za siku zijazo katika uzi tofauti.

Masomo zaidi

Unajua rasilimali ya jamii iliyokusaidia? Hariri ukurasa huu na uiongeze!_

Kiambatisho

Msimbo ufuatao unapaswa kuongezwa mwanzoni ikiwa ungependa kutekeleza maelezo ya python yaliyo hapo juu kama msimbo.

Ukubwa wa Data

Majedwali yafuatayo ya marejeleo yanatoa takriban epoch 2048 zilizopangwa za ukubwa wa data na ukubwa wa kache.

Ukurasa ulisasishwa mwisho: 15 Aprili 2026

Je, makala haya yalikuwa ya msaada?