از زمان پیدایش جاوا اسکریپت در اواسط دهه نود، این زبان ابزاری برای کامیونیتی توسعهدهندگان بوده است. در حال حاضر شناخته شده ترین زبان برنامه نویسی است و به طور گسترده ای مورد استفاده قرار میگیرد. همچنین این زبان میتواند در فناوری بلاکچین مورد استفاده قرار گیرد.
هنگام توسعه یک بلاکچین، استفاده از ابزارهایی که روی آنها تسلط دارید میتواند بسیار کمک کننده باشد. بخش بزرگی از توسعه دهندگان از زبان برنامه نویسی جاوا اسکریپت (JavaScript) استفاده میکنند، به این دلیل که یادگیری جاوا اسکریپت به نسبت آسان و هم یک زبان برنامهنویسی پویا است که از آن میتوان برای توسعه وب، بازیهای وب، برنامههای کاربردی تحت وب و بسیاری از موارد دیگر استفاده کرد. این زبان بسیار کاربردی است ولی متاسفانه داکیومنت (مستندات) خوبی برای استفاده از برنامه نویسی جاوا اسکریپت در بلاکچین ارائه نشده است، اما در واقع میتوان از جاوا اسکریپت هنگام ایجاد یک بلاکچین استفاده کرد.
اگر میخواهید به عنوان یه توسعه دهنده بلاکچین شروع به فعالیت کنید، آشنایی با زبان برنامه نویسی جاوا اسکریپت جزء اولین کارهایی است که باید انجام گیرد. جاوا اسکریپت قابلیتهای بسیار خوبی دارد، به طور مثال با این زبان میتوانید ویژگیهای خاص و پویا را در صفحات وبسایت خود پیاده سازی کنید.
بهتر است بدانید که یک صفحه وب، فعالیتی بیشتر از نمایش محتوا و اطلاعات استاتیک و لود کردن انجام میدهد، از زبان برنامه نویسی جاوا اسکریپت قدرت گرفته است. همچنین اجرای کارهایی مثل نمایش نقشههای تعاملی، بهروزرسانیهای مداوم در زمان مشخص، فریمهای پخش ویدئو، گرافیک دو بعُدی و سه بعُدی و مواردی شبیه به اینها به کمک این زبان برنامه نویسی صورت میگیرد.
فهرست مطالب
استفاده از جاوا اسکریپت در بلاکچین – چگونه کار میکند؟
از تکنولوژی بلاکچین به عنوان یک فناوری در پلتفرمهای رمزنگاری شده مورد استفاده قرار میگیرد. این فناوری پایگاهی برای ثبت و گزارش اطلاعات است با این تفاوت که این اطلاعات بین اعضای شبکه تقسیم میشود به این صورت که هر اعضای شبکه، یک نسخه از اطلاعات را به طور کامل در اختیار دارد. برای اولین بار در پروژه ارز دیجیتال بیتکوین از فناوری بلاکچین استفاده شد. نکته جالبی که وجود داشت این بود که در این فناوری از زبانهای برنامهنویسی مختلفی مثل زبان برنامهنویسی گو، پایتون، سی پلاس پلاس ، جاوا اسکریپت و موارد دیگر استفاده شده است.
بهتر است ذکر کینم که بعضی از سیستمهای بلاکچین خاص، از زبانهای برنامه نویسی منحصر به فردی استفاده میکنند که برخی از این شبکهها نیز خودشان آن زبان برنامه نویسی رو ایجاد کردهاند. توسعه دهندگان از زبان برنامه نویسی سالیدیتی (solidity) یا راست (rust) برای ساخت برنامههای کاربردی برای شبکه اتریوم (Ethereum) یا سولانا (Solana) به عنوان مثال استفاده میکنند. این زبانهای پیچیده و پیشرفته شروع یک حرفه در بلاکچین را بسیار چالشبرانگیزتر از آنچه لازم است میکند.
حالا که با جاوا اسکریپت در بلاکچین آشنا شدید، میتوان به این نتیجه رسید که یکی از موارد کاربرد آن استفاده در فناوری بلاکچین است. یکی از مهم ترین دلایل استفاده از جاوا اسکریپت در بلاکچین، قابلیت حمل آسان این زبان است، یعنی این گونه میشود بیان کرد که اپلیکیشنها و برنامههایی که بر اساس این زبان نوشته شدهاند به معماری ویژهای و پیچیدهای وابسته نیستند.
چگونه یک بلاکچین در جاوا اسکریپت بسازیم
Lisk SDK (کیت توسعه نرم افزار) ابزاری ساده برای استفاده برای توسعه دهندگان ارائه میدهد. این کیت داری قابلیتهایی است که با اصولی مشابه با زنجیره اصلی (main chain)، پایهای برای کار کردن ایجاد میکند. ماژولهای درون SDK را میتوان برای مطابقت با نیازهای زنجیره خاص تغییر داد.
همه این مؤلفهها با هم جمع میشوند و به توسعه دهندگان این فرصت را میدهند تا از جاوا اسکریپت در توسعه بلاکچین استفاده کنند.
این رویکرد ماژولار برای ایجاد یک بلاکچین، آزادی بیشتری به توسعه دهندگان میدهد تا زنجیرهای پویاتر و منحصر به فردتر از شبکه اصلی ایجاد کنند. بنابراین میتوانید طیف گستردهای از ماژولها را در SDK دستکاری کنید تا انواع موارد استفاده را کشف کنید.
اشاره کردن به این نکته هم خالی از لطف نیست که به دلیل وجود فریمورک نودجیاس (node.js) در جاوا اسکریپت، برنامه نویسان میتوانند پلتفرمهای جذاب و قدرتمندی را بر پایه شبکه بلاکچین طراحی کنند.
یکی دیگر از نکات مثبتی که درباره این زبان برنامهنویسی وجود دارد این است که روی هر سیستمی قابل اجرا است. در واقع میتوان این گونه بیان کرد که هر سیستمی برای اجرای جاوا اسکریپت به روش خود عمل میکند. بنابراین توسعه دهندگان پلتفرمهای ارائه دهنده رمزارزهای، دیگر نگرانیای در مورد یکپارچه سازی یا Integration برای آنها وجود نخواهند داشت.
بلاکچین برای توسعه دهندگان جاوا اسکریپت
اکنون که متوجه شدیم جاوا اسکریپت برای استفاده در بلاکچین امکان پذیر است، با این اطلاعات چه کاری میتوان انجام داد؟ به عنوان یک توسعه دهنده جاوا اسکریپت، دنیای بلاکچین اکنون به روی شما باز است. تفاوتهای واضح زیادی بین برنامههای ساخته شده برای وب 2 و برنامههای بلاکچین وجود دارد.
شاید بخواهید یک فروشگاه آنلاین ایجاد کنید که از سیستمهای پرداخت شخص ثالث مانند PayPal چشم پوشی کند. ایدههای ساده و پیچیده میتوانند از قدرت فناوری بلاکچین بهره ببرند. توسعه دهندگان جاوا اسکریپت میتوانند این سیستمها را پیاده سازی کنند.
زمانی که برنامه نویسان از جاوا اسکریپت برای توسعه فناوری بلاکچین استفاده کردند این فناوری تغییرات خوبی رو تجربه کرده است. مدیریت کارآمد و موثر کدهای ناهمزمان (asynchronous code) که در واقع تشکیل دهنده اصول پایهای بلاکچین هستند به کمک جاوا اسکریپت این عمل امکانپذیر است. همچنین این زبان برنامهنویسی به شما اجازه میدهد که چند عمل را به شکل موازی و در یک زمان مشخص انجام دهید.
همچنین بهتر است بدانید که بعضی از کاربردهای جاوا اسکریپت در بلاکچین شامل موارد زیر است که به آنها اشاره میکنیم:
- Ethereum.js
- Web3.js
- NEO
- شبکه Raiden
بررسی فریمورکهای جاوااسکریپت در بلاکچین
ابزار توسعه Lisk SDK
Lisk SDK یک کیت توسعه نرم افزار منبع باز است که توسعه دهندگان را قادر میسازد تا برنامههای بلاکچین مقیاس پذیر را در جاوا اسکریپت بسازند.
برای کار با Lisk SDK، دانش کافی از جاوا اسکریپت یا TypeScript برای ایجاد زنجیره خود کافی است و همچنین با استفاده از node.js، برای ساختن یک برنامه بلاکچین به هیچ زبان جدیدی نیاز نخواهید داشت.
مهمترین نکات و ویژگیهای Lisk SDK:
یک بلاکچین برای تمام اپلیکیشنها: برنامههای بلاکچین هر کدام بر روی بلاکچین سفارشی شده خود اجرا میشوند.
زبان برنامه نویسی: JS (جاوا اسکریپت) و TS (تایپ اسکریپت)
الگوریتم اجماع: Lisk DPoS و Lisk BFT
کاملاً ماژولار: هر یک از منطق مربوط به بلاکچین را میتوانید در برنامه با ماژولها و داراییها و پلاگینها پیکربندی، مبادله یا گسترش دهید.
زبان برنامه نویسی که برای ابزار توسعه Lisk انتخاب شده است جاوا اسکریپت است، به همین خاطر اگر میخواهید بیشترین استفاده از این فریمورک را ببرید بهتر است سراغ زبان برنامه نویسی جاوا اسکریپت بروید.
فریمورک Hardhat
فریمورک Hardhat یکی از محبوبترین و کاملترین فریمورکهای جاوا اسکریپتی برای توسعه اپلیکیشنهای بلاکچینی است. با دارا بودن مستندات خوب و آموزشهای کامل، ادغامپذیری ساده و متن باز بودن از جمله نکات مهمی است که در این فریمورک میتوانید بیابید. هر کسی که از کار کردن با کتابخانهها و فریمورکهای جاوا اسکریپتی لذت میبرد باید یک بار هم که شده از Hardhat استفاده کرده و آن را بررسی کند. از طرفی دیگر اگر بخواهید در شبکه بلاکچین اتریوم کار کنید و اپلیکیشنهای مبتنی بر ساختار اتریوم را ایجاد و توسعه دهید Hardhat باید انتخاب کلیدی و اصلی شما در بین فریمورکهای جاوا اسکریپتی باشد.
Hardhat با استفاده از قابلیتهای موجود در کتابخانههای Waffle و Ethers.js به شما قابلیت تست کردن اپلیکیشنها را قبل خروجی گرفتن میدهد. همچنان با بررسی کردن این دلایل میتوان نتیجه گرفت که Hardhat برای شبکه اتریوم میتواند بسیار بهتر از کتاب خانه Web3.js ، چالشهای مورد نیاز شما را پیادهسازی کند.
فریمورک Hardhat توسط جامعهای از توسعه دهندگان ساخته شده و توسط همین گروه نیز نگهداری میشود. و مهمتر از همه اینکه یک شبکه Discord اختصاصی نیز دارند، که اگر هرموقعه سوالاتی در ارتباط با این فریمورک داشته باشید در سریعترین زمان پاسخ خود را در یا این گروه پیدا خواهید کرد.
فریمورک Truffle
در سال ۲۰۱۶ که فرمورک Truffle ایجاد شد به عنوان یک ابزار اصلی برای توسعه قراردادهای هوشمند و اپلیکیشنهای مبتنی بر بلاکچین مورد استفاده توسعه دهندگان قرار گرفت. دلیل این موضوع به این خاطر است که: Truffle یک چهارچوب و در نهایت ابزار قدرتمند و استانداردی برای این منظور ارائه میدهد.
به عنوان یک نکته مهم این موضوع را باید عرض کنیم که فریمورکTruffle ابزارهای تست پیشرفتهای همانند فریمورک Hardhat نداشته اما به راحتی میتواند با ابزارهای تست مربوط به بلاکچین ادغام و ترکیب شود. اما باید این نکته را گفت، یکی از مشکلاتی که میتواند این امر داشته باشد این است که سرعت کاری آن به نسب Hardhat کمتر است که همین موضوع باعث میشود فریمورک hardhat را محبوب تر و کامل تر از فریمورک truffle کند.
در وبسایت رسمیTruffle آمده است که این فریمورک توسط یک گروه از مهندسین خلاق نرم افزار ایجاد شده و از پشتیبانی کاملی نیز برخوردار است. همچنین با نگاهی به صفحه مخزن این فریمورک در گیتهاب میتوانید پاسخگویی کامل آنها به مشکلاتی که امکان دارد به آن برخورد کنید را مشاهده بفرماید.
برای دوست داران زبان برنامه نویسی تایپ اسکریپت نیز این موضوع را ذکر کنیم که Truffle تنها با تایپ اسکریپت کار کرده و شما برای استفاده از آن نیاز دارید که حتما بتوانید به زبان تایپ اسکریپت کدنویسی بکنید. سازگاری بالای این فریمورک با زبان تایپ اسکریپت نه تنها حرفهای بودن آن، بلکه مطمئن بودن به لحاظ اجرایی را نمایان میکند.
پروژههای بلاکچین جاوا اسکریپت
اکنون که به بلاکچین و کارهایی که جاوا اسکریپت میتواند برای توسعه دهندگان در این فناوری انجام دهد را بررسی کردیم، میتوانیم به چند نمونه از پروژههایی که به ایجاد یک بلاکچین با زبان برنامه نویسی جاوا اسکریپت کردهاند نگاهی بیندازیم.
Topas City
با استفاده از جاوا اسکریپت، تیم Topas City یک دنیای VR با قدرت گرفتن از Lisk توسعه داده است. با داراییهای درون بازی، انافتیها (NFT) به عنوان آیتمها و سیستم ثبت دادهها بر اساس فناوری بلاکچین طراحی شده است، بازی در مراحل اولیه توسعه قرار دارد. ممکن است این اولین بازی از بسیاری از بازیهایی باشد که با استفاده از جاوا اسکریپت در بلاکچین برای تولید چیزی خاص ارائه میشود.
RGB, Your Place
بر اساس یک آزمایش هنری محبوب جامعه در Reddit، پروژه Your Place به مشارکت کنندگان اجازه میدهد پیکسلهای رنگی را به یک بوم خالی اضافه کنند. این به طور مداوم در طول چند هفته اتفاق میافتد تا تصویر نهایی ظاهر شود. سپس تصویر به صورت NFT بریده میشود و در وب به مزایده گذاشته میشود. ایجاد یک کامیونیتی بر اساس هنر و سرگرمی یک راه عالی برای توسعه و ایجاد تعامل است. با استفاده از این برنامه، کاربران همچنین میتوانند درآمدی نیز کسب کنند زیرا هر چیزی که از حراج به دست میآید بین مشارکت کنندگان تقسیم میشود.
Gun
GUN یک پروتکل کوچک، آسان و سریع برای همگام سازی دادهها است. از آنجایی که GUN کوچک است، میتوان آن را برای بهبود یک ویژگی به برنامه شما اضافه کرد. اما از آنجایی که استفاده از GUN آسان است، میتواند صدها یا هزاران خط کد، تماسهای شبکه، صفحه ذخیرهسازی، مسیریابی pub/sub، باطل کردن حافظه پنهان و موارد دیگر را جایگزین کند. قدرت GUN در این است که این پیچیدگی را در یک API ساده یکپارچه که بسیار متفاوت از سیستمهای سنتی است، با هدف آسان ساختن سریع برنامههای جالب، انتزاع میکند.
Eattheblocks
Eat the Blocks یک مدرسه توسعه بلاکچین آنلاین است که اخیراً یک دوره کامل در مورد توسعه Polygon با مجموعه کاملی از آموزشهای اتریوم و Solidity ایجاد کرده است. Eat the Blocks آموزشهای زیادی در مورد تولید اپلیکیشنهای غیر متمرکز dApp دارد و یک آموزش خاص برای استقرار (deploy) از طریق L2 dApps دارد.
embark-framework
embark فریمورکی برای برنامههای غیرمتمرکز بدون سرور با استفاده از اتریوم، IPFS و دیگر پلتفرمها است.
ساخت یک بلاکچین ساده با جاوا اسکریپت
پس از بررسی تمام مواردی که به استفاده جاوا اسکریپت در بلاکچین اشاره میشد در این بخش قصد داریم که یه بلاکچین ساده به کمک جاوا اسکریپت بسازیم تا به درک هر چه بیشتر از آن برسیم.
نکات مهمی که باید به آن ذکر کنیم این است که:
- برای درک این بخش باید پیش زمینه ابتدایی از مفاهیم بلاکچین رو داشته باشید که در مقاله ای جدا آن را آموزش دادیم.
- حتما نیاز نیست که با زبان جاوا اسکریپت کار کرده باشید، همین که با زبان برنامه نویسیای آشنا باشید و مفاهیمی همچون شیگرایی رو بدونید چی هستش کافیه!
- این کدها صرفا جنبه آموزشی داشته و منظور از نوشتن آنها درک مفاهیم ابتدایی است. طبیعی است که سیستمهای بلاکچینی که در رمزارزها یا هر بخشی که نیاز باشد استفاده میشوند خیلی پیشرفته تر هستند.
بسیار خب حالا وقت ساخت بلاکچین شخصی خودتان با جاوا اسکریپت است
همین ابتدای کار وقت این است که کلاس بلاکها(همانطور که میدانید بلاکچین از زنجیره بلاکها ساخته میشود) را ایجاد کنیم، همچنین این کلاس به متد سازنده (Constructor) نیاز دارد. سه المان اصلی هر بلاک ساخته شده شامل: ۱. داده (data) ۲. هش (hash) و ۳. هش بلاک قبلی (previous hash) است. و اینکه در اینجا یک index (شماره هر بلاک) برای هر بلاک در نظر میگیریم و همچنین از time stamp (فرآیند ثبت داده ها بر روی یک بلاکچین برای اثبات وجود آن در تاریخ و زمان خاصی است) در هش استفاده میکنیم:
همانطور که اشاره کردیم هر بلاک مکانی برای ثبت دادهها است، مثلا هدف هر بلاک، بلاکچین ارزدیجیتال بیتکوین ثبت اطلاعاتی در مورد تراکنشهای مالی آن است. به اضافه داده، هر بلاک داری یک اثر انگشت است که ما آن را هش نام گذاری میکنیم. و در آخر هر بلاک اثر انگشت یک بلاک قبل از خود را نیز در خود ذخیره میکند، به این ترتیب ذنجیرهای از بلاکها (بلاکچین) ساخته میشود. در همین ابتدای کار دو لایه امنیتی به وجود میآید: ۱. هش از دستکاری اطلاعات جلوگیری میکند ۲. یا به هر دلیلی هش تغییر کند چون هر بلاک بعدی هش بلاک قبلی را در خود دارد با تغییر نکردن آن، بلاکچین ما دیگر نامعتبر شناخته میشود.
برای محاسبه هش بلاک فعلی خود از متد calculateHash استفاده میکنیم. برای این کار نیاز به نصب کتابخانهی crypto-js داریم. برای جاوا اسکریپت نیاز به وارد کردن این دستور در ترمینال داریم تا این کتابخانه نصب شود:
پس از نصب و افزودن آن به پروژه، آین کتابخانه را به این صورت فراخوانی میکنیم:
در اینجا ما از الگوریتم SHA256 استفاده میکنیم، اما شما میتوانید از هر الگوریتمی که دوست دارید استفاده کنید. حالا متد calculateHash را در کلاس Block تعریف میکنیم:
حال زمان ساختن کلاس بلاکچین است. متد سازندهی این کلاس، تنظیمکنندهی آرایهای است از بلاکها. همانطور که گفتیم هر بلاک در یک بلاکچین باید به بلاک قبلی خود اشاره داشته باشد. این رفتار در همهی بلاکها صدق میکند، بجز نخستین بلاک که به بلاک جنسیس (Genesis Block) شهرت دارد.
بلاک جنسیس با بقیه بلاکها متفاوت است و باید توسط خود سازندهی بلاکچین و به صورت دستی ساخته شود و بخش previousHash آن به هیچ آدرسی در بلاکچین اشاره ندارد.
همانطور که مشاهده کردید، هش بلاک قبلی یا previousHash آن به گونه زیر تنظیم و ایجاد شده:
ما نیز متدی بنام createGenesisBlock میسازیم و آن را به عنوان اولین ایندکس در آرایهی موجود در متد سازنده تنظیم میکنیم. پس با این توضیحات کلاس بلاکچینای که گفتیم را به این گونه ایجاد میکنیم:
دو متد دیگر نیز لازم داریم که به این کلاس اضافه کنیم:
۱. متد getLastestBlock که وظیفهی بازگردانی آخرین بلاک از زنجیره را دارد.
۲. متد addBlock که وظیفهی ایجاد یک بلاک جدید در زنجیره را دارد.
یک مورد بسیار مهم این است که در بیشتر بلاکچینها و مخصوصا آنهایی که برای رمزارز ساخته میشوند، به همین سادگیها نمیتوان از طریق فراخوانی متد سادهای چون addBlock اقدام به اضافه کردن یک بلاک جدید کرد؛ بلکه بلاکها لازم و بهتر است از طریق فرایندهایی مانند ماینینگ (mining) و یا استیکینگ (staking) ایجاد شوند و در ازای ایجاد آنها نیز پاداشی اهدا شود. این کار انگیزه لازم برای شرکت کنندگان در این سیستم را ایجاد میکند.
چرا که بلاکچین سیستمی نامتمرکز و توزیع شده بوده و در اختیار یک شخص یا یک نهاد خاص قرار ندارد و کسی نباید بتواند به همین راحتی هر تعداد بلاک دلخواهی که دلش بخواهد را ایجاد کند. مسئلهی دیگر نیز امنیت این سیستم است. اگر هکری قصد نفوذ و تغییر دادهی یکی از بلاکها را داشته باشد باید کل زنجیره موجود را دستکاری کرده و بلاکهای جدیدی با هشهای جدید ایجاد کند.
به همین خاطر لازم است ایجاد بلاک، فرآیندی بسیار دشوار و زمانبر برای رایانهها باشد. به این فرآیند، الگوریتم اثبات کار (Proof-of-Work) گفته میشود. در قسمتهای بعدی به این موضوع خواهیم رسید؛ ولی در اینجا فعلا کار ایجاد بلاک را با همان متد addBlock که ایجاد کردهایم پیش خواهیم برد که به سادگی و در کسری از ثانیه، بلاک جدیدی برای ما ایجاد میکند.
حالا میخواهیم آنچه را که نوشتیم تست کنیم. در انتهای پروژه و خارج از دو کلاس یک شی (object) از کلاس بلاکچین میسازیم و دو بلاک جدید ایجاد میکنیم. ما نام ارزدیجیتال خود را پلازاکوین معرفی میکنیم.
در اولین خط، ارزدیجیتال ما معرفی شده و در خط دوم و سوم، دو بلاک جدید ایجاد شده که اطلاعات هر کدام شامل ایندکس و مهر زمانی و همچین یک موجودی فرضی است. در بلاک اول مبلغ ۵ و در بلاک دوم مبلغ ۲۱ منتقل شده است. در خط چهارم نیز بلاکهای بلاکچین در قالب JSON نشان داده خواهند شد.
در اینجا میتوانیم پروژهای که تمام کدهای بالا در آن نوشته شده را با دستور node اجرا کنیم. به این صورت که اگر نام آن myFirstBlockchain.js باشد، با این دستور اجرا میشود:
زمانی که کد بالا رو اجرا کنیم نتیجه زیر حاصل میشود:
میتونیم مشاهده کنیم که اولین بلاک قرار گرفته شده که همان جنسیس بلاک است در بلاکچین قرار گرفته است که به هیچ بلاک قبل از خود اشاره نمیکند. پس بلاک با ایندکس ۱ به همان جنسیس بلاک ما اشاره میکند و بلاک با ایندکس ۲ به بلاک با ایندکس ۱ اشاره میکند که همانطور که ذکر کردیم در هر بلاکچین بلاکها هش بلاک قبلی را در خود دارند (با دقت به مقادیر previousHash و هش هر بلاک توجه کنید).
زنجیرهی بلاک ما به درستی کار میکند؛ اما هنوز بعضی از چیزها را کم دارد و یکی از مهم و حیاتیترین مزیت بلاکچینها این است که اجازه نمیدهند دستکاری غیرمجاز در دادهها صورت گیرد. اگر دادهای تغییر کند، هش آن بلاک نیز تغییر میکند و اگر هش بلاکی تغییر کند، هش بلاک بعدی که به آن اشاره میکند نیز باید تغییر کند (چرا که دیگر به چیزی اشاره نمیکند) و در صورت این کار نیز هش آن تغییر میکند (فراموش نکنید که در متد calculateHash، یکی از عناصری که برای محاسبهی هش استفاده میشود هش بلاک قبلی است. باری دیگر متد calculateHash را بررسی کنید).
به این ترتیب بلاک بعدی، بلاک بعدی، بلاک بعدی و… نیز باید تغییر کند. به عبارتی دیگر، اگر هکری تصمیم بگیرد دادهی فقط یک بلاک را دستکاری کند (مثلاً موجودی ارزدیجیتال خود را افزایش دهد) ناچار به تغییر، نه فقط آن بلاک بلکه باید تکتک بلاکهای بلاکچین را تغییر دهد و بلاکهای ایجاد شدهی جدید را جایگزین تمام آنها کند (در بلاکچین سادهی ما این کار خیلی راحت و با استفاده از یک حلقهی for بر روی متد addBlock به راحتی قابل انجام و اجرا است.
اما زمانی که الگوریتم اثبات کار Proof-of-Work در پروژهمان وجود داشته باشد، این کار تقریبا به غیرممکن نزدیک میشود؛ در صورتی که آن هکر محترم، میلیاردها سال صبر داشته و یا این که بتواند با در دست داشتن امکان حملهی کوانتومی به بیتکوین ، سایر رمزارزها و هر پروژه بلاکچینی پیروز شود. درواقع یکی از خطرات تهدیدکنندهی امنیت بلاکچینها، رایانش کوانتومی است. اما جای نگرانی نیست؛ چرا که تا زمان فراگیر شدن رایانش کوانتومی، از خود آن برای حفاظت از بلاکچینها نیز استفاده خواهد شد).
بیایید به پروژه خود برگردیم! خب، در کلاس بلاکچین به متدی نیاز داریم که درستی بلاکچینمان را بررسی نماید. این متد ما دو وظیفه دارد این دو عبارتند از:
۱. بررسی کند که آیا هش هر بلاک با سایر محتوای آن (داده، زمان، هش بلاک قبلی و…) مطابقت دارد یا نه. چرا که بدون چنین سنجی میتوان برای مثال با یک خط زیر، دادهی موجود در بلاک ۱ را به راحتی تغییر داد و گفت که نه ۵ بلکه ۲,۵۰۰ پلازاکوین منتقل شده است!
۲. بررسی کند که آیا هر بلاک به بلاک قبل از خود اشارهای دارد یا خیر. چرا که ممکن است کسی حقهای بزند و علاوهبر اجرای کد بالا، هش آن بلاک را نیز با کد پایین تغییر دهد:
برای جلوگیری از این دلایلی که گفته شد، متد دیگری بنام isChainValid را به کلاس بلاکچین خود اضافه میکنیم. در متد isChainValid ، تکتک بلاکها از دو نظر بررسی میشوند: ۱- آیا هش آنها معتبر است؟ ۲- آیا به درستی به بلاک قبلی خود اشاره میکنند؟ (آیا previousHash آنها با هش بلاک قبلیشان یکی است؟)
حال بیایید آن را تست کنیم. کدهای قبلیای که در خطوط پایانی در انتهای پروژهمان نوشته بودیم را پاک کرده و این کدها را جایگزین آن کنید:
اگر هر دو خط مربوط به دستکاری غیرمجاز را کامنت کرده باشیم و فایل را اجرا کنید، عبارت زیر در کنسول ظاهر میشود:
اما اگر خط مربوط به دستکاری داده به تنهایی یا هر دو خط دستکاری داده و دستکاری هش (بروزرسانی هش) اجرا شود، بلاکچین ما معتبر نبوده و این عبارت نشان داده میشود:
تبریک میگم الان ما یک بلاکچین بسیار ساده ساختیم. این بلاکچین هنوز ویژگیهای مهم زیادی را ندارد؛ از جملهی آنها میتوان به موارد زیر اشاره کرد:
- خبری از الگوریتم Proof-of-Work نیست و ساخت بلاکها بسیار ساده و بدون پیچیدگی است. به این خاطر یک هکر میتواند علاوه بر تغییر بلاک دلخواه خود، کل بلاکچین را نیز تغییر و بروزرسانی کند تا همچنان معتبر بماند.
- همچنین تراکنشها بدون هیچ بررسی موجودی صورت میپذیرد. بدون اینکه چقدر پول در اختیار دارید، میتوانید هر مبلغی را واریز کنید!
- در این بلاکچین گیرنده و فرستندهای در کار نیست و فقط مبلغ تراکنش در بلاکها ذخیره شده است.
جمع بندی
قدم گذاشتن به دنیای جذاب بلاکچین و برنامه نویسی در این حوزه چندان هم که به نظر میرسد کار سخت و دشواری نیست. از آنجایی که ابزارها و فریمورکهای جاوا اسکریپتی بسیار زیادی حول محور این تکنولوژی ایجاد شده و توانسته افراد تکنیکی بسیار زیادی را جذب خود کند، شروع یادگیری زبان جاوا اسکریپت اهمیت بالایی دارد و کار شما را در این مسیر بسیار هموار میسازد.
در ابتدا کار نیازی نیست که با زبانهای پیچیده مثل Rust و Solidity شروع کنید، اگر کار با جاوا اسکریپت را بلد باشید میتوانید همین حالا به توسعه اولین اپلیکیشن مبتی بر بلاکچین خود اقدام کنید.