روش ساخت استخر استخراج اتریوم
میدانید که یکی از بزرگترین اکوسیستمهای فعلی در بین ارزهای دیجیتال راشبکه اتریوم داراست و روز به روز به تعداد افرادی که قصد کسب درآمد با پیوستن به استخرهای استخراج این ارز را دارند افزوده میشود. این کار اصول و قواعدی دارد که اطلاع از آنها هم سود شما را افزایش میدهد و هم از ضررهای احتمالی جلوگیری میکند. در این مقاله، درباره روش ساخت استخر استخراج اتریوم توضیح میدهیم که برای بسیاری از افراد علاقهمند به کار در این حوزه مفید خواهد بود.
ساخت استخر استخراج اتریوم و تاثیر آن بر کل اکوسیستم
استخرهای استخراج نقش مهمی در اکوسیستم ارز اتریوم دارند. با رشد حداکثر ارزش قابل استخراج (ارزش قابل استخراج ماینر) یا همان شاخص MEV (miner-extractable value)، اجرای طرح ۱۵۵۹ بهبود اتریوم (EIP-1559) و طرحهای ادغام در آینده، نقش این استخرها در اکوسیستم تأثیرگذارتر و مهمتر شده است.
در حقیقت برای افرادی که اطلاع چندانی ندارند، استخرهای استخراج ، یک ارائهدهنده نرمافزاری هستند که به واسطه این نرمافزار تعداد زیادی سختافزار ماینینگ توان خود را در کنار یکدیگر قرار میدهند و در ازای آن پاداش میگیرند. استخرهای استخراج به دو دلیل در استخراج یا همان ماینینگ به روش PoW (گواه اثبات کار) مهم هستند.
اول اینکه درآمد افرادی که بهصورت فردی کار استخراج انجام میدهند نوسان زیادی دارد. دومین مورد این است که راهاندازی یک زیرساخت نرمافزاری برای استخراج ارز کار بسیار پیچیدهای است. با تجمیع منابع، ماینرها میتوانند نوسانات درآمد خود را کمتر کنند و یک کسبوکار مشخص و قابل پیشبینی داشته باشند.
البته قراردادن این حجم بالا از توان محاسباتی مسئولیت بزرگی است و استخرهای استخراج قدرت زیادی دارند. دلیل این است که استخرها تصمیم میگیرند ماینرها روی کدام بلوک کار کنند و کدام تراکنشها را در آن بلوک قرار دهند. استخرها باید تصمیم بگیرند که کدام MEV و توسط چه کسی استخراج شود. همچنین باید با رأی دادن در تعیین محدودیت گس شبکه مشارکت کرده و در نبردهای سیاسی بزرگ نیز شرکت داشته باشند.
به همین جهت برای فرهنگ اتریوم اهمیت زیادی دارد که سد ورود به استخرهای ماینینگ تا جای ممکن کم باشد تا غیرمتمرکز بودن به حداکثر خود برسد. زمانی که MiningDAO (یک پروتکل از شبکه اتریوم که با هدف به حداکثر رساندن شفافیت و عدم تمرکز در یک استخر ماینینگ ایجاد شده و به شکل جمعی اداره میشود) تصمیم گرفت تا استخر مستقل خودش را ایجاد کند، توسعهدهندگان آن متوجه شدند که این کار بسیار پیچیده است.
روش ساخت استخر استخراج اتریوم
اطلاعات کمی درباره ساخت استخر استخراج اتریوم (و ارزهای دیگر) که قابلیت رقابت با دیگر استخرها باشند وجود دارد و بسیاری از منابع متنباز نیز که در این راه کمک میکنند، قدیمی شدهاند. به همین دلیل تصمیم داریم تا در این مقاله یک راهنمای گامبهگام درباره استخراج اتریوم نوشته و آن را در دسترس همه قرار دهیم. ایجاد یک استخر شامل دو مرحله است:
1-راهاندازی یک نود کلاینت (Client Node) با ارتباط مناسب همتا به همتا (P2P) و سرعت پردازش سریع
2-اتصال کامل نود (گره) به نرمافزار ماینینگ که کار مدیریت نرخ هش (هش ریت یا Hashrate) و توزیع کار بین تمام ماینرها را برعهده دارد.
در این مطلب درباره هر دو مورد توضیح خواهیم داد.
این مطلب نتیجه یک تجربه عملی از راهاندازی استخر MiningDAO.io است و نشان میدهد که چگونه مؤسسان این استخر توانستند Uncle Rate (سرعت ایجاد بلوکهای Uncle) را از ۱۰ تا ۱۴ درصد به ۴ تا ۵ درصد برسانند. این رقم آنها را همتراز با تعدادی از ۱۰ استخر برتر جهان قرار داده است.
راهاندازی کامل یک Node Client
راهاندازی و ساخت استخر استخراج اتریوم نیازمند راهاندازی یک نود کلاینت است. این کلاینت وظیفه دارد تا بلوکهای جدید و تراکنشهای معلق یا در حال انجام (تراکنشهای Pending یا تراکنشهایی که هنوز توسط هیچ گرهای پذیرفته نشدهاند) را بپذیرد. همچنین این نود باید بلاکهای خودش را بسازد و سپس آن را برای گرههای دیگر هم ارسال کند. در ادامه روش راهاندازی چنین نودی توضیح داده شده است.
الزامات سختافزاری سرور
جهت راهاندازی یک گره مناسب و هماهنگ با شبکه نیازمند سختافزار مناسب هستید. توصیه میشود حداقل از یک RAM با ظرفیت ۳۲ گیگابایت و حداقل ۲ ترابایت حافظه SSD استفاده کنید (همگامسازی سختافزارهای HDD با شبکه زمان بسیار زیادی لازم دارد و مناسب نیستند).
پهنای باند نیز یکی دیگر از فاکتورهای مهم است. برای این که بلاکهای جدید را بهسرعت دریافت کنید، توصیه میشود نود شما تا جای ممکن نزدیک به نودهای دیگر باشد. استفاده از سرویسهای مبتنی بر فضای ابری که در استخرهای دیگر محبوبیت دارند نیز توصیه میشود. برای مثال OVH و Hetzner در اروپا یا Alibaba (علیبابا) و AWS در آسیا نمونههایی از موارد محبوب استخرها هستند.
Geth یا OpenEthereum؟ انتخاب ما Geth است
قدم بعدی در ساخت استخر استخراج اتریوم این است که تصمیم بگیریم از کدام کلاینت اتریوم استفاده کنیم. محبوبترین و مناسبترین گزینهها در حال حاضر Geth و OpenEthereum هستند. Geth در توسعه پروتکلها پیشگام بوده و همیشه نیز بهروز است.
برای مقایسه این دو گزینه، یک آزمایش کوچک با Parity-2.7.2 (آخرین نسخه پایدار پیش از تغییر ساختار به OpenEthereum) و OpenEthereum انجام دادیم. هر دو مورد در زمان بارگذاری یا تولید بلوکهای جدید نتیجه ضعیفی داشتند که نتیجه آن مقدار بالای نرخ uncle بود که غیرقابلقبول است. توسعه دهندگان Geth ادعا میکنند که از آزمایش و تستهای مشابه استقبال میکنند اما ترجیح آنها همچنان Geth است.
دستوری که برای ایجاد کلاینت استفاده شده به شکل زیر است
geth –datadir=/ssd/gethdata –syncmode=fast –cache=21000
–maxpeers=250 –txpool.globalslots=1000
–http –http.api=eth
–miner.etherbase=’0xADDRESS’ –mine –miner.threads=0
–miner.extradata=’MiningDAO’
–miner.notify=’http://127.0.0.1:8107′ &>> ~/geth-log.txt
در مثال بالا دستور –cache=21000 نشان میدهد که از ۲۱ گیگابایت بری ذخیرهسازی در حالت RAM استفاده شده است (بیشترین مقداری که Geth میتواند پشتیبانی کند). در ادامه دستورات دیگر توضیح داده شده است. یک نکته مهم این است که تغییرات کد Geth از این لینک میتوانید استفاده کنید که در ادامه درباره آن توضیح میدهیم. برای اجرای دستورات نیز میتوانید از این لینک استفاده کنید.
فرکانس بلوکهای خالی را به حداقل برسانید
قبل از اینکه بیشتر درباره ساخت استخر استخراج اتریوم توضیح دهیم، بهتر است درباره یک موضوع مهم بدانید. دو مورد وجود دارد که ارزش کار ماینر را از بین میبرد:
-استخراج بلوکهای Uncle
-استخراج بلوکهای خالی
هر دو مورد به یک اندازه بد هستند زیرا پاداش بلوکهای Uncle برابر با ۱.۷۵ اتر (ETH) و برای بلوکهای خالی نیز برابر با ۲ اتر است. در هر دو نوع بلوک نیز هزینه مازادی برای تراکنش وجود ندارد. برای این که دید بهتری داشته باشید این رقم را با بلوکهای کامل مقایسه کنید. در بلوکهای کامل، کارمزد تراکنش بین ۳ تا ۴ اتر است و برخی اوقات نیز بسیار بیشتر از این میشود. با وجود این توضیحات چرا گاهی استخرهای استخراج بلوکهای خالی میسازند و چگونه میتوان فرکانس ایجاد آنها را به حداقل رساند؟
زمانی که استخر یک بلوک جدید (برای مثال در ارتفاع N) استخراج میکند، هر بلوک دیگری که در این ارتفاع وجود داشته باشد احتمالاً به بلوک Uncle یا عمو تبدیل میشوند؛ بنابراین زمانی که یک بلاک جدید پیدا شود، Geth بهسرعت وظیفه ماینر را استخراج یک بلوک خالی در ارتفاع N+1 قرار میدهد. درست است که چنین بلوکی هزینه تراکنش ندارد اما استخراج آن بهتر از ماین کردن بلوکهایی است که احتمالاً تبدیل به بلوک عمو یا Uncle میشوند.
در این شرایط Geth یک بلوک واقعی در ارتفاع N+1 میسازد و یک بار دیگر کار یا وظیفه ماینر را تغییر میدهد. ساختن یک بلوک واقعی از این نوع بین ۰.۱ تا ۰.۳ ثانیه زمان لازم دارد بنابراین این کار یک فرایند دو مرحلهای است. با وجود این در آن بازه زمانی ۰.۱ تا ۰.۳ ثانیه، ماینرهای دیگر روی یک بلوک خالی کار میکنند. جمعآوری تمام تراکنشهای تایید نشده و حداکثر کردن کارمزدها برای همه وسوسهانگیز است و با دستور زیر میتوانید به آن برسید:
–txpool.globalslots
در نتیجه این کار پردازشی که Geth برای ساختن بلوکهای واقعی انجام میدهد بیشتر میشود (یک ثانیه یا بیشتر) پس توصیه میشود مقادیری که تعیین میکنید بیشتر از ۱۰۰۰ تا ۲۰۰۰ نباشد. در این لینک میتوانید اطلاعات بیشتری در این زمینه کسب کنید.
فرکانس بلوکهای Uncle را به حداقل برسانید
با برداشتن بلوکهای خالی از سر راه، اکنون وقت آن رسیده که کار مشکل در ساخت استخر استخراج اتریوم را شروع کنیم. برای بهحداقلرساندن فرکانس بلوکهای Uncle توجه به دو نکته ضروری است:
-زمانی که استخرهای دیگر بلوکهای جدید میسازند، بهسرعت درباره آن بلوکها اطلاعات کسب کنید.
-زمانی که شروع به ساختن یک بلوک جدید میکنید، تا جای ممکن آن را برای دیگران ارسال کنید (بنابراین دیگران ساختن روی این بلوک را آغاز کنند)
اولین قدم برای ایجاد یک رابطه همتا به همتا که قبلاً درباره آن توضیح داده شد این است که نود یا گره خودتان را به طور کامل روی یک سرور ابری با پهنای باند مناسب و نزدیک به گرههای دیگر اجرا کنید.
دومین مورد که باید به آن توجه کنید این است که پهنای باند خوب به نودهای دیگر فرصت میدهد تا تعداد بیشتری همتای مستقیم را مدیریت کند. در نتیجه کاهش تعداد هاپهای (Hop) همتا به همتا لازم برای دریافت اطلاعات جدید کاهش مییابد. دستور Geth برای تعداد همتاها بهصورت زیر است:
–maxpeers
در ادامه چند نکته برای به حداکثر رساندن سرعت واردکردن (بارگذاری) و ارسال بلوک توضیح داده شده است. توجه به این نکات پیش از ساخت استخر استخراج اتریوم ضروری است.
از bloXroute در ساخت استخر استخراج اتریوم استفاده کنید
لازم است بدانید که bloXroute یک سرویس برای بهبود ارتباط بین ماینرها و کاهش نرخ Uncle است. بیشتر استخرها به bloXroute متصل هستند و حتی استخرهای بزرگ نیز که از این سرویس استفاده میکنند نتایج بسیار خوبی گرفتهاند. محاسبات KeeperDAO نشان میدهد که این سرویس نسبت به سرویسهای مشابه مزیتهای بسیار بیشتری دارد.
آزمایشهای انجام شده توسط تیم توسعه MiningDAO نیز پیشرفتهای قابلتوجهی بعد از استفاده از این سرویس نشان میدهد. در یک نود که بهتازگی با استفاده از تنظیمات پیشفرض استخراج شده است، تقریباً ۹۰ درصد تمام بلوکهای جدید ابتدا از سمت bloXroute میآیند. تنها ۱۰ درصد باقیمانده از همتاهای دیگر تأمین میشود. حتی بعد از اینکه در این آزمایش نود به همتاهای برتر متصل شد، همچنان بین ۴۰ تا ۶۰ درصد بلوکهای جدید ابتدا از سمت bloXroute بود.
بعد از مشاهده آموزش نصب bloXroute، لازم است که آن را به نودهای قابلاعتماد برای Geth متصل کنید که آموزش آن در این مقاله وجود دارد. بعداً به این تنظیمات نیاز خواهیم داشت. همتا یا Peerهای قابلاعتماد، نودهای از پیش تنظیم شدهای هستند که Geth صرفنظر از فرایند ایجاد اولیه همتای تصادفی (random peer initialization process) به آنها متصل میشود. نکته مهم این است که این همتاها در محدودیت تعداد نودها محاسبه نمیشوند.
ایجاد یک دروازه از bloXroute برای اتصال به همتاهای قابلاعتماد باعث میشود که Geth به طور تصادفی این ارتباط را قطع نکند. همچنین توصیه میشود که به شبکه Taichi متصل شوید. Taichi یک شبکه انتشار بلوک است که توسط Sparkpool توسعهیافته است. برای اتصال باید نقاط نهایی اتصال (Endpoints) شبکه Taichi را به همان فایل همتاهای مورد اعتماد متصل کنید.
بلوکهای خود را تا جای ممکن منتشر کنید
نکته مهم دیگری در ساخت استخر استخراج اتریوم وجود دارد که باید آن را بدانید. زمانی که Geth یک بلوک را با موفقیت استخراج میکند، بلاک را برای سراسر شبکه ارسال میکند. Geth به طور پیشفرض، بلوک را تنها بهاندازه یک زیرمجموعه از تابع sqrt(n_peers) که نشاندهنده جذر تعداد همتاها است ارسال میکند.
در ادامه نیز بلوک برای همتاهای دیگری نیز ارسال میشود و این فرایند ادامه پیدا میکند. این مکانیسم حتی در شرایطی که همه همتاها به یک اندازه مفید بودند نیز ایدهآل نیست اما در شرایطی که برخی از همتاها قدرتمندتر از دیگران هستند و این همتاها در این زیرمجموعه قرار نگیرند، بیشک مضر خواهد بود.
به طور خاص اولین کاری که در زمان استخراج بلوکهای جدید انجام میشود این است که آن را به bloXroute ارسال کنید تا bloXroute نیز آن را برای استخرهای دیگر بفرستد. اگر دروازه bloXroute به همان زیرمجموعه تصادفی از sqrt(n_peers) منتهی نشود، شانس شما برای uncle شدن یا همان استخراج بلوکهای uncle بالاتر میرود. در مرحله بعد باید بلوک را برای همتاهایی که بالاترین کیفیت را دارند بفرستید و سپس برای باقی همتاها ارسال کنید.
در این لینک یک پچ (Patch) متنباز از Geth قرار دارد که میتوانید از آن در کلاینت استفاده کنید. این دستور به شما کمک میکند تا همه بلوکهایی که بهتازگی استخراج شدهاند به نودهای قابلاعتماد (از جمله bloXroute) و سپس تمام همتاهای باقیمانده ارسال کنید.
همتاهایی که بهترین اتصال را دارند گسترش دهید
کلاینت Geth اصلی (تغییرنیافته) برای حداکثر کردن تمرکززدایی و ساختار شبکه مسطح طراحی شده است. این گزینه یک انتخاب خوب برای گیکها و علاقهمندان تفننی اجرای نود اتریوم است و یک اکوسیستم قوی شامل هزاران نود ارائه میکند. با وجود این، همانطور که در قسمت قبلی توضیح داده شد، این پیشفرضها برای برخی از نودها بهخوبی کار نمیکند. منظور نودهایی است که مسئولیتهای حیاتی در شبکه دارند و در صورت خرابی هزینه زیادی ایجاد میکنند.
در واقعیت همه همتاها به یک اندازه مفید نیستند. کیفیت اتصال برخی از آنها ضعیف است و نه بلوک جدیدی ارائه میکنند و نه نقشی در ارسال بلوکهای شما دارند. نودهای دیگر بهویژه نوهای دیگر استخرهای استخراج جریان ثابتی از دادههای بلوکهای جدید ایجاد میکنند.
بر اساس توصیههای Sparkpool، تیم توسعهدهنده Geth طوری آن را بهینهسازی کردهاند تا اولین همتایی که بلوک جدید برای Geth ارسال میکند ثبت شود. نگهداری دادهها برای مدت طولانی باعث شده تا بهترین همتا برای اتصال پیدا شود (از طریق تنظیمات static/trusted نودها که به ترتیب برای نودهای ثابت یا نودهای قابلاعتماد است). از طریق این لینک میتوانید به یک اسکریپت پایتون دسترسی پیدا کنید که برای پردازش دادهها و تبدیل به کد زیر استفاده میشود:
trusted_nodes.json
خروجی این کد یک لیست است که Geth توانایی خواندن آن را دارد.
ازآنجاییکه MiningDAO در مناطق جعرافیایی مختلف (geozone) در دسترس است (آمریکای شمالی، اروپا، آسیا)، تیم توسعهدهنده با استفاده از دادهکاوی لیستی از همتاهای برتر تهیه کرده است. البته IPهای موجود در این لیست برای جلوگیری از حمله DDoS منتشر نشده است. با وجود این هنوز هم تیم توسعهدهنده ادعا کرده که برای استفادههای خوب و بهصورت خصوصی این لیست در دسترس خواهد بود. همچنین نودهای MiningDAO در دسترس است تا استخرهای ماین کردن از آن استفاده کنند.
راهاندازی نرمافزار استخر استخراج
اکنون وارد مرحله دوم ساخت استخر استخراج اتریوم میشویم. زمانی که یک نود کامل راهاندازی شد، وقت راهاندازی خود نرمافزار است. این نرمافزار مسئول رسیدگی و مدیریت تمام تجهیزات ماینرها، پیگیری سهم ماینرها و مدیریت پرداختها است.
نرمافزار استخر را انتخاب کنید
به طور خلاصه 4 گزینه زیر تجزیه و تحلیل شده است:
-miningcore
-open-ethereum-pool
-NOMP (node open mining portal)
-MPOS (mining portal open source)
نرم افزار دیگری به نام Flexpool Solo وجود دارد اما هنوز آزمایش نشده است.
تجربه کار با Miningcore به دو دلیل بسیار خوب بود. اول اینکه این نرمافزار تمام دادههای گذشته را روی یک دیسک در دیتابیس SQL نگهداری میکند. در مقابل نرمافزار open-ethereum-pool دادهها را از طریق Redis تنها در RAM نگهداری میکند. ذخیرهسازی در دیسک در برابر ریبوت شدن (reboot) پایدار است و توانایی تحلیل دادهها را دارید. دوم دلیل تجربه خوب در استفاده از Miningcore خوانایی بالا و شیءگرایی کدهای آن است.
نرمافزار خود MiningDAO هم که با زبان Go نوشته شده یک انتخاب خوب است زیرا سرعت مناسبی دارد و در طراحی آن از Miningcore الگوبرداری شده است. انتظار میرود که این نرمافزار بهزودی متنباز شود اما تا آن زمان توصیه میشود از Miningcore استفاده کنید.
تاخیر در نرمافزار استخر را برطرف کنید
یکی از مشکلات اساسی که زمان استفاده از Miningcore (و ساخت استخر استخراج اتریوم) با آن روبرو میشوید روش کار آن در پردازش بهروزرسانیها است. این نرمافزار به طور پیشفرض هر نیم ثانیه یک RPC (remote procedure call یا فراخوانی رویهای دوردست) روی تمام نودها پینگ (Ping) میکند تا ببینید آیا آخرین کاری که باید انجام شود تغییر کرده یا خیر. این تنظیمات ممکن است برای ارزهای دیجیتال دیگری که زمان استخراج بلوکهای آن طولانیتر است کافی (برای بیتکوین با زمان استخراج بلوک ۱۰ دقیقهای این زمان قابل چشمپوشی است) اما برای اتریوم اینطور نبوده و این زمان باعث بالارفتن نرخ uncle میشود که مناسب نیست.
برای این منظور روش سادهای برای محاسبه افزایش نرخ uncle بهازای هر تأخیر در پردازش وجود دارد. زمان استخراج بلوکها از توزیع پواسون (یکی از توزیعهای احتمالی گسسته) پیروی میکند به این معنی که مهم نیست که چقدر زمان از استخراج آخرین بلوک گذشته باشد و احتمال پیداکردن بلوک بعدی در یک ثانیه بعدی (و یا میلیثانیه یا هر زمان دیگری) همیشه یکسان است.
بررسی و توضیح یک نمونه
برای مثال اگر اتریوم زمان استخراج بلوک ۱۳ ثانیهای را هدف قرار دهد، به این معنی است که احتمال اینکه بلوک در یک ثانیه بعدی استخراج شود با مقدار زیر برابر است:
یک ثانیه تقسیم بر ۱۳ ثانیه که تقریباً برابر با ۷.۷ درصد میشود. درصورتیکه استخر استخراج شما در هرکجا و به هر دلیل ۰.۱ ثانیه تأخیر داشته باشد، بهاندازه زیر به بلوکهای uncle اضافه میشود که در نتیجه این تأخیر است:
۰.۱ ثانیه که مقدار تأخیر است بر ۱۳ ثانیه که زمان استخراج بلوک است تقسیم میشود و عدد ۰.۷۷ درصد به دست میآید. درحالیکه ماینرهای شما در حال کارکردن روی یک کار قدیمی هستند به دلیل همان ۰.۱ ثانیه بلوکهای uncle ایجاد میشود. مجدد به توضیح Miningcore بر میگردیم. با استفاده از فرمول بالا، ۰.۵ ثانیه تأخیر در بهروزرسانی وظایف ماینرها باعث میشود ۴ درصد (۰.۵ تقسیم بر ۱۳) بلوک uncle اضافی داشته باشیم (این مقدار درصد مطلق است و نه نسبی). طبیعتاً این مقدار از خطاهای ساده قبل یا بعد از ساخت استخر استخراج اتریوم قابلقبول نیست.
آزمایشهای گستردهای انجام شده و در آن فرکانس بهروزرسانی از ۰.۵ ثانیه به ۵۰ میلیثانیه و کمتر کاهش پیدا کرد اما نتیجه این بود که این تغییرات فایدهای ندارد. بهروزرسانیها هنوز هم تا حد زیادی تأخیر داشتند.
یک راهحل بهتر این است که از ویژگی notifyWork که در Geth قرار داده شده استفاده کرد.
با این ویژگی بهمحض اینکه کار جدیدی در بهروزرسانیها قرار بگیرد آن را برای استخر استخراج ارسال میکند. برای بررسی، Miningcore استفاده شد و اصلاحات آن در این لینک منتشر شده است. بعد استفاده از notifyWork، نتایج نشان میدهد که تأخیرهای بین Geth و Miningcore عملاً ناچیز هستند بنابراین نرخ Uncle تا حد زیادی بهبود پیدا کرد (کمتر شد).
دیدگاهتان را بنویسید