Ruka hadi kwenye maudhui makuu
Change page

Ethash

Ethash ilikuwa algoriti ya uchimbaji ya Uthibitisho wa Kazi (PoW) wa Ethereum. Uthibitisho wa Kazi sasa umezimwa kabisa na Ethereum sasa inalindwa kwa kutumia Uthibitisho wa Dau (PoS) badala yake. Soma zaidi kuhusu Unganisho, Uthibitisho wa Dau (PoS) na uwekaji dhamana. Ukurasa huu ni kwa ajili ya maslahi ya kihistoria!

Ethash ni toleo lililobadilishwa la algoriti ya Dagger-Hashimoto. Uthibitisho wa Kazi (PoW) wa Ethash ni mgumu kwa kumbukumbu (opens in a new tab), jambo ambalo lilifikiriwa kuifanya algoriti hiyo kustahimili ASIC. ASIC za Ethash hatimaye zilitengenezwa lakini uchimbaji wa GPU bado ulikuwa chaguo linalofaa hadi Uthibitisho wa Kazi ulipozimwa. Ethash bado inatumika kuchimba sarafu nyingine kwenye mitandao mingine ya Uthibitisho wa Kazi isiyo ya Ethereum.

Je, Ethash inafanyaje kazi?

Ugumu wa kumbukumbu unafikiwa kwa algoriti ya Uthibitisho wa Kazi (PoW) inayohitaji kuchagua vijisehemu vya rasilimali isiyobadilika inayotegemea nonsi na kichwa cha kizuizi. Rasilimali hii (yenye ukubwa wa gigabaiti chache) inaitwa DAG. DAG inabadilishwa kila vitalu 30000, dirisha la saa ~125 linaloitwa kipindi (takriban siku 5.2) na inachukua muda kuzalisha. Kwa kuwa DAG inategemea tu urefu wa kitalu, inaweza kuzalishwa mapema, lakini ikiwa haijazalishwa mteja anahitaji kusubiri hadi mwisho wa mchakato huu ili kuzalisha kitalu. Ikiwa wateja hawatazalisha mapema na kuhifadhi DAG kwenye kache kabla ya wakati mtandao unaweza kupata ucheleweshaji mkubwa wa kitalu kwenye kila mabadiliko ya kipindi. Kumbuka kwamba DAG haihitaji kuzalishwa kwa ajili ya kuthibitisha Uthibitisho wa Kazi kimsingi ikiruhusu uthibitishaji kwa CPU ya chini na kumbukumbu ndogo.

Njia ya jumla ambayo algoriti inachukua ni kama ifuatavyo:

  1. Kuna mbegu ambayo inaweza kukokotolewa kwa kila kitalu kwa kukagua vichwa vya kizuizi hadi wakati huo.
  2. Kutoka kwa mbegu, mtu anaweza kukokotoa kache ya nasibu bandia ya MB 16. Wateja wepesi huhifadhi kache.
  3. Kutoka kwa kache, tunaweza kuzalisha seti ya data ya GB 1, yenye sifa kwamba kila kipengee katika seti ya data kinategemea idadi ndogo tu ya vipengee kutoka kwenye kache. Wateja kamili na wachimbaji huhifadhi seti ya data. Seti ya data inakua kwa mstari kulingana na wakati.
  4. Uchimbaji unahusisha kuchukua vipande vya nasibu vya seti ya data na kuviheshi pamoja. Uthibitishaji unaweza kufanywa kwa kumbukumbu ndogo kwa kutumia kache kuzalisha upya vipande maalum vya seti ya data unavyohitaji, kwa hivyo unahitaji tu kuhifadhi kache.

Seti kubwa ya data inasasishwa mara moja kila vitalu 30000, kwa hivyo juhudi kubwa ya mchimbaji itakuwa kusoma seti ya data, sio kuifanyia mabadiliko.

Ufafanuzi

Tunatumia ufafanuzi ufuatao:

Matumizi ya 'SHA3'

Uendelezaji wa Ethereum uliambatana na uendelezaji wa kiwango cha SHA3, na mchakato wa viwango ulifanya mabadiliko ya kuchelewa katika ujazo wa algoriti ya heshi iliyokamilishwa, ili heshi za "sha3_256" na "sha3_512" za Ethereum zisiwe heshi za kawaida za sha3, bali ni tofauti inayojulikana mara nyingi kama "Keccak-256" na "Keccak-512" katika miktadha mingine. Tazama majadiliano, k.m., hapa (opens in a new tab), hapa (opens in a new tab), au hapa (opens in a new tab).

Tafadhali kumbuka hilo kwani heshi za "sha3" zinarejelewa katika maelezo ya algoriti hapa chini.

Vigezo

Vigezo vya kache na seti ya data ya Ethash vinategemea nambari ya kitalu. Ukubwa wa kache na ukubwa wa seti ya data vyote vinakua kwa mstari; hata hivyo, kila mara tunachukua nambari tasa ya juu zaidi chini ya kizingiti kinachokua kwa mstari ili kupunguza hatari ya ukawaida wa bahati mbaya unaosababisha tabia ya mzunguko.

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

Uzalishaji wa kache

Sasa, tunabainisha chaguo la kukokotoa kwa ajili ya kuzalisha kache:

Mchakato wa uzalishaji wa kache unahusisha kwanza kujaza kwa mfuatano MB 32 za kumbukumbu, kisha kufanya mapitio mawili ya algoriti ya RandMemoHash ya Sergio Demian Lerner kutoka Strict Memory Hard Hashing Functions (2014) (opens in a new tab). Toleo ni seti ya thamani 524288 za baiti 64.

Chaguo la kukokotoa la ujumuishaji wa data

Tunatumia algoriti iliyohamasishwa na heshi ya FNV (opens in a new tab) katika baadhi ya matukio kama mbadala usio wa kushirikiana wa XOR. Kumbuka kwamba tunazidisha nambari tasa na ingizo kamili la biti 32, tofauti na vipimo vya FNV-1 ambavyo vinazidisha 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 waraka wa manjano unabainisha fnv kama v1*(FNV_PRIME ^ v2), utekelezaji wote wa sasa unatumia ufafanuzi ulio hapo juu mara kwa mara.

Ukokotoaji kamili wa seti ya data

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

Kimsingi, tunachanganya data kutoka kwa nodi 256 za kache zilizochaguliwa kwa nasibu bandia, na kuheshi hiyo ili kukokotoa nodi ya seti ya data. Seti nzima ya data kisha inazalishwa 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 tunajumuisha data kutoka kwa seti kamili ya data ili kuzalisha thamani yetu ya mwisho kwa kichwa maalum na nonsi. Katika msimbo ulio hapa chini, header inawakilisha heshi ya SHA3-256 ya uwakilishi wa RLP wa kichwa cha kizuizi kilichokatwa, yaani, cha kichwa kisichojumuisha sehemu za mixHash na nonce. nonce ni baiti nane za nambari kamili isiyo na saini ya biti 64 katika mpangilio wa kianzia-kikubwa. Kwa hivyo nonce[::-1] ni uwakilishi wa kianzia-kidogo wa baiti nane wa thamani hiyo:

Kimsingi, tunadumisha "mchanganyiko" wenye upana wa baiti 128, na kuchukua mara kwa mara kwa mfuatano baiti 128 kutoka kwa seti kamili ya data na kutumia chaguo la kukokotoa la fnv kuichanganya na mchanganyiko. Baiti 128 za ufikiaji wa mfuatano zinatumika ili kila raundi ya algoriti kila mara ichukue ukurasa kamili kutoka kwa RAM, ikipunguza ukosefu wa bafa ya kutazama kando ya tafsiri ambayo kinadharia ASIC zingeweza kuepuka.

Ikiwa toleo la algoriti hii liko chini ya lengo linalohitajika, basi nonsi ni halali. Kumbuka kwamba utumiaji wa ziada wa sha3_256 mwishoni unahakikisha kwamba kuna nonsi ya kati ambayo inaweza kutolewa ili kuthibitisha kwamba angalau kiasi kidogo cha kazi kilifanywa; uthibitishaji huu wa haraka wa nje wa Uthibitisho wa Kazi (PoW) unaweza kutumika kwa madhumuni ya kuzuia DDoS. Pia inatumika kutoa uhakikisho wa kitakwimu kwamba matokeo ni nambari isiyo na upendeleo, ya biti 256.

Uchimbaji

Algoriti ya uchimbaji inafafanuliwa kama ifuatavyo:

def mine(full_size, dataset, header, difficulty):
    # Jaza sufuri kwenye lengo ili kulinganisha na heshi 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 heshi ya mbegu

Ili kukokotoa heshi ya mbegu ambayo ingetumika kuchimba juu ya kitalu fulani, tunatumia algoriti 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 mzuri, tunapendekeza kukokotoa mapema heshi za mbegu na seti za data za siku zijazo katika uzi tofauti.

Usomaji zaidi

Je, unajua rasilimali ya jamii iliyokusaidia? Hariri ukurasa huu na uiongeze!

Kiambatisho

Msimbo ufuatao unapaswa kuongezwa mwanzoni ikiwa una nia ya kuendesha vipimo vya Python vilivyo hapo juu kama msimbo.

Ukubwa wa Data

Majedwali yafuatayo ya kutafuta yanatoa takriban vipindi 2048 vilivyoorodheshwa vya ukubwa wa data na ukubwa wa kache.