آنچه در این مقاله خواهید خواند
قرارداد هوشمند یا اسمارت کانترکت (Smart Contract) مزیتی مهم برای شبکه سولانا (Solana) محسوب میشود که یادگیری فرآیند آموزش آن میتواند برای هر توسعه دهنده بلاک چین مفید واقع شود. شبکه سولانا در سال 2017 برای رفع مشکل مقیاس پذیری بلاک چینهای موجود حوزه کریپتو توسط برنامهنویسی اهل شوروی سابق به نام آناتولی یاکوونکو (Anatoly Yakovenko) ساخته شد. بلاک چین Solana در یک شبکه استاندارد میتواند تا سقف 71,000 تراکنش زیر 176 بایتی را در هر ثانیه به انجام برساند که در این حوزه رقمی بسیار بالا محسوب میشود. سرعت بسیار زیاد شبکه سولانا در کنار قابلیت ساخت و اجرای قرارداد هوشمند بر بستر این بلاک چین، آن را به رقیبی سرسخت برای اتریوم، بایننس اسمارت چین و کاردانو بدل کرده است.
پلتفرم سولانا به گونهای طراحی و ساخته شده است تا توسعه اپلیکیشنهای غیر متمرکز با فرکانس تراکنش بالا را راحتتر کند که برای سیستمهای مالی پرمیشنلس (بدون نیاز به مجوز) الزامی هستند. بلاکچین سولانا به لطف افزون بر 500 پروژه وب3، دیفای، ان اف تی و قرارداد های هوشمند خود، ادعا میکند از سریعترین و رو به رشدترین شبکهها است.
سولانا برای دستیابی به سرعت و مقیاس پذیری بالای خود از الگوریتم اجماعی شامل اثبات تاریخ استفاده میکند که موجب میشود جایگاهی بالا در میان بلاک چینهای برتر و مقیاس پذیر به دست بیاورد. بنابراین میتوان گفت سولانا با سرعتی زیاد در حال توسعه و افزایش کاربرد است. یکی از دلایل افزایش استفاده این بلاک چین، قراردادهای هوشمند کاربردی آن است که البته در تمام پروژههای ذکر شده به کار برده میشوند. در این مطلب قصد داریم نحوه نوشتن قرارداد هوشمند یا اسمارت کانترکت (Smart Contract) را در بلاک چین سولانا آموزش دهیم تا شما نیز بتوانید به جمع توسعه دهندگان این بلاک چین پرسرعت و محبوب بپیوندید.
بلاک چین سولانا (Solana) چیست؟
شبکه سولانا یک اکوسیستم بلاک چینی غیر متمرکز است که به منظور دوری جستن از ازدحام و مقیاس ناپذیری شبکههای دیگر طراحی و ساخته شده است. تمرکز اصلی بلاک چین سولانا روی برطرف کردن دلایل اصلی مقیاس ناپذیری، یعنی کاهش زمان تایید تراکنشهای قرارداد هوشمند و افزایش تعداد تراکنش بر ثانیه (TPS) است. پروژه Solana متن باز است و ترکیبی از فناوریهای انقلابی Intel ،Netscape ،Google و Qualcomm را دارد که به آن در حفظ تعداد بالای تراکنشها کمک میکنند. بلاک چین سولانا همچنین ارز دیجیتال بومی خود را دارد که در فرآیندهای پرداختی شبکه کار میرود. به علاوه، ارسال قراردادهای هوشمند روی این بلاک چین نیازمند داشتن کوین بومی آن است، به همین خاطر احتمالا باید قبل از شروع پروسه، اقدام به خرید سولانا کنید.
ساختار و معماری قرارداد هوشمند در سولانا چگونه است؟
مدل و الگوی قرارداد هوشمند در بلاک چین سولانا نسبت به شبکههای سازگار با ماشین مجازی اتریوم (EVM) تفاوت بسیاری دارد و نمیتوان همان روند ساخت قرارداد هوشمند در اتریوم را برای آن به کار برد. اسمارت کانترکتهای سنتی متکی بر EVM از ترکیب کد، منطق و وضعیت (State) برای ساخت یک قرارداد استفاده میکنند که بعد روی زنجیره سوار میشود. در مقایسه، یک قرارداد هوشمند سولانا همواره در حالت Read-Only یا بدون وضعیت (Stateless) میماند و تنها کد منطقی درون خود دارد. در حقیقت پس از سوار کردن قرارداد هوشمند بر بستر بلاک چین، تنها با حساب یا اکانتهای بیرونی میتوان به آن دسترسی داشت. این حسابها وظیفه ذخیره دادههای مرتبط و استفاده شده در برنامه قرارداد هوشمند را بر عهده دارند و اسمارت کانترکت به کمک آنها و دادههایی که ارائه میدهند، فعالیت خود را ادامه میدهد.
به این روش، وضعیت حسابها (Account State) و منطق قرارداد (Contract Logic) به صورت منطقی از همدیگر جداسازی میشوند. میتوان گفت این مهمترین تفاوت قرارداد های هوشمند در سولانا و بلاک چینهای مبتنی بر ماشین مجازی اتریوم محسوب میشود. همچنین اکانتها نیز در شبکه سولانا با دیگر بلاک چین ها (مثلا اتریوم) تفاوت زیادی دارند. حسابها در سولانا برای ذخیره داده (مثل اطلاعات والت) استفاده میشوند، اما در اتریوم حسابها صرفا یک مرجع برای والتهای شخصی کاربران هستند. با توجه متفاوت بودن ساختار شبکه سولانا، برای ارسال قرارداد هوشمند روی آن نیازی به خرید ارز اتریوم وجود ندارد.
به علاوه سولانا یک کلاینت و رابط کاربردی برنامهنویسی RPC جی سون (JSON) نیز دارد که تعاملات اپلیکیشن های غیر متمرکز (DApp) را با این شبکه آسان میکنند. البته این اپلیکیشنهای غیر متمرکز همچنین میتوانند از کیتهای توسعه نرم افزار موجود نیز برای ارتباط برقرار کردن با بلاک چین و برنامههای سولانا استفاده کنند.
در تصویر بالا، برنامه (Program) سمت راست نمایانگر گردش کار (Workflow) توسعه است که به کاربران اجازه میدهد نزمافزارهای مطلوب خود را به شکل یک قرارداد هوشمند به زبانهای C ،Rust و ++C بر بستر بلاک چین سولانا بسازند و سوار کنند. اگر قبلا سعی کرده باشید در بلاک چینهای دیگر نیز قرارداد هوشمند بسازید، به راحتی متوجه میشوید که به عنوان مثال ساخت قرارداد هوشمند در بایننس اسمارت چین با سولانا تفاوت زیادی دارد.
پس از سوار شدن موفق نرم افزار روی بلاک چین، هر کسی که دانش برنامهنویسی لازم را داشته باشد میتواند از آن استفاده کند. کاربران برای تعامل با این برنامهها باید به کمک کیتهای توسعه نرم افزار موجود و رابط کاربردی برنامهنویسی RPC جی سون یک اپلیکیشن غیر متمرکز بسازند.
بر اساس تصویر گردش کار توسعه دوم، در بخش کلاینت (مربع پایین سمت راست)، کاربران میتوانند برای ارتباط برقرار کردن با برنامههای سوارشده، اپلیکیشنهای غیر متمرکز بسازند. این اپلیکیشنها به کمک کیت توسعه نرم افزار تراکنشهای خود را به این برنامهها ارسال میکنند و همچنین میتوانند نرم افزارهای مختلف همچون والتهای کریپتویی و صرافیهای غیر متمرکز بسازند.
دو بخش گردش کار (Program و Client) در کنار همدیگر شبکهای کامل از اپلیکیشنهای غیر متمرکز و برنامهها میسازند که برای آپدیت کردن وضعیت و بررسی شرایط بلاک چین با هم تعامل دارند.
چطور در بلاک چین سولانا (Solana) قرارداد هوشمند بنویسیم؟
در این بخش آموزش ساخت قرارداد هوشمند را با اجرای یک برنامه Hello World روی بلاک چین سولانا ادامه خواهیم داد. برنامه HelloWorld به زبان برنامهنویسی Rust نوشته شده است و یک خروجی را در کنسول محیط توسعه یکپارچه (IDE) منتشر میکند. اولین قدم برای ساخت قرارداد هوشمند سولانا این است که محیط Solana را روی ویندوز اجرا کنیم تا کار برایمان راحتتر شود.
آموزش اجرای محیط توسعه در بلاک چین سولانا
اجرای مستقیم کد قرارداد هوشمند به صورت مستقیم در ویندوز برای بسیاری از مردم سردرگمکننده است. به همین دلیل توصیه میشود یک نسخه اوبونتویی WSL (یک سیستم عامل ثانویه لینوکسی در ویندوز) را روی ویندوز خود (با ماشینهای مجازی) نصب کنید تا بتوانید کد قرارداد هوشمند راست را درون یک فایل با فرمت so. کامپایل کنید.
دستورهای لازم برای راهاندازی محیط توسعه سولانا به صورت زیر هستند:
apt upgradeapt updateapt install nodejsapt install npmapt install python3-pipcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shsh -c "$(curl -sSfL https://release.solana.com/v1.5.7/install)"source $HOME/.cargo/envexport PATH="/root/.local/share/solana/install/active_release/bin:$PATH"export RUST_LOG=solana_runtime::system_instruction_processor=trace,solana_runtime::message_processor=debug,solana_bpf_loader=debug,solana_rbpf=debugsolana-test-validator --log
سپس برنامه Hello World را اجرا و محیط توسعه را تست کنید:
git clone https://github.com/solana-labs/example-helloworld.git cd example-HelloWorld/ npm install npm run build:program-rust
پیشنیازهای نوشتن و ساخت قرارداد هوشمند در سولانا با زبان راست (Rust)
برای ساخت و سوار کردن قراردادهای هوشمند در بلاک چین سولانا به موارد زیر نیاز دارید:
- NodJS ورژن 14 یا بالاتر و NPM
- آخرین نسخه استیبل Rust
- کلاینت سولانا ورژن 1.7.11 یا بالاتر
- Git
ساخت و اجرای نمونه عملی قرارداد هوشمند HelloWorld در شبکه سولانا
برنامه HelloWorld یک قرارداد هوشمند است که خروجی خود را در کنسول پرینت میکند و همچنین تعداد دفعات اجرا شدن قرارداد هوشمند را در مدت زمان تعیین شده میشمارد و این رقم را به صورت درونزنجیرهای ذخیره میکند. بیایید با بررسی ذره ذره کد آن، شیوه عملکرد آن را بهتر درک کنیم.
در بخش اول تنها چند پارامتر استاندارد برنامههای سولانایی را میبینیم و همچنین نقطه ورود به اپلیکیشن (تابع process_instruction) تعیین شده است. به جز این تابع، در بخش اول همچنین از BORSH یا Binary Object Representation Serializer for Hashing برای مرتب و نامرتب کردن پارامترهای عبوری از برنامه بلاک چینی استفاده میشود.
از دستور ارائه شده برای راه اندازی برنامه HelloWorld استفاده کنید:
use borsh::{BorshDeserialize, BorshSerialize}; use solana_program::{ account_info::{next_account_info, AccountInfo}, entrypoint, entrypoint::ProgramResult, msg, program_error::ProgramError, pubkey::Pubkey, }; /// Define the type of state stored in accounts #[derive(BorshSerialize, BorshDeserialize, Debug)] pub struct GreetingAccount { /// number of greetings pub counter: u32, } // Declare and export the program's entrypoint entrypoint!(process_instruction);
سپس تابع process_instruction یک کلید خصوصی به نام program_id و اکانتی به نام accountInfo را قبول میکند که مورد اول در حقیقت محل قرار گرفتن برنامه و مورد دوم اکانتی است که خروجی را به آن ارسال میکنیم.
pub fn process_instruction( program_id: &Pubkey, // Public key of the account the hello world program was loaded into accounts: &[AccountInfo], // The account to say hello to _instruction_data: &[u8], // Ignored, all helloworld instructions are hellos
کد منطقی اصلی برنامه در ProgramResult ذخیره میشود. در این مثال، ProgramResult یک پیغام را چاپ و اکانت مدنظر را از فهرست accounts انتخاب میکند. اما در این مثال ما تنها از یک اکانت استفاده میکنیم.
) -> ProgramResult { msg!("Hello World Rust program entrypoint") // Iterating accounts is safer then indexing let accounts_iter = &mut accounts.iter(); // Get the account to say hello to let account = next_account_info(accounts_iter)?;
سپس برنامه بررسی میکند که مجوز تغییر داده را در اکانت مشخصشده دارد یا خیر.
// The account must be owned by the program in order to modify its data if account.owner != program_id { msg!("Greeted account does not have the correct program id"); return Err(ProgramError::IncorrectProgramId); }
در نهایت تابع عدد ذخیره شده کنونی در اکانت را فرا میخواند، مقدار آن را 1 رقم بالاتر میبرد، دوباره نتیجه را در اکانت مینویسد و یک پیغام را برای ما چاپ میکند.
// Increment and store the number of times the account has been greeted let mut greeting_account = GreetingAccount::try_from_slice(&account.data.borrow())?; greeting_account.counter += 1; greeting_account.serialize(&mut &mut account.data.borrow_mut()[..])?; msg!("Greeted {} time(s)!", greeting_account.counter); Ok(())
آموزش ارسال کردن (Deploy) کد قرارداد هوشمند روی بلاک چین سولانا
اولین قدم برای ارسال کد روی شبکه سولانا این است که ارز دیجیتال آن را داشته باشید تا هزینه گس را پرداخت کنید. توجه کنید که هزینه گس بر اساس قیمت لحظهای سولانا (SOL) میتواند تغییر کند، اما این مبلغ در بیشترین حالت کمتر از 10 سنت خواهد بود. در مرحله بعد برای سوار کردن برنامه یا قرارداد هوشمند بلاک چین سولانا این است که ریپازیتوری (Repository) را کلون یا تکثیر کنید.
git clone https://github.com/solana-labs/example-helloworld cd example-HelloWorld
پس از انجام این مرحله، میتوانید محیط توسعه کنونی را روی Devnet قرار دهید که شبکه آزمایشی سولانا برای توسعه دهندگان است تا قرارداد هوشمند خود را قبل از اجرای نهایی، تست کنند.
solana config set --url https://api.devnet.solana.com
در مرحله بعد باید یک زوجکلید یا Keypair جدید بسازید. این زوجکلید به اکانت شما اجازه میدهد با برنامهها و قرارداد های هوشمند سوارشده بر شبکه Solana Devnet تعامل داشته باشد. البته در نظر داشته باشید که این روش برای ذخیره کلیدهای خصوصی بسیار ناامن محسوب میشود و فقط در موارد آزمایشی قابل استفاده است. بنابراین برای امنیت بیشتر باید از رمز عبور استفاده کنید.
Solana-keygen new --force
برای سوار کردن کد قرارداد هوشمند بر بستر بلاک چین به مقداری رمز ارز برای پرداخت هزینه آن نیاز دارید. پس از ساخت اکانت، میتوانید با استفاده از برنامه Airdrop تعدادی ارز دیجیتال سولانا آزمایشی به حساب خود واریز کنید:
Solana airdrop 5
حالا کاملا برای ساخت و سوار کردن برنامه Hello World آماده هستید. با دستور زیر میتوانید برنامه را بسازید:
npm run build:program-rust
پس از ساخته شدن برنامه، آن را روی Devnet سوار کنید. پس از به دست آوردن خروجی دستور قبلی، حال باید دستوری برای اجرای برنامه وارد کنید که به صورت زیر است:
Solana program deploy dist/program/HelloWorld.so
به این ترتیب، با موفقیت تمام برنامه Hello World خود را روی Devnet اجرا کرده و یک Program Id مشخص به آن دادهاید. با مراجعه به اکسپلورر شبکه آزمایشی سولانا میتوانید وضعیت قرارداد هوشمند تازه ساخته شده را بررسی کنید.
سخن پایانی
ساخت قرارداد هوشمند بر بستر بلاک چین سولانا تفاوتهای زیادی با شبکههای دیگر از جمله بایننس اسمارت چین، اتریوم و کاردانو دارد. این تفاوتها بیشتر از ساختار و معماری شبکه Solana نشئت میگیرند که یادگیری برنامهنویسی و اجرای نرم افزار را در آن متفاوت میکند. اما اگر از این مانع ورودی گذر کنید، ساختار مدرن و مناسب برای توسعهدهندگان بلاک چین سولانا موجب تسریع و تسهیل فرآیند برنامهنویسی شما خواهد شد. ساخت قرارداد هوشمند در کاردانو نیز تقریبا مثل سولانا نسبت به دیگر شبکههای سازگار با ماشین مجازی اتریوم، متفاوت است. بیت 24 مقالهای نیز برای آموزش راه اندازی اسمارت کانترکت در کاردانو منتشر کرده است.
تهیه شده در بیت 24