راه اندازی یک Node ایمن Ethereum در Ubuntu

سلام. این اولین پست من تو ویرگوله. میخواستم با یه چیز خوب شروع کنم. البته ساده هست. من حدودا ۳ سالی هست تو حوزه کریپتوکارنسی فعال هستم. البته تو چند ماه اخیر فعالیتم کم شده اما اخبارش رو دنبال میکنم. تو این پست میخوام درباره راه اندازی یک Node ایمن برای ارز Ethereum بنویسم. امیدوارم که کمک کنه به شما.اول یک تعریف کوتاه درباره Ethereum بگم. Ethereum یک بستر اوپن سورس برای اجرای برنامه های غیرمتمرکز (Decenteralized) و البته قراردادهای هوشمنده. شاید تو یک پست مجزا درباره قراردادهای هوشمند بگم.همونطور که با خیلی از برنامه ها و بستر ها کار کردید، خیلیاشون به شما یک API میدن برای کار با اون بستر که Ethereum هم از این قاعده مستثنی نیست. شما میتونید از طریق RPC که شبیه REST API هست با Ethereum ارتباط برقرار کنین. حالا برای راه اندازیش باید چیکار کنیم ؟راه اندازی و پیکربندی کلاینت Gethراه اندازی و پیکربندی Nginx به عنوان Reverse Proxy راه اندازی و پیکربندی کلاینت Gethبرای دریافت آخرین نسخه رسمی این کلاینت میتونین به آدرس https://geth.ethereum.org/downloads برید و دانلود کنید. زمانی که این آموزش رو مینویسم آخرین نسخه ۱.۹.۱۳ هست.کارهای زیر رو انجام بدین:sudo apt-get update sudo apt-get upgrade -y wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.9.13-cbc4ac26.tar.gz tar -xzf geth-linux-amd64-1.9.13-cbc4ac26.tar.gz cd geth-linux-amd64-1.9.13-cbc4ac26 sudo mv geth /usr/local/bin/geth sudo chmod +x /usr/local/bin/gethخوب حالا کلاینت Geth شما آماده اجرا هست، اما بهتره اون رو به صورت یک سرویس راه اندازی کنیم. دستور زیر رو اجرا کنین:cat << 'EOF' | sudo tee /etc/systemd/system/geth.service > /dev/null [Unit] Description=Geth Client For Ethereum [Service] Type=simple User=username Restart=always ExecStart=/usr/local/bin/geth --rpc --syncmode &quotfast&quot --rpcaddr &quot127.0.0.1&quot --rpcport 8545 --rpcapi &quotweb3,personal,eth&quot --cache 4096 [Install] WantedBy=default.target EOFدستور بالا سرویسی با نام geth.service ایجاد میکنه. نکته ای که باید توجه کنید username هست که بولدش کردم. اون رو با نام کاربری ای که توی سرورتون هست و غیر از root عوض کنین.حالا دستورات زیر رو اجرا کنین. اولی برای فعال کردن سرویس به صورت خودکار هست. همون startup خودمون و دومی هم سرویس رو راه اندازی میکنه:sudo systemctl enable geth sudo systemctl start gethحالا که سرویس اجرا شد میتونید دستور curl زیر رو بزنین و وضعیت سینک شدن Node رو ببینین:curl -X POST 127.0.0.1:8545 \ --data '{&quotjsonrpc&quot:&quot2.0&quot,&quotmethod&quot:&quoteth_syncing&quot,&quotparams&quot:[],&quotid&quot:1}' \ -H 'Content-Type: application/json'دقت کنید که در حال حاضر فقط میتونید از داخل سرور درخواست بفرستین و با Node ارتباط داشته باشین، چون فقط روی 127.0.0.1 جواب میده. قصد ما اینه که کسی از بیرون نتونه به Node درخواست بده.راه اندازی و پیکربندی Nginx به عنوان Reverse Proxyبرای نصب Nginx این دستورات رو اجرا کنید:sudo apt install software-properties-common -y sudo add-apt-repository ppa:ondrej/nginx sudo apt update sudo apt install nginx -yبعد از نصب فایل پیکربندی پیشفرض رو باید ویرایش کنید. من اول خالیش میکنم و بعدش محتوای مورد نظرم رو با ادیتور Nano توش قرار میدم.sudo echo &quot&quot > /etc/nginx/sites-enabled/default sudo nano /etc/nginx/sites-enabled/defaultمحتوای زیر رو داخل فایل پیکربندی پیش فرض () قرار بدید:server { listen 80 default_server; location / { proxy_pass http://127.0.0.1:8545/; proxy_set_header Host $host; } }همونطور که تو کد بالا میبینید، تمامی درخواست هایی که به پورت ۸۰ ارسال بشه به وسیله این Reverse Proxy به Node ما تو سرور ارسال میشه.حالا میتونید درخواست های RPC خودتون رو از خارج از سرور ارسال کنید:curl -X POST x.x.x.x:80 \ --data '{&quotjsonrpc&quot:&quot2.0&quot,&quotmethod&quot:&quoteth_syncing&quot,&quotparams&quot:[],&quotid&quot:1}' \ -H 'Content-Type: application/json'خوب حالا همه چیز آماده هست اما هنوز Node شما ایمن نیست و هرکسی میتونه به سرور شما درخواست ارسال کنه. من برای این کار از Basic Authentication استفاده کردم تا یک نام کاربری و رمز عبور برای ارسال درخواست نیاز باشه. برای ساختن این نام کاربری و رمز عبور میتونین بسته apache2-utils رو نصب کنید:sudo apt install apache2-utils -yبعد از نصب باید یک فایل که حاوی نام کابری و رمز عبور شما هست ایجاد کنید. به جای username، هر نام کاربری ای که مورد نظرتون هست رو وارد کنید و بعد از شما درخواست رمز عبور میکنه که باید وارد کنید.sudo htpasswd -c /etc/nginx/.ethereum usernameبعد از اجرا و وارد کردن رمز عبور، محتوای فایل بالا چیزی شبیه این میشه:username:$apr1$viklpnqu$xWfZPGPENkctPiPm2nF740حالا باید دستورات مربوط به Authentication رو به Nginx اضافه کنیم. فایل پیکربندی پیشفرض رو باز کنید:sudo nano /etc/nginx/sites-enabled/defaultکدهای بولد شده رو مثل زیر اضافه کنید:server { listen 80 default_server; location / { auth_basic &quotProtected Area!&quot auth_basic_user_file /etc/nginx/.ethereum; proxy_pass http://127.0.0.1:8545/; proxy_set_header Host $host; } }بعد از این کار Nginx رو ریلود کنید تا فایل پیکربندی جدید اعمال بشه:sudo systemctl reload nginxحالا دستور Curl زیر رو بزنید و نتیجه رو ببینید:curl -X POST -u username:password x.x.x.x:80 \ --data '{&quotjsonrpc&quot:&quot2.0&quot,&quotmethod&quot:&quoteth_syncing&quot,&quotparams&quot:[],&quotid&quot:1}' \ -H 'Content-Type: application/json'خوب حالا Node شما ایمن شده و راحت میتونید برنامه خودتون رو برای ارتباط با این Node بنویسید.نکته مهمی که باید بهش اشاره کنم اینه که حجم فعلی دیتابیس Ethereum تا امروز معادل ۱۳۲ گیگابایته. مورد دیگه ای هم که خیلی مهمه اینه من نوع Sync کردن رو روی Fast گذاشتم. که حجم کمتری میگیره و البته کار شما رو هم راه میندازه.حجم دیتابیس Ethereumخوب اینم از پست اول و آموزش من. امیدوارم که خوب بوده باشه. اگر سوالی بود بپرسید.