Dummies کے لئے Hyperledger فیبرک

انٹرپرائز کے لیے ایک بلاکچین پلیٹ فارم

Dummies کے لئے Hyperledger فیبرک

صبح بخیر، پیارے قارئین، میرا نام نکولے نیفیڈوف ہے، میں IBM میں تکنیکی ماہر ہوں، اس مضمون میں میں آپ کو بلاکچین پلیٹ فارم - Hyperledger Fabric سے متعارف کرانا چاہوں گا۔ پلیٹ فارم کو انٹرپرائز کلاس بزنس ایپلی کیشنز بنانے کے لیے ڈیزائن کیا گیا ہے۔ مضمون کی سطح آئی ٹی ٹیکنالوجیز کی بنیادی معلومات کے حامل غیر تیار قارئین کے لیے ہے۔

Hyperledger Fabric ایک اوپن سورس پروجیکٹ ہے، اوپن سورس Hyperledger پروجیکٹ کی شاخوں میں سے ایک، لینکس فاؤنڈیشن کا کنسورشیم۔ Hyperledger Fabric اصل میں ڈیجیٹل اثاثوں اور IBM نے شروع کیا تھا۔ Hyperledger Fabric پلیٹ فارم کی اہم خصوصیت انٹرپرائز کے استعمال پر اس کی توجہ ہے۔ لہذا، پلیٹ فارم کو لین دین کی تیز رفتاری اور ان کی کم قیمت کے ساتھ ساتھ تمام شرکاء کی شناخت کو مدنظر رکھتے ہوئے تیار کیا گیا تھا۔ یہ فوائد لین دین کی تصدیق کی خدمت کو الگ کرنے اور تقسیم شدہ رجسٹری کے نئے بلاکس کی تشکیل کے ساتھ ساتھ سرٹیفیکیشن سینٹر کے استعمال اور شرکاء کی اجازت کے ذریعے حاصل کیے جاتے ہیں۔

میرا مضمون Hyperledger Fabric کے بارے میں مضامین کی ایک سیریز کا حصہ ہے، جس کے اندر ہم یونیورسٹی میں داخل ہونے والے طلباء کو ریکارڈ کرنے کے لیے سسٹم پروجیکٹ کی وضاحت کرتے ہیں۔

ہائپر لیجر فیبرک کا عمومی فن تعمیر

Hyperledger Fabric ایک تقسیم شدہ بلاکچین نیٹ ورک ہے جو مختلف فنکشنل اجزاء پر مشتمل ہے جو نیٹ ورک نوڈس پر نصب ہیں۔ Hyperledger Fabric اجزاء ڈوکر کنٹینرز ہیں جو DockerHub سے آزادانہ طور پر ڈاؤن لوڈ کیے جا سکتے ہیں۔ ہائپر لیجر فیبرک کوبرنیٹس ماحول میں بھی چلایا جا سکتا ہے۔

سمارٹ کنٹریکٹس لکھنے کے لیے (ہائپر لیجر فیبرک کے تناظر میں چین کوڈ)، ہم نے گولانگ استعمال کیا (حالانکہ ہائپرلیجر فیبرک دوسری زبانوں کے استعمال کی اجازت دیتا ہے)۔ ایک حسب ضرورت ایپلی کیشن تیار کرنے کے لیے، ہمارے معاملے میں، ہم نے متعلقہ Hyperledger Fabric SDK کے ساتھ Node.js استعمال کیا۔

نوڈس بزنس لاجک (سمارٹ کنٹریکٹ) پر عمل کرتے ہیں - چین کوڈ، تقسیم شدہ رجسٹری (لیجر ڈیٹا) کی حالت کو اسٹور کرتے ہیں اور پلیٹ فارم کی دیگر سسٹم سروسز کو انجام دیتے ہیں۔ نوڈ صرف ایک منطقی اکائی ہے؛ ایک ہی فزیکل سرور پر مختلف نوڈس موجود ہو سکتے ہیں۔ بہت زیادہ اہم یہ ہے کہ نوڈس کو کس طرح گروپ کیا جاتا ہے (ٹرسٹڈ ڈومین) اور وہ بلاکچین نیٹ ورک کے کن کاموں سے وابستہ ہیں۔

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

Dummies کے لئے Hyperledger فیبرک

تصویر 1. ہائپر لیجر فیبرک کا جنرل آرکیٹیکچر

یوزر ایپلیکیشن (سبمٹنگ کلائنٹ) ایک ایسی ایپلی کیشن ہے جس کے ساتھ صارفین بلاکچین نیٹ ورک کے ساتھ کام کرتے ہیں۔ کام کرنے کے لیے، آپ کو نیٹ ورک پر مختلف قسم کی کارروائیوں کے لیے مجاز ہونا چاہیے اور آپ کے پاس مناسب حقوق ہونا چاہیے۔

ساتھی کئی کرداروں میں آتے ہیں:

  • Endorsing Peer ایک نوڈ ہے جو کسی لین دین کے عمل کو نقل کرتا ہے (سمارٹ کنٹریکٹ کوڈ پر عمل درآمد کرتا ہے)۔ سمارٹ کنٹریکٹ کی تصدیق اور اس پر عمل درآمد کے بعد، نوڈ اپنے دستخط کے ساتھ کلائنٹ کی درخواست کو عملدرآمد کے نتائج واپس کرتا ہے۔
  • آرڈرنگ سروس کئی نوڈس پر تقسیم شدہ سروس ہے، جو تقسیم شدہ رجسٹری کے نئے بلاکس بنانے اور لین دین کے عمل کے لیے ایک قطار بنانے کے لیے استعمال ہوتی ہے۔ آرڈرنگ سروس رجسٹری میں نئے بلاکس کا اضافہ نہیں کرتی ہے (کارکردگی کو بہتر بنانے کے لیے اس فیچر کو کمیٹنگ پیئرز میں منتقل کر دیا گیا ہے)۔
  • Committing Peer ایک نوڈ ہے جو تقسیم شدہ رجسٹری پر مشتمل ہوتا ہے اور رجسٹری میں نئے بلاکس کا اضافہ کرتا ہے (جو آرڈرنگ سروس کے ذریعے تیار کیے گئے تھے)۔ تمام عہد ساز ساتھی تقسیم شدہ لیجر کی مقامی کاپی پر مشتمل ہوتے ہیں۔ کمٹٹنگ پیئر مقامی طور پر نیا بلاک شامل کرنے سے پہلے بلاک کے اندر تمام لین دین کی درستگی کی جانچ کرتا ہے۔

توثیق کی پالیسی کسی لین دین کی درستگی کو جانچنے کی پالیسی ہے۔ یہ پالیسیاں نوڈس کے مطلوبہ سیٹ کی وضاحت کرتی ہیں جن پر لین دین کو درست تسلیم کرنے کے لیے سمارٹ کنٹریکٹ کو عمل میں لایا جانا چاہیے۔

تقسیم شدہ رجسٹری - Lerger - دو حصوں پر مشتمل ہے: WolrldState (جسے اسٹیٹ ڈیٹا بیس بھی کہا جاتا ہے) اور BlockChain۔

BlockChain بلاکس کا ایک سلسلہ ہے جو تقسیم شدہ رجسٹری اشیاء میں ہونے والی تمام تبدیلیوں کا ریکارڈ محفوظ کرتا ہے۔

WolrldState ایک تقسیم شدہ لیجر جزو ہے جو تمام تقسیم شدہ لیجر اشیاء کی موجودہ (کٹنگ ایج) اقدار کو محفوظ کرتا ہے۔

ورلڈ اسٹیٹ ایک ڈیٹا بیس ہے، بنیادی ورژن میں - LevelDB یا اس سے زیادہ پیچیدہ - CouchDB، جس میں کلیدی قدر کے جوڑے ہوتے ہیں، مثال کے طور پر: پہلا نام - Ivan، آخری نام - Ivanov، سسٹم میں رجسٹریشن کی تاریخ - 12.12.21/17.12.1961/XNUMX ، تاریخ پیدائش - XNUMX/XNUMX/XNUMX، وغیرہ۔ WorldState اور تقسیم شدہ رجسٹری کسی چینل میں تمام شرکاء کے درمیان مطابقت پذیر ہونی چاہیے۔

چونکہ Hyperledger Fabric ایک ایسا نیٹ ورک ہے جس میں تمام شرکاء کو جانا جاتا ہے اور اس کی تصدیق کی جاتی ہے، اس لیے یہ ایک سرٹیفیکیشن اتھارٹی - CA (سرٹیفیکیشن اتھارٹی) کا استعمال کرتا ہے۔ CA X.509 معیاری اور عوامی کلیدی بنیادی ڈھانچے - PKI کی بنیاد پر کام کرتا ہے۔

ممبرشپ سروس ایک ایسی سروس ہے جس کے ذریعے ممبران تصدیق کرتے ہیں کہ کوئی چیز کسی خاص تنظیم یا چینل سے تعلق رکھتی ہے۔

ایک لین دین - زیادہ تر معاملات میں، تقسیم شدہ رجسٹری میں نیا ڈیٹا لکھ رہا ہے۔
چینلز یا سمارٹ معاہدوں کی تخلیق کے لیے بھی لین دین ہوتے ہیں۔ لین دین صارف کی درخواست سے شروع ہوتا ہے اور تقسیم شدہ لیجر میں ریکارڈ کے ساتھ ختم ہوتا ہے۔

چینل ایک بند سب نیٹ ورک ہے جو دو یا دو سے زیادہ بلاکچین نیٹ ورک کے شرکاء پر مشتمل ہوتا ہے، جسے شرکاء کے محدود لیکن معلوم دائرے میں خفیہ لین دین کرنے کے لیے ڈیزائن کیا گیا ہے۔ چینل کا تعین شرکاء، اس کی تقسیم شدہ رجسٹری، سمارٹ کنٹریکٹس، آرڈرنگ سروس، ورلڈ اسٹیٹ کے ذریعے کیا جاتا ہے۔ ہر چینل کے شرکت کنندہ کو چینل تک رسائی حاصل کرنے اور مختلف قسم کے لین دین کرنے کا حق حاصل ہونا چاہیے۔ ممبرشپ سروس کا استعمال کرتے ہوئے اجازت دی جاتی ہے۔

عام لین دین پر عمل درآمد کا منظر

اگلا، میں اپنے پروجیکٹ کو بطور مثال استعمال کرتے ہوئے ایک عام لین دین کے عمل کے منظر نامے کے بارے میں بات کرنا چاہوں گا۔

اپنے اندرونی منصوبے کے حصے کے طور پر، ہم نے Hyperledger Fabric نیٹ ورک بنایا، جو یونیورسٹیوں میں داخل ہونے والے طلباء کے رجسٹریشن اور اکاؤنٹ کے لیے ڈیزائن کیا گیا ہے۔ ہمارا نیٹ ورک یونیورسٹی A اور یونیورسٹی B سے تعلق رکھنے والی دو تنظیموں پر مشتمل ہے۔ ہر تنظیم ایک کلائنٹ ایپلی کیشن کے ساتھ ساتھ اس کے اپنے کمٹمنٹ اور انڈورسنگ پیر پر مشتمل ہے۔ ہم عام خدمات آرڈرنگ سروس، ممبرشپ سروس اور سرٹیفیکیشن اتھارٹی کا بھی استعمال کرتے ہیں۔

1) لین دین کا آغاز

ایک صارف کی درخواست، Hyperledger Fabric SDK کا استعمال کرتے ہوئے، لین دین کی درخواست شروع کرتی ہے اور سمارٹ معاہدوں کے ساتھ نوڈس کو درخواست بھیجتی ہے۔ درخواست تقسیم شدہ رجسٹری (لیجر) سے تبدیل یا پڑھنے کی ہو سکتی ہے۔ اگر ہم یونیورسٹی کے طلباء کے اکاؤنٹنگ کے لیے اپنے ٹیسٹ سسٹم کی ترتیب کی ایک مثال پر غور کریں، تو کلائنٹ کی درخواست یونیورسٹیوں A اور B کے نوڈس کو ٹرانزیکشن کی درخواست بھیجتی ہے، جو کہ سمارٹ کنٹریکٹ کی توثیق کی پالیسی میں شامل ہیں۔ نوڈ اے ایک نوڈ ہے جو یونیورسٹی میں واقع ہے جو آنے والے طالب علم کو رجسٹر کرتا ہے، اور نوڈ بی ایک نوڈ ہے جو دوسری یونیورسٹی میں واقع ہے۔ کسی لین دین کو تقسیم شدہ رجسٹری میں محفوظ کرنے کے لیے، ضروری ہے کہ تمام نوڈس جو کاروباری منطق کے مطابق، لین دین کو منظور کریں، اسی نتیجے کے ساتھ سمارٹ معاہدوں کو کامیابی کے ساتھ انجام دیں۔ نوڈ A یوزر ایپلیکیشن، Hyperledger Fabric SDK ٹولز کا استعمال کرتے ہوئے، توثیق کی پالیسی حاصل کرتی ہے اور سیکھتی ہے کہ کن نوڈس کو لین دین کی درخواست بھیجنی ہے۔ یہ تقسیم شدہ رجسٹری میں مخصوص ڈیٹا کو پڑھنے یا لکھنے کے لیے ایک مخصوص سمارٹ کنٹریکٹ (چین کوڈ فنکشن) کی درخواست کرنے کی درخواست ہے۔ تکنیکی طور پر، کلائنٹ SDK متعلقہ فنکشن کا استعمال کرتا ہے، جس کا API لین دین کے پیرامیٹرز کے ساتھ ایک خاص چیز کو پاس کرتا ہے، اور ایک کلائنٹ کے دستخط بھی شامل کرتا ہے اور اس ڈیٹا کو gRPC پر پروٹوکول بفر کے ذریعے مناسب نوڈس (پیئرز کی توثیق) کو بھیجتا ہے۔

Dummies کے لئے Hyperledger فیبرک
تصویر 2. لین دین شروع کرنا

2) سمارٹ معاہدے پر عمل درآمد

نوڈس (اینڈورسنگ پیئرز) کو ٹرانزیکشن کرنے کی درخواست موصول ہونے کے بعد، کلائنٹ کے دستخط چیک کریں اور اگر سب کچھ ٹھیک ہے تو، وہ درخواست کے ڈیٹا کے ساتھ ایک اعتراض لیتے ہیں اور ایک سمارٹ کنٹریکٹ (چین کوڈ فنکشن) کے نفاذ کا ایک سمولیشن چلاتے ہیں۔ یہ ڈیٹا. ایک سمارٹ کنٹریکٹ کسی لین دین کی کاروباری منطق ہے، شرائط اور ہدایات کا ایک مخصوص سیٹ (ہمارے معاملے میں، یہ ایک طالب علم کی تصدیق ہے، کیا یہ ایک نیا طالب علم ہے، یا وہ پہلے سے رجسٹرڈ ہے، عمر کی تصدیق وغیرہ)۔ سمارٹ کنٹریکٹ پر عمل کرنے کے لیے، آپ کو ورلڈ اسٹیٹ سے ڈیٹا کی بھی ضرورت ہوگی۔ انڈورسنگ پیئر پر سمارٹ کنٹریکٹ کی تقلید کے نتیجے میں، ڈیٹا کے دو سیٹ حاصل کیے جاتے ہیں - سیٹ سیٹ اور رائٹ سیٹ۔ ریڈ سیٹ اور رائٹ سیٹ اصل اور نئی ورلڈ سٹیٹ اقدار ہیں۔ (نیا - سمارٹ معاہدے کی نقل کے دوران حاصل کردہ معنی میں)۔

Dummies کے لئے Hyperledger فیبرک
تصویر 3. ایک سمارٹ معاہدے پر عمل درآمد

3) کلائنٹ کی درخواست پر ڈیٹا واپس کرنا

سمارٹ کنٹریکٹ کی نقل کرنے کے بعد، Endorsing Peers اصل ڈیٹا اور سمولیشن کا نتیجہ، نیز RW سیٹ، اپنے سرٹیفکیٹ کے ذریعے دستخط شدہ کلائنٹ کی درخواست کو واپس کرتے ہیں۔ اس مرحلے پر، تقسیم شدہ رجسٹری میں کوئی تبدیلی نہیں ہوتی ہے۔ کلائنٹ کی ایپلیکیشن Endorsing Peer کے دستخط کی جانچ کرتی ہے، اور لین دین کے اصل ڈیٹا کا بھی موازنہ کرتی ہے جو بھیجا گیا تھا اور جو ڈیٹا واپس کیا گیا تھا (یعنی، یہ چیک کرتا ہے کہ آیا اصل ڈیٹا جس پر لین دین کی نقل کی گئی تھی اسے مسخ کیا گیا ہے)۔ اگر لین دین صرف رجسٹری سے ڈیٹا پڑھنے کے لیے تھا، تو کلائنٹ کی درخواست اس کے مطابق ضروری ریڈ سیٹ حاصل کرتی ہے اور یہ عام طور پر تقسیم شدہ رجسٹری کو تبدیل کیے بغیر لین دین کو کامیابی سے مکمل کرتا ہے۔ کسی لین دین کی صورت میں جس میں رجسٹری میں ڈیٹا کو تبدیل کرنا ضروری ہے، کلائنٹ کی درخواست اضافی طور پر توثیق کی پالیسی کے نفاذ کو بھی چیک کرتی ہے۔ یہ ممکن ہے کہ ایک کلائنٹ کی درخواست توثیق کی پالیسی پر عمل کرنے کے نتیجے کی جانچ نہ کرے، لیکن اس معاملے میں Hyperledger Fabric پلیٹ فارم رجسٹری میں لین دین کو شامل کرنے کے مرحلے پر نوڈس (کمٹیٹنگ پیئرز) پر پالیسیوں کی جانچ پڑتال فراہم کرتا ہے۔

Dummies کے لئے Hyperledger فیبرک
تصویر 4. کلائنٹ کی درخواست پر ڈیٹا واپس کرنا

4) ساتھیوں کو آرڈر کرنے کے لیے RW سیٹ بھیجنا

کلائنٹ ایپلیکیشن لین دین کے ساتھ ساتھ ڈیٹا آرڈرنگ سروس کو بھیجتی ہے۔ اس میں RW سیٹ، ساتھیوں کے دستخطوں کی توثیق، اور چینل ID شامل ہیں۔

آرڈرنگ سروس - نام کی بنیاد پر، اس سروس کا بنیادی کام آنے والے لین دین کو درست ترتیب میں ترتیب دینا ہے۔ اس کے ساتھ ساتھ تقسیم شدہ رجسٹری کے ایک نئے بلاک کی تشکیل اور تمام کمٹینگ نوڈس کو نئے تیار کردہ بلاکس کی ضمانت کی فراہمی، اس طرح تقسیم شدہ رجسٹری (کمیٹنگ پیئرز) پر مشتمل تمام نوڈس پر ڈیٹا کی مستقل مزاجی کو یقینی بناتا ہے۔ ایک ہی وقت میں، آرڈرنگ سروس خود رجسٹری کو کسی بھی طرح سے تبدیل نہیں کرتی ہے۔ آرڈرنگ سروس سسٹم کا ایک اہم جزو ہے، لہذا یہ کئی نوڈس کا ایک کلسٹر ہے۔ آرڈرنگ سروس درستگی کے لیے لین دین کی جانچ نہیں کرتی ہے، یہ صرف ایک مخصوص چینل شناخت کنندہ کے ساتھ لین دین کو قبول کرتی ہے، آنے والے لین دین کو ایک خاص ترتیب میں ترتیب دیتی ہے اور ان سے تقسیم شدہ رجسٹری کے نئے بلاکس بناتی ہے۔ ایک آرڈرنگ سروس بیک وقت کئی چینلز کی خدمت کر سکتی ہے۔ آرڈرنگ سروس میں کافکا کلسٹر شامل ہے، جو درست (غیر متغیر) لین دین کی قطار کو برقرار رکھتا ہے (پوائنٹ 7 دیکھیں)۔

Dummies کے لئے Hyperledger فیبرک
تصویر 5. آرڈر کرنے والے ساتھیوں کو RW سیٹ بھیجنا

5) کمٹٹنگ پیئر کو جنریٹڈ بلاکس بھیجنا

آرڈرنگ سروس میں بنائے گئے بلاکس کو تمام نیٹ ورک نوڈس پر منتقل کیا جاتا ہے (براڈکاسٹ)۔ ہر نوڈ، ایک نیا بلاک حاصل کرنے کے بعد، اس کی تصدیق کی پالیسی کی تعمیل کے لیے اسے چیک کرتا ہے، چیک کرتا ہے کہ سمارٹ کنٹریکٹ سمولیشن کے نتیجے میں تمام توثیق کرنے والے ساتھیوں کو ایک ہی نتیجہ (رائٹ سیٹ) موصول ہوا ہے، اور یہ بھی چیک کرتا ہے کہ آیا اصل اقدار میں لین دین شروع ہونے کے وقت سے تبدیل کر دیا گیا (یعنی ریڈ سیٹ - ورلڈ سٹیٹ کے سمارٹ کنٹریکٹ کے ذریعے پڑھا جانے والا ڈیٹا)۔ اگر تمام شرائط پوری ہو جاتی ہیں تو، لین دین کو درست کے طور پر نشان زد کیا جاتا ہے، بصورت دیگر، لین دین کو غلط حیثیت مل جاتی ہے۔

Dummies کے لئے Hyperledger فیبرک
تصویر 6۔ کمٹٹنگ پیئر کو تیار کردہ بلاکس بھیجنا

6) رجسٹری میں ایک بلاک شامل کرنا

ہر نوڈ تقسیم شدہ رجسٹری کی اپنی مقامی کاپی میں ایک لین دین کا اضافہ کرتا ہے، اور اگر لین دین درست ہے، تو Write Set کو WorldState (موجودہ حالت) پر لاگو کیا جاتا ہے، اور اس کے مطابق، اشیاء کی نئی قدریں جو اس سے متاثر ہوئی تھیں۔ لین دین لکھا جاتا ہے. اگر کسی لین دین کو ایسا ٹوکن موصول ہوا جو درست نہیں ہے (مثال کے طور پر، ایک ہی بلاک کے اندر ایک ہی اشیاء کے ساتھ دو ٹرانزیکشنز ہوئی ہیں، تو ان میں سے ایک ٹرانزیکشن درست نہیں ہوگی، کیونکہ اصل قدریں پہلے ہی کسی دوسرے لین دین کے ذریعے تبدیل ہو چکی ہیں) . یہ لین دین ایک غلط ٹوکن کے ساتھ تقسیم شدہ لیجر میں بھی شامل کیا جاتا ہے، لیکن اس لین دین کا رائٹ سیٹ موجودہ ورلڈ اسٹیٹ پر لاگو نہیں ہوتا ہے اور اس کے مطابق، لین دین میں شریک اشیاء کو تبدیل نہیں کرتا ہے۔ اس کے بعد، صارف کی درخواست کو ایک نوٹیفکیشن بھیجا جاتا ہے کہ لین دین کو تقسیم شدہ رجسٹری میں مستقل طور پر شامل کر دیا گیا ہے، ساتھ ہی لین دین کی حیثیت، یعنی یہ درست ہے یا نہیں...

Dummies کے لئے Hyperledger فیبرک
تصویر 7. رجسٹری میں ایک بلاک شامل کرنا

آرڈرنگ سروس

آرڈرنگ سروس کافکا کلسٹر پر مشتمل ہے جس میں متعلقہ زو کیپر نوڈس اور آرڈرنگ سروس نوڈس (OSN) ہیں، جو کہ آرڈرنگ سروس کلائنٹس اور کافکا کلسٹر کے درمیان کھڑے ہیں۔ کافکا کلسٹر ایک تقسیم شدہ، غلطی کو برداشت کرنے والا بہاؤ (پیغام) مینجمنٹ پلیٹ فارم ہے۔ کافکا میں ہر چینل (موضوع) ریکارڈز کا ایک ناقابل تغیر سلسلہ ہے جو صرف ایک نیا ریکارڈ شامل کرنے کی حمایت کرتا ہے (موجودہ کو حذف کرنا ممکن نہیں ہے)۔ موضوع کی ساخت کی ایک مثال ذیل میں دکھائی گئی ہے۔ یہ کافکا کی یہ خاصیت ہے جو بلاک چین پلیٹ فارم بنانے کے لیے استعمال ہوتی ہے۔

Dummies کے لئے Hyperledger فیبرک
kafka.apache.org سے لیا گیا۔

  • تصویر 8۔ آرڈرنگ سروس کے عنوان کا ڈھانچہ*

مفید لنکس

یوٹیوب - ہائپر لیجر پروجیکٹ کے ساتھ کاروبار کے لیے ایک بلاک چین بنانا
Hyperledger Fabric Docs
ہائپر لیجر فیبرک: اجازت یافتہ بلاک چینز کے لیے ایک تقسیم شدہ آپریٹنگ سسٹم

اعترافات

میں اس مضمون کی تیاری میں مدد کے لیے اپنے ساتھیوں کا تہہ دل سے شکریہ ادا کرنا چاہوں گا:
نکولے مارین
ایگور کھاپوف
دمتری گورباچوف
الیگزینڈر زیمتسوف
ایکٹرینا گوسیوا

ماخذ: www.habr.com

نیا تبصرہ شامل کریں