نحوه نوشتن کیف پول قرارداد هوشمند با تغییر مالکیت

کیف پول قرارداد هوشمند را می توان به عنوان دستگاه یا برنامه ای تعریف کرد که به کاربران امکان می دهد روشی را که ترجیح می دهند برای مدیریت دارایی های دیجیتال خود سفارشی کنند.
یکی از مهارتهای بسیار مهم یک توسعهدهنده قرارداد هوشمند، درک درستی از تراکنشها در EVM، داشتن دانش کافی در مورد استفاده از گاز و بهینهسازی، استفاده از قدرت تماسهای سطح پایین، درک خطرات امنیتی و پایبندی به الگوهای ایمن نوشتن قرارداد هوشمند است. تمام این اصول در این پروژه ساده جامد پوشش داده شده است.
بررسی اجمالی
اجرای پروژه ها به 4 بخش تقسیم می شود:
-
پیاده سازی مالک قرارداد هوشمند و محدود کردن برخی از عملکردها فقط به مالک.
-
اجازه دادن به قرارداد هوشمند برای دریافت وجوه از EOA و سایر قراردادها.
-
قابلیت انتقال وجه
-
اجرای سیستم رای گیری تغییر مالک.
پیاده سازی صاحب قرارداد هوشمند
ماهیت یک قرارداد هوشمند که باعث میشود پس از استقرار آن را غیرقابل تغییر کند، لازم است عملکردهای بسیار مهمی قبل از اعطای دسترسی «مجاز» شوند. کمترین سطح دسترسی در قرارداد هوشمند، اجرای صاحب قرارداد هوشمند است.
صاحب قرارداد هوشمند آدرسی است که قرارداد هوشمند را در زنجیره بلوکی مستقر می کند. قرارداد جامد اجازه اجرای سازنده را می دهد. سازنده این امکان را فراهم می کند که ابتدا یک کد سیاه در ایجاد قرارداد هوشمند و تنها یک بار پیاده سازی شود. یک مالک متغیر از نوع آدرس ایجاد می شود، این یک متغیر حالت و از نوع آدرس است. با استفاده از متغیرهای کلی موجود در یک قرارداد هوشمند، به مالک مقدار msg.sender اختصاص داده می شود.
قابلیت دریافت وجوه
یک قرارداد هوشمند یک آدرس دارد، از این رو می تواند وجوه دریافت کند و تراکنش انجام دهد. چند راه وجود دارد که می توان قرارداد هوشمند برای دریافت وجوه منعقد کرد. یکی با ایجاد یک تابع “depositFund” است که برچسب قابل پرداخت دارد، دیگری با استفاده از یک تابع برگشتی قابل پرداخت است. یکی دیگر از گزینه هایی که در این قرارداد هوشمند مورد استفاده قرار گرفت استفاده از قابلیت دریافت است. تابع دریافت از این جهت که نمی تواند داده ها را دریافت کند با یک بازگشت متفاوت متفاوت است و اولین تابع پیش فرض است که هنگام شروع پرداخت سطح پایین به قرارداد هوشمند فراخوانی می شود.
تابع دریافت به فضای ذخیرهسازی دسترسی نمییابد یا یک تابع را فراخوانی نمیکند، بنابراین کمک هزینه گاز 2300 برای تراکنش کافی است. با این وجود، استفاده از فراخوانی تابع سطح پایین در جایی که فرستنده تراکنش گاز بیشتری را در یک قرارداد به تابع ارسال میبندد تا هزینههای اضافی در انتقال وجه به قرارداد را تامین کند، روش بهتری است.
قابلیت انتقال وجه
عملکرد انتقال تابعی است که از بیانیه های بسیاری برای اطمینان از انجام بررسی های مناسب قبل از انتقال وجه استفاده می کند.
سه بررسی الزامی انجام می شود: اولی اطمینان می دهد که مبلغی که باید منتقل شود کمتر یا حداکثر برابر با وجوه موجود در قرارداد هوشمند است.
دومین بیانیه نیاز، نقشهبرداری ایجاد شده را بررسی میکند که به آدرسهای خاصی اجازه میدهد گیرندگان وجوه قرارداد هوشمند باشند. نقشه برداری “isAllowedToSend” برای اعطای مجوز برداشت وجه توسط مالک قرارداد هوشمند استفاده می شود.
سومین بیانیه الزامی تضمین می کند که مبلغی که باید به یک حساب منتقل شود کمتر یا برابر با مبلغی است که مالک قبلاً تعیین کرده است.
برای جلوگیری از حمله ورود مجدد، جایی که در نتیجه گاز اضافی ارائه شده برای معاملات با قراردادهای خارجی، همچنان می توانند به قرارداد منبع دسترسی داشته باشند و سعی کنند متغیرهای حالت را تغییر دهند. با پیروی از بهترین روش، عملکرد انتقال آخرین تعامل با قراردادهای خارجی است.
ابتدا مبلغی را که باید منتقل شود از قرارداد هوشمند قبل از انجام معامله انتقال واقعی کسر می کنیم.
انتقال را می توان با حداقل سه روش انجام داد:
- _address.transfer()
- _address.send()
- _to.call{value: _mount, gas: 100000}(payload);
روش سوم به عنوان تماس سطح پایین نامیده می شود. این روش معمولاً زمانی استفاده می شود که هیچ اطلاعی از آدرس گیرندگان انتقال وجه خود نداشته باشید. هنگامی که انتقال به دیگر EOA (آدرسهای متعلق به خارجی) انجام میشود، هر یک از روشهای بالا ایمن است، اگر انتقال به یک قرارداد هوشمند باشد، در صورت تعامل عملکرد دریافت یا بازگشت با قرارداد، تراکنش با شکست مواجه میشود. دلیل این شکست این است که عملکردهای انتقال اولیه فقط گاز کمک هزینه را برای تراکنش ها در دسترس قرار می دهد، فقط می توان از تماس های سطح پایین برای درج هزینه گاز تعیین شده در تراکنش استفاده کرد.
پاسخ تماس سطح پایین، باید برای بررسی موفقیت آمیز بودن تراکنش تعیین شود.
اجرای سیستم رای گیری تغییر مالک.
قرارداد هوشمند یک سیستم رأی گیری ساده را پیاده سازی می کند که امکان تغییر مالکیت را فراهم می کند. این به راحتی می تواند یک ویژگی مفید در زمانی که حاکمیت یک قرارداد هوشمند نیاز به تغییر دارد، یا از بین می رود.
سیستم رأی گیری تضمین می کند که صاحب یک قرارداد هوشمند حداقل سه قیم را انتخاب می کند که توانایی انتخاب آدرس بعدی را به عنوان صاحب قرارداد هوشمند دارند.
به محض اینکه یک آدرس دارای 3 سرپرست انتخاب شود، آنگاه آدرس مالک قرارداد هوشمند جدید می شود و عملکردهای محدود به مالک قرارداد هوشمند را انجام می دهد.
لینک کد قرارداد هوشمند در Github وجود دارد. در لینکدین با من تماس بگیرید.
مقالات بیشتری در این زمینه منتشر خواهد شد، استقرار یک قرارداد هوشمند برای یک بلاکچین محلی، استقرار در یک شبکه آزمایشی مانند Sepolia، استقرار در راه حل لایه 2 (ZK SNARK).