کتابخانه های جاوا اسکریپتی اتریوم:
Web3.js و ethers.js کتابخانه های جاوا اسکریپتی هستند که به دولوپر اجازه تعامل با بلاک چین را می دهند. در این مطلب به منظور توضیح چگونگی ارسال تراکنش ها با استفاده از هر دو کتابخانه Web3.js و ethers.js و از طریق API مربوط به Infura، به صورت گام به گام یک dApp را توسعه می دهیم.
پیش نیاز ها:
پیش فرض ما در این آموزش این است که آشنایی کافی برای توسعه قراردادهای هوشمند در سالیدیتی وجود دارد.
پیش از شروع اجازه بدهید علت انتخاب ما برای استفاده از Infura را توضیح بدهیم. برای دولوپرها یا تیم هایی که احتیاج به زیرساخت های مقیاس پذیر بر اساس تقاضا را دارند، Infura امکان اتصال dApps به testnet و mainnet اتریوم را با یک دستور یک خطی فراهم می کند. به این تریتب، به علت عدم اجبار در داشتن هاست، و نگهداری از نود های اتریوم خود، که هر دو پیچیده و پرهزینه هستند، Infura امکان صرفه جویی برای تیم های توسغه دهنده را فراهم می آورد. این تیم ها قادر خواهند بود بجای نگهداری از زیرساخت گران قیمت تمام تمرکز خود را متوجه توسعه محصول اصلی کنند.
شروع پروژه: قسمت اول
توجه:
اگر قبلا تنظیمات یک پروژه را انجام داده اید می توانید مستقیما به سراغ بخش دوم: Web3 در قسمت دوم بروید. در غیر اینصورت، در این بخش ما مرور سریعی خواهیم داشت بر چگونگی ایجاد یک پروژه با استفاده از Infura و Truffle و اتصال آن پروژه به React، جایی که با Web3 و Ethers تعامل خواهیم داشت.
بخش اول: Truffle
در این آموزش ما برای ساخت بنای پروژه از Truffle استفاده می کنیم. Truffle یک محیط توسعه است که امکان تعامل با EVM و تعامل با قرارداد های هوشمند را می دهد. Truffle با ارائه ابزارهای کامپایل، توسعه، تست، و اشکال زدایی، توسعه قرارداد های هوشمند روی اتریوم را آسان تر می کند. Truffle در ترکیب با Ganache به دولوپر ها امکان لوکال تست را پیش از قرار دادن قرارداد ها روی شبکه های عمومی مانند Rinkedby و Mainnet می دهد.
بیایید کار خود را با ایجاد یک پرژه Truffle در خط فرمان شروع کنیم:
~$ truffle init
بیایید نگاهی به تغییراتی بیاندازیم که با اجرای ایم دستور در مسیر پروژه می افتد. همان طور که می بینید بلاک های اجرایی در مسیر پروژه ما ساخته شده اند. در این آموزش تمرکز ما بر روی فایل های contracs، migrations، و truffle-config خواهد بود.
در مرحله بعد، برای اینکه بتوانید تراکنش های خود را قبل از ارسال به نودهای Infura امضا کنید، می توانید Truffle HD Wallet را به پروژه خود اضافه کنید.
برای افزودن این wallet دستور زیر را اجرا کنید:
~$ npm install --save @truffle/hdwallet-provider
در این مرحله احتیاج به نصب Ganache خواهید داشت:
~$ npm install -g ganache-cli
Ganache یک بلاکچین اتریوم شخصی است که شما می توانید برای اجرای تست ها، اجرای دستورات، و تشخیص وضعیت در حالی که عملکرد بلاکچین را کنترل می کنید، از آن استفاده کنید. این ابزار می تواند در تمام چرخه توسعه مفید واقع شود.
می توانید آن را به عنوان localhost:XXXX خود تصور کنید: هر چیزی که اتفاق می افتد به صورت لوکال باقی خواهد ماند، که یک زمین بازی فوق العاده را فراهم می کند، که می توانید پیش از استفاده از Infura و دیپلوی کردن روی testnet از آن استفاده کنید.
برای دسترسی به truffle console( که بزودی به آن خواهیم پرداخت)، باید اطمینان حاصل کنیم که فایل truffe-config به روز است. در غیراینصورت با چنین خطایی مواجه می شویم:
اگر ترجیح می دهید که برای Ganache به جای نسخه CLI از نسخه GUI استفاده کنید می توانید آن را از این آدرس دانلود کنید:
نتیجه اجرا Ganache GUI در حالت quick-start چیزی مشابه این تصویر خواهد بود:
برای اینکه بتوانیم به local Ganache testnet متصل شویم فایل truffle-config باید به صورت زیر باشد:
development: {
host: "127.0.0.1", // Localhost (default: none)
port: 8545, // Standard Ethereum port (default: none)
network_id: "*" // Any network (default: none)
},
اگر با این فایل آشنا نیستید، در واقع یک فایل جاوا اسکریپتی است و می تواند هر کدی که برای ایجاد تنظیمات پروژه شما مورد نیاز است را اجرا کند.
سپس در یک ترمینال مجزا دستور زیر را اجرا کنید:
~$ ganache-cli
اگر Ganache به درستی نصب شده باشد با اجرای این دستور می توانیم آن را در ترمینال مشاهده کنیم. برای تست کارکرد اتصال به testnet، دستور زیر را اجرا کنید:
~$ truffle console
در این مرحله احتیاج خواهیم داشت که تنظیماتی بر رووی hdwallet-provider که پیش از این نصب کردیم اعمال کنیم. صرفا برای یادآموری، hdwallet-provider یک اتصال شبکه راحت و آسان برای پیکربندی از طریق Infura به اتریوم است.
دستور زیر را در کنسول اجرا کنید:
~$ const HDWalletProvider = require('@truffle/hdwallet-provider');
(HDWalletProvider در نتیجه اجرا undefined را بر خواهد گرداند)
در مرحله بعد mnemonic خود را تعریف کنید:(mnemonic در اینجا یک رشته تصادفی شامل 12 کلمه است)
~$ const mnemonic = '12 words here';
(mnemonic در نتیجه اجرا undefined را بر خواهد گرداند)
در این مرحله wallet خود را اضافه خواهیم کرد:
~$ const wallet = new HDWalletProvider(mnemonic, "http://localhost:8545");
در نتیجه، با اجرای دستور wallet لیست حساب ها/آدرس هایی که می توانیم از آنها استفاده کنیم را مشاهده می کنیم:
~$ wallet
در نتیجه اجرای این دستور می توانید ببینید که یک wallet ساخته اید که می توانید از آن در ترمینال خود استفاده کنید. شما باید چیزی شبیه تصویر زیر در ترمینال خود مشاهده کنید:
بیایید به نصب ارتباط مورد نظرمان به یک testnet (که در اینجا Rinkedby خواهد بود) ادامه دهیم. ما برای دیپلوی کردن قرارداد هایمان بر روی testnet از Infura استفاده خواهیم کرد تا بتوانیم واسط کاربری برنامه خود را بسازیم ودر آن با قرارداد هوشمند Storage تعامل داشته باشیم.
نکته مهم: ما در اینجا از اولین آدرس از آرایه آدرس ها که wallet در اختیار ما قرار می دهد برای دیپلوی قرارداد هوشمند خود بر روی tetnet استفاده خواهیم کرد. باید اطمینان حاصل کنیم که این آدرس دارای موجودی است. Eth های تستی که در بخش بعد از Rinkedby دریافت می کنیم برای دیپلوی قرارداد استفاده خواهند شد.
در تصویر زیر یک مثال از محل دسترسی به آدرس ذکر شده در ترمینال را مشاهده می کنید. دقت کنید که آدرسی که در اختیار شما قرار می گیرد با تصویر زیر متفاوت خواهد بود.