در Cairo، یکی از مفاهیم اصلی که با آن روبهرو میشوید نوع felt252 است که با نام عضو میدان هم شناخته میشود.
این نوع، اعداد صحیح را در محدودهی مشخصی نمایش میدهد که با یک عدد اول بزرگ $P$ تعریف میشود.
در این تمرین، فقط با نوع felt252 کار میکنید که بخشی ضروری از برنامهنویسی Cairo است.
نوع felt252 در Cairo یک نوع اسکالر است که برای نمایش اعداد صحیح از ۰ تا $P - 1$ به کار میرود؛ $P$ یک عدد اول بزرگ است که در حال حاضر برابر $( 2^{251} + 17 \cdot 2^{192} + 1 )$ قرار داده شده است.
این نوع تضمین میکند که همهی عملیات حسابی به پیمانهی $P$ انجام میشوند و همین آن را از انواع استاندارد اعداد صحیح که ممکن است در زبانهای برنامهنویسی دیگر ببینید، متمایز میکند.
Cairo از عملیات حسابی پایه روی مقادیر felt252 پشتیبانی میکند:
+): دو مقدار felt252 را با هم جمع میکند.
اگر نتیجه از $P$ بیشتر شود، به پیمانهی $P$ کاهش مییابد.-): یک مقدار felt252 را از مقدار دیگر کم میکند.
اگر نتیجه منفی شود، با افزودن مضربی از $P$ طوری تنظیم میشود که در محدوده باقی بماند.*): دو مقدار felt252 را در هم ضرب میکند و نتیجه به پیمانهی $P$ محاسبه میشود./): یک مقدار felt252 را بر مقدار دیگر تقسیم میکند و تضمین میکند که نتیجه در معادلهی $( \frac{x}{y} \cdot y = x \mod P)$ صدق کند.در این تمرین، به یک رمزنگار کمک میکنید تا یک سیستم ارتباطی امن را مدیریت و بررسی کند.
این سیستم بهشدت به «عناصر میدان»، بهطور مشخص نوع felt252 در Cairo، وابسته است تا مطمئن شود همهی عملیات حسابی در بازهی تعریفشدهای باقی میمانند.
دو پیام رمزنگاریشده که هر کدام بهصورت یک felt252 نمایش داده میشوند، باید با هم جمع شوند تا یک پیام ترکیبی بسازند.
اما به دلیل رمزنگاری، هر نتیجهای که از بیشترین مقدار $P - 1$ فراتر برود، باید با پیمانهی $P$ دوباره به درون بازه برگردد.
تابعی پیادهسازی کنید که دو مقدار felt252 میگیرد و مجموعشان را برمیگرداند، به گونهای که نتیجه در بازهی معتبر باقی بماند:
add_messages(3618502788666131213697322783095070105623107215331596699973092056135007822949, 987654321)
// => 123456789
توجه: مقدار بازگشتی باید از نوع
felt252باشد.
گاهی لازم است پیامها از هم کم شوند تا دادههای اصلی بازیابی شوند.
اگر نتیجهی تفریق منفی شود، سیستم بهطور خودکار $P$ را به نتیجه اضافه میکند تا آن را دوباره در بازهی یک مقدار معتبر felt252 قرار دهد.
تابعی پیادهسازی کنید که دو مقدار felt252 میگیرد و تفاضلشان را برمیگرداند، به گونهای که نتیجه در بازهی معتبر باقی بماند:
subtract_messages(123456789, 987654321)
// => 3618502788666131213697322783095070105623107215331596699973092056135007822949
توجه: مقدار بازگشتی باید از نوع
felt252باشد.
برای تضمین یکپارچگی دادههای رمزنگاریشده، سیستم رمزنگاری اغلب دو پیام (felt252) را در هم ضرب میکند تا مطمئن شود حاصلضربشان در بازهای معتبر میماند.
نتیجه باید به پیمانهی $P$ محاسبه شود تا در بازهی معتبر باقی بماند.
تابعی پیادهسازی کنید که دو مقدار felt252 میگیرد و حاصلضربشان را برمیگرداند، به گونهای که نتیجه در بازهی معتبر باقی بماند:
multiply_messages(382927772233671078546147897004315551461400594453673204174697055647611, 9449570)
// => 123456789
توجه: مقدار بازگشتی باید از نوع
felt252باشد.