Ownable2Step در سالیدیتی

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

استفاده از Ownable2Step به جای Ownable در کتابخانه OpenZeppelin

برای مثال، در کد زیر تابع setMessage() فقط توسط آدرسی که به عنوان مالک (owner) مشخص شده، قابل فراخوانی است:

با این حال، پیاده‌سازی رایج Ownable در کتابخانه OpenZeppelin یک نقص مهم دارد: مالک فعلی می‌تواند اشتباهاً مالکیت را به یک آدرس نادرست یا حتی به یک آدرس غیرموجود منتقل کند، که در عمل ممکن است باعث از دست رفتن دسترسی به قرارداد شود.

برای رفع این مشکل، کتابخانه OpenZeppelin در نسخه 4.8 که در ژانویه 2023 منتشر شد، قرارداد جدیدی با نام Ownable2Step در سالیدیتی ارائه کرد. در اینجا می توانید کد مربوطه را مشاهده کنید. این نسخه ایمن‌تر از Ownable است، چرا که فرآیند انتقال مالکیت را به صورت دو مرحله‌ای انجام می‌دهد. در این روش، انتقال مالکیت تنها زمانی نهایی می‌شود که مالک جدید با فراخوانی تابع acceptOwnership()، انتقال را تأیید کند. این موضوع احتمال بروز خطا در وارد کردن آدرس مالک جدید را کاهش می‌دهد و باعث می‌شود تنها فردی که کنترل کلید خصوصی یا کنترل یک قرارداد هوشمند را دارد، قادر به پذیرش مالکیت باشد.

در ادامه، یک نمونه ساده از استفاده از Ownable2Step ارائه شده است:

در این پیاده‌سازی، Ownable2Step از قرارداد Ownable ارث‌بری می‌کند و تابع transferOwnership() را بازنویسی می‌کند تا ابتدا آدرس جدید به عنوان “مالک در انتظار” (pending owner) ثبت شود. سپس، آدرس مورد نظر باید به صورت فعال تابع acceptOwnership() را فراخوانی کند تا مالکیت نهایی شود.

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

نکته مهم دیگر این است که هنوز در فرآیند واگذاری کامل مالکیت (renounceOwnership) که باعث انتقال مالکیت به آدرس صفر می‌شود، مرحله تأیید دوم وجود ندارد. بنابراین اگر نیازی به این قابلیت ندارید، بهتر است با بازنویسی تابع renounceOwnership()، کاری کنید که در صورت فراخوانی، اجرای آن با شکست مواجه شود (revert شود). این کار از حذف ناخواسته مالکیت جلوگیری می‌کند.

5/5 - (1 امتیاز)

راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.

آموزش گام به گام برنامه نویسی اندروید با B4A (پروژه محور)
  • انتشار: ۵ خرداد ۱۴۰۴

دسته بندی موضوعات

آخرین محصولات فروشگاه

مشاهده همه

نظرات

بازخوردهای خود را برای ما ارسال کنید