آموزش کار با (Go Ethereum)GETH- بخش سوم(پایانی)

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

  • Full: در این حالت نود ایجاد شده، تمام هدر بلاک ها و بدنه بلاک ها را ذخیره می کند و تمام بلاک ها و تراکنش های آن ها را با شروع از بلاک آغازین اعتبارسنجی می کند. که در نهایت باعث ایجاد یک full node بر روی سیستم می شود. که آخرین وضعیت کل بلاکچین را نگه داری می کند. و تمام بلاک های ورودی جدید را نیز اعتبارسنجی می کند. این نوع نود نباید با نود آرشیو(archive node) اشتباه گرفته شود که تمام این کارها را انجام می دهد و علاوه براین تاریخچه کل تراکنش های بلاکچین را نیز نگه داری می کند.

  • Fast: در این حالت نیز نود ایجاد شده، تمام هدر بلاک ها و بدنه بلاک ها را ذخیره می کند ولی هیچ کدام از تراکنش های قبلی را اعتبارسنجی نمی کند تا رسیدن به تراکنش های جدید. از اینجا به بعد مشابه نود کامل یا حالت قبل رفتار می کند. در مدت زمان آپدیت شما می توانید تمام بلاک ها را داشته باشید ولی در عین حال کاملا آپدیت نباشید. به این دلیل که وضعیت حساب ها(مانند موجودی ها، کد قراردادهای هوشمند) ممکن است هنوز آپدیت نشده باشد. دانلود این اطلاعات به طور موازی با دانلود بلاک ها انجام می شود و ممکن است خیلی بیشتر از دانلود بلاک ها طول بکشد.

  • Light: در این حالت تنها وضعیت حال حاضر بلاکچین دانلود می شود. بنابراین برای اعتبارسنجی تراکنش ها، نیازمند این است که از یک نود کامل یا آرشیو درخواست کند.

اتصال به یک شبکه تست اتریوم

اتصال به یک شبکه تستی به کمک geth بسیار ساده است. به عنوان مثال برای اتصال به شبکه تستی Rinkeby دستور زیر را اجرا کنید با حالت به روزرسانی fast(در صورتی که در اجرای دستور با حالت fast دچار خطا می شوید؛ می توانید از حالت snap استفاده کنید). پس از اجرای این دستور وارد کنسول جاوا اسکریپت می شوید.

$ geth --rinkeby --syncmode fast console

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

> eth.syncing
{
  currentBlock: 1846452,
  highestBlock: 2970863,
  knownStates: 0,
  pulledStates: 0,
  startingBlock: 1841089
}

این اطلاعات هم زمان با آپدیت شدن نود تغییر می کند.

مشاهده اطلاعات یک بلاک

می توانید اطلاعات مربوط به یک شماره بلاک نود شما آن را داشته باشد؛ با دستور زیر مشاهده کنید:

> eth.getBlock(1830000)
{
  difficulty: 2,
  extraData: "0xd783010802846765746887676f312e392e34856c696e7578000000000000000042eb768f2244c8811c63729a21a3569731535f066635f83421bf059cd8111f180f0727128685bae47ffc57839b00206d1ad20c69a1981b489f772031b279182d99e65703f0076e4812653aab85fca0f0d6ae8250b8348c94847280928c79fb3b63ca453efc18cbc391de84dbd87db83b20935d3e89f5dd91b239241f4286de636a1c1d431d162611438e5fe8a148b6ff13c4422ff4212ac94a35b271da789fa309f485e7be631f5322cc9ac22eedc9986414dd089afd92f800",
  gasLimit: 7212968,
  gasUsed: 741031,
  hash: "0xa20b9701c16c2c17cf5a844dba59b33530913bb227bbf17cf5ecb052d2b287b7",
  logsBloom: "0x00000000000000000000008000000000000000000000200080000000000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000008000000000000000000000400000000000000000800001000000000400000008000000000000000100000040000000010000000000400000000000000000000000000000000010000020000000000000000000200000000000000400000000000000000000001000000000000000000400000000000000002000000000001000000000000000020000000000000000000000000000000000000000400000000001000000400000000000000000000000020020100",
  miner: "0x0000000000000000000000000000000000000000",
  mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  nonce: "0x0000000000000000",
  number: 1830000,
  parentHash: "0x61aceb1112c79f12fd4acae7d5c263f58c0cfc23cabf996d0f81d3426c9db5fc",
  receiptsRoot: "0x18cd5444fbc45c3b45536ee1c0d66ff1498a43425ca8f4e7594af25bd87ad2fe",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 2092,
  stateRoot: "0x84c27ff36faabd161a5c850906581df27fa758bccdf9ac660602399ecca39972",
  timestamp: 1519519986,
  totalDifficulty: 3388435,
  transactions: ["0x77dd615bcc63322f436a747f43d02f7ad15ebbf7867c7dbb065e6a1a4d58a2cf", "0xa367a991aaa44b602247d5d12e748dc216fc71a8cd1408107076643094d83377", "0xf6dc6e3cbca47eaee35f7368372e2fb4336d4c7869ba4447d785c2af63545caf", "0xab50463b9617b6fdea0b4c6f8c80607608c36918a33c3b45dfd2d336ced7d50a"],
  transactionsRoot: "0x130985bb247d15b853dca099ad8d9f900a1d24ea2a68828b63530ef7090b7dad",
  uncles: []
}

همان طور که مشاهده می کنید آدرس ماینر و عدد nonce برابر صفر است. این به این دلیل است که مکانیزم اجماع شبکه Rinkeby بر اساس اثبات کار نیست. بلکه مبتنی بر اثبات قدرت است.

مشاهده اطلاعات یک تراکنش

می توانید اطلاعات هر تراکنشی را که در نود شما وجود دارد مشاهده کنید. به عنوان مثال میخواهیم اطلاعات تراکنش قرارگرفته در ایندکس 0 برای شماره بلاک 1830000 را مشاهده کنیم.

> eth.getTransaction(eth.getBlock(1830000).transactions[0])
{
  blockHash: "0xa20b9701c16c2c17cf5a844dba59b33530913bb227bbf17cf5ecb052d2b287b7",
  blockNumber: 1830000,
  from: "0xb840f68af2624c761adc42a365d99dd470f73d08",
  gas: 47197,
  gasPrice: 15000000000,
  hash: "0x77dd615bcc63322f436a747f43d02f7ad15ebbf7867c7dbb065e6a1a4d58a2cf",
  input: "0xde5f72fd",
  nonce: 11,
  r: "0x53b2e2bd0f77701d697d7d7579f86ff433bfc87cf50b1f0f53da62f2b0b2f9d8",
  s: "0x2adc0b0a3dbd8719eb1d994a4fac0fa11fb3d74b8c51a480142056a202dac7c6",
  to: "0x832b52302b89fa8e703cc12db1b6049984d6fef7",
  transactionIndex: 0,
  v: "0x2c",
  value: 0
}

مشاهده اطلاعات یک قرارداد

همچنین می توانید کد هر قراردادی که بر روی شبکه Rinkeby دیپلوی شده باشد را با داشتن آدرس آن مشاهده کنید.

> eth.getCode("0x832b52302b89fa8E703Cc12dB1B6049984d6fEF7")

خروجی این دستور یک رشته خیلی بزرگ به فرمت hex می باشد که کد قرارداد را نشان می دهد.
برای مشاهده حافظه قرارداد می بایست از دستور ()eth.getStorageAt استفاده شود.

> eth.getStorageAt("0x832b52302b89fa8E703Cc12dB1B6049984d6fEF7")
"0x000000000000000000000000000000000000000000004a1d89bb94865ec00000"

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

دریافت اتر تست

آپدیت نود خود را از طریق fast متوقف کنید و یک نود light ایجاد کنید که خیلی سریع تر است و حافظه بسیار کمتری اشغال می کند.

$ geth --rinkeby --syncmode light console

همان طور که قبلا گفته شد می توانید لاگ های روی کنسول را با دستور debug.verbosity(0) متوقف کنید. بعد از آنکه نود لایت آپدیت شد(ممکن است چند دقیق طول بکشد). یک اکانت اتریوم بر روی شبکه Rinkeby خود بسازید. می توانید با دستور eth.accounts اکانت های موجود را چک کنید و با دستور ()personal.newAccount اکانت جدید بسازید. از طریق این لینک می توانید با دادن آدرس خود در شبکه های اجتماعی و ارسال لینک پست مربوطه در این سایت، اتر رایگان دریافت کنید. سپس می توانید وجودی حساب خود را چک کنید:

> eth.getBalance(eth.accounts[0])
3000000000000000000 // in wei (equal to 3 ether)

از این اتر می توانید برای پرداخت فی gas ، ارسال اتر و یا دیپلوی قرارداد بر روی شبکه Rinkeby استفاده کنید.

7 پسندیده

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

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

ممنون

برای سوال اول، شماره بلاکی رو که میخواید بررسی کنید، اول با دستور eth.syncing چک کنید که نود تون تا اون شماره بلاک رو آپدیت کرده باشه. دوم، وقتی که دستور ()eth.getBlock رو برای یک شماره بلاک خاص، اجرا می کنید، حتما چک کنید که قسمت transactions خالی نباشه و حداقل یک تراکنش داشته باشه. اگر این هم اوکی بود می تونید دستور مورد نظرتون ر و برای اولین تراکنش بلاک مورد نظر، اجرا کنید.

در مورد سوال دوم، با استفاده از ctl+d روی کنسول می تونید عملیات بروزرسانی نود رو متوقف کنید. توی کنسول باید چاپ کنه Blockchain Stopped

2 پسندیده

سلام مجدد.
۱. در اینجا فرمودید Fast Node تراکنش های قبلی رو اعتبارسنجی نمیکنه ولی Full Node اینکارو انجام میده. این اعتبار سنجی رو متوجه نمیشم.
۲. علاوه براین، وقتی یه شخصی میخواد فول نود باشه، اطلاعاتی رو از سایر نودها دانلود میکنه که قبلا اعتبارسنجی و تایید شدن و چرا باید دوباره اطلاعات رو اعتبارسنجی کنه؟
تشکر

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

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

2 پسندیده

سلام وقتی این دستور میزنم این خطا رو می دهد :
invalid value “fast” for flag -syncmode: unknown sync mode “fast”, want “full”, “snap” or “light”

حتی در داکیومنت Geth هم این مقدار هست به هر حال من با مقدار snap برای پارامتر syncmode جواب گرفتم
طبق داکیومنت همین عملکرد fast را خواهد داشت .
https://geth.ethereum.org/docs/getting-started

Sync modes

You can start Geth in one of three different sync modes using the --syncmode "<mode>" argument that determines what sort of node it is in the network.

These are:

  • Full: Downloads all blocks (including headers, transactions, and receipts) and generates the state of the blockchain incrementally by executing every block.
  • Fast: Downloads all blocks (including headers, transactions and receipts), verifies all headers, and downloads the state and verifies it against the headers.
  • Snap (Default): Same functionality as fast, but with a faster algorithm.
  • Light: Downloads all block headers, block data, and verifies some randomly.
2 پسندیده

سلام منم مشکل دوست عزیزمون رو داشتم که ب جای fast از snap استفاده کردم و حل شد. مشکل بعدی من اینه که وقتی دستور eth.syncing رو میزنم این خطا را دریافت میکنم:
‘eth.syncing’ is not recognized as an internal or external command,
operable program or batch file.
ممنون میشم راهنمایی بفرمایید.

2 پسندیده

سلام در نظر بگیرین . این دستور وقتی فعاله که توی محیط کنسول باشین .
geth --rinkeby --syncmode snap console

2 پسندیده

ممنون مهران جان اکی شد. تمام مراحل رو رفتم ولی مثل اینکه فاست rinkbey کار نمیکنه که ولت رو شارژ کنیم. شما ولت رو چجوری شارژ کردی؟

2 پسندیده

https://www.rinkeby.io/#faucet
از اینجا میشه

1 پسندیده

من تو توئیتر یه توئیت زدم https://twitter.com/mehran_mazhar4/status/1479447133262651392
ادرسشو زدم تو Rinkeby: Network Dashboard اوکی شد .

1 پسندیده

سلام من وقتی زدم نود لایت بالا بیاره هدرارو کامل گرفت بجز تقریبا 10 تا بلاک آخرو و بعد از اون توی حالت looking for peers موند، بعد از این مرحله برای خودم اکانتی ساختم و زدم که چندتا اتر تست نت برام واریز شه، اما وقتی که میخوام موجودی اکانت رو ببینم با این پیام مواجه میشم

احتمال این رو دادم که شاید تراکنشم توی بلاک های جدید بوده برام نیاورده برای همین صبر کردم اون هارو هم بگیره و وقتی که گرفت دوباره کامند رو زدم و باز هم همین ارور رو نشونم داد

سلام منم مشکل دوست عزیزمون رو داشتم که ب جای fast از snap استفاده کردم و حل شد. مشکل بعدی من اینه که وقتی دستور eth.syncing رو میزنم این خطا را دریافت میکنم:
‘eth.syncing’ is not recognized as an internal or external command,
operable program or batch file.
ممنون میشم راهنمایی بفرمایید.

1 پسندیده

سلام
اگر مشکلتون حل شد به ما هم اعلام بفرمایید
با تشکر

این دستور وقتی فعاله که توی محیط کنسول باشین .
geth --rinkeby --syncmode snap console

یخرده سرچ کردم راجبش داستان اینه که فاستی که این کوینارو برای ما قراره بفرسته نمیفرسته، خیلیای دیگه این مشکلو داشتن ولی مشکلشون مثلا مال 4 سال پیشه، چندباری تست کردم ببینم میشه از فاسته چیزی دریافت کرد، نیومد برام یا باید یکیو پیدا کنیم که خودش اتریوم روی تست نت رینکبی رو داشته باشه و بصورت همتا به همتا ازش بگیریم، یا یه فاست دیگه براش پیدا کنیم، نتیجه سرچم این بود که مشکل از کدی که نوشته بودم نبود

1 پسندیده

سلام وقت شما بخیر
میگم این کد رو که اجرا میکنم این ارور رو میده

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

2 پسندیده

سلام
من زمانی که tweets URL تو سایت Rinkeby وارد میکنم با ارور
" insufficient funds for gas * price + value" مواجه میشم.
باید چه کاری انجام بدم؟