链上ERC-20没有“1.23枚”这种浮点余额,只有整数。decimals告诉界面把整数小数点向左移动多少位:raw balance为1230000、decimals为6时显示1.23。这个元数据不决定一枚代币值多少美元,也不决定价格Feed保留几位小数。
数量与价格各有一把尺
- ERC-20的balanceOf、transfer和allowance都使用整数;decimals用于用户界面把整数按10^decimals缩放展示。
- decimals是可选元数据,OpenZeppelin默认返回18,但代币实现可以覆盖,客户端不能硬编码18。
- 代币价格来自交易市场或预言机并有独立的报价单位与decimals;数量精度不决定价格精度或经济价值。
| 数据 | 由谁定义 | 缩放方式 |
|---|---|---|
| balanceOf/transfer金额 | 代币合约整数 | 除以10^tokenDecimals展示 |
| token decimals | ERC-20可选元数据 | 常见18但不能假设 |
| 市场价格 | 市场或报价源 | 按报价源单位解释 |
| oracle answer | 预言机Feed | 除以10^feedDecimals |
decimals不改变合约算术
transfer、approve和allowance接收的amount都是最小单位整数。把1 USDC输入成1而不是1,000,000,会发送百万分之一;把18位代币按6位缩放,则可能放大一万亿倍。后端应存raw amount与decimals,展示层再格式化,不要把格式化字符串写回精确账本。
价格有自己的方向和精度
“ETH/USD为250000000000”可能表示2500美元且Feed有8位decimals;也可能是另一个单位。计算资产价值要先把token raw balance恢复数量,再按价格Feed自身decimals和quote currency缩放。两种decimals相加减的指数必须写进公式,不能只看结果位数。
异常代币需要防御性处理
EIP-20把decimals列为可选函数,非标准代币可能缺失、revert、返回异常值或后来通过代理改变逻辑。钱包可用可信资产列表回退,并限制过大指数导致的内存或显示问题。任何fallback都要标注“未验证精度”,不能悄悄默认18后执行大额交易。
小数位多不等于价值更高
更多decimals不代表价格更稳定或代币更值钱,只代表可表达的最小数量单位更细。显示很多小数也不等于数据准确,行情源、流动性和更新时间才决定价格质量。decimals是一把数量尺,不是一张估值证书。
代币地址来源先按合约地址核验确认;链上日志金额可结合事件data解码,EIP-1559费用单位则参考以太坊交易类型避免和代币数量混淆。
前端金额换算防错表
- 按chainId与合约地址读取decimals
- 所有金额计算使用整数或高精度库
- 价格Feed单独读取decimals与报价方向
- 展示舍入与交易输入精度采用不同规则
- 授权和转账前回显raw amount与人类数量
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。