انجمن توسعه قرارداد هوشمند

آموزش کار با (Go Ethereum)GETH- بخش دوم

در بخش اول در مورد ویژگی های ابزار geth توضیح داده شد، و به نحوه نصب و اجرای آن اشاره شد. در این مقاله قصد داریم به کمک geth یک بلاکچین خصوصی ایجاد کنیم، بلاک های آن را ماین کنیم و در نهایت یک تراکنش روی این شبکه انجام دهیم.

ایجاد اکانت اتریوم

قبل از ایجاد یک بلاکچین خصوصی نیاز داریم تا یک حساب اتریوم ایجاد کنیم با استفاده از دستور زیر:

$ geth account new

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

همان طور که در تصویر مشاهده می کنید در قسمت path of the secret key file آدرس محل ذخیره سازی کلید خصوصی مربوط به آدرس ایجاد شده به صورت رمزنگاری شده مشخص شده است. محل ذخیره سازی این کلید در پوشه keystore مربوط به نود شبکه اصلی است.

ساخت بلاکچین خصوصی

قبل از هر چیز یک پوشه برای بلاکچین خصوصی خود بر روی سیستم ایجاد کنید.
ساخت هر بلاکچین با یک بلاک آغازین یا بلاک genesis آغاز می شود. برای این کار می بایست یک فایل با فرمت json ایجاد کنیم و تنظیمات بلاک آغازین را در آن قرار دهیم. یک فایل با نام genesis.json داخل پوشه بلاکچین خود ایجاد کنید و محتویات زیر را داخل آن کپی کنید.


{
  "config": {
        "chainId": 4568,
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
  "alloc"      : {},
  "difficulty" : "400",
  "extraData"  : "",
  "gasLimit"   : "15000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00"
}

در ادامه بخش های مختلف فایل genesis توضیح داده می شود:

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

    1.1 chainId: مشخص کننده بلاکچین است. زنجیره اصلی اتریوم با شماره 1 مشخص می شود؛ شبکه تست
    Ropsten با شماره زنجیره 3 مشخص می شود؛ Rinkeby شماره 4 و Kovan شماره 42 است. شبکه خصوصی ای که ما ایجاد می کنیم دارای شماره زنجیره 4568 است. این عدد می تواند هر شماره دلخواهی که قبلا استفاده نشده است؛ باشد. با یک کلاینت مشترک می توان به انواع شبکه های اتریوم متصل شد.
    1.2 homesteadBlock: این فیلد و سه فیلد بعدی مشخص کننده این است که از کدام شماره بلاک تغییرات مربوط به هارد فورک ها آغاز می شود. در اینجا ما بلاکچین خود را داریم و از بلاک آغازین شروع می کنیم، بنابراین تمام فیلدها را صفر قرار ی دهیم.

  2. alloc: در این بخش می توانیم به محض ایجاد بلاکچین، آدرس ایجاد کنیم و آن ها را شارژ کنیم. ما با این قسمت کاری نداریم. برای شارژ اکانت ها از ماین کردن کمک می گیریم.

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

  4. extraData: یک مقدار اختیاری به اندازه 32 بایت است که هر عبارت دلخواهی می تواند باشد.

  5. gasLimit: حداکثر مقدار مجاز gas برای هر بلاک را مشخص می کند. عدد 15,000,000 مقدار در حال حاضر بر روی شبکه اصلی است.

  6. parentHash: مقدار هش هدر بلاک قبلی یا والد را مشخص می کند. درواقع همین اشاره گر به بلاک قبلی، زنجیره بلاک ها را ایجاد می کند.

  7. timestamp: زمان به فرمت یونیکس در هنگام ساخت بلاک را مشخص می کند. این پارامتر به ما کمک می کند چه زمانی سطح سختی می بایست تغییر کند تا میانگین زمان تولید یک بلاک ثابت بماند. همچنین به کمک این پارامتر می توان صحت ترتیب بلاک ها را داخل یک زنجیره تایید کرد.

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

$ geth --datadir . init genesis.json

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

geth --datadir . account new

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

$  geth --allow-insecure-unlock --datadir . --keystore keystore --networkid 4568 --http --http.corsdomain "*" --http.port 8502 --http.api personal,eth,net,web3,txpool,miner --mine --miner.etherbase=0xD04E55037Cab53E4d711BBC81f275e9d37629C9c

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

حالا می توانیم به زنجیره خصوصی خود متصل شویم. با توجه به اینکه نود مورد نظر بر روی سیستم خودمان است می توانیم از پروتکل IPC استفاده کنیم. پیش از آن در هنگام اجرای دستور قبل عبارت IPC endpoint opened را می توان مشاهده کرد. این آدرس بر روی سیستم عامل های مختلف ممکن است متفاوت باشد. به عنوان مثال بر روی سیستم عامل ویندوز به شکل زیر وجود دارد:

همانطور که در بخش اول آموزش گفته شد می توانیم یک ترمینال جدید باز کنیم و از طریق ایجاد یک بستر IPC به نود مورد نظر متصل شویم.
پس از اتصال به نود می بایست چنین چیزی شاهده کنیم:

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

بررسی اکانت

شما می توانید به تمام اکانت های geth از طریق eth.accounts دسترسی داشته باشید.

> eth.accounts
["0x1c29b7832ad2e4731d816e60f767777cbf374e15", "0x01058d7d56a216b3f1ff8f41c20ad58888424de7"]

همچنین می توانید موجودی هر حساب را با استفاده از متد ()eth.getBalance مشاهده کنید.

> eth.getBalance(eth.accounts[0])
0

اولین حساب ایجاد شده یا حساب اصلی از طریق eth.coinbase نیز در دسترس است.

ماینینگ

از آنجایی که شبکه خصوصی ایجاد شده همانند شبکه اتریوم از مکانیزم اجماع اثبات کار استفاده می کند، برای اجرای تراکنش ها می بایست بلاک ها را ماین کنیم.
برای شروع ماینینگ کافیست دستور ()miner.start را اجرا کنیم. می توانید فرآیند ماینینگ را بر روی ترمینال نود مشاهده کنید. بعد از آنکه تعدادی بلاک ماین شد با دستور ()miner.stop می توانید فرآیند را متوقف کنید. حالا می توانید موجودی حساب اصلی خود را مجددا چک کنید که باید شامل مقداری اتر باشد.

ارسال تراکنش

باتوجه به اینکه مقداری اتر در حساب خود داریم می توانیم یک تراکنش انجام دهیم و به یک حساب دیگر اتر واریز کنیم. برای انجام تراکنش در کنسول geth از متد ()eth.sendTransaction استفاده می کنیم. ولی پش از آن ی بایست بدانیم یک تراکنش اتریوم شامل چه داده های است:

  • from: از نوع String، آدرس ارسال کننده را مشخص می کند.

  • to: از نوع String، آدرس گیرنده یا مقصد را شخص می کند.

  • value: فیلد اختیاری، از نوع Number, String و یا BigNumber می تواند باشد. مبلغی که در تراکنش منتقل می شود بر حسب wei.

  • gas: فیلد اختیاری، از نوع Number, String و یا BigNumber می تواند باشد. میزان gas ای که برای تراکنش مصرف می شود.

  • gasPrice:فیلد اختیاری، از نوع Number, String و یا BigNumber. هزینه gas برای این تراکنش برحسب wei. مقدار پیشفرض براساس حداقل هزینه gas شبکه در نظر گرفته می شود.

  • data: فیلد اختیاری، از نوع String.

  • nonce: فیلد اختیاری، از نوع Number. یک عدد صحیح است به ما اجازه میدهد تراکنشی را که هنوز در حال انجام است جایگزین کنیم با تراکنشی که دارای همان عدد nonce باشد.

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

> eth.sendTransaction({to: eth.accounts[1], from: eth.accounts[0], value: 100})

در هنگام اجرای این دستور با خطای Error: authentication needed مواجه می شوید. بنابراین می بایست اصطلاحا حسابی که می خواهید با آن اتر ارسال کنید یعنی تراکنش انجام دهید را unlock کنید با وارد کردن رمز عبور به صورت زیر:

> personal.unlockAccount(eth.coinbase)
Unlock account 0xabc...
true

حال می توانید دستور اجرای تراکنش را مجددا اجرا کنید. بعد از انجام تراکنش موجودی حساب 1 را چک کنید:

> eth.getBalance(eth.accounts[1])
0

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

> eth.getBalance(eth.accounts[1])
100

موجودی حساب می بایست مقدار 100 باشد.

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

5 Likes

من اینجا فایل درست کردم ولی کد رو میزنم ارور میده چیکار کنم ؟

پسوند txt. می بایست از نام فایل حذف بشه و صرفا در انتهای فایل json. باشه.

سلام من یه فایل جنسیس با فرمت json. ایجاد کردم. این فایل رو توی پوشه ای که خودم ایجاد کردم به نام chaindata ساختم. ولی میرسم به دستور شما fail میشه و اجرا نمیکنه. اینجایی که گفتین دستور زیر را در پوشه مربوط به بلاکچین خصوصی که ساخته اید، اجرا کنید. . این دستور هست : geth --datadir . init genesis.json . با توجه به اینکه من نمیدونم دستورو توی پوشه مخصوص چجوری ایجاد کنم از این ویدیو کمک گرفتم :S01L03 - Prepare a Ethereum Private Network with Geth - YouTube که دستوری که داد اینه:
geth --datadir=./chaindata init genesis.json
(من هم نام پوشه ساختم که راحت بفهمم)
و مسیرش هم توی user خودمه
ولی بازم fail میشه.
خواستم بپرسم اینکه دستورو در پوشه مربوط به بلاکچین خصوصی که ساخته ام ایجاد کنم دقیقا چه دستوری میشه . فرمتمم json هست اما خوب با نوت پد باز میشه.
genesis
مرسی

در واقع، بعد از datadir-- می بایست مسیر پوشه بلاکچین خصوصی داده بشه، مثلا path/to/chaindata/ .در دستور نمونه ای که اینجا آورده شده علامت . به معنی current directory یا مسیری هست که ترمینال در حال حاضر در اون قرار داره. یعنی اگر ترمینال را داخل پوشیه بلاکچین خصوصی باز کنیم، علامت . کافیه وگرنه باید مسیر رسیدن به پوشه رو مشخص کنیم. مسیری که توی ویدئو گفته شده chaindata/. به این معنیه که ترمینال در یک پوشه قبل تر از پوشه chaindata اجرا شده. البته توی دستور من علامت = وجود نداره. به احتمال زیاد ویدئو برای نسخه قدیمی geth هست.
اگر منظورتون این هست که در یک پوشه مشخص چه طور cmd رو باز کنید در ویندوز، از این لینک میتونین استفاده کنید: Windows 10 How to Open Command Prompt in Current Folder or Directory - YouTube

1 Likes

من فایل جنسیس رو هم درست میکنم ولی میرنم نمیتونه بفهمه کدوم پوشس

فکر کنم مشکل اصلی با مسیری اجرایی cmd هست.

اگر با این ویدیو درست نشد لطفا ارروری که CMD نشون میده رو ارسال کنید تا بشه فهمید مشکل از کجاست.

2 Likes

سلام مرسی از پاسختون چقدر ویدیو هم خوب بود :+1:
من از توی پوشه هم cmd باز کردم چند تا مورد بود چون بازم اجرا نمیشد میگم:
اول اینکه من فایل json رو ولید کردم که بدونم اشتباهی اونجا نیست که تصویرشم میفرستم شمام لطفا یه نگاهی کنید و در فایل chaindata ذخیره کردم.(چون تغییر فایل تسکت به json اجرا نشده بود توی cmd این دفعه از خود MiTeC.JSON ساختم)
دوم اینکه اسم فایل رو به همون genesis.json تغییر دادم ( که از خود MiTeC.JSON ساختم) که تصویر error1 مربوط به اینه
سوم چون دیدم باز اجرا نمیشه گفتم اسم فایل رو بذارم genesis خالی (پسوند .json رو ندادم توی اسم و از خود MiTeC.JSON فایل json رو ساختم) که تصویر error2 مربوط به اینه:
(Fatal: invalid genesis file: invalid character ‘ï’ looking for beginning of value)
و خطایی که میگرفتم رو سرچ کردم اما سختم بود بفهمم چیه مشکلش این لینک رو دیدم :

مرسی :pray:
json file


error2

من یک نمونه فایل genesis.json روی گیت خودم گذاشتم. لطفا از این لینک باز کنید. فقط محتویات رو کپی نکنید، روی صفحه راست کلیک کنید و save as کنید که مستقیم به صورت فایل رو سیستمتون ذخیره بشه. بعد با این فایل تست کنید.

1 Likes

درست شد :heart_eyes: :raised_hands: خیلی ممنونم ازتون . من تا مرحله آخر انجام میدم امشب بازم سوالی بود میپرسم :pray:

2 Likes

خواهش می کنم. من حدس میزنم به احتمال زیاد، فایل شما در اصل genesis.json.txt بوده. واین به این دلیل هست که سیستم شما پسوند فایل ها رو نمایش نمیده. می تونید با راهنمایی این مقاله فعال اش کنید:
https://fileinfo.com/help/windows_10_show_file_extensions
نکته دیگه در ادامه برای اجرای بلاکچین خصوصی فراموش نکنید networkid می بایست همان آی دی داخل فایل genesis باشه و آدرس ماینر رو هم به اولین آدرسی که ساختین تغییر بدین.

2 Likes

سلام من موفق شدم ساختم بلاک چینمو

5 Likes

:heart_eyes:دقیقا همین بود مرسی از ارسال ویدیو. :+1:من کاراش رو کردم و آی دی هم همونی که توی فایل شما بود رو توی دستور 1994 networkid قرار دادم و مراحلو پیش رفتم و الان خواستم ارسال تراکنش رو امتحان کنم و قبلش ماین کنم که موجودی داشته باشم. تصویر خروجی هارو هم میذارم شاید مفید باشه اگه جایی اشتباهه شما بفرمایید.بعد که وارد کنسول شدم و ماینینگ رو اجرا کردم در نهایت اومدم استاپ کردم و موجودی حساب گرفتم اما بازم صفر بود. فکر میکنم اینکه فرمودید آدرس ماینر رو هم به اولین آدرسی که ساختین تغییر بدین رو دستورش رو متوجه نشدم.
و اینکه مثلا حدودی چقدر مدت زمان باید به ماین اختصاص بدیم که موجودی داشته باشیم؟
1



بعد یه سوال دیگه توی خود کنسول برای پیست کردن دستور چون Shift+Ctrl+V و Ctrl+V کار نکرد از چه کیبوردی استفاده کنم که تایپ نکنم؟
مرسی خیلی :pray:

1 Likes

خیلی عالی موفق باشین، در همون دستوری که برای اجرای بلاکچین وجود داره، قسمت miner.etherbase رو باید معادل آدرس coinbase خودتون قرار بدین، یعنی همین آدرسی که عکس اش رو فرستادین. زمان ماین هر بلاک خیلی کم هست در حد چند ثانیه چون دیفیکالتی رو خیلی کم درنظر گرفتیم. توی لاگ کنسول بلاکچین می تونید ببینید که بلاک ها ایجاد می شن.
در مورد سوال آخر، ترمینال ویندوز معمولا یه مقدار لختی داره و گاهی اوقات هنگ می کنه که مجبورین پنجره رو ببندین و دوباره باز کنین. ولی برای پیست کردن از دکمه راست کلیک موس روی ترمینال استفاده کنید، اگر چیزی مشاهده نکردین، کلید right arrow کیبورد رو بعدش بزنید، نمایش میده.

1 Likes

مرسی کلی از پاسخ کاملتون. :heart_eyes:توی دستور اجرای بلاکچین خصوصی آدرس و آی دی مربوط رو زدم و اجراش کردم
من ماین رو اجرا میکنم ولی نال میشه . ببخشید من همش سوال کردم. :pray:
من چند تا چیز دیدم که چرا این طوری میشه و عکساشو اینجا میذارم شاید بقیه هم این مشکل پیش بیاد براشون و من فکر میکنم آنلاک هم نمیتونم بکنم .پسورد رو همون که خودمون قرار دادیم بذاریم؟ و بعد خوندم که شاید ماین بکنه ولی بزنه نال و شما باز چک کنید که من دیدم نه واقعا کار نکرده و مقدار هم نشد بدم .موجودی هم میگرفتم 0 بود.

1
و
2
و
3

مرسی بازم حالا اگرم نشد دوشنبه ازتون میپرسم. :pray:

1 Likes

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

1 Likes

سلام سحر خانم
عرض ادب و احترام
خسته نباشید میگم و تشکر فراوان بابت تمام زحماتی که میکشید :pray:
من تمام مراحل رو اجرا کردم و درست بود تا مرحله اجرای بلاکچین و ماینینگ که درست کار نمیکنه چند بار فیلم آموزش و دمو رو دیدم و همه رو مو به مو اجرا کردم ولی نمیدونم چرا کار نمیکنه
من عکسه رو هم اینجا میفرستم ممنون میشم چک کنید و ایراد کارم رو بفرمایید :pray:



1 Likes

سلام
من وقتی دستور شروع ماین رو می زنم اینجوری می شه ممنو می شم اهنمایی کنید
مرسی

باسلام
با نصب مجدد Geth درست و همهچی اجرا شد.

1 Likes

hi there
sorry my keyboard doesn’t have farsi that’s why I’m typing in English .
as you see in my screenshot when I’m trying to run new account it doesn’t open a new account and it doesn’t give me any password would you please have a look and see where I am doing wrong wrong
thanks a lot