کتابخانه ها (Library) در قراردادهای هوشمند Solidity
کتابخانه ها در قرارداد هوشمند سالیدیتی
کتابخانه ها در solidity بلوکهایی از کدهایی هستند که قابلیت استفاده دوباره را دارند. این کتابخانهها توابعی را که در تمام قراردادهای هوشمند در شبکه بلاک چین کاربرد دارند را در خود دارد. این ویژگی در زبان برنامهنویسی سالیدیتی و دیگر زبانهای شیگرا موجب افزایش استفاده از آنها میشود. کتابخانه ها در سالیدیتی این امکان را برای برنامهنویسان و توسعهدهندگان فراهم میکند تا برنامههای خود را به صورت ماژولار طراحی کنند.
کتابخانه ها (solidity libraries) در قراردادهای هوشمند Solidity مزایای بسیاری دارند که یکی از مهمترین آنها استفاده مجدد از کدها در قراردادهای دیگر است. در این مقاله در توکن خان قصد داریم تا به بررسی این مفهوم و مزایای آن در ایجاد قراردادهای هوشمند در سالیدیتی بپردازیم.
قبل از مطالعه کامل مقاله “کتابخانه ها در قراردادهای هوشمند سالیدیتی” پیشنهاد میکنیم مقالات دیگر حوزه دوره آموزش سالیدیتی را هم مطالعه کنید.
نحوه ایجاد توکن ERC721 با قرارداد هوشمند
انواع داده ها و متغیرها در سالیدیتی (solidity)
مدیریت خطا در سالیدیتی Error Handling
گس فی GAS FEE در شبکه اتریوم چیست؟
استفاده از Import در سالیدیتی Solidity
انواع حافظه در قرارداد هوشمند سالیدیتی
ویژگی های کتابخانه سالیدیتی چیست؟
کتابخانهها این امکان را برای ما فراهم میکنند تا قابلیتهایی را که نیاز داریم به انواع داده و متغیرها اضافه کنیم، مثلا یک کتابخانه میتواند به منظور بهبود عملکرد یک متغیر از انواع داده uint در قرارداد هوشمند ما به کار گرفته شود. در واقع میتوان کتابخانه را یک بلوک ایزوله در نظر گرفت که کدهایی با قابلیت استفاده دوباره در آن وجود دارند.
توابعی که در کتابخانهها وجود دارند، از فضای ذخیرهسازی در قرارداد هوشمند استفاده میکنند. در طی اجرای تابعی از کتابخانه، کد فراخوانی تابع در چارچوب آن قرارداد فراخوانی شده، اجرا میشود. کتابخانهها اگر به صراحت اعلان شوند، به متغیرهای حالت که در این قرارداد وجود دارند، دسترسی خواهند داشت.
به طور کلی کتابخانهها نوع خاصی از قراردادها هستند که میتوان ویژگیهای زیر را برای آنها برشمرد:
- آنها نمونه مشابهی ندارند.
- هیچ شکلی از ذخیرهسازی ندارند یا به عبارت دیگر متغیر حالتی که امکان تغییر داشته باشد را در خود ذخیره نمیکنند.
- کتابخانه ها در سالیدیتی نمیتوانند توابع بازگشتی داشته باشند.
- در کتابخانهها گزارش رویداد (event) وجود ندارد.
- کتابخانهها موجودی اتر را نگهداری نمیکنند.
- کتابخانهها بدون مالک هستند.
- امکان تخریب آنها وجود ندارد.
- کتابخانهها ارث برده نمیشوند و خود نیز نمیتوانند ارث ببرند.
چگونگی ایجاد یک کتابخانه در سالیدیتی
کتابخانه را باید با کلمه کلیدی Library تعریف و ایجاد کنید و سینتکس آن به شکل زیر است:
1 2 3 |
pragma solidity ^0.8.6; library libraryName {} |
کتابخانه ها در solidity از کدام انواع داده پشتیبانی می کنند؟
این قابلیت میتواند از انواع داده مختلفی پشتیبانی کند، یکی از آنها متغیرهایی هستند که با نام متغیر ثابت یا const در سالیدیتی تعریف میشوند، این متغیرها قابل تغییر نیستند. متغیرهای کتابخانه در فضای ذخیرهسازی بلاک چین (Storage) ذخیره نمیشوند بلکه فضای ذخیره آنها در بایتکد (bytecode) است.
بایتکدها مکان دادهای هستند که شما تنها میتوانید از روی آن قرارداد را بخوانید اما نمیتوانید در آن بنویسید. این مکان داده، جایی است که میتوانید در آن متغیرهایی را پیدا کنید که در سالیدیتی به عنوان متغیرهای ثابت تعریف شده اند. بایتکد دارای منطق و اطلاعات زیادی درباره قرارداد هوشمند شامل توزیع کننده (dispatcher) و فراداده (metadata) قرارداد، است.
انواع داده دیگر که کتابخانهها از آنها پشتیبانی میکنند، Struts و Enums هستند.
چگونگی استقرار کتابخانه ها در سالیدیتی
استقرار Libraryها در سالیدیتی یا به شکل قرارداد کدگذاری شده است یا قرارداد پیوندی، که در ادامه به معرفی هر یک از این روشهای استقرار میپردازیم.
- استقرار کتابخانه از طریق قرار دادن آن در یک قرارداد : در حالتی که یک کتابخانه تنها دارای توابعی داخلی باشد، در قراردادی که از آن استفاده میکند، مستقر میشود در این صورت نیازی به ایجاد یک قرارداد مجزا برای کتابخانه از بین میرود.
در تصویر زیر میتوانید قرارداد Z را مشاهده کنید در این قرارداد کد و کتابخانه هر دو در یک قرارداد مستقر شده اند.
- استقرار کتابخانه از طریق پیوند آن به یک قرارداد دیگر : در حالتی که یک کتابخانه دارای توابعی عمومی یا خارجی باشد، میتوان برای استقرار آن یک قرارداد مجزا ایجاد کرد. این قرارداد باید به آدرس قرارداد کتابخانه اشاره کند.
در نمودار تصویر زیر، قراردادهای X و Y به قرارداد کتابخانه پیوند داده شده اند. در این تصویر استفاده دوباره از کد قرارداد از طریق کتابخانهها را مشاهده میکنید. در نتیجه این کاربرد، استفاده از کدها کمتر شده است و این موجب صرفهجویی و کاهش مصرف گس میشود.
مثال استفاده از کتابخانه ها در سالیدیتی
برای شروع، باید یک کتابخانه را در یک قرارداد مستقر یا دیپلوی کنید. به این ترتیب که در کد مربوط که در زیر عبارت pragma قرار دارد، کد کتابخانه مورد نظر خود را قرار میدهید. شما میتوانید این کد را یا به صورت مستقیم در قرارداد وارد کنید و یا آن را در فایلی مجزا ذخیره کنید و فایل را از طریق کلمه کلیدی Import وارد کنید. این دو حالت را میتوانید در مثالهای زیر به ترتیب با عنوان حالت اول و حالت دوم ببینید.
حالت اول: نوشتن کد کتابخانه به صورت مستقیم در قرارداد
در این حالت کتابخانهها را در بالای قرارداد مینویسیم تا در تعدادی تابع فراخوانده شده، به کار گرفته شوند.
1 2 3 4 5 6 7 8 9 10 11 |
pragma solidity ^0.8.6; // تعریف کتاباخانه library MathLibrary { // تعریف تابعی که از // کتابخانه استفاده می کند function multiply(uint a, uint b) public view returns (uint, address) { return (a * b, address(this)); } } |
حالت دوم: وارد کردن فایل از طریق کلمه کلیدی Import
در زمان به کار گرفتن این کلمه کلیدی در یک قرارداد، کامپایلر کدی که در فایل وجود دارد را به طور مستقیم در قرارداد کپی میکند.
1 2 3 4 5 6 7 8 9 10 11 12 |
pragma solidity ^0.8.6; // تعریف کتابخانه // import می توان با استفاده از واژه // کتابخانه ای را از فایلی دیگر وارد قرارداد کرد import LibraryName from “./libraryfile.sol”; // یا // می توان تمامی کتابخانه های موجود // در یک فایل را وارد قرارداد کرد import "./libraryfile.sol"; |
به منظور استفاده از کتابخانه ها در solidity از دستور LibraryName for type استفاده کنید. از طریق این دستور، توابع از کتابخانه مورد نظر بر روی هر یک از انواع داده در قرارداد فراخوانده شده، اعمال خواهند شد. در واقع LibraryName نام کتابخانه مورد نظر ماست که قصد داریم در قرارداد از آن استفاده کنیم و type نوع متغیر است که قرار است توابع کتابخانه بر روی آنها اعمال شود.
انواع متغیرها و دادهها میتوانند uint، string، address و موارد دیگر باشند که در کتابخانه پشتیبانی میشوند. برای پیوند کردن توابع کتابخانه به تمام انواع داده، میتوان از نماد * استفاده کرد.
در نمونه قرارداد هوشمند زیر میتوانید دستور using SafeMath for uint که به معنی پیوند توابع موجود در SafeMath برای تمام انواع داده Uint است را مشاهده کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
//SPDX-License-Identifier: MIT pragma solidity ^0.8.6; // تعریف کتابخانه library SafeMath { // تعریف تابعی برای // جمع دو عدد function sum(uint a, uint b) public pure returns (uint) { return a + b; } // تعریف تابعی برای // تفریق دو عدد function sub(uint a, uint b) public pure returns (uint) { require(a > b, "a must be bigger than b"); return a - b; } // تعریف قرارداد contract Test { // استفاده از کتابخانه برای نوعی از داده // از این طریق می توان به توابع تعریف شده // در کتابخانه برای داده های ذکر شده استفاده کرد using SafeMath for uint; // تعریف توابعی برای استفاده از // توابع تعریف شده در کتابخانه function makeSum(uint _a, uint _b) public pure returns (uint) { return _a.sum(_b); } function makeSum(uint _a, uint _b) public pure returns (uint) { return _a.sub(_b); } } |
چگونگی فراخوانی یک کتابخانه توسط یک تابع در سالیدیتی
سینتکس استفاده از توابع کتابخانه به ترتیب زیر است:
1 |
variable.libraryFunctionName(Argument) |
مراحل استفاده از توابع کتابخانه:
- ابتدا متغیری که قصد دارید به تابع کتابخانه انتقال دهید را مشخص کنید.
- سپس یک “.” وارد کرده و در ادامه نام تابع کتابخانه مورد نظر را وارد کنید.
- سالیدیتی به صورت ضمنی در اولین پارامتر به تابع انتقال مییابد.
1 2 3 4 5 |
// از تابع جمع کتابخانه استفاده می کند _a // به معنای جمع دو پارامتر است a.sub(_b) function makeSum(uint _a, uint _b) public pure returns (uint) { return _a.sum(_b); } |
نمونه ای از استفاده از کتابخانه ها(Library) در قراردادهای هوشمند Solidity
در ادامه میتوانید یک مثال از نحوه استفاده از یک کتابخانه را در قرارداد هوشمند مشاهده کنید. همانطور که میبینید در این مثال به جای کلمه کلیدی contract از کلمه کلیدی library استفاده شده است. کدهای زیر را میتوانید در ریمیکس امتحان کنید تا ببینید کتابخانه سالیدیتی چیست و دقیقا چگونه کار میکند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; // تعریف کتابخانه library Math { // تعریف تابعی برای // محاسبه رادیکل یک عدد function sqrt(uint y) internal pure returns (uint z) { if (y > 3) { z = y; uint x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } // else z = 0 (default value) } } // تعریف قرارداد contract TestMath { // تعریف تابعی برای استفاده از // تابع رادیکال تعریف شده در کتابخانه function testSquareRoot(uint x) public pure returns (uint) { return Math.sqrt(x); } } |
جمع بندی
همانطور که گفتیم کتابخانهها دارای کدهای قابل استفاده دوباره هستند و این استفاده دوباره کدها یکی از مهمترین مزایای کتابخانه ها در سالیدیتی است. این مزیت اصلی، خود مزایای دیگری را به همراه دارد که جلوگیری از تکرار کد و صرفهجویی در مصرف گس از آن جمله است.
منابع معتبر مرتبط:
https://medium.com/@eiki1212/what-is-ethereum-gas-simple-explanation-2f0ae62ed69c
مطالب زیر را حتما مطالعه کنید
بررسی رفتار توابع View و Pure در سالیدیتی Solidity
توابع Payable در قراردادهای هوشمند Solidity
سالیدیتی Solidity چیست؟
سطح دسترسی Visibility در سالیدیتی Solidity
توابع Function در سالیدیتی Solidity
انواع حافظه در قرارداد هوشمند سالیدیتی
6 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
واقعا ارزش وقت گذاشتن داشت
بازم درمورد این موضوع مطلب بزارین
شما پیج اینستا هم دارین؟
خیلی دنبال این موضوع بودم
خیلی محتوای خوبی بود مهندس
این مطلب حرف نداشت