قرارداد ماژول امنیتی اوراکل
این صفحه مرجع قرارداد هوشمند در سطح ذخیرهسازی و توابع است؛ مخاطب آن حسابرسی، بازبینی مستقل و کار مستقیم با قراردادهای روی زنجیره است. مسیر یکپارچهسازی سازمانی از راهنمای یکپارچهسازی سازمانی میگذرد و مستقل از این مرجع است.
مقدمه
قرارداد ماژول امنیتی اوراکل1 یا OSM تضمین میکند که سیستم قیمتهای تازه منتشرشده از اوراکل را تا نگذشتن مدتی مشخص نپذیرد. مقادیر از قرارداد DSValue یا هر قرارداد دیگری که رابطهای read و peek را داشته باشد از طریق روش poke خوانده میشوند؛ روشهای read و peek مقدار فعلی تغذیه قیمت را میدهند، و برای فراخوانیشان، قراردادهای دیگر باید در لیست معتبر قرار گرفته شوند. یک قرارداد ماژول امنیتی اوراکل میتواند تنها از یک تغذیهگر قیمت بخواند، بنابراین در عمل یک قرارداد ماژول امنیتی اوراکل برای هر نوع وثیقه باید دیپلوی شود.
عملکردهای کلیدی و اصطلاحات ماژول امنیتی اوراکل
چیدمان ذخیرهسازی
stopped: یک پرچم از نوعuint256که در صورت غیر صفر بودن، به روزرسانیهای تغذیه قیمت را غیر فعال میکند.src: آدرسDSValueکه ماژول امنیتی اوراکل از آن خواهد خواند.ONE_HOUR: معادل ۳۶۰۰ ثانیه از نوع دادهuint16hop: تاخیر زمانی بین فراخوانیهایpokeاز نوعuint16که بهصورت پیشفرضONE_HOURاست.zzz: زمان آخرین بهروزرسانی (گرد شده به نزدیکترین مضرب و کوچکتر ازhop)cur: ساختارFeedکه مقدار فعلی تغذیه را نگه میداردnxt: ساختارFeedکه مقدار بعدی تغذیه را نگه میداردbud: یک نگاشت از آدرس به دادهuint256؛ خوانشهای تغذیه را در لیست معتبر قرار میدهد
متدهای عمومی
متدهای مدیریتی
این توابع را تنها آدرسهای مجاز میتوانند فراخوانی کنند؛ یعنی آدرسهای usr که wards[usr] == 1 باشد.
rely/deny: اضافه یا حذف کاربران مجاز (با انجام تغییرات در نگاشتwards)stop /start: تغییر اینکه آیا تغذیه قیمت میتواند بهروزرسانی شود یا خیر (با تغییر مقدارstopped)change: تغییر داده برای قیمتها (با تنظیمsrc)step: تغییر فاصله بین بهروزرسانیهای قیمت (با تنظیمhop)void: مشابهstopاست، اما همچنینcurوnxtرا به یک ساختارFeedبا مقادیر صفر میرساندkiss/diss: اضافه کردن/حذف مصرفکنندگانfeedمجاز (با تغییرات در نگاشتbuds)
متدهای خواندن تغذیه
این متدها را هم تنها آدرسهایی میتوانند فراخوانی کنند که در لیست معتبر جای گرفتهاند
peek: مقدار تغذیه فعلی و یک باینری که نشان دهنده اعتبار است را برمیگرداندpeep: مقدار تغذیه بعدی را نشان میدهد (به عبارت دیگر چیزی که در فراخوانی poke بعدی به مقدار فعلی تبدیل میشود) و یک باینری را برمیگرداند که نشان میدهد معتبر است یا خیرread: مقدار تغذیه فعلی را برمیگرداند؛ اگر سازوکار معتبری آن را تنظیم نکرده باشد، متدهای بهروزرسانی تغذیه را برمیگرداندpoke: مقدار تغذیه فعلی را بهروزرسانی میکند و مقدار بعدی خوانده میشود- ساختار
Feed: یک ساختار با دو عضو از نوعuint128شاملvalوhasکه برای ذخیره داده تغذیه استفاده میشوند.
سازوکارها و مفاهیم کلیدی
سازوکار مرکزی بهطور دورهای یک قیمت به تعویق افتاده را برای نوع خاصی از وثیقه به سیستم MCD تأمین میکند. برای اینکه این کار به خوبی انجام شود، یک فعال خارجی باید بهطور منظم متد poke را فراخوانی، قیمت فعلی را بهروزرسانی کرده و قیمت بعدی را بخواند. این قرارداد زمان آخرین فراخوانی poke را در متغیر zzz ( به نزدیکترین مضرب از hop به پایین گرد شده است) پیگیری میکند و اجازه نمیدهد تابع poke فراخوانی شود تا وقتی که مقدار block.timestamp حداقل برابر zzz+hop باشد. این مقادیر از قرارداد DSValue (آدرس آن در src ذخیره میشود) خوانده میشوند. هدف این سازوکار که بهروزرسانی با تأخیر انجام میشود این است که زمان کافی برای شناسایی و واکنش به یک حمله اوراکل (مانند تنظیم قیمت وثیقه به صفر) فراهم شود. واکنشها به این موضوع شامل فراخوانی stop یا void یا فعالسازی خاموشی اضطراری است.
قراردادهای دیگر، اگر در لیست معتبر قرار داده شوند، میتوانند مقدار cur را از طریق متدهای peek و read بررسی کنند. تابع peek یک مقدار باینری برمیگرداند که نشان میدهد که آیا مقدار برای آن تنظیم شده است یا خیر. اگر مقدار تنظیم نشده باشد، read وظیفه revert را دارد. مقدار nxt میتواند از طریق peep بررسی شود. این قرارداد از یک ساختار مجوزدهی دوسطحی استفاده میکند. به این صورت که آدرسهایی که به ۱ در wards نگاشت میشوند، میتوانند شروع و متوقف شوند، src را تنظیم کنند، مقدار void را فراخوانی کنند، و خوانشهای جدید را اضافه کنند؛ آدرسهایی که در buds به ۱ نگاشت میشوند میتوانند peek، peep و read را فراخوانی کنند.