یکی از رایجترین الگوهای امنیتی در زبان سالیدیتی، استفاده از مقداردهی به صاحب قرارداد (owner) و محدود کردن دسترسی به توابع خاص از طریق onlyOwner
است. در سالهای اخیر، توسعهدهندگان با معرفی Ownable2Step در سالیدیتی، این الگوی امنیتی را ارتقا دادهاند. این بهروزرسانی خطاهای رایج در انتقال مالکیت را تا حد زیادی کاهش میدهد.
استفاده از Ownable2Step به جای Ownable در کتابخانه OpenZeppelin
برای مثال، در کد زیر تابع setMessage()
فقط توسط آدرسی که به عنوان مالک (owner) مشخص شده، قابل فراخوانی است:
1 2 3 |
function setMessage(string calldata _message) external onlyOwner { message = _message; } |
با این حال، پیادهسازی رایج Ownable
در کتابخانه OpenZeppelin یک نقص مهم دارد: مالک فعلی میتواند اشتباهاً مالکیت را به یک آدرس نادرست یا حتی به یک آدرس غیرموجود منتقل کند، که در عمل ممکن است باعث از دست رفتن دسترسی به قرارداد شود.
برای رفع این مشکل، کتابخانه OpenZeppelin در نسخه 4.8 که در ژانویه 2023 منتشر شد، قرارداد جدیدی با نام Ownable2Step در سالیدیتی ارائه کرد. در اینجا می توانید کد مربوطه را مشاهده کنید. این نسخه ایمنتر از Ownable
است، چرا که فرآیند انتقال مالکیت را به صورت دو مرحلهای انجام میدهد. در این روش، انتقال مالکیت تنها زمانی نهایی میشود که مالک جدید با فراخوانی تابع acceptOwnership()
، انتقال را تأیید کند. این موضوع احتمال بروز خطا در وارد کردن آدرس مالک جدید را کاهش میدهد و باعث میشود تنها فردی که کنترل کلید خصوصی یا کنترل یک قرارداد هوشمند را دارد، قادر به پذیرش مالکیت باشد.
در ادامه، یک نمونه ساده از استفاده از Ownable2Step
ارائه شده است:
1 2 3 4 5 6 7 8 9 10 11 |
import "@openzeppelin/contracts/access/Ownable2Step.sol"; contract ExampleOwnable2Step is Ownable2Step { string public message; constructor() Ownable(msg.sender) {} function setMessage(string calldata _message) external onlyOwner { message = _message; } } |
در این پیادهسازی، Ownable2Step
از قرارداد Ownable
ارثبری میکند و تابع transferOwnership()
را بازنویسی میکند تا ابتدا آدرس جدید به عنوان “مالک در انتظار” (pending owner) ثبت شود. سپس، آدرس مورد نظر باید به صورت فعال تابع acceptOwnership()
را فراخوانی کند تا مالکیت نهایی شود.
این کار، امنیت قرارداد را افزایش میدهد و اطمینان حاصل میکند که تنها آدرسهایی که واقعاً دسترسی دارند، میتوانند کنترل قرارداد را در اختیار بگیرند.
نکته مهم دیگر این است که هنوز در فرآیند واگذاری کامل مالکیت (renounceOwnership) که باعث انتقال مالکیت به آدرس صفر میشود، مرحله تأیید دوم وجود ندارد. بنابراین اگر نیازی به این قابلیت ندارید، بهتر است با بازنویسی تابع renounceOwnership()
، کاری کنید که در صورت فراخوانی، اجرای آن با شکست مواجه شود (revert شود). این کار از حذف ناخواسته مالکیت جلوگیری میکند.
راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.
- انتشار: ۵ خرداد ۱۴۰۴
دسته بندی موضوعات
- آموزش ارز دیجیتال
- آموزش برنامه نویسی
- آموزش متنی برنامه نویسی
- اطلاعیه و سایر مطالب
- پروژه برنامه نویسی
- دوره های تخصصی برنامه نویسی
- رپورتاژ
- فیلم های آموزشی
- ++C
- ADO.NET
- Adobe Flash
- Ajax
- AngularJS
- apache
- ARM
- Asp.Net
- ASP.NET MVC
- AVR
- Bootstrap
- CCNA
- CCNP
- CMD
- CSS
- Dreameaver
- EntityFramework
- HTML
- IOS
- jquery
- Linq
- Mysql
- Oracle
- PHP
- PHPMyAdmin
- Rational Rose
- silver light
- SQL Server
- Stimulsoft Reports
- Telerik
- UML
- VB.NET&VB6
- WPF
- Xml
- آموزش های پروژه محور
- اتوکد
- الگوریتم تقریبی
- امنیت
- اندروید
- اندروید استودیو
- بک ترک
- بیسیک فور اندروید
- پایتون
- جاوا
- جاوا اسکریپت
- جوملا
- دلفی
- دوره آموزش Go
- دوره های رایگان پیشنهادی
- زامارین
- سئو
- ساخت CMS
- سی شارپ
- شبکه و مجازی سازی
- طراحی الگوریتم
- طراحی بازی
- طراحی وب
- فتوشاپ
- فریم ورک codeigniter
- فلاتر
- کانستراکت
- کریستال ریپورت
- لاراول
- معماری کامپیوتر
- مهندسی اینترنت
- هوش مصنوعی
- یونیتی
- کتاب های آموزشی
- Android
- ASP.NET
- AVR
- LINQ
- php
- Workflow
- اچ تی ام ال
- بانک اطلاعاتی
- برنامه نویسی سوکت
- برنامه نویسی موبایل
- پاسکال
- پایان نامه
- پایتون
- جاوا
- جاوا اسکریپت
- جی کوئری
- داده کاوی
- دلفی
- رباتیک
- سئو
- سایر کتاب ها
- سخت افزار
- سی اس اس
- سی پلاس پلاس
- سی شارپ
- طراحی الگوریتم
- فتوشاپ
- مقاله
- مهندسی نرم افزار
- هک و امنیت
- هوش مصنوعی
- ویژوال بیسیک
- نرم افزار و ابزار برنامه نویسی
- وردپرس