script (⏱,💰)

script (⏱,💰)

NG#5 - 溢出

思路#

Cairo 中的 felt 有一个范围,如果超过了这个范围,就会出现溢出。这道题中,amount 需要传入一个大于 1000000000000000 的数,乘以另一个数 6007,使得计算出来的值在溢出后等于 balance。balance 一开始是 0,每次调用 claim_coin 只能让 balance + 1。

题目旁边的 walkthrough 有很详细的解释,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 的特性。实际开发中,涉及到数学运算时,一般会使用类似 u256 的整型来代替 felt252。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。