کتابخانه ها(Library) در قراردادهای هوشمند Solidity

کتابخانه ها(Libraries) در قراردادهای هوشمند
کتابخانه ها در قراردادهای هوشمند Solidity بلوک هایی از کد قابل استفاده مجدد هستند. آنها حاوی توابعی هستند که توسط سایر قراردادها در شبکه بلاک چین استفاده می شود. کتابخانه ها برنامه نویسی شی گرا را ترویج می کنند و به توسعه دهندگان اجازه می دهند طراحی خود را ماژولار سازند.
استفاده از کتابخانه ها در قراردادهای هوشمند Solidity مزایایی دارد. بزرگترین مزیت استفاده مجدد کد در قراردادهای دیگر است. از آنجایی که کتابخانه ها قابل استفاده مجدد هستند، به جلوگیری از تکرار کد کمک می کنند. علاوه بر این، کتابخانهها در مصرف گس صرفهجویی میکنند، زیرا یک کد چندین بار در بلاک چین مستقر نمیشود.
کتابخانه ها شکل خاصی از قراردادها هستند که:
- نمونه مشابهی ندارند.
- هیچ گونه ذخیره سازی یا متغیر حالتی که تغییر کند در خود نگهداری نمی کنند.
- نمی تواند توابع بازگشتی داشته باشد.
- هیچ گزارش رویدادی (event) وجود ندارد.
- اتر (موجودی) را نگه نمی دارد.
- بدون مالک هستند.
- نمی توان آن ها را تخریب کرد.
- نمی تواند ارث ببرد یا ارث برده شود.
Libraries در Solidity به شما امکان می دهد تا قابلیت هایی را به انواع اضافه کنید. به عنوان مثال می توانید از یک کتابخانه برای بهبود عملکرد متغیری از نوع uint در قرارداد استفاده کنید.
کتابخانه یک بلوک ایزوله از کد است. توابع موجود در کتابخانه ها، از فضای ذخیره سازی Storage در قرارداد فراخوانی استفاده می کند. در طول اجرای یک تابع از کتابخانه، کد فراخوانی در چارچوب قرارداد فراخوانی اجرا می شود. کتابخانه ها می توانند به متغیرهای حالت قرارداد فراخوانی کننده دسترسی داشته باشند اگر به طور صریح ارائه شده باشند.
به عنوان مثال یک کتابخانه Solidity را در نظر بگیرید که عملکردهای یک ماشین حساب اصلی (جمع، تفریق، ضرب و تقسیم) را انجام می دهد. قرارداد فراخوان ورودی های 5 و 5 را به تابع افزودن کتابخانه ها ارسال می کند. تابع افزودن کتابخانه اجرا می شود و 10 را به قرارداد فراخوانی برمی گرداند.
نحوه ایجاد کتابخانه (Library) در Solidity
برای ایجاد یک کتابخانه (Library) را با کلمه کلیدی Library تعریف کنید نه با کلمه کلیدی Contract.
pragma solidity ^0.8.6;
library libraryName {
Library ها می توانند چندین نوع داده مختلف را پشتیبانی کنند.
انواع پشتیبانی شده عبارتند از:
- Libraryها از متغیرهایی که به عنوان const تعریف شده اند پشتیبانی می کنند زیرا تغییرناپذیر هستند. متغیرهای Library در بایت کد ذخیره می شوند نه در Storage در بلاک چین.
- Struts و Enums در Library پشتیبانی می شوند.
Library مثال زیر به نام MathLibrary شامل یک عملیات ضرب اولیه است. یک قرارداد فراخوانی کننده، دو عدد صحیح بدون علامت را به تابع اضافه می کند تا ضرب شوند. Library نتیجه را به قرارداد فراخوان کننده برمی گرداند.
pragma solidity ^0.8.6;
library MathLibrary {
function multiply(uint a, uint b) public view returns (uint, address) {
return (a * b, address(this));
}
}
How to
نحوه استقرار Library در Solidity
Libraryها در Solidity به صورت قرارداد کدگذاری شده یا پیوندی مستقر می شوند.
1- قراردادن یک Library در یک قرارداد – اگر یک Library فقط عملکردهای داخلی داشته باشد، Library در قراردادی که از آن استفاده می کند گنجانده می شود. نیازی به قرارداد جداگانه برای Library نیست. در نمودار زیر قرارداد Z را ببینید که نمونه ای از کد فراخوانی کننده و Library همه در یک قرارداد است.
2- پیوند یک Library به یک قرارداد – اگر کتابخانه ای دارای تابع عمومی یا خارجی باشد، می توان آن را به طور جداگانه مستقر کرد. قرارداد فراخوانی کننده با استفاده از Library باید به آدرس قرارداد کتابخانه اشاره کند. در نمودار زیر پیوند قرارداد X و Y به قرارداد کتابخانه را ببینید. تصویر زیر استفاده مجدد از کد قرارداد و استفاده از کد کمتر را نشان می دهد که منجر به صرفه جویی در مصرف گس می شود.

برای نشان دادن این دو مفهوم، هر دو روش را در زیر با استفاده از قراردادهای نمونه بررسی خواهیم کرد.
نحوه استفاده از کتابخانه در قرارداد هوشمند Solidity
کتابخانه را در یک قرارداد جاسازی کنید
برای شروع، در کد مربوطه زیر عبارت pragma، کد Library خود را قرار دهید. می توانید کد Library خود را مستقیماً در قرارداد هوشمند بنویسید یا می توانید کد Library خود را در یک فایل جداگانه نگه دارید و آن را وارد کنید.
گزینه 1 – استفاده از Import
هنگامی که کلمه کلیدی “Import” در یک قرارداد استفاده می شود، کامپایلر کد موجود در فایل را مستقیماً در قرارداد هوشمند کپی می کند.
pragma solidity ^0.8.6;
//if your library is in another file you can import it into the contract
import LibraryName from “./libraryfile.sol”;
or
//to import all libraries in the file use the pattern below
import "./libraryfile.sol";
گزینه 2 – کد Library به طور مستقیم در قرارداد
کتابخانهها را میتوان در بالای قرارداد نوشت تا در چندین تابع فراخوانی استفاده شود.
pragma solidity ^0.8.6;
library MathLibrary {
//function that returns a * b and the requesting address
function multiply(uint a, uint b) internal view returns (uint, address) {
return (a * b, address(this));
}
}
برای استفاده از کتابخانه در قرارداد هوشمند از دستور زیر استفاده کنید:
استفاده از LibraryName برای type
این دستورالعمل برای پیوست کردن توابع از کتابخانه (LibraryName) به هر نوع داده (نوع) قرارداد فراخوانی استفاده می شود.
LibraryName– نام کتابخانه ای است که می خواهید در قرارداد استفاده کنید.
Type– نوع متغیری که از کتابخانه استفاده می شود (uint، string، address و غیره). از علامت * برای پیوست کردن توابع از کتابخانه به همه انواع استفاده کنید.
در زیر نمونه قراردادی است که از Library استفاده می کند. به نحوه دستورالعمل “using MathLibrary for uint” توجه داشته باشید. این بدان معنی است که تابع را از MathLibrary برای همه انواع Uint وصل کنید.
pragma solidity ^0.8.6;
library MathLibrary {
//function that returns a * b and the requesting address
function multiply(uint a, uint b) internal view returns (uint, address) {
return (a * b, address(this));
}
}
contract exampleContractUsingLibrary {
//use the syntax - using LibraryName for Type
//this can be use to attach library functions to any data type.
using MathLibrary for uint;
address owner = address(this);
//function calls the function multiply in the MathLibrary above
function multiplyExample(uint _a, uint _b) public view returns (uint, address) {
return _a.multiply(_b);
}
}
چگونه یک تابع یک Library را فراخوانی می کند
برای استفاده از توابع Library، سینتکس به شکل زیر است:
variable.libraryFunctionName(Argument)
1- متغیری را که می خواهید به تابع کتابخانه منتقل کنید، تعیین کنید
2- یک “.” را اضافه کنید به دنبال آن نام تابع کتابخانه ای که می خواهیم استفاده کنید مشخص کنید
3- Solidity به طور ضمنی در اولین پارامتر به تابع منتقل می شود
مثلا:
//variable _a use the multiply function in the library
//_a.multiply(_b) which means multiply a * b
//_a is implicitly passed in as the first parameter
//_b is passed in as the second parameter
function multiplyExample(uint _a, uint _b) public view returns (uint, address) {
return _a.multiply(_b);
پیوند یک کتابخانه مستقر شده با استفاده از Remix
در مرحله بعد، می خواهیم از Remix برای پیوند یک قرارداد جدید به یک Library مستقر استفاده کنیم. این فرایند به شرح زیر است:
- قرارداد Library را در یک شبکه آزمایشی دپلوی کنید
- Remix را با آدرس کتابخانه مستقر پیکربندی کنید
- دپلوی قرارداد فراخوانی کننده
قبل از شروع پیوند قراردادها، پیش شرط زیر باید رخ دهد:
- شما یک قرارداد Library را مستقر و تأیید کردید
- شما آدرس قرارداد Library را دارید
- قرارداد فراخوان دارای “libraryfile.sol/.” است. این دستور در بالای قرارداد قرار دارد و آماده استقرار است
برای پیوند دادن یک قرارداد کتابخانه، پیکربندی ریمیکس را تغییر دهید
بهطور پیشفرض Remix یک فایل metadata قرارداد را تولید نمیکند. برای ایجاد یک فایل metadata قراردادها، به ماژول تنظیمات بروید و Generation metadata را انتخاب کنید.

سپس به کامپایلر Solidity بروید و قرارداد هوشمند فراخوانی را مجدداً کامپایل کنید تا مطمئن شوید که هیچ خطایی وجود ندارد و فایل metadata را ایجاد کنید.
سپس به پوشه artifacts در فایل اکسپلورر Remix رفته و فایل callingcontract.json را باز کنید.

رفتار پیشفرض Remix این است که به طور خودکار یک کتابخانه را مستقر میکند و آن را به قرارداد فراخوان پیوند میدهد (autoDeployLib: true). این رفتار پیش فرض Remix به خوبی کار می کند.
رفتار Remix را تغییر دهید تا یک کتابخانه به قرارداد فراخوانی پیوند داده شود. فایل metadata قرارداد فراخوانی کننده را ویرایش کنید.

با استفاده از آدرس کتابخانه، تگ <address> شبکه ای را که در حال استقرار در آن هستیم، با آدرس واقعی کتابخانه جایگزین کنید. در مثال ما در حال استقرار در یک شبکه آزمایشی هستیم، بنابراین در فایل netadata تگ های مناسب را ویرایش کنید.
همچنین باید تنظیمات autoDeployLib را بهروزرسانی کنیم تا Remix بهطور خودکار کتابخانه را هنگام اجرای قرارداد فراخوانی دپلوی نکند. autoDeployLib را روی false قرار دهید.
قرارداد را در REMIX اجرا کنید
در Remix، گزینه injected web3 را به عنوان محل استقرار انتخاب کنید، قرارداد را انتخاب کنید و روی deploy کلیک کنید. قرارداد خود را تأیید کنید و روند را آزمایش کنید.
از نمونه فایل های زیر استفاده کنید. کتابخانه را مستقر کنید و سپس آن را به یک قرارداد هوشمند مستقر جداگانه پیوند دهید
نمونه قرارداد کتابخانه
//name this file MathLibrary.sol
pragma solidity ^0.8.6;
library MathLibrary {
function multiply(uint a, uint b) public view returns (uint, address) {
return (a * b, address(this));
}
}
نمونه قرارداد فراخوانی
ragma solidity ^0.8.6;
import './MathLibrary.sol';
contract exampleContractUsingLibrary {
using MathLibrary for uint;
address owner = address(this);
function multiplyExample(uint _a, uint _b) public view returns (uint, address) {
return _a.multiply(_b);
}
}

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