script (⏱,💰)

script (⏱,💰)

NG#5 - 溢出

unsafe math

思路#

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 ...

本地写个 test 计算出需要的 amount。

然后 starkli invoke [contract] claim_coin 使得 balance 变成 1。
最后 starkli invoke [contract] buy_incense [计算得到的amount]就能成功解决问题。

总结#

unsafe math end

这题很简单,主要是了解 felt252 的特性。实际开发中,涉及到数学运算,一般来说会用 u256 之类的整型来代替 felt252。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。