Cairoを使ううえで出会う中心的な概念の1つが、felt252型です。これはフィールド要素とも呼ばれます。
この型は、大きな素数$P$で定義される特定の範囲内の整数を表します。
この演習ではfelt252型だけを扱います。これはCairoプログラミングに欠かせないものです。
Cairoのfelt252型はスカラー型で、0から$P - 1$までの整数を表すために使われます。ここで$P$は大きな素数であり、現在は$( 2^{251} + 17 \cdot 2^{192} + 1 )$に設定されています。
この型では、すべての算術演算が$P$を法として行われるため、他のプログラミング言語で見かける標準的な整数型とは異なります。
Cairoはfelt252の値に対する基本的な算術演算をサポートしています。
+):felt252の値を2つ足します。
結果が$P$を超えると、$P$を法として還元されます。-):あるfelt252の値から別のfelt252の値を引きます。
結果が負になる場合は、$P$の倍数を加えて範囲内に収まるように調整されます。*):felt252の値を2つ掛け合わせ、結果は$P$を法として計算されます。/):あるfelt252の値を別の値で割り、結果が等式$( \frac{x}{y} \cdot y = x \mod P)$を満たすようにします。この演習では、暗号技術者が安全な通信システムを管理・検証するのを手伝います。
このシステムは、すべての算術演算が決められた範囲内に収まるようにするために、体の要素、とりわけCairoのfelt252型に大きく依存しています。
暗号化された2つのメッセージは、それぞれがfelt252として表され、それらを足し合わせて1つの結合されたメッセージを作る必要があります。
ただし、暗号化の都合上、最大値$P - 1$を超える結果は、$P$で割った余りを使って折り返す必要があります。
2つのfelt252の値を受け取り、それらの和を返す関数を実装してください。結果は有効な範囲内に収まるようにします。
add_messages(3618502788666131213697322783095070105623107215331596699973092056135007822949, 987654321)
// => 123456789
注意: 戻り値は
felt252にする必要があります。
元のデータを取り出すために、メッセージを引く必要があることもあります。
引き算の結果が負の場合、システムは自動的に$P$を足して、有効なfelt252の値の範囲内に戻します。
2つのfelt252の値を受け取り、それらの差を返す関数を実装してください。結果は有効な範囲内に収まるようにします。
subtract_messages(123456789, 987654321)
// => 3618502788666131213697322783095070105623107215331596699973092056135007822949
注意: 戻り値は
felt252にする必要があります。
暗号化されたデータの完全性を保つために、暗号システムはしばしば2つのメッセージ(felt252)を掛け合わせ、その積が有効な範囲内に収まるようにします。
結果は有効な範囲内に収まるように、$P$で割った余りとして計算する必要があります。
2つのfelt252の値を受け取り、それらの積を返す関数を実装してください。結果は有効な範囲内に収まるようにします。
multiply_messages(382927772233671078546147897004315551461400594453673204174697055647611, 9449570)
// => 123456789
注意: 戻り値は
felt252にする必要があります。