معاملات ، وزن و هزینه

  • 2022-08-19

هنگامی که معاملات انجام می شود یا داده ها در زنجیره ذخیره می شوند ، فعالیت وضعیت زنجیره را تغییر می دهد و منابع blockchain را مصرف می کند. از آنجا که منابع موجود در یک blockchain محدود است ، مهم است که نحوه مصرف عملیات در زنجیره ای آنها را مدیریت کنید. علاوه بر محدود بودن از نظر عملی - از جمله ظرفیت ذخیره سازی - منابع بلوک ، یک بردار حمله بالقوه برای کاربران مخرب است. به عنوان مثال ، یک کاربر مخرب ممکن است سعی در اضافه بار شبکه با پیام ها برای جلوگیری از تولید بلوک های جدید داشته باشد. برای محافظت از منابع blockchain از تخلیه یا بارگذاری بیش از حد ، باید نحوه تهیه آنها و نحوه مصرف آنها را مدیریت کنید. منابعی که باید از آنها آگاه باشید شامل موارد زیر است:

  • استفاده از حافظه
  • ورودی و خروجی ذخیره سازی
  • محاسبات
  • معامله و اندازه بلوک
  • اندازه پایگاه داده دولتی

بستر راه های مختلفی را برای مدیریت دسترسی به منابع و جلوگیری از مصرف بیش از حد زنجیره ای بیش از حد از هر منبع واحد ، به نویسندگان بلوک ارائه می دهد. دو مورد از مهمترین مکانیسم های موجود برای مسدود کردن نویسندگان ، وزن و هزینه معاملات است.

از وزنه ها برای مدیریت زمان لازم برای اعتبارسنجی یک بلوک استفاده می شود. به طور کلی ، از وزنه ها برای توصیف زمان لازم برای اجرای تماس در بدن یک بلوک استفاده می شود. با کنترل زمان اجرای که یک بلوک می تواند مصرف کند ، وزنه ها محدودیت هایی را برای ورودی و خروجی و محاسبه ذخیره می کنند.

برخی از وزن مجاز برای یک بلوک به عنوان بخشی از اولیه سازی و نهایی سازی بلوک مصرف می شود. همچنین ممکن است از این وزن برای اجرای تماس های اجباری ذاتی اجباری استفاده شود. برای کمک به اطمینان از بلوک ها ، زمان اجرای بیش از حد مصرف نمی کنند - و از بارگذاری کاربران مخرب سیستم با تماس های غیر ضروری جلوگیری می کنند.

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

چگونه هزینه ها محاسبه می شود

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

  • هزینه پایه: این حداقل مبلغی است که کاربر برای معامله پرداخت می کند. در زمان اجرا به عنوان یک وزن پایه اعلام شده و با استفاده از وزنه برداری به هزینه تبدیل می شود.
  • هزینه وزن: هزینه متناسب با زمان اجرای (ورودی و خروجی و محاسبه) که یک معامله مصرف می کند.
  • هزینه طول: هزینه متناسب با طول رمزگذاری شده معامله.
  • نکته: یک نکته اختیاری برای افزایش اولویت معامله ، به آن فرصت بالاتری می دهد که توسط صف معامله گنجانده شود.

هزینه پایه و هزینه های متناسب و هزینه متناسب هزینه ورود به سیستم را تشکیل می دهد. هزینه ورود به مطالعه حداقل هزینه ای است که باید در یک معامله در یک بلوک در دسترس باشد.

با استفاده از پالت پرداخت معامله

پالت پرداخت معامله منطق اساسی را برای محاسبه هزینه ورود به سیستم فراهم می کند.

همچنین می توانید از پالت پرداخت معامله استفاده کنید:

  • با استفاده از پیکربندی :: TeightTofee ، مقدار وزن را به یک هزینه کسر بر اساس نوع ارزی تبدیل کنید.
  • هزینه بلوک بعدی را با تعریف ضرب ، بر اساس وضعیت نهایی زنجیره در انتهای بلوک قبلی با استفاده از Config :: FeemultiplierUpdate به روز کنید.
  • مدیریت برداشت ، بازپرداخت و واریز هزینه های معامله را با استفاده از پیکربندی :: OnchargetRansaction مدیریت کنید.

می‌توانید درباره این ویژگی‌های پیکربندی در اسناد پرداخت تراکنش اطلاعات بیشتری کسب کنید.

باید توجه داشته باشید که کارمزد تراکنش قبل از انجام تراکنش برداشت می شود. پس از انجام تراکنش، وزن تراکنش را می توان تنظیم کرد تا منعکس کننده منابع واقعی تراکنش استفاده شده باشد. اگر تراکنش از منابع کمتری نسبت به انتظار استفاده کند، کارمزد تراکنش تصحیح شده و کارمزد معامله تعدیل شده واریز می شود.

نگاهی دقیق تر به هزینه گنجاندن

فرمول محاسبه هزینه نهایی به صورت زیر است:

در این فرمول، targeted_fee_adjustment یک ضریب است که می تواند هزینه نهایی را بر اساس ازدحام شبکه تنظیم کند.

  • Base_fee حاصل از وزن پایه، سربار گنجاندن مانند تأیید امضا را پوشش می دهد.
  • length_fee یک کارمزد در بایت است که در طول خارجی کدگذاری شده ضرب می شود.

هزینه weight_fee با استفاده از دو پارامتر محاسبه می شود:

ExtrinsicBaseWeight که در زمان اجرا اعلام می شود و برای همه موارد خارجی اعمال می شود.

حاشیه نویسی #[pallet::weight] که پیچیدگی یک خارجی را توضیح می دهد.

برای تبدیل وزن به ارز، زمان اجرا باید ساختار WeightToFee را تعریف کند که تابع تبدیل، Convert را پیاده سازی کند.

توجه داشته باشید که قبل از فراخوانی فرستنده خارجی، هزینه گنجاندن دریافت می شود. کارمزد از موجودی فرستنده کسر می شود حتی اگر تراکنش در هنگام اجرا با شکست مواجه شود.

حساب هایی با موجودی ناکافی

اگر حسابی موجودی کافی برای پرداخت هزینه شامل شدن را نداشته باشد و زنده بماند - یعنی برای پرداخت هزینه شامل و حفظ حداقل سپرده وجودی کافی باشد - باید اطمینان حاصل کنید که تراکنش لغو شده است تا کارمزدی کسر نشود وتراکنش اجرا نمی شود

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

فرمول هزینه درج همیشه به همان هزینه برای ورودی یکسان منجر می شود. با این حال، وزن می تواند پویا باشد و - بر اساس نحوه تعریف WeightToFee - هزینه نهایی می تواند درجاتی از تنوع را شامل شود.

برای محاسبه این تنوع، پالت پرداخت تراکنش پارامتر قابل تنظیم FeeMultiplierUpdate را ارائه می دهد.

تابع به‌روزرسانی پیش‌فرض از شبکه Polkadot الهام گرفته شده است و یک تنظیم هدفمند را پیاده‌سازی می‌کند که در آن یک سطح اشباع هدف وزن بلوک تعریف می‌شود. اگر بلوک قبلی اشباع تر باشد، هزینه ها کمی افزایش می یابد. به همین ترتیب، اگر بلوک قبلی تراکنش های کمتری نسبت به هدف داشته باشد، کارمزدها با مقدار کمی کاهش می یابد. برای اطلاعات بیشتر در مورد تعدیل های چند برابری کارمزد، به صفحه تحقیق Web3 مراجعه کنید.

معاملات با شرایط خاص

هزینه های گنجاندن باید قبل از اجرا قابل محاسبه باشد و بنابراین فقط می تواند منطق ثابت را نشان دهد. برخی از تراکنش ها محدودیت منابع را با استراتژی های دیگر تضمین می کنند. مثلا:

اوراق قرضه نوعی کارمزد است که ممکن است پس از برخی رویدادهای زنجیره ای بازگردانده یا کاهش یابد.

به عنوان مثال، ممکن است بخواهید از کاربران بخواهید که برای شرکت در رأی گیری، اوراق قرضه قرار دهند. پس از آن ممکن است این اوراق در پایان همه پرسی بازگردانده شود یا در صورت اقدام رای دهنده به رفتار بدخواهانه، قطع شود.

سپرده ها هزینه هایی هستند که ممکن است بعداً برگردانده شوند.

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

عملیات Burn برای پرداخت هزینه تراکنش بر اساس منطق داخلی آن استفاده می شود.

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

محدودیت‌ها شما را قادر می‌سازد تا محدودیت‌های ثابت یا قابل تنظیم را بر روی برخی عملیات اعمال کنید.

به عنوان مثال، پالت پیش‌فرض Staking فقط به نامزدها اجازه می‌دهد تا 16 اعتبارسنجی را نامزد کنند تا پیچیدگی فرآیند انتخاب اعتبارسنجی را محدود کند.

توجه به این نکته مهم است که اگر زنجیره را برای کارمزد تراکنش پرس و جو کنید، فقط هزینه درج را برمی گرداند.

حاشیه نویسی وزن پیش فرض

همه عملکردهای قابل ارسال در Substrate باید یک وزن را مشخص کنند. روش انجام این کار استفاده از سیستم مبتنی بر حاشیه نویسی است که به شما امکان می دهد مقادیر ثابت برای وزن خواندن/نوشتن پایگاه داده و/یا مقادیر ثابت را بر اساس معیارها ترکیب کنید. ابتدایی ترین مثال به این صورت خواهد بود:

توجه داشته باشید که ExtrinsicBaseWeight به طور خودکار به وزن اعلام شده اضافه می شود تا هزینه های صرفاً گنجاندن یک خارجی خالی در یک بلوک را محاسبه کند.

عملیات خواندن/نوشتن وزن و پایگاه داده

برای مستقل کردن حاشیه‌نویسی‌های وزنی از باطن پایگاه داده مستقر شده، آنها به عنوان یک ثابت تعریف می‌شوند و سپس هنگام بیان دسترسی‌های پایگاه داده انجام‌شده توسط قابل ارسال، در حاشیه‌نویسی‌ها استفاده می‌شوند:

این قابل ارسال یک پایگاه داده را می خواند و دو پایگاه داده را می نویسد و علاوه بر موارد دیگری که 20000 مورد اضافی را اضافه می کند. دسترسی به پایگاه داده معمولاً هر بار که مقداری که در داخل بلوک #[pallet::storage] اعلام می‌شود قابل دسترسی است. با این حال، فقط دسترسی‌های منحصربه‌فرد شمارش می‌شوند، زیرا پس از دسترسی به یک مقدار، در حافظه پنهان ذخیره می‌شود و دسترسی مجدد به آن منجر به عملیات پایگاه داده نمی‌شود. به این معنا که:

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

ارسال ها به سه دسته تقسیم می شوند:

  • طبیعی
  • عملیاتی
  • اجباری

اگر یک ارسال به عنوان عملیاتی یا اجباری در حاشیه نویسی وزن تعریف نشده باشد، ارسال به طور پیش فرض به عنوان عادی شناخته می شود. می توانید تعیین کنید که dispatchable از کلاس دیگری مانند این استفاده کند:

این نماد تاپل همچنین به شما اجازه می دهد تا یک آرگومان نهایی را مشخص کنید که تعیین می کند کاربر بر اساس وزن مشروح شارژ می شود یا خیر. اگر غیر از این را مشخص نکنید، Pays::Yes فرض می شود:

اعزام های معمولی

ارسال در این کلاس نشان دهنده تراکنش های عادی ایجاد شده توسط کاربر است. این نوع ارسال ها تنها بخشی از حد وزن کل بلوک را مصرف می کنند. برای اطلاعات در مورد حداکثر بخشی از یک بلوک که می تواند برای ارسال های معمولی مصرف شود، به AvailableBlockRatio مراجعه کنید. ارسال های عادی به استخر معاملات ارسال می شود.

اعزام های عملیاتی

بر خلاف دیسپاچ های معمولی که نشان دهنده استفاده از قابلیت های شبکه است، اعزام های عملیاتی آنهایی هستند که قابلیت های شبکه را فراهم می کنند. اعزام های عملیاتی می توانند کل محدودیت وزن یک بلوک را مصرف کنند. آنها محدود به AvailableBlockRatio نیستند. ارسال ها در این کلاس دارای حداکثر اولویت هستند و از پرداخت طول_هزینه معاف هستند.

اعزام های اجباری

اعزام های اجباری حتی اگر باعث شود بلوک از حد وزن آن پیشی بگیرد ، در یک بلوک گنجانده شده است. شما فقط می توانید برای معاملات ذاتی که توسط نویسنده بلوک ارسال می شود ، از کلاس اعزام اجباری استفاده کنید. این کلاس Dispatch در نظر گرفته شده است تا توابع بخشی از فرآیند اعتبار سنجی بلوک را نشان دهد. از آنجا که این اعزام ها بدون در نظر گرفتن وزن عملکرد همیشه در یک بلوک گنجانده شده اند ، بسیار مهم است که فرآیند اعتبار سنجی مانع از سوء استفاده از گره های مخرب از عملکرد به بلوک های صنایع دستی معتبر اما غیرممکن می شود. شما به طور معمول می توانید با اطمینان از این امر این کار را انجام دهید:

  • عملیات انجام شده همیشه سبک است.
  • این عملیات فقط یک بار در یک بلوک قرار می گیرد.

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

علاوه بر وزن و ثابت صرفاً ثابت ، محاسبه وزن می تواند استدلال های ورودی یک اعزام را در نظر بگیرد. وزن باید از آرگومان های ورودی با برخی از حسابهای اساسی محاسبه شود:

تصحیح وزن پس از اعزام

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

همچنین می توانید سیستم های هزینه سفارشی را از طریق توابع وزن سفارشی یا توابع هزینه ورود به سیستم تعریف کنید.

به جای استفاده از حاشیه نویسی های پیش فرض وزن ، می توانید با استفاده از ماژول وزنه ها یک نوع محاسبه وزن سفارشی ایجاد کنید. نوع محاسبه وزن سفارشی باید صفات زیر را پیاده سازی کند:

  • برای تعیین وزن اعزام.
  • ClassifyDispatch برای تعیین کلاس اعزام.
  • برای تعیین اینکه آیا فرستنده اعزام هزینه های خود را پرداخت می کند ، پرداخت می کند.

بستر سپس اطلاعات خروجی سه صفت را در ساختار DispatchInfo قرار می دهد و با اجرای GetDispatchInfo برای همه انواع تماس و انواع بیرونی مات آن را فراهم می کند. این در داخل توسط سیستم و ماژول های اجرایی استفاده می شود.

ClassifyDispatch ، Teaddata و Paysfee از نظر T عمومی هستند ، که به جز مبداء ، در تمام آرگومان های اعزام برطرف می شود. مثال زیر ساختاری را نشان می دهد که وزن را به عنوان m * len (args) محاسبه می کند که در آن m چند برابر شده است و استدلال ها ، یک قطعه قطعه شده از همه استدلال های اعزام است. در این مثال ، اگر معامله بیش از 100 بایت طول در آرگومان داشته باشد ، کلاس اعزام عملیاتی است و در صورت طول رمزگذاری شده از 10 بایت هزینه می پردازد.

یک عملکرد ماشین حساب وزن نیز می تواند به جای تعریف آن به عنوان یک نوع مبهم که می تواند رمزگذاری شود ، به نوع نهایی آرگومان اجباری شود. کد تقریباً شبیه این است:

در این مثال ، وزن سفارشی فقط می تواند در رابطه با اعزام با یک امضای خاص (U32 ، U64) ، بر خلاف وزنه برداری ، استفاده شود ، که می تواند با هر چیزی استفاده شود زیرا هیچ فرضیه ای در مورد آن وجود ندارد.

هزینه شمول سفارشی

مثال زیر نحوه شخصی سازی هزینه ورود به شما را نشان می دهد. شما باید انواع مرتبط مرتبط را در ماژول مربوطه پیکربندی کنید.

به کجا برویم

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

ثبت دیدگاه

مجموع دیدگاهها : 0در انتظار بررسی : 0انتشار یافته : ۰
قوانین ارسال دیدگاه
  • دیدگاه های ارسال شده توسط شما، پس از تایید توسط تیم مدیریت در وب منتشر خواهد شد.
  • پیام هایی که حاوی تهمت یا افترا باشد منتشر نخواهد شد.
  • پیام هایی که به غیر از زبان فارسی یا غیر مرتبط باشد منتشر نخواهد شد.