思路#
Cairo のフェルトには範囲があり、それを超えるとオーバーフローが発生します。この問題では、amount には 1000000000000000 を超える数を渡し、別の数 6007 と乗算して計算された値がバランスと等しくなるようにする必要があります。バランスは最初は 0 であり、claim_coin を呼び出すたびにバランスを + 1 することしかできません。
問題の横にあるウォークスルーには、Cairo の除算はオーバーフローを計算できること、extern fn felt252_div( lhs: felt252, rhs: NonZero<felt252> ) -> felt252 nopanic;
を使用して答えを得ることができることが詳しく説明されています。
バランスが 1 の場合、1/6007
を試して得られる amount が 1000000000000000 を超える場合、目標が達成されます。それでもダメな場合は、2/6007
を試してみます...
ローカルでテストを作成して必要な amount を計算します。
そして、starkli invoke [contract] claim_coin
を使用してバランスを 1 にします。
最後に、starkli invoke [contract] buy_incense [計算されたamount]
を実行すると、問題が解決します。
总结#
この問題は非常に簡単で、主に felt252 の特性を理解することが重要です。実際の開発では、数学演算に関与する場合、通常は felt252 の代わりに u256 などの整数型を使用することが一般的です。