سریعترین روش برای یادگیری نحوه کار بلاک چین، ساخت بلاک چین (Blockchain Building) است. اگر شیفته ظهور ارزهای دیجیتال هستید باید نحوه کار بلاک چین که فناوری موجود در ارزهای دیجیتال است را یاد بگیرید.
یادگیری بلاک چین آسان نیست. باید فیلم های آموزشی زیادی مشاهده کنید و از آنجایی که مثالهای کمی در این زمینه وجود دارد، باید بر خستگیهای موجود در آموزش ساخت بلاک چین فائق آیید.
باید یادگیری را با انجام دادن فرا بگیرید. در ساخت بلاک چین با سطوح کدنویسی مواجه میشوید. با خواندن این مقاله، نحوه کار بلاک چین را یاد میگیرید و میتوانید بلاک چینی با عملکرد مناسب ایجاد کنید.
قبل از شروع به یاد داشته باشید که بلاک چین، زنجیره تغییرناپذیر و متوالی از رکوردها و ثبتهایی با نام بلاک است. بلاکها میتوانند شامل تراکنشها، فایلها یا هر گونه اطلاعات مورد نظر شما باشند؛ اما نکته مهم این است که با استفاده از هشها به یکدیگر متصل شدهاند.
اگر نمیدانید هش چیست برای شما توضیح خواهیم داد.
این راهنما مخصوص چه کسانی است؟ باید به خواندن و نوشتن اصول زبان برنامه نویسی Python آشنا باشید. هم چنین باید نحوه کار درخواست های HTTP را بدانید؛ زیرا زیرا با HTTP با بلاک چین صحبت خواهیم کرد.
به چه چیزی نیاز داریم؟ اطمینان حاصل کنید که نسخه بالاتری از پایتون ۳.۶ را نصب کردهاید. هم چنین باید Flask نسخه ۰.۱۲.۲ و کتابخانه درخواستها نسخه ۲.۱۸.۴ را نیز نصب کنید.
به علاوه به یکی از کلاینتهای HTTP نظیر Postman یا cURL نیز نیاز دارید.
مرحله اول: ساخت بلاک چین
ویرایشگر متن مورد نظر خود یا IDE را اجرا کنید. ویرایشگر متن PyCharm گزینه خوبی است. فایل جدیدی به اسم blockchain.py ایجاد کنید.
معرفی بلاک چین
ما بلاک چینی ایجاد خواهیم کرد که سازنده آن، فهرست خالی اولیهای برای ذخیره بلاک چین ایجاد میکند، و بلاک چین دیگری برای ذخیره تراکنشها ایجاد میکنیم. راهنمای کلاس بلاک چین ما بدین گونه است:

کلاس بلاک چین ما مسئول مدیریت زنجیره است و تراکنشها را ذخیره میکند و چند روش کمکی برای افزودن بلاکهای جدید به زنجیره دارد. در ادامه به چند مورد از این روشها میپردازیم.
بلاک به چه شکل است؟
هر بلاک دارای یک شاخص یا ایندکس، ثبت زمانی (بر اساس زمان یونیکس)، فهرستی از تراکنشها، گواه و هش بلاک قبلی است.
در ادامه مثالی از یک بلاک را ذکر میکنیم:

در این مرحله، ایده زنجیره باید مشخص باشد. هر بلاک جدید داخل خود دارای هش بلاک قبلی است. این موضوع بسیار حیاتی است؛ زیرا این نکته باعث تغییرناپذیری بلاک چین میشود. اگر هکر، بلاک قبلی زنجیره را تغییر دهد یا آلوده کند، تمام بلاکهای بعدی نیز دارای هشهای نادرست خواهند شد.
آیا این موضوع را متوجه شدید؟ اگر متوجه نشدید کمی زمان بگذارید تا کامل آن را متوجه شوید؛ زیرا هسته اصلی ایده بلاک چین است.
افزودن تراکنشها به بلاک
ما به روشی برای افزودن تراکنشها به بلاک نیاز داریم. روش مورد نظر ما ()new_transaction است که کاملا سرراست و بدون پیچیدگی است:

پس از آن که ()new_transaction تراکنش جدیدی به فهرست افزود، شاخص بلاکی که تراکنش به آن افزوده خواهد شد را بر میگرداند. این نکته بعدا و هنگامی که کاربر تراکنش را ثبت میکند، مفید خواهد بود.
ایجاد بلاکهای جدید در ساخت بلاک چین
پس از معرفی بلاک چین، باید آن را با بلاک جنسیس یا همان بلاک اولیه شروع کنیم. هم چنین باید گواه به بلاک جنسیس اضافه کنیم که حاصل ماینینگ است. در این خصوص بیشتر خواهیم گفت.
علاوه بر ایجاد بلاک جنسیس، باید روشهایی برای ()new_block و ()new_transaction و ()hash را نیز به آن بیافزاییم:



مطالب فوق، ساده هستند. تقریبا کار معرفی بلاک چین تمام شد. اما در این مرحله شاید از خود بپرسید که نحوه ایجاد، ساخت یا استخراج بلاکهای جدید چگونه است.
درک گواه اثبات کار
الگوریتم گواه اثبات کار، نحوه ایجاد یا استخراج بلاک های جدید بر بستر بلاک چین است. هدف گواه اثبات کار، کشف عددی است که مسئله را حل کند. از نظر محاسباتی پیدا کردن این عدد باید سخت اما تایید آن آسان باشد. این ایده اصلی گواه اثبات کار است.
برای درک بهتر این موضوع به بیان یک مثال میپردازیم.
در نظر بگیرید که عدد یکان هش حاصل ضرب x در y صفر باشد. بنابراین داریم
Hash(x*y)=ac23dc…0
برای این مثال، x را برابر با ۵ در نظر میگیریم و آن را در پایتون اجرا میکنیم:

جواب y نیز ۲۱ میشود؛ زیرا هش تولید شده باید به عدد صفر ختم شود:

در بیت کوین، به الگوریتم گواه اثبات کار هشکش میگویند و فرق آنچنانی با مثال فوق ندارد؛ هشکش الگوریتمی است که ماینرها برای حل آن و به منظور ایجاد بلاک جدید رقابت میکنند.
به طور کل، سختی با تعداد کاراکترها (اعداد، حروف و نشانه ها) جستجو شده در یک رشته از زنجیره تعیین میشود. سپس ماینرها برای جوابی که ارائه میدهند با دریافت کوین، پاداش دریافت میکنند.
شبکه به راحتی میتواند راهکار و جواب آنها را تایید کند.
پیاده سازی گواه اثبات کار مقدماتی
الگوریتم مشابهی را برای بلاک چین خود پیاده سازی میکنیم. قوانین نیز مشابه با مثال فوق خواهد بود:
عدد p را طوری پیدا کنید که هنگامی که با جواب بلاک قبلی هش میشود، ۴ رقم آخر آن صفر باشد.


برای تنظیم سختی الگوریتم، میتوانیم تعداد صفرهای آخر را تغییر دهیم. اما ۴ رقم آخر مناسب است. متوجه خواهید شد که افزودن یک صفر به این ۴ رقم، تفاوت چشمگیری در زمان مورد نیاز برای یافتن جواب ایجاد خواهد کرد.
کلاس بلاک چین ما تقریبا تکمیل شده است و آماده تعامل با آن با استفاده از درخواست های HTTP هستیم.
مرحله دوم: بلاک چین به عنوان API
ما از چارچوب فلسک پایتون استفاده خواهیم کرد. این چارچوب یک میکروفریمورک است و تعیین اندپوینتها برای توابع پایتون را آسان میکند. این امر به ما کمک میکند تا با بلاک چین با استفاده از درخواستهای HTTP صحبت کنیم.
سه روش را ایجاد خواهیم کرد:
transaction/new/: برای ایجاد تراکنش جدید در بلاک
mine/: برای دستور استخراج بلاک جدید به سرور
chain/: برای برگشت بلاک چین کامل
ایجاد و تنظیم فلسک (Flask)
سرور، یک نود در شبکه بلاک چین ایجاد خواهد کرد. در ابتدا چند کد بویلرپلیت ایجاد میکنیم:


توضیح مختصری از چیزهایی که اضافه کردهایم:
خط ۱۵: شروع به کار نود یا گره
خط ۱۸: ایجاد اسم تصادفی برای نود
خط ۲۱: شروع به کار بلاک چین
خط ۲۴ الی ۲۶: ایجاد اندپوینت mine/ که درخواست دریافت میکند
خط ۲۸ الی ۳۰: ایجاد اندپوینت transaction/new/ که درخواست را پست میکند؛ زیرا دادهها را به آن ارسال خواهیم کرد.
خط ۳۲ الی ۳۸: ایجاد اندپوینت chain/ که بلاک چین کامل را بر میگرداند
خط ۴۰ الی ۴۱: سرور را در پورت ۵۰۰۰ اجرا میکند
اندپوینت تراکنش (Transactions Endpoint) در ساخت بلاک چین
درخواست تراکنش به این شکل است. نحوه ارسالهای کاربر به سرور این گونه است:

از آنجایی که روش خود برای افزودن تراکنش به بلاک را داریم، باقی موارد آسان است. تابع افزودن تراکنش به این شکل است:

اندپوینت ماینینگ در ساخت بلاک چین
اندپوینت ماینینگ بسیار ساده است و باید شامل سه مورد باشد:
- محاسبه گواه اثبات کار
- جایزه دادن به ماینر با افزودن تراکنشی که یک کوین اهدا میکند
- ایجاد بلاک جدید با افزودن آن به زنجیره


به خاطر داشته باشید که دریافت کننده بلاک استخراج شده، آدرس نود ما میباشد و اکثر اقداماتی که انجام میدهیم، فقط تعامل با روش های موجود در بلاک چین است. در این مرحله کار ما تمام شده است و میتوانیم تعامل با بلاک چین را آغاز کنیم.
مرحله سوم: تعامل با بلاک چین
میتوانید با روشهای ساده و قدیمی cURL یا Postman با API تعامل ایجاد کنید.

به کار انداختن سرور:
با ارائه درخواست http://localhost:5000/mine، ماینینگ بلاک را امتحان میکنیم:

با ارائه درخواست POST به http://localhost:5000/transaction/new با بدنه شامل ساختار تراکنش، تراکنش جدیدی ایجاد میکنیم:

اگر از Postman استفاده نمیکنید، میتوانید معادل این درخواستها را با استفاده از cURL انجام دهید:

ما سرور خود را ریستارت و دو بلاک استخراج کردیم. برای بررسی زنجیره کامل درخواست http://localhost:5000/chain را اجرا میکنیم.


مرحله چهارم: اجماع
این مرحله بسیار جالب است. ما بلاک چین اولیهای داریم که تراکنشها را میپذیرد و به ما امکان میدهد تا بلاکهای جدید استخراج کنیم. اما نکته کلی بلاک چینها این است که غیرمتمرکز باشند.
اگر بلاک چینها متمرکز باشند، چگونه مطمئن شویم که بیانگر زنجیره یکسانی هستند؟ به این موضوع، مشکل اجماع میگوییم و اگر در شبکه خود بیش از یک نود میخواهیم، باید الگوریتم اجماع اجرا کنیم.
ثبت نودهای جدید در فرآیند ساخت بلاک چین
قبل از آن که بتوانیم الگوریتم اجماع پیاده سازی کنیم، به روشی نیاز داریم تا نودها در خصوص نودهای مجاور خود در شبکه باخبر شوند. هر نود داخل شبکه ما باید رجیستری یا ثبتی از سایر نودهای شبکه داشته باشد. بنابراین به اندپوینتهای بیشتری نیاز داریم:
nodes/register/: این اندپوینت برای پذیرش فهرست نودهای جدید در قالب URL ها است.
nodes/resolve/: این اندپوینت برای پیاده سازی الگوریتم اجماع است که هر تناقضی را برطرف میکند تا اطمینان حاصل شود که نود مورد نظر، دارای زنجیره صحیح است.
ما باید سازنده بلاک چین خود را تغییر داده و اصلاح کنیم و روشی را برای ثبت نودها ارائه دهیم:

توجه داشته باشید که برای نگهداری فهرست نودها از ()set استفاده کردهایم. این روش ابتدایی برای اطمینان حاصل کردن از تغییرناپذیری افزودن نودهای جدید است، یعنی آن که فرقی ندارد چند بار نود خاصی را اضافه کنیم؛ مهم این است که تمام این دفعات دقیقا یکبار نشان داده شوند.
پیاده سازی الگوریتم اجماع برای ساخت بلاک چین
همانطور که اشاره شد، تناقض هنگامی به وجود میآید که یک نود نسبت به نود دیگر، زنجیره متفاوتی داشته باشد.
برای برطرف کردن این تناقض، قانونی وضع خواهیم کرد که بلندترین زنجیره معتبر، دارای مسئولیت و اعتبار باشد. به عبارت دیگر، بلندترین زنجیره شبکه، زنجیره موجود و دارای کارایی است. با استفاده از این الگوریتم، بین نودهای شبکه به اجماع دست مییابیم.



اولین روش ()valid_chain مسئول بررسی معتبر بودن زنجیره است و این امر را با بررسی هر بلاک و تایید هش و گواه انجام میدهد.
هم چنین ()reaolve_conflicts روشی است که تمام نودهای مجاور را بررسی، زنجیرههای آنها را دانلود و با روش فوق، آنها را تایید میکند. در صورت یافتن زنجیره معتبر که طول آن بیشتر از زنجیره ما باشد، زنجیره خود را جایگزین میکنیم.
دو اندپوینت را در API خود ثبت میکنیم، یک اندپوینت برای افزودن نودهای مجاور و اندپوینت دیگر برای برطرف کردن تناقضها:


در این مرحله اگر بخواهید، میتوانید دستگاه دیگری تهیه و نود دیگری در شبکه ایجاد کنید و یا با استفاده از پورت متفاوت بر روی همان دستگاه، فرآیند دیگری شروع کنید. ما نود دیگری بر روی دستگاه خود و با پورت متفاوت آغاز کردیم و با نود فعلی خود، آن را ثبت کردیم. بنابراین دو نود داریم:
Http://localhost:5000
Http://localhost:5001

سپس چند بلاک جدید با نود ۲ استخراج کردیم تا اطمینان حاصل کنیم که زنجیره بزرگتر بوده است. سپس درخواست nodes/resolve را بر روی نود ۱ اجرا میکنیم که زنجیره با الگوریتم اجماع جایگزین شده است:

و تمام شد. با دوستان خود ساخت بلاک چین را آزمایش کنید!
امیدواریم که این مقاله به شما کمک کند تا به ساخت بلاک چین خود بپردازید. ما به شدت در خصوص ارزهای دیجیتال هیجان زدهایم؛ زیرا معتقدیم که بلاک چینها به سرعت اقتصاد، نظارت و حفظ ثبتهای مختلف را تغییر خواهد داد.
اگر این مقاله را دوست داشتید یا پیشنهادی دارید در قسمت کامنتها اعلام کنید. همچنین اگر متوجه اشتباهی در این مقاله شدید، با ما در میان بگذارید.