راه اندازی شبکه خصوصی(محلی) اتریوم در VirtualBox

شاید برای شما پیش آمده باشد که بخواهید شبکه بلاکچین اتریوم را به صورت شخصی و محلی روی کامپیوتر (متفاوت از شبکه testnet و mainnet) خود شبیه سازی کنید تا بتوانید نحوه کار و فرایند ها در آن را بهتر درک کنید. در اینترنت منابع انگلیسی متعددی در مورد راه اندازی یک شبکه خصوصی اتریوم روی یک سیستم وجود دارد اما تعدادی از از آنها قدیمی هستند و به دلیل تغییرات و بروزرسانی های اتریوم در هنگام پیاده سازی دچار مشکل می شوند. در اینجا سعی کردم راه اندازی این شبکه اتریوم خصوصی را جامع تر، به صورت گام به گام و به زبان فارسی آموزش بدهم.همان طور که می دانیم شبکه اتریوم شامل گره هایی (node) است که به صورت همتا به همتا (peer-2-peer) با یک دیگر مانند شکل بالا در ارتباط هستند. این راهنما، راه اندازی شبکه اتریوم شامل 3 گره را با استفاده از Go Ethereum (Geth) و به صورت خصوصی روی سیستم شخصی خود (local) شبیه سازی می کند. هنگامی که شبکه بلاکچین اتریوم به شبکه اصلی متصل نباشند و به صورت محلی و مستقل کار کنند به این شبکه، یک شبکه خصوصی می گوییم. باید توجه داشت در اینجا خصوصی فقط به معنای جدا شده یا شخصی است، نه محافظت شده یا امن. این شبکه ی کاملاً محلی و خصوصی را می توان به عنوان پشتوانه ای برای توسعه دهندگان و کسانی که روی مسائل مربوط به شبکه/بلاک چین کار می کنند مفید دانست. به منظور شبیه سازی و درک راحت تر نحوه کار این شبکه خصوصی، ما در این جا تمام گره ها را روی یک ماشین مجازی (VM) در VitualBox و با سیستم عامل Ubuntu راه اندازی می کنیم. اما شما می توانید این کار را روی چند ماشین مجازی یا به صورت فیزیکی در یک شبکه واقعی محلی (LAN) پیاده سازی کنید. پیش نیاز ها:نصب و راه اندازی Ubuntu روی VitualBox با استفاده از راهنمای اینجاانجام تنظیمات شبکه VirtualBox و اتصال به اینترنتسپس دستورات زیر را به ترتیب برای نصب go-ethereum (Geth) وارد می کنیم:sudo apt-get update sudo apt-get upgrade sudo add-apt-repository -y ppa:ethereum/ethereum sudo apt-get install ethereumنصب Geth روی Ubuntuراه اندازی شبکه خصوصی اتریوم:1- ساخت دایرکتوری Nodeها: چون قصد داریم تا شبکه ی ما دارای سه Node باشد بنابراین سه دایرکتوری برای هر سه Node می سازیم که همه آنها دارای بلاک genesis و network ID یکسان خواهند بود. اگر روی VM جداگانه در حال کار هستید هریک از این دایرکتوری ها روی یک ماشین خواهد بود.mkdir Node1 Node2 Node3ساخت دایرکتوری برای سه Node2- ساخت Account: هر گره دارای یک حساب کاربری (Account) خواهد بود که اطلاعات مربوط به هرکدام شامل کلید خصوصی و آدرس اتریوم در آن قرار می گیرد. برای این کار با استفاده از دستور زیر برای هر گره یک Account می سازیم که در آن 'DirectoryName' (بدون ' ' ) نام دایرکتوری هر گره است:geth --datadir 'DirectoryName' account newهنگام اجرای این دستور از ما می خواهد تا یک پسورد برای حفظ امنیت فایل های ساخته شده وارد کنیم زیرا این فایل ها دارای اطلاعات محرمانه کلید خصوصی است نیاز به وارد کردن پسورد دارد. بعد از اجرای این دستور در دایرکتوری هر Node اطلاعات مربوط به Account در داخل keystore قرار می گیرد.اطلاعات مربوط به Account هر Nodeهمان طور که مشاهده می شود هر Node یک ادرس عمومی دارد که در دایرکتوری keystore مربوط به هر Node ذخیره شده است.3- ذخیره پسورد: پسوردهایی را که هنگام ایجاد حساب‌ها وارد کرده‌اید را با استفاده از دستورات زیر ذخیره کنید.echo 'node1Password' > Node1/password.txt echo 'node2Password' > Node2/password.txt echo 'node3Password' > Node3/password.txtدر دستورات بالا بجای 'node1Password' پسورد هنگام ساخت Account را قرار دهید (همراه با ' ' ) تا فایل پسورد مربوط به هر Node در داخل دایرکتوری آن ایجاد شود.4- ایجاد فایل genesis: اولین بلوک در بلاکچین، بلوکی به نام genesis است که به صورت دستی ایجاد می شود و بلوک های بعدی به صورت خودکار توسط شبکه به آن متصل (زنجیر) می شوند. اتریوم برای ایجاد یک شبکه خصوصی دو مکانیزم اجماع (consensus mechanism) شامل اثبات سهم (PoS) و اثبات اعتبار (PoA) برای ارائه می دهد. در این آموزش ما بلوک genesis را براساس PoA که از الگوریتم Clique استفاده می کند می سازیم. برای این کار اطلاعات تصویر زیر را در یک فایل متنی کپی می کنیم و با اسم genesis.json مانند شکل زیر ذخیره می کنیم. شما مس توانید این فایل را از اینجا دانلود کنید.بلوک genesisدر این فایل در کادر مربعی قرمز رنگ آدرس های عمومی سه Node قرار می گیرد که در مرحله ساخت account تولید شدند و در مقابل آن مقدار balance یا موجودی اتر هر Node را می توان به دلخواه براساس مقیاس Wei مشخص کرد. در قسمتی که با خط قرمز مشخص شده است آدرس Node تایید کننده تراکنش ها(signer/miner) را به دلخواه مشخص می کنیم. توضیحات مربوط به سایر پارامترهای این فایل خارج از حوصله این مقاله است.5- اختصاص بلوک genesis به Nodeها: حال باید هر گره(Node) در شبکه با همان بلوک genesis مقداردهی اولیه شود یا اصطلااحا به آن شناسانده شود.با استفاده از دستورات زیر فایل json را برای هر Node مقدار دهی اولیه می کنیم.geth init --datadir Node1 genesis.json geth init --datadir Node2 genesis.json geth init --datadir Node3 genesis.jsonاختصاص بلوک genesis به Node1 6- راه اندازی bootnode: گام بعدی پیکربندی یک bootnode است. گره های boot به عنوان تسهیل کننده اتصال گره ها و در واقع راه ورود و اتصال گره ها شبکه بلاکچین به یکدیگر هستند. این گره ها هیچ اطلاعاتی از وضعیت شبکه بلاکچین را نگه داری نمی کنند و می توانند هر گره ای از شبکه باشند. برای پیکره بندی آن نیاز انجام به تنظیماتی روی آن گره دارد. در این آموزش از ابزار bootnode که همراه با geth نصب شده برای پیکربندی سریع و آسان یک گره استفاده می شود. ابتدا گره bootnode به یک کلید نیاز دارد که با دستور زیر می توان آن را ایجاد کرد، این دستور یک کلید را در فایل boot.key ذخیره می کند: bootnode -genkey boot.keyکلید bootenodeبعد از ایجاد کلید با استفاده از دستور زیر bootnode را راه اندازی می کنیم. bootnode -nodekey boot.key -addr :30305انتخاب پورت ارسال شده به addr- دلخواه است، اما شبکه های عمومی اتریوم از 30303 استفاده می کنند، بنابراین بهتر است از انتخاب این پورت اجتناب شود. این دستور log را روی ترمینال نشان می دهد که نشان دهنده در حال اجرا بودن آن است. مقدار enode در این log برای اتصال Nodeها به یکدیگر در گام بعد بکار می رود.راه اندازی bootnode7- ایجاد شبکه p2p واتصال Nodeها: اکنون می توان سه گره را راه اندازی و به یکدیگر متصل کرد. ترمینال های جداگانه ای را برای هر گره باز می کنیم و bootnode را در ترمینال اصلی بگذارید فعال باشد. در هر ترمینال، دستورات زیر را برای هر Node اجرا می کنیم. به هر Node شماره port-- و authrpc.port-- دلخواه اما متفاوت بدهید اما نقطه اتصال آنها یعنی bootnode و شناسه شبکه (net id) ثابت است که در مرحله قبل ساخته شد و با کادر قرمز نشان داده شد. همچنین آدرس عمومی هر Node و فایل رمز عبور برای هر گره که باید ارائه شود. دستور زیر برای اتصال گره ها از طریق bootnode را نشان می دهد.geth --datadir 'node direcrtory' --port 'port number' --bootnodes 'generated bootnode' --networkid 'net ID' --unlock 'node address' --password 'password file' --authrpc.port 'port'در دستورات بالا مقادیر مناسب(داخل ' ') را برای هر گره قرار می دهیم. به عنوان مثال در این آموزش برای گره اول در ترمینال جداگانه دستور زیر را وارد می کنیم: geth --datadir Node1 --port 30306 --bootnodes enode://2418adaab03e183a9aa96d75ca56134f97090073797400e2d6599ee211a9eca474eeb1c701dc6d34c00cf881a9fe92a22c0af9b48636bc6aacc8257083e19350@127.0.0.1:0?discport=30305 --networkid 123454321 --unlock 0xa200de2eec49c000fecaa0de891dfba1f0e58e62 --password Node1/password.txt --authrpc.port 8551 در ترمینال دوم برای گره دوم: geth --datadir Node2 --port 30307 --bootnodes enode://2418adaab03e183a9aa96d75ca56134f97090073797400e2d6599ee211a9eca474eeb1c701dc6d34c00cf881a9fe92a22c0af9b48636bc6aacc8257083e19350@127.0.0.1:0?discport=30305 --networkid 123454321 --unlock 0xc4040f83c57587580d79102f6f4a7d3247ce9d33 --password Node2/password.txt --authrpc.port 8552در ترمینال سوم برای گره سوم: geth --datadir Node3 --port 30308 --bootnodes enode://2418adaab03e183a9aa96d75ca56134f97090073797400e2d6599ee211a9eca474eeb1c701dc6d34c00cf881a9fe92a22c0af9b48636bc6aacc8257083e19350@127.0.0.1:0?discport=30305 --networkid 123454321 --unlock 0x91e9e59c5de8bee175eeb2757a3d837081c5ab17 --password Node3/password.txt --authrpc.port 8553شکل زیر اجرای دستورات بالا را برای گره اول (Node1) نشان می دهد.دستور اتصال Node1 به bootnode* نکته: در صورتی که این عملیات روی چند VM جداگانه یا در شبکه محلی LAN اجرا می کنید باید توجه داشته باشید که به جای آدرس 127.0.0.1 در کادر قرمز رنگ تصویر بالا باید آدرس IP گره ای که bootnode روی آن فعال است را بدهید. حال بعد از اجرا دستور در Node2 و به محض اتصال آن، یک اتصال روی ترمینال Node1 مانند شکل زیر ظاهر می شود.اتصال گره دوم و نمایش تعداد 1 اتصال در ترمینال Node1و بعد اتصال Node3 (گره سوم) تعداد اتصال به 2 تغییر می کند. این بدین معنی است که هر Node به دو Node دیگر از متصل است. اتصال سومین گره و نمایش تعداد 2 اتصال در ترمینال Node1 در شکل زیر نمایی از ترمینال اتصال تمام Nodeها همراه با ترمینال bootnode را مشاهده می کنید که نشان می دهد هر گره به دو گره دیگر متصل است.نمایش اتصال تمام Nodeها در یک نما8- اتصال هر Node به بلاکچین eth: برای تعامل و کار با گره ها و انجام کارهای مختلف مانند انتقال اتر یا گرفتن موجودی و غیره، باید هر Node را به بلاک چین موردنظر متصل شویم. برای این کار یک ترمینال را باز کنید و از دستور زیر برای اتصال به Node استفاده کنید. دستور زیر را برای هر یک از گره ها در یک ترمینال جداگانه اجرا کنید زیرا در دنیای واقعی هر یک از این Nodeها روی سیستم های متفاوتی پیاده شده است.geth attach Node1/geth.ipc geth attach Node2/geth.ipc geth attach Node3/geth.ipcبعد از این دستور، یک کنسول API جاوا اسکریپت را به هر یک از گره ها وصل (attach) می کند تا بتوان مشخصات شبکه را پرس و جو (query) کرد و با این شبکه خصوصی اتریوم تعامل داشت. شکل زیر اتصال Node1 به شبکه بلاک چین را از طریق این API نشان می دهد.attach9- تعامل با شبکه: حال که تمام تنظیمات و اتصالات در شبکه را انجام دادیم و به Node مورد نظر متصل کردیم می توانیم با شبکه از طریق این API تعامل داشته باشیم.به عنوان مثال برای نشان دادن تعداد Nodeهای متصل دستور زیر را وارد می کنیم > net.peerCount برای دریافت میزان موجودی یک Account(همراه با ' ') (هر Node دارای یک حساب است):> eth.getBalance('AccountAddress')انتقال اتر :> eth.sendTransaction({from: 'AddressSender', to: 'AddressreRecipient', value: 'Value'})در شکل زیر نتایج اجرای این دستورات در شبکه اتریوم محلی که ما شبیه سازی کرده ایم را نشان می دهد. دستورات تعاملی account مربوط به Node1 با شبکه بلاکچین از طریق API همان طور که در شکل بالا مشاهده می کنید مقدار موجودی دو Node همان مقداری است که در بلوک اولیه (genesis) قرار دادیم. همچنین بعد از انجام تراکنش (انتقال اتر) تاییدیه هش آن تراکنش را نمایش می دهد. اما برای تکمیل فرایند انتقال باید miner/signer ها این تراکنش را تایید کنند تا انتقال اتر انجام شود. اگر به خاطر داشته باشید، ما در گام 4 (ایجاد فایل genesis) گره اول را به عنوان تاییدکننده اولیه در آن مشخص کردیم. بنابراین می توانیم قابلیت mine کردن این گره را با استفاده از دستورات زیر در همین کنسول فعال کنیم تا تراکنش های ما تایید شوند: > eth.accounts #show list of account > miner.setEtherbase('NodeAddress') > miner.start(2)فعال کردن Node1 به عنوان miner/signer و انجام تراکنش در تصویر زیر مشاهده می کنید که ترمینال مربوط به Node1 بعد از اجرای دستور بالا تبدیل به miner شده و علاوه بر نشان دادن تعداد اتصال ها، اطلاعات مربوط به بلوک و تراکنش های انجام شده در شبکه را پایش می کند.پایش شبکه شامل تعداد اتصالات ، بلوک ها و تراکنش ها برای آشنایی با دستورات بیشتر در این شبکه بلاکچین می توانید از کتابخانه های Web3js و Web3py که به زبان های جاوا اسکریپت و پایتون توسعه یافته اند استفاده کنید. این کتابخانه شامل مجموعه‌ای از ماژول‌هایی است که دارای قابلیت‌هایی برای کار با اکوسیستم اتریوم هستند. سخن پایانی:در این مقاله سعی کردم تا راه اندازی یک شبکه خصوصی اتریوم را به صورت گام به گام آموزش بدهم. امیدوارم این آموزش برای علاقه مندان این حوزه مفید باشد. در صورت مشاهده اشکال نگارشی، محتوایی یا همچنین واضح نبودن توضیحات، می توانید در قسمت نظرات به من اطلاع دهید تا اسرع وقت آن را اصلاح کنم.