شیوه ساخت یک بلاک چین خصوصی مثل اتریوم و نحوه کارکرد آن، یکی از سوالات متداول افراد در فضای بلاکچین است. اتریوم پلتفرم غیرمتمرکزی است که قراردادهای هوشمند را اجرا میکند. این قراردادها در حقیقت برنامههای برنامهریزی شدهای هستند که احتمال از کار افتادن، اعمال سانسور، کلاهبرداری و مداخله شخص ثالث در آنها به صفر میل میکند. در این مقاله قصد داریم تا تمامی گامهای مورد نیاز برای پایهریزی کامل و کاربردی بلاک چین خصوصی اتریوم را در شبکه بومی شما تشریح کنیم.
در این مطلب شما را با نحوه راهاندازی بلاکچین خصوصی اتریومی بر روی شبکه محلی شما با استفاده از ابزار geth آشنا میکنیم. همچنین مراحل وصل کردن کیف پول متامسک به این شبکه جدید و انتقال توکنها به این شبکه جدید را پوشش خواهیم داد. علاوه بر اینها با نحوه ایجاد و راهاندازی قراردادهای هوشمند بر روی شبکه خود آشنا خواهید شد و در نهایت بلاک اکسپلورری برای شبکه خود راهاندازی خواهید کرد. با این مطلب جذاب همراه باشید.
بلاکچین خصوصی اتریوم و گامهای مورد نیاز برای ساخت آن
- راه اندازی یک بلاک چین خصوصی با کمک اتریوم و با استفاده از geth.
- اتصال کیف پول مبتنی بر اتریوم MetaMask به شبکه جدید برای کار کردن با آن.
- انتقال منابع مالی و بودجه بین چندین حساب کاربری.
- استقرار، ساخت و فراخوانی یک قرارداد هوشمند بر روی بلاک چین خصوصی با استفاده از ابزار remix.
- راه اندازی مرورگر بلاک اتریوم بر روی بلاک چین خصوصی.
نصب Geth
Go Ethereum (و یا geth) یکی از سه راهکار اصلی پیادهسازی (در کنار C++ و پالیگان) پروتکل اتریوم است. این راهکار با زبان GO به صورت کاملا متن باز و تحت مجوز نسخه سوم GNU LGPL منتشر شده است. Go Ethereum به صورت یک کلاینت مستقل تحت عنوان geth در دسترس ما قرار دارد و میتوانید آن را بر روی یک سیستم عامل و یا به عنوان یک مرجع کتابخانهای (Library در زبان کدنویسی) قابل ارجاع در پروژههای GO ،Android و یا iOS خود پیادهسازی کنید.
برای نصب geth بر روی MAC OS X از homebrew استفاده میکنیم. وظیفه Homebrew نصب کردن عوامل مورد نیازی است که در Apple موجود نیستند. در این مقاله فرض میکنیم homebrew بر روی سیستم شما نصب شده است، در غیر این صورت به اینجا مراجعه کنید. به محض اینکه hombrew بر روی سیستم شما نصب شود، دستورهایی که در تصویر میبینید به نصب شدن geth منجر میشود.
نصب کردن geth بر روی Ubuntu به سادگی اتفاق میافتد، تنها چیزی که نیاز دارید استفاده کردن از apt-get- است و دستورهای مورد نیاز در ادامه نمایش داده شدهاند:
میتوانید با کلیک کردن بر روی این لینک به شیوه نصب geth بر روی ویندوز دست بیابید. اگر با هرگونه مشکلی در رابطه با شیوههای نصبی که تا به اینجا بیان کردیم مواجه شدید به این لینک مراجعه کنید.
ساخت حساب کاربری ماینر در بلاکچین خصوصی
در ابتدا نیاز داریم تا یک حساب کاربری برای استخراج اتریوم بسازیم. این امر به ایجاد یک جفت کلید عمومی/خصوصی برای شما منجر میشود و به واسطه گذرواژه از آن حفاظت میشود. به هیچ عنوان پسورد یا گذرواژه خود را گم نکنید، در صورت روی دادن این اتفاق قادر به بازیابی این کلیدها نخواهید بود. به صورت پیش فرض، کلیدها در داخل خود این بستر و در datadir>/keystore> ذخیره میشود. هر چیزی که geth به نگهداری کردن از آن اقدام میکند در datadir (به جز برای Ethash DAG که از گواه اثبات کار استفاده میکند) نوشته میشود. محل پیش فرض دادهها توسط پلتفرم مشخص شدهاند. بهتر است همواره مسیر datadir را نادیده بگیرید و لوکیشن مختص بلاک چین خصوصی خود را ایجاد کنید.
- Mac: ~/Library/Ethereum
- Linux: ~/.ethereum
- Windows: %APPDATA%\Ethereum
هش اتریوم یا Ethash DAG در ~/.ethash (Mac/Linux) و یا %APPDATA%\Ethash (Windows) ذخیرهسازی میشود. بنابراین همه کاربران میتوانند از آن استفاده کنند.
دستور پیش رو نشاندهنده شیوه ساخت حساب کاربری دارای مسیر دلخواه برای datadir است. به محض کامل شدن این مسیر، این دستور آدرس اتریوم شما را پرینت میکند.
مثال:
ساخت بلاک Genesis
در میان بلاکهای شبکه اتریوم یکی با دیگران متفاوت است و آن بلوک خاص، بلوک پیدایش یا نخستین بلوک این شبکه (جنسیس بلاک) است. یک بلاک چین روند کاری خود را با یک بلاک جنسیس آغاز کرده و ادامه روند را به صورت مبتنی بر آن میسازد و طی این روند، هر بلاک به بلاک زیرین خود ارجاع داده میشود. در بلاک چین عمومی اتریوم، بلاک جنسیس در تاریخ ۲۰ جولای ۲۰۱۵ (۲۹ تیر ماه ۱۳۹۴) ساخته شد. برای ساختن بلاکچین شخصی خود، در ابتدا نیاز داریم تا بلاک جنسیس خود را بسازیم. با استفاده از دستور پیش رو و به واسطه بلاک جنسیسی که در اختیار دارید میتوانید روند ساخت بلاکچین خصوصی خود را آغاز کنید.
مثال:
- datadir: مرجع داده برای پایگاههای داده و محل ذخیرهسازی کلید.
- init: بلوک جنسیس جدید را به واسطه فایل json ارائه شده بوت استرپ (راه اندازی) میکند.
در ادامه میتوانید بلاک جنسیس استفاده شده در بلاک چین خصوصی ما را مشاهده کنید. لازم است تا این مجموعه دستورات را با پسوند genesis.json ذخیره کنید و به دستور بالا ارجاع دهید.
chainid: این بخش راهی برای ارسال تراکنشهایی که در بستر اتریوم کار میکنند و بینیاز به کار با ETC (اتریوم کلاسیک) و یا شبکه تستی Morden هستند، فراهم میکند. EIP155 مقادیر ارزشی پیش رو را برای شبکههای گوناگون ارائه میکند:
- شبکه اصلی اتریوم (۱)
- شبکه اصلی morden/expanse (۲)
- ropsten (۳)
- rinkeby (۴)
- شبکه اصلی یا مین نت rootstock (۳۰)
- شبکه تستی یا تست نت rootstock (۳۱)
- kovan (۴۲)
- شبکه اصلی اتریوم کلاسیک (۶۱)
- شبکه تستی اتریوم کلاسیک (۶۲)
- زنجیرههای خصوصی geth (۱۳۳۷ به صورت پیش فرض)
ما در مثال خود از ۱۵ استفاده کردهایم که توسط هیچ یک از این شبکهها مورد استفاده قرار نمیگیرد.
- homesteadBlock: ارزش صفر نشاندهنده استفاده آن از انتشار homestead اتریوم است. Homestead دومین بلاک اصلی منتشر شده توسط اتریوم است و به تاریخ ۱۶ اکتبر ۲۰۱۷ (۲۴ مهر ۱۳۹۶) بر میگردد. در این زمان، اتریوم هارد فورکی را برای انتقال به انتشار byzantium به انجام رساند.
- eip155Block: در این بلاک ارزش صفر به معنای پشتیبانی آن از EIP (درخواستنامه پیشرفت اتریوم) ۱۵۵ است. EIPها توصیفکننده استانداردهایی برای پلتفرم اتریوم هستند و این شامل مشخصات پروتکل بنیادین، APIهای مشتریها و استانداردهای قراردادها میشود.
- eip158Block: ارزش صفر در این بلاک به معنای پشتیبانی آن از EIP (طرح بهبود اتریوم) ۱۵۸ است.
- difficulty: مقدار ارزشی نشاندهنده سطح سختی اعمال شده در طول پیدایش nonce یا هدف فعلی این بلاک است. در این مقاله شیوه محاسبه میزان سختی شبکه در اتریوم را با جزئیات توضیح میدهیم.
- gasLimit: گس در حقیقت میزان قیمتگذاری شده داخلی، در ازای انجام یک تراکنش و یا قرارداد در بستر اتریوم است. هر یک از دستورالعملهایی که در راستای پردازش یک تراکنش و یا قرارداد هوشمند به ماشین مجازی اتریوم (Ethereum Virtual Machine) یا EVM ارسال میشوند به پرداخت میزان مشخصی از گس نیاز دارند. اگر میزان مورد نیاز از گس در اختیار تراکنش قرار نگیرد، ترکنش مورد نظر پیش از رسیدن به مرحله تکمیل لغو میشود. هنگامی که هر یک از تراکنشهای بستر اتریوم را به انجام میرسانید، میزان گس فی را مشخص میکنید و این در حقیقت میزان حداکثری گس مورد نیاز تمامی اعمالی است که تراکنش مورد نظر میتواند به خود اختصاص دهد. پارامترهای حد گس یا gasLimit بلاک مشخصکننده مجموع گس تمامی تراکنشهای موجود در بلاک است.
- alloc: این بخش به شما اجازه میدهد تا مقادیر اتر مورد نظر را از پیش و از مبدا بلاک جنسیس به یک یا چند حساب کاربری اختصاص دهید. در مثال بلاک جنسیس بالا، تخصیص اولیه ما به حسابهای کاربری که در ابتدا ساختیم صورت گرفته است.
آغاز ماینینگ در بلاکچین خصوصی
با پایهریزی کردن تمامی اعمالی که تا به اینجا مطرح کردیم، اکنون میتوانیم روند ماینینگ خود را با استفاده از geth و به کمک دستور پیش رو آغاز کنیم. پارامتر networked در اینجا به منظور جدا کردن این شبکه اتریوم از سایر شبکهها مورد استفاده قرار میگیرد. تمامی ماینرهایی که قصد اتصال به این شبکه را دارند باید از همین networked و بلاک جنسیس مربوطه استفاده کنند.
مثال:
- networkid: شناساگر شبکه است که برای این شبکه اتریوم مورد استفاده قرار میگیرد. در این راستا باید ارزش مورد نظر را انتخاب کنید. به عنوان مثال: olympic (0)، frontier (1)، morden (2)، ropsten (3).
- mine: اجازه ماینینگ را به شما میدهد.
- rpc: یک سرور HTTP-RPC را برای شما فعال میکند. برنامه کیف پولهای مختلف را میتوانید به این نود ماینینگ و بر روی http مختص آن متصل کنید.
- rpcaddr: رابط لیست شدن سرور HTTP-RPC (که به صورت پیش فرض “localhost” در نظر گرفته میشود) را شناسایی میکند.
- rpcport: پورت لیست شدن سرور HTTP-RPC (که به صورت پیش فرض 8545 در نظر گرفته میشود) را مشخص میکند.
- rpcapi: این مولفه APIهای ارائه شده در بستر رابط HTTP-RPC (که به صورت پیش فرض eth، net، web3 در نظر گرفته میشود) را مشخص میکند.
- rpccorsdomain: این بخش CORS مورد نیاز را با استفاده از دامنههای لیستی که با ویرگول مجزا شده است مشخص میکند تا درخواستهای متقاطع مبدا را بپذیرد. این امر در هنگام استفاده از ویراستارهای مرورگر مبتنی بر سالیدیتی (remix) برای استقرار قراردادهای هوشمند یا کیف پولهای مبتنی بر مرورگر بسیار کارآمد خواهد بود. به عنوان مثال میتوان به تصویر بعدی اشاره کرد که CORS را از هر دامنهای میپذیرد.
- nodiscover: مکانیزم کشف همتا را غیرفعال میکند. هیچ کدام از نودهای دیگری که درون شبکه وجود دارند قادر به یافتن نود شما نخواهند بود. اگر قصد دارید تا این بلاک چین خصوصی در شبکه بومی شما در کنار دیگران مورد استفاده قرار بگیرد از این پارامتر استفاده نکنید.
- console: با استفاده از این دستور میتوانیم نود ماینینگ خود را با کمک یک محیط جاوا اسکریپت تعاملی راه اندازی کنیم. در بخش بعدی بیشتر در مورد این موضوع صحبت میکنیم.
اتصال کنسول Geth
یا میتوانید نود ماینینگ خود را به عنوان یک console فعال کنید و یا اینکه کنسول مورد نظر را به صورت جداگانه راه اندازی میکنید و آن را به یک نود ماینینگ و با استفاده از دستور attach متصل میکنید. در ادامه میتوانید شیوه انجام این کار را مشاهده کرده و از دنبال کردن ترتیب این پارامتر اطمینان حاصل کنید.
مثال:
این کنسول به واسطه ipc.ipc (ارتباطات میان پردازشی) به نود ماینینگ متصل میشود و بر روی کامپیوتر بومی اجرا میشود. در این بخش geth یک پایپ ipc (که توسط فایل <path-to-data-directory> به نمایش گذاشته میشود) در فایل سیستمی این کامپیوتر میسازد و کنسول مورد نظر پل ارتباطی به این نود را بر روی بستر ipc میسازد.
نمایش تمامی حسابهای کاربری
به محض اتصال شما به کنسول geth، میتوانید از دستورات بعدی برای لیست کردن تمامی حسابهای کاربری موجود استفاده کنید.
نمایش موجودی حساب کاربری
دستور بعدی نشاندهنده شیوه نمایش موجودی حساب کاربری مورد نظر از مبدا کنسول geth است.
اتصال کیف پول مبتنی بر بلاکچین خصوصی اتریوم
متامسک یک کیف پول مبتنی بر اتریوم است و به صورت افزونه مرورگر گوگل کروم نیز مورد استفاده قرار میگیرد. این کیف پول API وب ۳ اتریوم را به محتوای جاوا اسکریپت وبسایتهای مورد نظر منتقل میکند تا برنامههای گوناگون بتوانند داده مورد نظر را از بلاک چین خصوصی مورد استفاده بخواند. لازم به ذکر است که متامسک به کاربران اجازه میدهد تا هویت خود را در بستر این کیف پول ساخته و مدیریت کنند. در ادامه این ماجرا، اگر برنامهای قصد اجرای یک تراکنش و نوشتن بر روی بلاک چین خصوصی را داشته باشد، رابط ایمنی برای کاربر به نمایش گذاشته میشود تا تراکنش مورد نظر را پیش از تایید یا لغو مورد بررسی قرار دهد.
برای اتصال متامسک به بلاک چین خصوصی اتریوم، نیاز داریم تا نام و پورت میزبان صحیح را انتخاب کنیم. API وب ۳ در حقیقت API جاوا اسکریپت اتریومی است که در قالب web3.js پیادهسازی شده است. متامسک برای ارتباط با نود اتریوم از طریق یک برنامه جاوا اسکریپت، از کتابخانه web3.js استفاده میکند. این Library رابط مناسبی را برای استفاده در راهکارهای rpc در اختیار ما قرار میدهد. این رابط در پس پرده با یک نود بومی و از طریق فراخوانیهای rpc تعامل میکند. web.js قادر به همکاری با هر یک از نودهای اتریوم است و در معرض یک لایه rpc فعالیت میکند. ممکن است پیش از این نیز متوجه شدید باشید که در هنگام آغاز روند کاری یک نود ماینینگ، میتوانیم پارامتر rpcapi را برای مشخص کردن رابطهایی که قصد نمایش آنها را داریم را ارسال کنیم. به صورت پیش فرض، اگر رابط خاصی را تعیین نکنید، eth، net و web3 به نمایش گذاشته میشوند.
انتقال اتر از بلاکچین خصوصی
شما میتوانید به کمک متامسک یه حساب کاربری مبتنی بر اتریوم بسازید که با یک کلید خصوصی و آدرس اتریوم همراه است. در ادامه میتوانید روند انتقال اتر در کنسول geth از اولین حساب کاربری که ساختهاید به حساب کاربری متامسک را ببینید. برای انتقال منابع مالی از یک حساب کاربری باید از کلید خصوصی این حساب به عنوان امضای دیجیتال استفاده کنید. برای استفاده از این کلید خصوصی نیاز داریم تا آن را طبق روند پیش رو فعال (unlock) کنیم.
personal یکی از APIهای مدیریتی ارائه شده توسط geth است. لازم به ذکر است که geth میتواند APIهای مدیریتی دیگری را نیز ارائه کند: admin، debug، miner و txpool. به محض اینکه حساب کاربری را باز یا آزادسازی کنیم، میتوانیم سه متغیر را در کنسول تعریف کنیم. این مقادیر به فرستنده، دریافتکننده و میزان مبلغ مورد نظر برای ارسال اختصاص دارند. ارزش اختصاص داده شده به فرستنده آدرس اتریومی است که در ابتدای این مقاله ساختیم و ارزش مورد نظر برای دریافتکننده آدرس اتریومی از که در بخش مربوط به متامسک ساختیم.
دستور بعدی عمل انتقال منابع مالی را به انجام میرساند و به متغیرهایی که در بالا تعریف کردیم ارجاع داده میشود.
نمایش موجودی حساب در متامسک
با تکمیل روند انتقال منابع مالی در مراحل بالا، میتوانیم به دو روش میزان موجودی حساب کاربری را بیابیم. یکی از راهها این است که به صورت مستقیم از plugin متامسک استفاده کنیم.
روش دوم با استفاده از کنسول geth و به کمک دستور پیش رو صورت میگیرد.
ویراستار سالیدیتی Remix
سالیدیتی رایجترین زبان برنامهنویسی مورد استفاده در نوشتن قراردادهای هوشمند اتریوم است. Remix یک IDE برای سالیدیتی بوده و دارای یک debugger یا برطرفکننده خطا و محیط آزمایش ادغامشده در آن است. در این لینک میتوانید به ویراستار آنلاین Remix دست پیدا کنید. میتوانیم Remix را به هر یک از شبکههای اتریوم متصل کنیم و برای اتصال آن به بلاکچین خصوصی خود باید از آغاز شدن روند کاری نود ماینینگ اطمینان حاصل کنیم.
دستور این کار به همراه پارامتر مشخص شده در ادامه قابل مشاهده است. معنای این پارامتر را پیش از این به شما آموختیم. به جای استفاده از «*» میتوانید از «https://remix.ethereum.org» به عنوان مقدار ارزش rpccorsdomain استفاده کنید.
برای اتصال remix به شبکه خصوصی خود نیاز دارید تا محیط خود را در Run به ارائهدهنده وب ۳ تغییر دهید. هنگامی که این تغییر را اعمال کنید، remix از شما میخواهد که Endpoint یا نقطه پایانی ارائهدهنده وب ۳ را مشخص کنید. در این بخش این مقدار ارزشی را وارد کنید: http://localhost:8545
. به جز در حالتی که پورت را تغییر داده باشید، نود ماینینگ کار خود را بر روی پورت 8545 آغاز میکند.
نوشتن یک قرارداد هوشمند
حالا آماده نوشتن اولین قرارداد هوشمند و اجرای آن در بستر اتریوم هستیم. کد دستوری زیر را کپی کرده و در ویراستار آنلاین remix بنویسید. این یک قرارداد هوشمند بسیار ساده است و نیازی به توضیح خط به خط آن نیست.
در صوت عدم تغییر تنظیمات پیش فرض remix روند کامپایل آغاز میشود در غیر این صورت نیاز به کامپایل کردن این کد دارید.
پس از تکمیل فرایند کامپایل اگر بر روی دکمه Details کلیک کنید، میزان گس تخمین زده شده برای ساخت قرارداد هوشمند در بلاک چین خصوصی به شما نشان داده میشود.
استقرار یک قرارداد هوشمند
حالا میتوانیم قرارداد هوشمند خود را در بلاک چین خصوصی خود ثبت کنیم. در تب Run میتوانید از صحیح بودن حساب کاربری اتریوم انتخاب شده و مقدار gas limit اطمینان حاصل کنید. میتوانید مقدار صفر را برای هزینه گس و ارزش مورد نظر استفاده کنید.
در اینجا ما از یک تراکنش اتریوم که توسط حساب کاربری منتخب امضا شده است برای ثبت قرارداد هوشمند در بلاک چین خصوصی استفاده کردهایم. برای امضا کردن قرارداد، در ابتدا نیاز داریم تا حساب خود را با استفاده از کنسول geth باز کنیم.
حالا بر روی دکمه Create کلیک کنید تا قرارداد هوشمند ثبت شود. در مثال قرارداد هوشمند ما، سازندهای وجود دارد که پارامتر رشتهای ما را میپذیرد و این امر دلیل نمایش داده شدن یک باکس نوشتاری در کنار دکمه Create است. در این بخش میتوانید ارزش مورد نظر خود را (در داخل گیومه مثل “Hi”) وارد کنید و یا آن را خالی بگذارید. هنگامی که ساخت قرارداد هوشمند را تایید میکنید پیام پیش رو را در کنسول geth میبینید. به یاد داشته باشید که اگر میزان حد گس را تعیین نکرده باشید یک پیام خطا به شما نشان داده میشود.
فراخوانی یک قرارداد هوشمند در بلاکچین خصوصی
به محض ثبت قرارداد هوشمند، رابط کاربری یا UI ریمیکس کمی تغییر میکند.
حالا میتوانید ارزش مورد نظر را به شیوه setGreeting تعریف کنید و با کلیک کردن بر روی آن قرارداد هوشمند را فراخوانی میکنید. از باز بودن حساب کاربری خود اطمینان حاصل کنید زیرا برای فراخوانی یک قرارداد هوشمند از تراکنشهای اتریوم استفاده میکنیم و نیاز به امضای اقدامکننده داریم. پس از طی کردن روند setGreeting میتوانید شیوههای دیگر را نیز فراخوانی کنید.
مرورگر بلاک اتریوم
احتمالا با اتر اسکن (etherscan) آشنا هستید و میدانید که اطلاعات زیادی در مورد بلاکچین عمومی اتریوم در اختیار شما قرار میدهد. با این حال نمیتوانیم از آن برای نشان دادن بلاک چین خصوصی یا بومی خود استفاده کنیم. با اینکه مرورگر بلاک اتریوم به اندازه اتر اسکن غنی نیست اما برای بررسی رویدادهای بلاک چین بومی کاربرد دارد.
برای تنظیم مرورگر بلاک اتریوم در ابتدا باید سورس آن را از git repo دریافت کنیم.
سپس دستور نصب بعدی را در از فهرست مرورگر نصب کنید.
پس از تکمیل روند نصب، با استفاده از دستور پیش رو مرورگر بلاک اتریوم را اجرا کنید. میتوانید از طریق http://localhost:8000
به کنسول وب دسترسی پیدا کنید.
برای اتصال مرورگر بلاک اتریوم به بلاک چین خصوصی خود از آغاز شدن روند اجرای نود ماینینگ و با استفاده از دستور بعدی و پارامتر مشخص شده اطمینان حاصل کنید. معنای این پارامتر نیز پیش از توضیح داده شده است.
سخن پایانی
ساخت یک بلاکچین خصوصی نیازمند گامهایی برای راهاندازی صحیح است. کدها و دستورات مورد نیاز برای ساخت بلاک چین خصوصی اتریوم در این مقاله به صورت کامل بیان شد. از آن جا که Ethereum و ماشین مجازی آن مسبب اصلی اجرای قراردادهای هوشمند در این شبکه و تمام شبکههای مبتنی بر EVM هستند، شیوه نوشتن و فراخوانی این قراردادها نیز اهمیت بالایی پیدا میکند. کیف پولهای نرم افزاری یکی دیگر از شاخصههای مرتبط با یک بلاک چین هستند و از این رو، نحوه اتصال کیف پول محبوب متامسک به شبکه جدید خصوصی شما آموزش داده شد. امیدواریم که این مقاله کمک اندکی به برداشتن اولین قدم در ایجاد بلاکچین خصوصی شما کرده باشد.
اگر تجربهای در ایجاد بلاکچینهای خصوصی و یا سازمانی دارید، لطفا تجربیات ارزشمند خود را با ما و دیگر کاربران به اشتراک بگذارید.