script (⏱,💰)

script (⏱,💰)

NG#5 - オーバーフロー

思路#

Cairo のフェルトには範囲があり、それを超えるとオーバーフローが発生します。この問題では、amount には 1000000000000000 より大きい数を渡し、別の数 6007 と乗算して、計算結果がオーバーフローした後に balance と等しくなるようにする必要があります。balance は最初は 0 であり、claim_coin を呼び出すたびに balance を 1 増やすことしかできません。

問題の横にある解説には、Cairo の除算はオーバーフローを計算できることが書かれており、extern fn felt252_div( lhs: felt252, rhs: NonZero<felt252> ) -> felt252 nopanic;を使用して答えを得ることができます。

もし balance が 1 であれば、1/6007を試して得られる amount が 1000000000000000 より大きければ目標を達成できます。そうでなければ、2/6007を試してみます...

ローカルでテストを作成して必要な amount を計算します。

そして、starkli invoke [contract] claim_coinを使用して balance を 1 にします。
最後に、starkli invoke [contract] buy_incense [計算されたamount]を実行すると問題が解決できます。

总结#

unsafe math end

この問題は非常に簡単で、主に felt252 の特性を理解することが重要です。実際の開発では、数学演算に関与する場合、通常は felt252 の代わりに u256 などの整数型を使用します。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。