مقدمه :



​در این مقاله تصمیم داریم با زبان پایتون یک «بلاکچین هوشمند» ساده و مینی مال را پیاده سازی کنیم و آن را با یک بلاکچین مقایسه نماییم. امیدواریم با انجام این کار، مفاهیم اصلی و امتیازات این تکنولوژی بیشتر مشخص شود و مورد استقبال توسعه دهندگان و جامعه بلاکچین قرار گیرد. در یک «بلاکچین هوشمند» مینی مال، یک قرارداد هوشمند سازنده بلاک «BPSC» داخل شبکه حضور دارد. برای انجام یک تراکنش موفق در شبکه؛ ابتدا می بایست فرستنده رمز ارز خود را به والت «BPSC» منتقل کند و بلافاصله «BPSC» همان رمز ارزها را بصورت اتومات به والت گیرنده نهایی می فرستد. این کار به ظاهر ساده باعث می شود که اطلاعات دقیق و غیر قابل خدشه از همه تراکنش های موفق در قرارداد هوشمند «BPSC» ذخیره گردد. مقاله حاضر در مارچ سال ۲۰۲۰ توسط سمیه غلامی و مهران کاظمی نیا در دو نسخه به زبان انگلیسی و زبان فارسی نوشته شده است.



English version





Understanding "Smart Blockchain" by coding



قبل از شروع به نکات زیر توجه کنید :



اگر با «بلاکچین هوشمند» آشنا نیستید و مقالات قبلی ما را راجع به این تکنولوژی مطالعه نکردید، می توانید کلیات موضوع را در مقاله زیر ببینید. البته به هرحال، توضیحات ضروری هنگام پیاده سازی آورده می شود.



What is Smart Blockchain? Hackernoon publication

By: Somayyeh Gholami



فرض ما این است که خواننده محترم با زبان پایتون آشنایی دارد و به مفاهیم بلاکچین مثل بلاک، هش و ... مسلط است. به همین دلیل برای این که مطلب طولانی و خسته کننده نشود، ما بیشتر روی ویژگی های «بلاکچین هوشمند» تاکید می کنیم. البته اگر بعضی مفاهیم بلاکچین را فراموش کردید، می توانید به مقاله زیر رجوع کنید. در این مقاله نویسنده با توضیحات کامل یک بلاکچین را با پایتون پیاده سازی کرده است. ما هم از ایده و کدهای ایشان برای پیاده سازی «بلاکچین هوشمند» استفاده می کنیم تا به راحتی بتوانیم «بلاکچین هوشمند» را با بلاکچین مقایسه نماییم.



Learn Blockchains by Building One Hackernoon publication

By: Daniel van Flymen



پایتون ما Python 3.7 می باشد و به عنوان IDE از Spyder-Anaconda3 استفاده می کنیم. شما می توانید ازIDE مورد علاقه خود مثل PyCharm و ... استفاده کنید. البته بدیهی است که مثلا Jupyter Notebook برای این کار مناسب نیست. ضمنا ما ازPostman استفاده خواهیم کرد ولی شما از cURL هم می توانید استفاده کنید.



درک عملکرد «بلاکچین هوشمند» با کدنویسی



کار را شروع می کنیم و یک کلاس به نام Smart_Blockchain می سازیم. متد سازنده این کلاس، فعلا دو لیست خالی ایجاد می کند که یکی برای ذخیره کردن تراکنش ها و دیگری برای ذخیره زنجیره بلاک ها استفاده خواهد شد. ضمنا در متد سازنده این کلاس، کد ایجاد بلاک اولیه genesis را نیز می نویسیم. حالا باید چهار متد زیر را تکمیل کنیم:



new_block, new_transaction, last_block, hash



اما در«بلاکچین هوشمند» مشکلات اجماع Consensus وجود ندارد و نیازی به مکانیسم اثبات کار«POW» یا مکانیسم اثبات سهام «POS» و یا ... نیست. به عبارت دیگر احتیاجی نیست که مانند شبکه های بلاکچین بیت کوین، اتریوم و ... ابتدا آلترناتیوهای متعددی از یک بلاک تولید شود و سپس ماینرها با میلیاردها دلار هزینه و مصرف سرسام آور برق، بلاک معتبر و صحیح را انتخاب کنند. کدهای زیر دقیقا بر اساس همین ویژگی ها تنظیم شده است.





در کدهای بالا متغیر proof و یا همان nonce وجود ندارد و دیگر احتیاجی به پاداش بلاک Block Reward هم نیست. زیرا همانطور که قبلا گفته شد، در «بلاکچین هوشمند» اجماع Consensus انجام نمی شود. حتی هزینه تراکنش ها Transaction Fees نیز می تواند صفر باشد. ولی ما برای جلوگیری از اسپم Spam ، مثلا هزینه هر تراکنش را 0.00005 مبلغ کل تراکنش در نظر گرفته ایم. این مبلغ ناچیز داخل قرارداد هوشمند «BPSC» ذخیره می شود و مجموع هزینه تراکنش ها می تواند برای توسعه و ... مصرف شود و یا حتی برای ایجاد تورم منفی سوزانده شود. تورم منفی یکی از موثرترین راهکارهای حفظ و تقویت ارزش پول و همچنین رمز ارزها است.



حالا از فریمورک Flask استفاده می کنیم تا بتوانیم با درخواست های مبتنی بر بستر پروتکل http با «بلاکچین هوشمند» ارتباط برقرار نماییم. برای این کار، سه متد زیر را ایجاد می کنیم:



transactions/new/

درخواست برای ساخت یک تراکنش جدید و اضافه کردن آن به یک بلاک

mine/

از سرورمان بخواهیم که یک بلاک جدید را استخراج کند

chain/

درخواست برای برگرداندن لیست کامل بلاک ها








مطابق کدهای بالا، سرور بر روی پورت شماره 5000 راه اندازی می شود. البته راه دیگر این است که sys را import کنید و تغییرات زیر را در کدهای انتهایی انجام دهید. با این کار همیشه می توانید هنگام اجرا، پورت مورد نظر خود را معین کنید.





حالا دو قسمت اصلی کد را به هم متصل می کنیم. البته همه کدهای این مقاله را می توانید ازاینجا دانلود نمایید و دراین مرحله، نام فایل ما bpsc101.py می باشد. در گام بعدی سرور را اجرا می کنیم. ضمنا برای ارتباط با API جدید روی شبکه، از Postman استفاده می نماییم.



با ارسال یک درخواست تراکنش از نوع POST به آدرس سرورمان: http://localhost:5000/transactions/new ارتباط با API جدید را شروع می کنیم. اطلاعات این تراکنش را باید در قسمت Body وارد کنیم و بدیهی است که raw و سپس JSON را انتخاب می کنیم.





ما در مثال بالا می خواستیم مبلغ یک میلیون توکن (مثلا آکا توکن) را از والت خودمان به یک شخص دیگر(با آدرس مشخص) ارسال کنیم. برای این کار، توکن ها و درخواست این تراکنش را به سرورمان (که نقش قرارداد هوشمند سازنده بلاک «BPSC» را دارد) ارسال کردیم. همانطور که ملاحظه کردید سرور پاسخ داد که این تراکنش به بلاک دوم اضافه خواهد شد. زیرا بلاک اولیه یا Genesis Block قبلا در کدها تعریف و ساخته شده است.



حالا یک درخواست استخراج از نوع GET را به آدرس سرورمان ارسال می کنیم: http://localhost:5000/mine با این کار، بلاک بعدی ساخته می شود. محتویات هر بلاک، شامل تمام تراکنش های انجام شده و در انتظار می باشد، مثلا در این مثال بلاک دوم ساخته می شود که حاوی فقط یک تراکنش خواهد بود.





مطابق تصویر بالا، مبلغ پنجاه توکن بابت هزینه تراکنش در کیف پول «BPSC» باقی مانده است و مابقی مبلغ، توسط «BPSC» به گیرنده نهایی ارسال شده است. البته همانطور که قبلا گفته شد، هزینه تراکنش ها یا سوزانده می شود و یا برای توسعه و .... مصرف خواهد شد. به هرحال فعلا نوع مصرف این مبالغ، مدل نشده است. حالا می دانیم که باید دو بلاک در زنجیره سرورمان موجود باشد. برای این که زنجیره فعلی را ببینیم، یک درخواست زنجیره از نوع GET را به آدرس سرورمان ارسال می کنیم: http://localhost:5000/chain





برای تست بیشتر، شما می توانید درخواست های جدید برای تراکنش ارسال کنید و هربار پس از چند درخواست تراکنش، یک درخواست استخراج بدهید. حتی می توانید بدون انجام تراکنش، بلاک خالی را استخراج نمایید. ضمن این که درخواست زنجیره، وضعیت زنجیره را در هر لحظه برای شما مشخص می کند.



شبکه غیرمتمرکز برای «بلاکچین هوشمند»



شبکه «بلاکچین هوشمند» مانند شبکه بلاکچین، غیرمتمرکز است. به همین دلیل باید روشی را پیاده سازی کنیم تا هر نود بتواند از نودهای همسایه اش در شبکه مطلع شود و لیست آنها را نگهداری نماید. برای انجام این کار، از ( )set استفاده می کنیم تا هر نود فقط یکبار ثبت شود. ضمنا برای پذیرش لیستی از نودهای جدید به شکل URL‌ها، متد زیر را ایجاد می کنیم:

nodes/register/





به یاد داشته باشیم که در«بلاکچین هوشمند» فقط قرارداد هوشمند سازنده بلاک، یعنی «BPSC» می تواند بلاک جدید بسازد و یا به اصطلاح استخراج نماید. ولی بقیه نودهای شبکه فقط می توانند به «BPSC» درخواست بفرستند و از این طریق آخرین زنجیره بلاک را دریافت نمایند.



پس باید درخواست نودها از «BPSC» برای برگرداندن آخرین زنجیره بلاک را پیاده سازی کنیم. برای این کار، متد زیر را ایجاد می کنیم:

smart/chain/





همانطور که قبلا گفته شد؛ در این مثال می خواهیم سرور خود را ( که نقش قرارداد هوشمند سازنده بلاک «BPSC» را دارد) بر روی پورت شماره 5000 راه اندازی کنیم. مطابق کدهای بالا هر نود دیگری، در شبکه می تواند به «BPSC» درخواست بفرستد و آخرین زنجیره بلاک را دریافت نماید. دستور requests در خط شماره 26 همین کار را می کند. به عبارت دیگر با یک درخواست، آخرین زنجیره بلاک که توسط «BPSC» ایجاد شده است، جایگزین زنجیره بلاک آن نود خواهد شد. برای ادامه کار باید قطعات کدها (تا این مرحله) را به هم متصل کنیم. شما می توانید همه کدهای این مقاله را از اینجا دانلود کنید و تا این مرحله bpsc102.py نام فایل ما می باشد.



اما اگر بخواهیم متد nodes/register/ و همچنین متد smart/chain/ را تست کنیم، باید نودهای دیگری هم در شبکه داشته باشیم. یعنی یا باید از چند کامپیوتر استفاده کنیم و یا روی کامپیوتر فعلی پورت های متفاوتی را تعریف کنیم. ما کار دوم را انجام می دهیم و دو نود دیگر را با شماره پورت های 5001 و 5002 روی کامپیوتر فعلی ایجاد می کنیم. اما مشکل اصلی این است که به غیر از قرارداد هوشمند سازنده بلاک «BPSC» که وظیفه انجام تراکنش، استخراج بلاک و ایجاد زنجیره را برای توکن مشخص (مثلا آکا توکن) را دارد، بقیه نودهای شبکه نباید این توانایی را داشته باشند. البته کار ساده است و فقط باید با حذف بعضی از کدها، امکان استخراج و ..... را از نودهای دیگر بگیریم.



برای این کار، فایل nodes_v1_5001.py و فایل nodes_v1_5002.py را ایجاد کردیم. لطفا جزییات این دو فایل را با کلیک روی آنها ببینید، زیرا برای طولانی نشدن مقاله، این تغییرات در متن آورده نشده است. در این فایل ها، نسبت به فایل اصلی​ bpsc102.py فقط بعضی از کدها حذف شده و فعلا چیزی اضافه نشده است. البته شماره پورت هم تغییر کرده است.



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

http://localhost:5000 که نقش قرارداد هوشمند «BPSC» را دارد.

http://localhost:5001 یکی از نودهای شبکه که نقش فرستنده توکن را دارد. http://localhost:5002 یکی از نودهای شبکه که نقش گیرنده توکن را دارد.



برای تست ابتدا دو درخواست POST بصورت پی در پی، ارسال می کنیم تا نودی که شماره پورت5001 دارد، از نودهای همسایه اش در شبکه مطلع شود و لیست این نودها را ذخیره نماید. http://localhost:5001/nodes/register


یعنی ابتدا ["nodes": ["http://127.0.0.1:5000" در نقش «BPSC»

و سپس ["nodes": ["http://127.0.0.1:5002" در نقش یک نود دیگر

در لیست مذکور ذخیره می شود.





حالا می خواهیم متد smart/chain/ را تست کنیم. ولی بهتر است که قبل از این تست، حداقل درخواست یک تراکنش و سپس درخواست استخراج را برای «BPSC» بفرستیم. تا با این کار یک زنجیره با دو بلاک در «BPSC» ذخیره شود.









حالا درخواست زیر را که از نوع GET می باشد، به آدرس نودی که شماره پورت 5001 دارد، ارسال می کنیم: http://localhost:5001/smart/chain


با انجام این کار، نودی که شماره پورت5001 دارد، آخرین زنجیره بلاک را از «BPSC» دریافت می نماید. به این ترتیب که، آخرین زنجیره بلاک که توسط «BPSC» ایجاد شده است، جایگزین زنجیره بلاک این نود می شود.





پس در«بلاکچین هوشمند» با این که هیچکدام از نودها نمی توانند زنجیره بلاک تولید کنند، ولی همه آنها از طریق «BPSC» می توانند تراکنش های خود را انجام دهند و آخرین زنجیره بلاک را نیز از«BPSC» دریافت نمایند. ضمنا به عنوان یک شبکه غیر متمرکز نودها می توانند با هم ارتباط داشته باشند و حتی نودهای شبکه می توانند از خدمات دهها «BPSC» استفاده نمایند، زیرا فرض بر این است که هر«BPSC» مخصوص یک نوع توکن و یا .... است.



دهها «بلاکچین هوشمند» روی یک شبکه غیرمتمرکز



برای این که این موضوع به ظاهر پیچیده، روشن و شفاف شود، بهتر است ما یک زنجیره دوم را برای نودهای شبکه پیاده سازی کنیم. زیرا با توسعه این الگو شما قادر خواهید بود دهها زنجیره موازی را روی هر نود ذخیره کنید. موضوع ساده است ولی همیشه نوشیدن قهوه بیشتر، خوب است. : )





اگر به کدهای بالا دقت کنید، دو بلاکچین موازی و مستقل روی یک نود، ذخیره می شوند. البته یکی از آنها همان «بلاکچین هوشمند» قبلی است و دیگری یک بلاکچین ساده است که برای ذخیره اطلاعات شخصی، به کدهای قبلی اضافه شده است. بدیهی است که بلاکچین دوم می توانست «بلاکچین هوشمند» باشد و یک نود به همین روش می تواند از خدمات دهها «BPSC» استفاده نماید. (مثلا تراکنش توکن های متفاوت، در بلاکچین های مستقل ذخیره شود.)



برای ایجاد زنجیره دوم، دو لیست به لیست های قبلی اضافه شده است. خط 12 برای ذخیره کردن اطلاعات و خط 14 برای ذخیره کردن زنجیره بلاک ها می باشد. بقیه تغییرات را نیز خودتان می توانید بررسی کنید. فایل nodes_v2_5001.py و فایل nodes_v2_5002.py دقیقا مطابق کدهای بالا ایجاد شده اند. لطفا این دو فایل و همچنین فایل​ bpsc102.py را بصورت همزمان اجرا کنید تا شما هم بتوانید تست های زیر را انجام دهید.



حالا می خواهیم متد chain2/ را تست کنیم. فایل nodes_v2_5001.py نودی را نمایندگی می کند که شماره پورت 5001 دارد. یک درخواست برای ذخیره اطلاعات شخصی به این نود می فرستیم. البته می دانیم که بلاک اولیه یا Genesis Block از ابتدا ساخته می شود، به همین دلیل سرور پاسخ می دهد که این اطلاعات به بلاک دوم اضافه خواهد شد. سپس درخواست استخراج را نیز برای همین نود می فرستیم. با این کار، بلاک بعدی (بلاک دوم روی زنجیره دوم) ساخته می شود.

http://localhost:5001/information/new

http://localhost:5001/mine


حالا درخواست زیر را که از نوع GET می باشد، به همین نود ارسال می کنیم: http://localhost:5001/chain2


با این تست مطمئن می شویم که دو بلاک در زنجیره دوم سرورمان موجود است و زنجیره دوم هیچ ارتباطی با زنجیره اول ندارد.









برای این که مطمئن شویم زنجیره دوم، عملکرد «بلاکچین هوشمند» را مختل نکرده است، دقیقا تست های قبلی را برای «بلاکچین هوشمند» تکرار می کنیم. یعنی ابتدا برای هر سه نود، متد nodes/register/ را تست می کنیم. سپس از نودی که نقش «BPSC» را دارد، چندین تراکنش و چندین استخراج را درخواست می نماییم: http://localhost:5000/transactions/new http://localhost:5000/mine


درنهایت درخواست زیر را که از نوع GET می باشد، به آدرس نودی که شماره پورت 5001 دارد، ارسال می کنیم:

http://localhost:5001/smart/chain


همانطور که درتصاویر زیرمی بینید، آخرین زنجیره بلاک که توسط «BPSC» ایجاد شده است، جایگزین زنجیره اصلی (زنجیره اول) این نود می شود. و نهایتا نتیجه می گیریم که هم «بلاکچین هوشمند» وهم زنجیره دوم، بصورت کاملا مستقل، دراین نود ذخیره می شوند.







برنامه ریزی و زمانبندی برای عملیات استخراج و ساخت بلاک، در یک «بلاکچین هوشمند»‌



وقتی یک قرارداد هوشمند در شبکه بلاکچین ثبت می شود، این قرارداد زندگی جاوید پیدا می کند. یعنی تا زمانی که آن شبکه بلاکچین کار می کند، هیچ انسانی (حتی طراح و نویسنده قرارداد هوشمند) نمی تواند کوچکترین تغییری درمفاد اولیه قرارداد ایجاد کند. قرارداد هوشمند سازنده بلاک «BPSC» نیزهمین وضعیت را دارد. پس ازهمان ابتدا باید زمان عملیات استخراج (ساخت بلاک) روشن باشد و در کدها پیاده سازی شود. در غیر این صورت، «BPSC» همیشه باید منتظر درخواست استخراج باشد تا بتواند بلاک جدید را استخراج کند.



برای انجام عملیات استخراج (ساخت بلاک)، به سه طریق می توان قرارداد هوشمند سازنده بلاک «BPSC» را برنامه ریزی کرد:


یک - براساس زمان؛ یعنی مثلا هرثانیه و یا هردقیقه، ساخت بلاک جدید انجام شود.

دو - براساس تعداد تراکنش؛ مثلا پس از هر ده تراکنش و یا صد تراکنش.

سه ـ تلفیق روش یک و دو؛ مثلا ده ثانیه و یا ده تراکنش، هر کدام زودتر اتفاق بیفتد.


البته ما فقط یک نمونه از روش اول را پیاده سازی می کنیم. مثلا فرض می کنیم که بعد از هر تراکنش، یک بلاک جدید توسط «BPSC» ساخته می شود. پس هر بلاک، فقط یک تراکنش را شامل می شود.





همانطور که ملاحظه می کنید، تغییرات فقط در متد transactions/new/ انجام شده و دقیقا کدهای متد mine/ به انتهای آن متد اضافه شده است. ما فایل bpsc103.py را با اعمال همین تغییرات ایجاد کردیم. شما می توانید این فایل را اجرا کنید و با استفاده از postman تست های مورد نظر خودتان را انجام دهید.


در این حالت اگر درخواست زیر را به سرور ارسال کنید: http://localhost:5000/transactions/new بلافاصله «BPSC» هم تراکنش را انجام می دهد و هم یک بلاک استخراج کرده و به زنجیره اضافه می کند.


حالا اگر مثلا تصمیم بگیرید که درخواست استخراج را به سرور ارسال کنید: http://localhost:5000/mine​ فقط یک بلاک خالی استخراج می شود، زیرا هیچ تراکنشی در انتظار نیست.



خلاصه و جمع بندی:



برای شبیه سازی قرارداد هوشمند سازنده بلاک «BPSC» یک نود با پورت 5000 درنظر گرفتیم و سه فایل زیر را برای آن پیاده سازی کردیم:


bpsc101.py این نسخه نهایی نیست و امکان تعامل با نودهای دیگر را ندارد.


bpsc102.py این نسخه نهایی است و برای این نسخه همه موارد تست شد. درخواست تراکنش، درخواست استخراج، درخواست ارسال آخرین زنجیره برای نودهای دیگر و .... را با هم تست کردیم.


bpsc103.py این نسخه هم نهایی است ولی دراین نسخه یک قابلیت جدید به نسخه قبلی اضافه کردیم. یعنی «BPSC» موظف شد که پس از هر تراکنش، یک بلاک جدید بسازد و آن بلاک را به زنجیره خودش اضافه نماید.






نمایندگی نودهای دیگر شبکه با پورت های شماره 5001 و 5002 است. برای شبیه سازی این نودها نیز دو نسخه زیر را پیاده سازی کردیم:


فایل nodes_v1_5001.py و فایل nodes_v1_5002.py

این نسخه نهایی است و مطابق تکنولوژی «بلاکچین هوشمند»، با این که این نودها نمی توانند بلاک تولید کنند، ولی آنها از طریق «BPSC» می توانند تراکنش های خود را انجام دهند و آخرین زنجیره بلاک را نیز از«BPSC» دریافت نمایند.


فایل nodes_v2_5001.py و فایل nodes_v2_5002.py

این نسخه هم نهایی است ولی دراین نسخه یک قابلیت جدید به نسخه قبلی اضافه کردیم. یعنی یک بلاکچین ساده برای ذخیره اطلاعات شخصی، به کدهای قبلی اضافه شده است.






کد نویسی تمام شد و همه فایل های مقاله را می توانید از اینجا دانلود کنید. تست های بیشتر را نیز می توانید با کامپیوترهای جداگانه و یا با همراهی دوستان انجام دهید. ولی به هرحال فراموش نکنید که شبیه سازی با پایتون، چه برای بلاکچین و چه برای «بلاکچین هوشمند»‌، معمولا شامل همه کنترل ها وعملیات ضروری نمی شود. دراین مقاله نیز بعضی کنترل ها انجام نشد؛ مثلا کنترل های لازم برای والت ها انجام نشد. ضمنا ما می خواهیم اگر به هر دلیلی «BPSC» نتوانست توکن ها را برای گیرنده نهایی ارسال کند، تمام توکن ها را به فرستنده برگرداند. ولی این موضوع هم در کدها پیاده سازی نشد. بدیهی است که این نوع کنترل ها را نباید در کار واقعی فراموش کرد. اکثر قراردادهای هوشمند، با زبان های مخصوص و به اصطلاح سطح بالا نوشته می شوند. مثلا قراردادهای هوشمند در بلاکچین اتریوم، معمولا با زبان سولیدیتی نوشته می شود. خوشبختانه پیاده سازی این نوع کنترل ها با سولیدیتی، حتی از پایتون هم ساده تر است.



کلام آخر



ما دراین مقاله و چند مقاله قبلی، نشان دادیم که ماینرها، سازندگان بلاک و فعالیت آنها، جزء لاینفک و یا ارکان تکنولوژی بلاکچین نیستند. البته می دانیم جایگزین کردن قراردادهای هوشمند به جای ماینرها و سازندگان بلاک، ایده بزرگی است و مانند هر کار بزرگی، مخالفت ها و موانع زیادی درمسیر قراردارد، ولی حفظ وضعیت فعلی نیز برای بلند مدت ممکن نیست. به عنوان مثال، با افزایش حجم محاسبات درالگوریتم های یادگیری ماشین، همزمان شاهد افزایش ظرفیت پردازش کامپیوترها هستیم. ولی عملا مکانیسم اثبات کار«POW» برای بیت کوین، یک بن بست واقعی است. همه ماینرها ظرفیت پردازش خود را افزایش می دهند، ولی برای رقابت با هم، همچنان مجبورند برق یک کشور ده میلیونی را مصرف کنند. این خودخواهی بزرگی است و منصفانه نیست.


به هرحال اگر به موضوع علاقه مند شدید، می توانید مقاله های قبلی ما را راجع به «بلاکچین هوشمند» وهمچنین مشکلات بیت کوین، مطالعه کنید. ضمن این که اگرسوالی دارید و یا دراین مقاله ابهام و خطایی دیدید، لطفا به ما اطلاع دهید.