چگونه یک قرارداد هوشمند WebAssembly در شبکه Ontology بنویسیم؟ قسمت 1: زنگ

چگونه یک قرارداد هوشمند WebAssembly در شبکه Ontology بنویسیم؟ قسمت 1: زنگ

فناوری Ontology Wasm هزینه انتقال قراردادهای هوشمند dApp را با منطق تجاری پیچیده به بلاک چین کاهش می دهد و در نتیجه اکوسیستم dApp را تا حد زیادی غنی می کند.

اکنون هستی شناسی Wasm به طور همزمان از توسعه Rust و C++ پشتیبانی می کند. زبان Rust از Wasm بهتر پشتیبانی می کند و بایت کد تولید شده ساده تر است که می تواند هزینه تماس های قراردادی را بیشتر کاهش دهد. بنابراین، چگونه از Rust برای توسعه قرارداد در شبکه Ontology استفاده کنیم؟

توسعه قرارداد WASM با Rust

قرارداد ایجاد کنید

بار یک ابزار خوب ایجاد پروژه و مدیریت بسته برای توسعه Rust است که به توسعه دهندگان کمک می کند تا تعامل کد و کتابخانه های شخص ثالث را بهتر سازماندهی کنند. برای ایجاد یک قرارداد Ontology Wasm جدید، به سادگی دستور زیر را اجرا کنید:

چگونه یک قرارداد هوشمند WebAssembly در شبکه Ontology بنویسیم؟ قسمت 1: زنگ

ساختار پروژه ای که ایجاد می کند:

چگونه یک قرارداد هوشمند WebAssembly در شبکه Ontology بنویسیم؟ قسمت 1: زنگ

فایل Cargo.toml برای تنظیم اطلاعات اولیه پروژه و اطلاعات کتابخانه وابسته استفاده می شود. بخش [lib] فایل باید روی crate-type = ["cdylib"] تنظیم شود. فایل lib.rs برای نوشتن کد منطقی قرارداد استفاده می شود. علاوه بر این، باید پارامترهای وابستگی را به بخش [وابستگی ها] فایل پیکربندی Cargo.toml اضافه کنید:

چگونه یک قرارداد هوشمند WebAssembly در شبکه Ontology بنویسیم؟ قسمت 1: زنگ

با این وابستگی، توسعه‌دهندگان می‌توانند رابط‌هایی را فراخوانی کنند که با بلاک چین آنتولوژی و ابزارهایی مانند پارامتر سریال‌سازی تعامل دارند.

عملکرد ورود قرارداد

هر برنامه یک تابع ورودی دارد، مانند تابع اصلی که معمولاً می بینیم، اما قرارداد تابع اصلی ندارد. هنگامی که قرارداد Wasm با استفاده از Rust توسعه می یابد، تابع فراخوانی پیش فرض به عنوان تابع ورودی برای استفاده از قرارداد استفاده می شود. نام یک تابع در Rust هنگام کامپایل کد منبع Rust به بایت کد که می تواند توسط یک ماشین مجازی اجرا شود نامشخص خواهد بود. برای جلوگیری از تولید کد اضافی توسط کامپایلر و کاهش اندازه قرارداد، تابع invoke حاشیه‌نویسی #[no_mangle] را اضافه می‌کند.

تابع invoke چگونه پارامترهایی را برای اجرای تراکنش دریافت می کند؟

کتابخانه ontio_std یک تابع Runtime::input() برای دریافت پارامترهای اجرای تراکنش ارائه می دهد. توسعه‌دهندگان می‌توانند از ZeroCopySource برای جداسازی آرایه بایت‌های حاصل استفاده کنند. که در آن اولین آرایه از بایت های خوانده شده نام متد invoke و به دنبال آن پارامترهای متد است.

نتیجه اجرای قرارداد چگونه برمی گردد؟

تابع runtime::ret ارائه شده توسط کتابخانه ontio_std نتیجه اجرای یک متد را برمی گرداند.

تابع فراخوانی تکمیل شده به صورت زیر است:

چگونه یک قرارداد هوشمند WebAssembly در شبکه Ontology بنویسیم؟ قسمت 1: زنگ

سریال‌سازی و جداسازی داده‌های قرارداد

در فرآیند توسعه قراردادها، توسعه‌دهندگان همیشه با مشکل سریال‌سازی و سریال‌زدایی مواجه می‌شوند، به‌ویژه در مورد نحوه ذخیره یک نوع داده ساختاری در پایگاه داده و نحوه غیر سریال‌سازی یک آرایه بایتی خوانده‌شده از پایگاه داده برای دریافت نوع داده ساختار.

کتابخانه ontio_std رابط‌های رمزگشا و رمزگذار را برای سریال‌سازی و سریال‌زدایی داده‌ها فراهم می‌کند. فیلدهای یک ساختار همچنین رابط های رمزگشا و رمزگذار را پیاده سازی می کنند تا ساختار را بتوان سریالی و غیر سریالی کرد. نمونه هایی از کلاس Sink زمانی که انواع داده های مختلف سریال سازی می شوند مورد نیاز است. نمونه ای از کلاس Sink دارای یک فیلد buf از نوع set است که داده های نوع بایت را ذخیره می کند و تمام داده های سریال در buf ذخیره می شود.

برای داده های با طول ثابت (به عنوان مثال: بایت، u16، u32، u64، و غیره)، داده ها مستقیماً به یک آرایه بایت تبدیل می شوند و سپس در buf ذخیره می شوند. برای داده‌هایی با طول غیر ثابت، ابتدا باید طول، سپس Ddata را سریال‌سازی کرد (به عنوان مثال، اعداد صحیح بدون علامت با اندازه ناشناخته، از جمله u16، u32، یا u64، و غیره).

سریال زدایی درست برعکس است. برای هر روش سریال‌سازی، یک روش سریال‌زدایی مربوطه وجود دارد. Deserialization مستلزم استفاده از نمونه های کلاس Source است. این نمونه کلاس دارای دو فیلد buf و pos است. Buf برای ذخیره داده‌هایی که قرار است بی‌سریال شوند و pos برای ذخیره موقعیت خواندن فعلی استفاده می‌شود. وقتی نوع خاصی از داده در حال خواندن است، اگر طول آن را بدانید، می‌توانید مستقیماً آن را بخوانید، برای داده‌هایی با طول ناشناخته - ابتدا طول آن را بخوانید، سپس محتوا را بخوانید.

دسترسی و به روز رسانی داده ها در زنجیره

هستی شناسی-wasm-cdt-rust - یک روش عملیاتی برای کار با داده ها در زنجیره کپسوله می کند که برای توسعه دهندگان برای اجرای عملیاتی مانند افزودن، حذف، تغییر و پرس و جو داده ها در زنجیره به شرح زیر راحت است:

  • پایگاه داده::get(key) - برای درخواست داده از زنجیره استفاده می شود و کلید اجرای رابط AsRef را درخواست می کند.
  • پایگاه داده::put(کلید، مقدار) - برای ذخیره داده ها در شبکه استفاده می شود. کلید پیاده سازی رابط AsRef را درخواست می کند و ارزش پیاده سازی رابط Encoder را درخواست می کند.
  • پایگاه داده::حذف (کلید) - برای حذف داده ها از زنجیره استفاده می شود و کلید اجرای رابط AsRef را درخواست می کند.

تست قرارداد

زمانی که روش‌های یک قرارداد پیاده‌سازی می‌شوند، نیاز به دسترسی به داده‌های موجود در زنجیره داریم و به یک ماشین مجازی مناسب برای اجرای بایت کد قرارداد نیاز داریم، بنابراین به طور کلی لازم است که قرارداد را روی زنجیره برای آزمایش مستقر کنیم. اما این روش آزمایش مشکل ساز است. برای آسان‌تر کردن آزمایش قراردادها برای توسعه‌دهندگان، کتابخانه ontio_std یک ماژول ساختگی برای آزمایش فراهم می‌کند. این ماژول شبیه‌سازی داده‌ها را در زنجیره فراهم می‌کند و آزمایش واحد روش‌های قرارداد را برای توسعه‌دهندگان آسان‌تر می‌کند. نمونه های خاصی را می توان یافت اینجا.

اشکال زدایی قرارداد

کنسول::debug(msg) اطلاعات اشکال زدایی را هنگام اشکال زدایی قرارداد نمایش می دهد. اطلاعات msg به فایل گزارش گره اضافه می شود. یک پیش نیاز این است که هنگام اجرای گره آزمایشی Ontology محلی، سطح فایل گزارش را روی حالت اشکال زدایی تنظیم کنید.

runtime::notify(msg) اطلاعات مربوط به اشکال زدایی را در حین اشکال زدایی قرارداد خروجی می دهد. این روش اطلاعات وارد شده به زنجیره را ذخیره می کند و با استفاده از روش getSmartCodeEvent می توان از زنجیره پرس و جو کرد.

این مقاله توسط ویراستاران Hashrate&Shares مخصوصاً برای OntologyRussia ترجمه شده است. گریه کردن

آیا شما یک ارتقاء دهنده هستید؟ به جامعه فناوری ما بپیوندید در اختلاف. همچنین، نگاهی به مرکز توسعه دهندگان در وب سایت ما، جایی که می توانید ابزارهای توسعه دهنده، اسناد و موارد دیگر را بیابید.

هستیشناسی

منبع: www.habr.com

اضافه کردن نظر