Remix部署的Solidity合约mint函数仅支持铸造≤53整数是什么原因?
问题根因分析
- 核心错误是运算符误用:Solidity 中
^符号不是数学幂运算符,而是按位异或运算符。你代码中写的10^60实际执行的是 10 和 60 的按位异或计算:- 10 二进制:
001010 - 60 二进制:
111100 - 异或结果:
110110,换算为十进制就是 54
所以你的校验条件require(amount < (1 * (10^60)), ...)实际等价于require(amount < 54),因此只有 1~53 的数值可以通过校验,超过就会触发回滚。
- 10 二进制:
修复方案
- 将幂运算写法替换为正确的语法:
若要表示 1 * 10^60,Solidity 支持两种正确写法:- 字面量写法:
1e60 - 幂运算符写法:
10 ** 60
替换后mint函数的校验逻辑就符合你的预期了:
require(amount < 1e60, 'Amount requested too High for minting'); - 字面量写法:
- 其他代码问题提示:
send函数中balances[minter] = -amount;写法错误:uint是无符号整数类型,不支持负数值赋值,正确的余额扣减写法是balances[minter] -= amount;- 错误信息笔误:
Coin balance to low应为Coin balance too low - 当前
mint函数是直接覆盖接收地址的余额,若要实现累加铸造,可改为balances[receiver] += amount;
内容的提问来源于stack exchange,提问作者codelace
相关产品推荐
相关产品推荐

