مرکزی مواد پر جائیں
Change page

ایتھ ہیش

ایتھ ہیش ایتھیریم کا ثبوتِ کار (PoW) کان کنی کا الگورتھم تھا۔ ثبوتِ کار (PoW) کو اب مکمل طور پر بند کر دیا گیا ہے اور ایتھیریم اب اس کے بجائے حصہ داری کا ثبوت (PoS) کا استعمال کرتے ہوئے محفوظ ہے۔ دی مرج، حصہ داری کا ثبوت (PoS) اور اسٹیکنگ کے بارے میں مزید پڑھیں۔ یہ صفحہ تاریخی دلچسپی کے لیے ہے!

ایتھ ہیش Dagger-Hashimoto الگورتھم کا ایک ترمیم شدہ ورژن ہے۔ ایتھ ہیش ثبوتِ کار (PoW) میموری ہارڈ (opens in a new tab) ہے، جس کے بارے میں خیال کیا جاتا تھا کہ یہ الگورتھم کو ASIC کے خلاف مزاحم بناتا ہے۔ بالآخر ایتھ ہیش ASIC تیار کر لیے گئے لیکن ثبوتِ کار (PoW) کے بند ہونے تک GPU کان کنی اب بھی ایک قابل عمل آپشن تھا۔ ایتھ ہیش اب بھی دیگر غیر ایتھیریم ثبوتِ کار (PoW) نیٹ ورکس پر دیگر کوائنز کی کان کنی کے لیے استعمال ہوتا ہے۔

ایتھ ہیش کیسے کام کرتا ہے؟

میموری ہارڈنیس ایک ثبوتِ کار (PoW) الگورتھم کے ساتھ حاصل کی جاتی ہے جس کے لیے نانس اور بلاک ہیڈر پر منحصر ایک مقررہ وسیلے کے ذیلی سیٹس (subsets) کا انتخاب درکار ہوتا ہے۔ اس وسیلے (جس کا سائز چند گیگا بائٹس ہوتا ہے) کو DAG کہا جاتا ہے۔ DAG کو ہر 30,000 بلاکس کے بعد تبدیل کیا جاتا ہے، جو کہ تقریباً 125 گھنٹے کا دورانیہ ہے جسے ایک دور (epoch) کہا جاتا ہے (تقریباً 5.2 دن) اور اسے بننے میں کچھ وقت لگتا ہے۔ چونکہ DAG کا انحصار صرف بلاک کی اونچائی پر ہوتا ہے، اس لیے اسے پہلے سے تیار کیا جا سکتا ہے، لیکن اگر ایسا نہیں ہے تو کلائنٹ کو بلاک تیار کرنے کے لیے اس عمل کے اختتام تک انتظار کرنا پڑتا ہے۔ اگر کلائنٹس وقت سے پہلے DAGs کو تیار اور کیش (cache) نہیں کرتے ہیں تو نیٹ ورک کو ہر دور کی منتقلی پر بلاک میں بڑے پیمانے پر تاخیر کا سامنا کرنا پڑ سکتا ہے۔ نوٹ کریں کہ ثبوتِ کار (PoW) کی تصدیق کے لیے DAG تیار کرنے کی ضرورت نہیں ہے، جو بنیادی طور پر کم CPU اور چھوٹی میموری دونوں کے ساتھ تصدیق کی اجازت دیتا ہے۔

الگورتھم کا عمومی طریقہ کار درج ذیل ہے:

  1. ایک سیڈ (seed) موجود ہوتا ہے جس کا حساب ہر بلاک کے لیے اس مقام تک بلاک ہیڈرز کو اسکین کر کے لگایا جا سکتا ہے۔
  2. سیڈ سے، کوئی بھی 16 MB کا سیڈورینڈم کیش (pseudorandom cache) شمار کر سکتا ہے۔ لائٹ کلائنٹس کیش کو اسٹور کرتے ہیں۔
  3. کیش سے، ہم ایک 1 GB کا ڈیٹاسیٹ تیار کر سکتے ہیں، اس خصوصیت کے ساتھ کہ ڈیٹاسیٹ میں موجود ہر آئٹم کا انحصار کیش کے صرف چند آئٹمز پر ہوتا ہے۔ فل کلائنٹس اور کان کن ڈیٹاسیٹ کو اسٹور کرتے ہیں۔ ڈیٹاسیٹ وقت کے ساتھ لکیری (linearly) طور پر بڑھتا ہے۔
  4. کان کنی میں ڈیٹاسیٹ کے بے ترتیب حصوں کو پکڑنا اور انہیں ایک ساتھ ہیشنگ کرنا شامل ہے۔ تصدیق کم میموری کے ساتھ کیش کا استعمال کرتے ہوئے ڈیٹاسیٹ کے ان مخصوص حصوں کو دوبارہ تیار کر کے کی جا سکتی ہے جن کی آپ کو ضرورت ہے، لہذا آپ کو صرف کیش کو اسٹور کرنے کی ضرورت ہے۔

بڑے ڈیٹاسیٹ کو ہر 30,000 بلاکس میں ایک بار اپ ڈیٹ کیا جاتا ہے، لہذا کان کن کی زیادہ تر کوشش ڈیٹاسیٹ کو پڑھنے میں صرف ہوگی، نہ کہ اس میں تبدیلیاں کرنے میں۔

تعریفیں

ہم درج ذیل تعریفیں استعمال کرتے ہیں:

'SHA3' کا استعمال

ایتھیریم کی ترقی SHA3 معیار کی ترقی کے ساتھ ہی ہوئی، اور معیارات کے عمل نے حتمی ہیش الگورتھم کی پیڈنگ میں تاخیر سے تبدیلی کی، تاکہ ایتھیریم کے "sha3_256" اور "sha3_512" ہیشز معیاری sha3 ہیشز نہیں ہیں، بلکہ ایک قسم ہے جسے اکثر دیگر سیاق و سباق میں "کیچاک-۲۵۶" اور "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 الگورتھم کے دو پاسز انجام دینا شامل ہے۔ آؤٹ پٹ 524288 64-byte اقدار کا ایک سیٹ ہے۔

ڈیٹا ایگریگیشن فنکشن

ہم کچھ معاملات میں XOR کے غیر متعلقہ متبادل کے طور پر FNV ہیش (opens in a new tab) سے متاثر ایک الگورتھم استعمال کرتے ہیں۔ نوٹ کریں کہ ہم پرائم کو مکمل 32-bit ان پٹ کے ساتھ ضرب دیتے ہیں، اس کے برعکس FNV-1 اسپیک جو پرائم کو باری باری ایک بائٹ (octet) کے ساتھ ضرب دیتا ہے۔

FNV_PRIME = 0x01000193

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

براہ کرم نوٹ کریں، یہاں تک کہ یلو پیپر fnv کو v1*(FNV_PRIME ^ v2) کے طور پر متعین کرتا ہے، تمام موجودہ نفاذات مستقل طور پر مندرجہ بالا تعریف کا استعمال کرتے ہیں۔

مکمل ڈیٹاسیٹ کا حساب

مکمل 1 GB ڈیٹاسیٹ میں ہر 64-byte آئٹم کا حساب اس طرح لگایا جاتا ہے:

بنیادی طور پر، ہم 256 سیڈورینڈم طور پر منتخب کردہ کیش نوڈز سے ڈیٹا کو یکجا کرتے ہیں، اور ڈیٹاسیٹ نوڈ کا حساب لگانے کے لیے اسے ہیش کرتے ہیں۔ پھر پورا ڈیٹاسیٹ اس کے ذریعے تیار کیا جاتا ہے:

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

مین لوپ

اب، ہم مرکزی "hashimoto" جیسے لوپ کی وضاحت کرتے ہیں، جہاں ہم ایک مخصوص ہیڈر اور نانس کے لیے اپنی حتمی قدر تیار کرنے کے لیے مکمل ڈیٹاسیٹ سے ڈیٹا اکٹھا کرتے ہیں۔ ذیل کے کوڈ میں، header ایک مختصر بلاک ہیڈر کی RLP نمائندگی کے SHA3-256 ہیش کی نمائندگی کرتا ہے، یعنی ایک ہیڈر جس میں mixHash اور nonce فیلڈز شامل نہیں ہیں۔ nonce بگ اینڈِین ترتیب میں 64 bit غیر دستخط شدہ انٹیجر کے آٹھ بائٹس ہیں۔ لہذا nonce[::-1] اس قدر کی آٹھ بائٹ لٹل اینڈِین نمائندگی ہے:

بنیادی طور پر، ہم 128 bytes چوڑا ایک "مکس" برقرار رکھتے ہیں، اور بار بار ترتیب وار مکمل ڈیٹاسیٹ سے 128 bytes حاصل کرتے ہیں اور اسے مکس کے ساتھ جوڑنے کے لیے fnv فنکشن کا استعمال کرتے ہیں۔ ترتیب وار رسائی کے 128 bytes استعمال کیے جاتے ہیں تاکہ الگورتھم کا ہر راؤنڈ ہمیشہ RAM سے ایک مکمل صفحہ حاصل کرے، جس سے ٹرانسلیشن لک اسائیڈ بفر (translation lookaside buffer) کی کمی کو کم کیا جا سکے جس سے نظریاتی طور پر ASIC بچنے کے قابل ہوں گے۔

اگر اس الگورتھم کا آؤٹ پٹ مطلوبہ ہدف سے کم ہے، تو نانس درست ہے۔ نوٹ کریں کہ آخر میں sha3_256 کا اضافی اطلاق اس بات کو یقینی بناتا ہے کہ ایک درمیانی نانس موجود ہے جو یہ ثابت کرنے کے لیے فراہم کیا جا سکتا ہے کہ کم از کم تھوڑا سا کام کیا گیا تھا؛ یہ فوری بیرونی ثبوتِ کار (PoW) کی تصدیق اینٹی-DDoS مقاصد کے لیے استعمال کی جا سکتی ہے۔ یہ شماریاتی یقین دہانی فراہم کرنے کا بھی کام کرتا ہے کہ نتیجہ ایک غیر جانبدار، 256-bit نمبر ہے۔

کان کنی

کان کنی کے الگورتھم کی تعریف اس طرح کی گئی ہے:

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

نوٹ کریں کہ ہموار کان کنی اور تصدیق کے لیے، ہم تجویز کرتے ہیں کہ مستقبل کے سیڈ ہیشز اور ڈیٹاسیٹس کو ایک الگ تھریڈ میں پہلے سے شمار کیا جائے۔

مزید مطالعہ

کسی ایسے کمیونٹی وسیلے کے بارے میں جانتے ہیں جس نے آپ کی مدد کی ہو؟ اس صفحے میں ترمیم کریں اور اسے شامل کریں!

ضمیمہ

اگر آپ مندرجہ بالا Python اسپیک کو کوڈ کے طور پر چلانے میں دلچسپی رکھتے ہیں تو درج ذیل کوڈ کو پہلے شامل کیا جانا چاہیے۔

ڈیٹا کے سائز

درج ذیل لک اپ ٹیبلز ڈیٹا سائز اور کیش سائز کے تقریباً 2048 ٹیبولیٹڈ ادوار (epochs) فراہم کرتے ہیں۔