تا پیش از اتریوم، کدهای کامپیوتری روی سرورهایی اجرا میشدند که تحت تسلط نهادهای مرکزی بودند. مثلا گوگل درخواستهای شما را بررسی میکرد و انجام میداد، یا فیسبوک دادههای شما را جمعآوری میکرد و پیامهای شما را به دیگران نشان میداد. اما بلاکچین اتریوم آمد تا بازی را عوض کند. ویتالیک بوترین تصمیم گرفت پلتفرمی بسازد که در آن کدهای کامپیوتری نیز توسط ماشین مجازی اتریوم اجرا و پردازش میشوند. فرض کنید کامپیوترهای زیادی در تمام دنیا به یکدیگر متصل هستند و یک کد کامپیوتری میتواند روی تمام آنها اجرا شود. این ایده اولیهای بود که توسط ویتالیک بوترین مطرح شد و سپس در بلاکچین اتریوم پیادهسازی شد. حالا کاربران میتوانند بدون اتکا به یک نهاد مرکزی، کدهایی بنویسند که به طور خودکار اجرا میشوند و هیچ نهاد مرکزیای نمیتواند جلوی کار کردنشان را بگیرد. مثلا اگر شما به نامزد موردعلاقه خود در انتخابات رای میدهید، هیچ راهی برای عوض کردن رای شما وجود ندارد. زیرا این رایگیری روی شبکهای از کامپیوترهای غیرمتمرکز اجرا شده؛ نه یک سرور مرکزی که مثلا تحت تسلط یک دولت خاص قرار دارد.
حال، استفاده از این ویژگیها با ظهور کتابخانههای web3.js و ethers.js سادهتر از پیش شده است. این کتابخانهها مجموعهای از کدها و تابعهای آماده جاوااسکریپت هستند که برنامهنویسان از آنها استفاده میکنند تا سایتهایشان به بلاکچین اتریوم متصل شود. در ادامه با نحوه کار این دو کتابخانه و شیوه کارکرد سایتها در جهان web3 بیشتر آشنا خواهیم شد.
بلاکچین اتریوم چیست و چرا باید به سایت متصل شود؟
بلاکچین اتریوم، یک پلتفرم غیرمتمرکز و متنباز است که امکان اجرای قراردادهای هوشمند را فراهم میکند. قراردادهای هوشمند، کدهایی هستند که به طور خودکار روی یک بلاکچین اجرا میشوند. ماشین مجازی اتریوم نیز نام محیطی است که این کدها یا قراردادهای هوشمند در آن اجرا میشوند. این ویژگی، اتریوم را از بلاکچینهای دیگر متمایز میکند. به عنوان مثال از بیت کوین فقط برای جابجایی پول میتوان استفاده کرد؛ اما اتریوم با ارائه زیرساختی برای اجرای قراردادهای هوشمند، امکان ساخت برنامههای غیرمتمرکز (dApps) را فراهم کرده است. این برنامهها طوری طراحی شدهاند که بدون نیاز به یک سرور مرکزی کار میکنند.
تا پیش از این، برنامههای کامپیوتری روی سرورهای مرکزی اجرا میشدند، و آن سرور مرکزی این قدرت را داشت تا برنامه را به سلیقه خود اجرا کند. اما در اتریوم، با توجه به غیرمتمرکز بودن آن، کدها همیشه طبق قوانین خود اجرا میشوند و هیچ کس نمیتواند جلوی کارکرد آنها را بگیرد. پس اگر یک کد قرار است در فرآیند معامله یک ارز دیجیتال اجرا شود، هیچ نهادی نمیتواند جلوی آن را بگیرد و مثلا یک کاربر را تحریم کند.
اتصال سایت به شبکه اتریوم، به توسعهدهنده و کاربر سایت این اجازه را میدهد که از طریق سایت، با قراردادهای هوشمند موجود در بلاکچین اتریوم تعامل برقرار کند. مثلا یک فروشگاه آنلاین میتواند پرداختهایش را از طریق اتریوم دریافت کند، یا یک سامانه رایگیری آنلاین میتواند نتایج رایگیری را در بلاکچین ثبت کند. در دنیای web3 سایتها صرفا صفحاتی برای نمایش اطلاعات نیستند؛ بلکه درگاهی برای ارتباط با زیرساخت غیرمتمرکز محسوب میشوند.
Web3.js و Ethers.js چه تفاوتی دارند؟
web3.js و ethers.js کتابخانههایی هستند که برنامهنویسان از آنها برای ارتباط با بلاکچین اتریوم استفاده میکنند. این کتابخانهها، درواقع مجموعهای از کدها و توابع جاوا اسکریپت هستند که برای راحتی کار برنامهنویسان ساخته شدهاند. مثلا یک برنامهنویس برای اضافه کردن یک تراکنش به بلاکچین اتریوم، دیگر نیاز نیست از ابتدا کدهای جاوا اسکریپت مربوط به این کار را بنویسد و به راحتی از تابعهایی استفاده میکند که دیگران در این حیطه نوشتهاند و به خوبی کار میکنند و مشکلات نرمافزاری (باگ) نیز ندارند.
web3.js کتابخانهای قدیمیتر با کاربردهای گستردهتر است که توسط بنیاد اتریوم توسعه یافته و در بسیاری از سایتهای قدیمیتر از آن استفاده میشود. در مقابل، Ethers.js با هدف ارائه کدهای سبکتر، مدرنتر و امنتر توسعه یافته و ساختاری سادهتر دارد. web3.js کدهای بیشتری را در مرورگر فراخوانی میکند و ether.js از این نظر بهینهتر است و سایتهایی که از آن استفاده میکنند سریعتر لود میشوند. اگر میخواهید بین این دو کتابخانه انتخاب کنید، باید هدف پروژه و سطح دانش فنی تیم توسعهدهنده را در نظر بگیرید.
پیشنیازهای اتصال سایت به شبکه اتریوم
برای این که یک وبسایت به درستی به شبکه اتریوم متصل شود، باید چند پیشنیاز فراهم شود. اول این که باید محیط توسعه جاوااسکریپت (مثلا Node.js) روی سرور سایت نصب شده باشد تا امکان اجرا کردن کدهای جاوااسکریپت وجود داشته باشد. دوم این که کاربران سایت باید از مرورگرهایی استفاده کنند که کیف پولهای اتریوم مثل متامسک روی آنها نصب شده باشد. در مرحله بعد باید توسعهدهندگان سایت با قراردادهای هوشمند اتریوم و نحوه کار با آنها آشنا باشند.
نصب و راهاندازی Web3.js یا Ethers.js در پروژه
نصب ابزارهای web3.js یا ethers.js برای ارتباط سایت با ماشین مجازی اتریوم یا EVM معمولا خیلی پیچیده نیست و با استفاده از برنامههای مدیریت بسته نرمافزاری در یک سرور لینوکس انجام میشود. پس از این که پیشنیازها نصب شدند، میتوانیم از کدهای این کتابخانهها در سایت استفاده کنیم. سپس باید Provider را تعریف کرد. Provider نقش پل ارتباطی بین سایت و شبکه اتریوم را دارد و از طریق کیف پول متامسک یا یک نود (مثل Infura) تعریف میشود. زمانی که شما یک داده را بخواهید، این پل شما را به بلاکچین متصل میکند و داده مورد نیازتان را به شما برمیگرداند. پس از تنظیم این بخش، سایت امکان انجام عملیاتهایی مانند خواندن موجودی یک حساب، ارسال تراکنش و ارتباط با قرارداد هوشمند را پیدا میکند.
آموزش اتصال سایت به کیف پول متامسک
حال، فرض کنید که یک کاربر وارد سایت شما شده است. ابتدا از کاربر میخواهید که کیف پول ارز دیجیتال را به سایت متصل کند. با استفاده از کدهای مخصوصی که در کتابخانههای web3.js و ethers.js وجود دارند، به راحتی میتوانید متوجه شوید که آیا کاربر کیف پول را متصل کرده یا خیر. سپس از کاربر میخواهید که به شما اجازه دهد نگاهی به حساب اتریوم او بیندازید. مانند زمانی که یک اپلیکیشن از شما میخواهد به لیست مخاطبینتان دسترسی پیدا کند. اگر کاربر اجازه دهد، شما میتوانید موجودی حساب او و باقی دادههای عمومی را پیدا کنید. حال میتوانید با توابع آمادهای که در این دو کتابخانه وجود دارد، متوجه تغییراتی شوید که در کیف پول کاربر اتفاق میافتد؛ تا بتوانید به آنها واکنش مناسب نشان بدهید. مثلا اگر کاربر شبکهای که از آن استفاده میکند را عوض کند، شما متوجه شوید و به او اخطار بدهید. همچنین میتوانید یک تراکنش بسازید و از کاربر بخواهید که آن را امضا کند. این مورد میتواند در سایتهایی استفاده شود که خدمات یا محصولاتی را در ازای اتریوم یا توکنهای بر بستر اتریوم میفروشند.
دریافت آدرس کیف پول و موجودی با Web3.js / Ethers.js
در کتابخانههای web3.js و ethers.js دستوراتی وجود دارد که با استفاده از آنها به راحتی میتوانید آدرس کیف پول و موجودی کاربر را مشاهده کنید. مثلا با استفاده از یک کد ابتدا تمام حسابهای کاربر را فراخوانی میکنید و سپس با یک کد دیگر، میزان موجودی هر حساب را دریافت میکنید. تمام این فرآیند را میتوانید طوری طرحریزی کنید که هر چند لحظه به روز شود؛ درست مانند وقتی که کاربری کارت به کارت انجام میدهد و موجودی حساب او در نرمافزار بانک تغییر میکند. مثلا اگر از web3.js استفاده میکنید، با زدن کد web3.eth.getBalance(address) و جایگذاری آدرس به جای کلمه address، میتوانید موجودی یک آدرس را مشاهده کنید. همانطور که دیدید، فقط از یک خط کد آماده برای دسترسی به موجودی یک آدرس اتریوم استفاده کردیم؛ در صورتی که اگر نمیخواستیم از کتابخانه web3.js استفاده کنیم باید از طریق پروتکل ارتباط HTTP با یک نود اتریوم ارتباط برقرار میکردیم که فرآیند پیچیدهای است و میتواند با انواع مشکلات روبرو شود.
ارسال تراکنش روی شبکه اتریوم از طریق سایت
حال فرض کنید که کاربر شما میخواهد یک خرید انجام دهد و باید ۰.۱ اتریوم پرداخت کند. ابتدا باید برخی جزئیات را درباره تراکنش آماده کنید. باید بدانید پول قرار است به چه کسی ارسال شود (آدرس مقصد)، میزان انتقال چقدر است، و تنظیمات فنی مربوط به کارمزد را نیز مشخص کنید. شما در کد خود این موارد را مشخص میکنید و پس از این که کاربر دکمه پرداخت را زد، یک تراکنش آماده میشود و در کیف پول او نمایش داده میشود. اگر خریدار راغب بود، میتواند دکمه تایید را در کیف پولش انتخاب کند. با این کار، تراکنش با استفاده از کلید خصوصیای که به صورت رمزنگاری شده در کیف پول وجود دارد امضا میشود. سپس تراکنش امضا شده به شما تحویل داده میشود و شما آن را به کمک کدهای آماده کتابخانه web3.js و ethers.js به بلاکچین ارسال میکنید. همچنین در نتیجه این فرآیند یک شناسه تراکنش به شما داده میشود که میتوانید آن را به کاربر نیز نشان دهید تا بتواند بعدا وضعیت تراکنش را در بلاکچین پیگیری کند. خود شما نیز میتوانید این شناسه تراکنش را بررسی کنید و با اعلامیههایی مانند «در حال انتظار…» یا «تایید شد!» به او خبر بدهید که تراکنشش در چه وضعیتی قرار دارد.
خواندن دادهها از قرارداد هوشمند (Smart Contract Interaction)
حال، فرض میکنیم که یک قرارداد هوشمند از پیش روی بلاکچین وجود دارد و ما میخواهیم با آن ارتباط برقرار کنیم. ابتدا نیاز به یک دفترچه راهنما از قرارداد داریم، تا بتوانیم به زبان آن قرارداد با او حرف بزنیم. به این دفترچه راهنما ABI یا Application Binary Interface گفته میشود و درست مثل دفترچه راهنمای یک وسیله خانگی است. مثلا به ما میگوید که این قرارداد هوشمند چه نوع ورودیای دریافت میکند و خروجیاش چیست و چطور میتوان از آن استفاده کرد. حال با استفاده از کدهای web3.js و ethers.js و آدرسی که قرارداد دارد، قرارداد هوشمند را صدا میزنیم و خواستهمان را مطرح میکنیم. مثلا میگوییم: فلان NFT در حال حاضر چند بار معامله شده است؟ پس از مدت زمان اندکی، قرارداد هوشمندی که مربوط به آن NFT بوده پاسخ را به ما میدهد. این فرآیند هیچ هزینهای ندارد و مثل خواندن داده از روی دیتابیسهای معمولی است. اما اگر بخواهیم تغییری در قرارداد هوشمند انجام دهیم، مثلا به همان قرارداد بگوییم که کاربر ما میخواهد NFT را خریداری کند، باید کمی کارمزد بدهیم. زیرا برای این کار باید داده جدید در بلاکچین ثبت کنیم و این کار توسط اعتبارسنجها انجام میشود و آنها هم از ما کارمزد میگیرند. مثلا میتوانیم بنویسیم که کاربر سایت ما، NFT مخصوصی را به قیمت ۰.۵ اتریوم خریداری کرده و از این لحظه به بعد، او صاحب این NFT است. مثلا وبسایت زیر با خواندن قرارداد هوشمند مربوط به این NFT، دادههایی را از جمله قیمت یا سازنده ان اف تی ارائه داده است.
نوشتن داده در بلاکچین با Web3.js / Ethers.js
زمانی که میخواهیم اطلاعات جدیدی را به یک قرارداد هوشمند اضافه کنیم، باید محتویات آن را تغییر دهیم. تغییر دادن یک داده، برعکس خواندن آن، هزینهبر است و نیازمند صرف مقداری کارمزد است. درست مثل این که شما ایمیلی به کارمند ثبت احوال میزنید و از او میخواهید تا نام خانوادگی شما را اصلاح کند و کارمند نیز برای انجام این کار از شما پول دریافت میکند. برای نوشتن داده جدید در بلاکچین، باز هم با کمک کدهایی که در کتابخانههای web3.js و ethers.js وجود دارد، ابتدا به قرارداد هوشمند دسترسی پیدا میکنیم. سپس درخواست تغییرمان را ثبت میکنیم؛ مثلا میخواهیم یک رای به یک رایگیری اضافه کنیم. پس از این کار، پنجرهای در کیف پول کاربر باز میشود و از او میخواهد تا این تغییر را بررسی کند. کاربر مشاهده میکند که قرار است یک رای ثبت شود (البته بررسی این مورد نیازمند این است که کاربر کمی از زبان قراردادهای هوشمند سر در بیاورد) و کارمزد ارسال این داده را نیز مشاهده میکند. اگر کاربر پیام تایید را انتخاب کند، درست مثل تایید کردن یک تراکنش، داده جدید به بلاکچین ارسال میشود و یک اعتبارسنج این تغییرات را در بلاک بعدی ثبت میکند. این تغییرات نیز درست مثل تراکنشها شناسه پیگیری دارند و میتوان تایید شدن یا در انتظار تایید بودنشان را در مرورگرهای بلاکچین بررسی کرد.