ورود به تارنما

منتشر شده در گروه : امنیت شبکه - اینترنت

یک بلاکچین خصوصی ایجاد کنیم

27 آوریل 2018 نوشته شده توسط 

 

در مطلبی باعنوان "مکانیزم ایتریوم و قراردادهای هوشمند" با فناوری بلاکچین ایتریوم و چگونگی عملکرد آن آشنا شدیم، البته مطالب بسیاری وجود دارد که باید آنها را مطالعه کنید، اما در این بخش می خواهیم برای آنکه تا حدی با جزئیات فناوری ایتریوم آشنا شویم، یک بلاکچین خصوصی را با استفاده از فناوری بلاکچین ایتریوم پیاده سازی کنیم.

 

شبکه بلاکچین ایتریوم از تعداد زیادی EVM (Ethereum Virtual Machine)، یا گره  تشکیل شده است، که همه آنها یک شبکه بهم پیوسته مش (Mesh) را ایجاد کرده اند. در هر گره یک نسخه کامل از تمام بلاکچین ایتریوم قرار دارد و ازآن برای بدست آوردن گره بعدی و یا اعتبارسنجی تراکنش ها استفاده می شود. زمانی که یک بلاک جدید اضافه می شود، بلاکچین اطلاعات مربوط به آن را بروز می کند و آن را در تمام شبکه بلاکچین منتشر می کند، تا به این ترتیب همه گره ها به روز رسانده شوند.

 

برای اینکه بتوانیم یک گره  در شبکه ایتریوم باشیم، باید یک نسخه کامل از بلاکچین ایتریوم را دانلود کنیم و آن را بروز رسانی کنیم. برای اینکار بلاکچین ایتریوم ابزارهایی را ارائه کرده است، برای برقراری ارتباط و استفاده از آنها کافی است که به شبکه ایتریوم متصل شویم.  این ابزارها عبارتند از:

 Geth ابزاری برای ساختن رابط کاربری تحت وب برای بلاکچین ایتریوم می باشد.

 Eth اگر بخواهیم برای امنیت بیشتر دو نسخه مختلف از بلاکچین مورد نظر را به صورت موازی اجرا کنیم و یا اینکه بخواهیم از فناوری پردازش موازی GPU استفاده کنیم، آنگاه ابزار Eth با قابلیت برنامه نویسی به زبان C++ برای این منظور در نظر گرفته شده است.

 Pyethapp در صورتی که بخواهیم از زبان پایتون برای توسعه کاربرد مورد نظراستفاده کنیم، و بخواهیم کاربردی را به صورت  غیرمتمرکز با استفاده از فناوری بلاکچین ایتریوم پیاده سازی کنیم، این ابزار می تواند بسیار مناسب باشد.

 همه این ابزارها امکان دسترسی به یک کنسول رابط کاربری که یک محیطی پیاده سازی شده با زبان جاوااسکریپت می باشد، را می دهند. از طریق این کنسول امکان دسترسی به کلیه امکانات و قابلیت های موجود در بلاکچین ایتریوم فراهم شده است.

 در این مثال از Geth استفاده خواهیم کرد، ابزاری که توسعه دهندگان وب سایت ها تمایل بیشتری برای استفاده از آن دارند.

 Geth   نام اختصاری ابزار پیاده سازی Ethereum’s Go می باشد.

 این ابزار دارای رابط کاربری خط فرمان می باشد، این ابزار امکان برقراری ارتباط با شبکه ایتریوم را دارد و به عنوان رابط بین گره های موجود در این شبکه می باشد.

 اگر بلاکی توسط گره دیگری در شبکه ایتریوم ایجاد شود، برنامه Geth شما از طریق آن اطلاعات مورد نیاز را دریافت می کند و سپس آن را به CPU و یا GPU مورد نظر ارسال می کند، تا بدین ترتیب اطلاعات بلاکچین ایتریوم مورد استفاده را بروز رسانی کند. با استفاده از Geth عملیات زیر را می توانیم انجام دهیم:

 ·        ارز دیجیتال Ether (قوه محرکه برای شبکه ایتریوم محسوب می شود) را تولید کنیم.

 ·         ارزهای دیجیتال را بین آدرس های مختلف منتقل کنیم.

 ·        قراردادهای هوشمند ایجاد کنیم و تراکنش ها را به آنها ارسال کنیم.

 ·        سوابق مربوط به بلاک ها را مرور کنیم و بسیار از کارهای دیگر....

 اکنون می خواهیم Geth را نصب کنیم.

 برای اینکه بخواهید این ابزار را بر روی مک نصب کنید، باید ابتدا Homebrew را دانلود و نصب کنید،

 کاربران ویندوز و لینوکس:

 در این آدرس می توانید آخرین نسخه تست شده از ابزار Geth را دانلود کنید. در این آدرس نیز می توانید مراحلی را که بعد دانلود باید انجام دهید را مشاهده خواهید کرد.

 پس از اینکه Geth را نصب کردید، از لحاظ فنی امکان برقراری ارتباط با شبکه اصلی و عمومی ایتریوم را خواهید داشت و می توانیم به عنوان یک گره واقعی وارد شوید. البته در این مطلب قصد انجام اینکار را نداریم، زیرا هدف ما ایجاد یک بلاکچین خصوصی می باشد و در ضمن در حال حاضر چون ارز دیجیتال Ether در اختیار نداریم، کاری در این شبکه نمی توانیم انجام دهیم.

 در صورتی که Ether نداشته باشیم، برای شروع  چه کارکنیم؟

 در صورتی که Ether در اختیار نداشته باشیم، ایتریوم به ما امکان ایجاد شبکه بلاکچین خصوصی را می دهد. این شبکه از لحاظ عملکرد همانند شبکه اصلی و عمومی ایتریوم کار می کند، با این تفاوت که امکان دسترسی به کلیه تراکنش ها و قراردادهای هوشمند فقط برای گره های موجود در آن امکان پذیر می باشد.

 ایجاد بلاکچین خصوصی ایتریوم

 با استفاده از ابزار Geth یک بلاکچین خصوصی ایتریوم (testnet) ایجاد خواهیم کرد. این کار به این روش برای یادگیری مفاهیم موجود در بلاکچین ایتریوم می باشد. با استفاده از این ابزار می توانیم قراردادهای هوشمند ایجاد کنیم و تراکنش های مورد نیاز را ایجاد کرده و یا حتی کاربردهای گسترده و غیرمتمرکز بر روی شبکه بلاکچین خصوصی مورد نظر ایجاد کنیم. در این شبکه خصوصی می توانیم برای خودمان یک ارز دیحیتال ایجاد کرده و از آن برای ایجاد، انتقال تراکنش ها  و پیاده سازی قراردادهای هوشمند استفاده کنیم.

 بلاکچین و بلاک Genesis

 بلاکچین

 آنچنان که تا کنون یاد گرفته اید؛ بلاکچین در واقع یک دفتر دیجیتال برای ثبت تراکنش ها و سوابق مربوط به آنها به صورت گسترده و عمومی می باشد. این تراکنش ها در بلاک ها ذخیره می شوند، هر گره در این شبکه گسترده می تواند بلاک بعدی در این شبکه را استخراج کند. در صورتی که بلاک  معتبر جدید یافت شود، به بلاکچین اضافه می شود و اطلاعات مربوط به آن در شبکه بلاکچین پخش می شود. سپس  گره ها این اطلاعات را دریافت می کنند و خود را با استفاده از آن بروز می کنند.

 هر بلاکچین با یک بلاک  Genesis شروع می شود، این بلاک در واقع بلاک شماره صفر در بلاکچین می باشد، تنها بلاکی که قبل از آن بلاک دیگری قرار ندارد.  

 

برای اینکه بتوانیم بلاکچین خصوصی خود را ایجاد کنیم، باید ابتدا یک بلاک Genesis ایجاد کنیم. برای اینکار، ابتدا یک فایل Genesis با محتویات مورد نظر ایجاد می کنیم، سپس با استفاده از Geth و از طریق فایل Genesis، اقدام به ایجاد بلاک Genesis می کنیم، و این نقطه شروع بلاکچین خصوصی خواهد بود.

 محتویات فایل Genesis بلاکچین مورد نظر به صورت زیر می باشد:

 

{
    "config": { 
        "chainId": 987,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
    "difficulty": "0x400",
    "gasLimit": "0x8000000",  //set this really high for testing
    "alloc": {}

}
}

 

تنظمیات مشخص شده در فایل Genesis به شرح زیر می باشند:

 config: در این بخش تنظمیات مربوط به بلاکچین خصوصی مورد نظر را تعریف می کنیم.

 chainId: شماره شناسایی بلاکچین خصوصی مورد نظر می باشد، بلاکچین اصلی و عمومی ایتریوم داری شماره شناسایی مخصوص به خود می باشد (ID)، اما برای بلاکچین خصوصی مورد نظر از یک کد شناسایی منحصر به فرد استفاده می کنیم.

 homesteadBlock: Homestead دو ویرایش اصلی از ساختار ایتریوم می باشد و اولین نسخه تولید شده از ساختار فناوری ایتریوم محسوب می شود. در این ساختار برخی از پروتکل ها تغییر کرده اند. با توجه به اینکه از این ساختار استفاده نمی کنیم، مقدار این متغیر را صفر قرار می دهیم.

 eip155Block/eip158Block: ساختار Homestead با بسیاری از قابلیت های که با نسخه های قبلی آن سازگار نمی باشند، ارائه شده است. این تغییرات توسط فناوری EIP (Ethereum Improvement Proposal) در ویرایش مختلف این ساختار مشخص می شود. در این مثال با توجه به اینکه از ساختار Homestead استفاده نمی کنیم، مقدار این متغیر را صفر در نظر می گیریم.

 difficulty: با استفاده از این متغیر می توانیم زمان مورد نیاز برای تولید بلاک ها را بلاکچین خصوصی مورد نظر کنترل کنیم. با افزایش مقدار این متغیر، باید محاسبات بیشتری برای استخراج بلاک مورد نظر انجام شود، در این مثال، مقدار این متغیر را کم در نظرمی گیریم تا سرعت انجام عملیات افزایش یابد.

 gasLimit: با استفاده از این متغیر حد مورد نظر برای gas در هر بلاک را مشخص می کنیم. gas در واقع سوخت ایتریوم می باشد که برای هر بلاک در نظر گرفته می شود و توسط آن برای هر تراکنش مصرف می شود. مقدار این متغیر را به اندازه کافی بزرگ در نظر می گیریم تا در ضمن انجام عملیات با محدودیت مقدار آن مواجه نشویم.

 alloc: با استفاده از این متغیر می توانید محل ایجاد و محتویات ارز دیجیتال مورد استفاده در بلاکچین خصوصی را مشخص کنید. برای این مثال چون می توانیم ارز دیجیتال مورد نظر را به راحتی و به سرعت ایجاد کنیم؛ از این گزینه استفاده نمی کنیم.

 اکنون برای شروع، فایلی با نام CustomGenesis.json را ایجاد می کنیم. برای اینکار از یک ویرایشگر متن استفاده می کنیم و فایل ایجاد شده را در یک پوشه بر روی دیسک ذخیره می کنیم.

 سپس پنجره ترمینال را باز می کنیم و با فرض اینکه قبلا ابزار Geth را نصب کرده اید، دستور زیر را وارد می کنیم:

 geth identity “yourIdentity” init /path_to_folder/CustomGenesis.json datadir /path_to_your_data_directory/ACPrivateChain

 

 با استفاده از دستور بالا، ابزار Geth اقدام به تولید بلاک Genesis با استفاده از محتویات فایل CustomGenesis.json می کند. در این دستور مسیری را برای ذخیره سازی اطلاعات مربوط به بلاکچین خصوصی را مشخص می کنیم. دقت کنید که این مسیر باید از مسیر مورد استفاده برای بلاکچین عمومی و اصلی ایتریوم متفاوت باشد.

 با اجرای دستور بالا باید در پنجره ترمینال پیامی مبنی به اجرای موفقیت آمیز عملیات توسطGeth دریافت کنید.

 

ایجاد یک شبکه خصوصی برای اشتراک بلاکچین مورد نظر

 تا این مرحله، اولین قدم را در راه ایجاد بلاکچین خصوصی مورد نظر را برداشتیم. اکنون می بایست شبکه خصوصی مورد نظر برای استفاده از بلاکچین ایجاد شده را تعریف کنیم، با استفاده از این شبکه می توانیم بلاک های بعدی را استخراج کرده و به بلاکچین خصوصی اضافه کنیم.

 برای اینکار دستور زیر را در پنجره ترمینال اجرا می کنیم:

geth --datadir /path_to_your_data_directory/ACPrivateChain --networkid 9876

 با استفاده از این دستور از ابزار Geth می خواهیم که شبکه خصوصی مورد نظر را راه اندازی کند و از مسیر فهرست مورد نظر (در دستور ایجاد بلاک Genesis مشخص شده است) می خواهیم که به بلاکچین خصوصی دسترسی پیدا کند.

 در دستور بالا از پارامتر networked استفاده کرده ایم، با استفاده از این پارامتر برای شبکه ایتریوم مورد نظر یک کد شناسایی تعیین می کنیم. در این مثال از عدد 9876  استفاده کرده ایم، اما توجه داشته باشید که در زمان ایجاد بلاکچین خود باید از یک عدد اتفاقی دیگر استفاده کنید تا با شبکه سایرین تداخلی ایجاد نشود.

 شبکه اصلی و عمومی ایتریوم دارای شماره شناسایی 1 می باشد، در این فهرست می توانیم همه شبکه های ایتریوم را به همراه کد شناسایی آنها مشاهده کنید.

0: Olympic, Ethereum public pre-release testnet
1: Frontier, Homestead, Metropolis, the Ethereum public main network
1: Classic, the (un)forked public Ethereum Classic main network, chain ID 61
1: Expanse, an alternative Ethereum implementation, chain ID 2
2: Morden, the public Ethereum testnet, now Ethereum Classic testnet
3: Ropsten, the public cross-client Ethereum testnet
4: Rinkeby, the public Geth Ethereum testnet
42: Kovan, the public Parity Ethereum testnet
7762959: Musicoin, the music blockchain

 با اجرای دستور بالا، شبکه بلاکچین خصوصی شما فعال خواهد شد. در شکل آنچه که در صفحه ترمینال مشاهده خواهید کرد؛ نشان داده شده است.

 

یک مورد مهم. هر زمان که بخواهیم به شبکه بلاکچین خصوصی دسترسی پیدا کنیم، باید دو دستور زیر را به همان ترتیب ارائه شده اجرا کنیم، زیرا Geth نمی تواند تنظیمات مربوط به بلاکچین خصوصی را به خاطر بسپارد.

  #1
geth
identity “yourIdentity” init /path_to_folder/CustomGenesis.json datadir /path_to_your_data_directory/YOUR_FOLDER

 

#2
geth --datadir /path_to_your_data_directory/ACPrivateChain --networkid YOUR_NETWORK_ID

 

 در صورتی که عملیات مورد نظر را تا این مرحله بدرستی انجام داده باشید، شبکه بلاکچین خصوصی مورد نظر ایجاد و فعال می باشد. اکنون می خواهیم با بلاکچین خصوصی مورد نظر از طریق حساب کاربری، ارتباط برقرار کنیم.

 ایجاد حساب کاربری EOA (Externally Owned Account)

 اکنون می خواهیم برای دسترسی به شبکه بلاکچین مورد نظر یک حساب کاربری ایجاد کنیم.

 

زمانی که اولین پنجره ترمینال Geth باز می باشد، پنجره ترمنیال دوم Geth را باز می کنیم و دستور زیر را در آن وارد می کنیم:

geth attach /path_to_your_data_directory/YOUR_FOLDER/geth.ipc

 با اینکار پنجره ترمینال دوم به پنجره ترمینال اول مرتبط می شود، اکنون می بایست کنسول جاوااسکریپت را به شکل زیر مشاهده کنید:

 

اکنون از طریق کنسول جاوااسکریپت، می توانید حساب کاربری مورد نظر را ایجاد کنید:

personal.newAccount()

 

پس از اجرای دستور بالا، از شما برای رمز عبور سوال خواهد و سپس حساب کاربری ایجاد می شود.

این حساب کاربری را در محلی نگهداری کنید، بعدا به آن نیاز خواهید داشت.

 با استفاده از دستور زیر می توانیم میزان ارز دیجیتال (ether) موجود در حساب کاربری مورد نظر را مشاهده کنیم.

eth.getBalance("ENTER_YOUR_ACCOUNT_NUMBER_HERE")

 آنچه دریافت خواهیم کرد، عدد صفر خواهد بود، طبیعی است که بلافاصله در شروع ایجاد حساب کاربری هنوز ارز دیجیتالی در کیف پول الکترونیکی مربوط به آن قرار نداشته باشد.

 

اکنون که شبکه خصوصی بلاکچین فعال می باشد و برای دسترسی به آن حساب کاربری مورد نظر را ایجاد کرده ایم، زمان استخراج بلاک و افزودن آن به بلاکچین مورد نظر رسیده است.

 استخراج ether برای حساب کاربری مورد نظر

 عملیات استخراج در بلاکچین اصلی و عمومی ایتریوم کاری بسیار پیچیده و زمان بر می باشد، اما عملیات استخراج در بلاکچین خصوصی مورد نظر سریع و ساده انجام می شود،  برای این کار دستور زیر را  وارد می کنیم:

miner.start()

 در صورتی که به کنسول دیگر Geth نگاه کنید، مشاهده خواهید که بلاک مورد نظر با موفقیت استخراج شده است. به مدیت 10 تا 15 ثانیه صبر کنید و سپس موجودی کیف پول خود را کنترل کنید.

 

اکنون که ether دارید می توانید توابعی را برای ایجاد و ارسال تراکنش های مورد نظر ایجاد کنید. برای اینکه عملیات استخراج بلاک ها را متوقف کنید، دستور زیر را وارد کنید.

miner.stop()

 در مطلب بعدی که ارائه خواهیم داد، قصد داریم که گره دیگری به شبکه اضافه کنیم و سپس با تعریف قرارداد هوشمند بین آنها تراکنش های مورد نظر را منتقل کنیم، با ما همراه باشد.

آخرین تغییرات در 16 نوامبر 2018
بازدید 1380 دفعه
امتیاز این مطلب
(0 رای)
نشانه گذاری شده در
مدیر تارنما

مهندس مهران تاجبخش

نام سایت : www.mehrantajbakhsh.com
برای ارسال نظر ابتدا وارد سایت شوید

تازه ترین مطالب