一个项目迁到新合约,公布一个比例,开一个兑换窗口。你的钱包里显示的还是旧代币余额,而你最后会拿到多少,哪儿都没写。把一个公布出来的比例变成真正到账的余额,要过三道各自独立的检查,而出问题的那一道,往往不是你以为的那次乘法。
兑换比例说的到底是什么
兑换比例是两个账本之间的一个固定兑换率:旧代币的每一个单位能换到多少个新代币单位。比例由项目设定,由兑换合约执行,而且不随行情变动。无论你兑换那天这两个代币在市场上是什么价,你拿到的比例就是当初写下的那个比例。
第一件要先弄清的事是方向,因为一个写成“一比四”的比例可以有两种读法。它可以是每四个旧单位换一个新单位,也可以是每一个旧单位换四个新单位,而这两种读法之间差着十六倍。把读法锚在一个你能独立核对的东西上:拿新的总供应量与旧的比一比。如果新供应量是两者中较小的那个,那么每一个旧单位换到的必然不足一个新单位,任何说反了的读法都是倒着的。
第二件要弄清的事是这个比例适用于哪一笔余额。一次迁移会划定一个合格集合:某个快照时点持有的余额、仍然留在旧合约里的余额,或者在兑换合约停止支付之前被送进去的余额。这个集合之内所有人适用同一个比例,所以下面所有算法都假定你的余额在集合里。而兑换窗口现在还开不开着,是另一个问题,与“如果开着它会付多少”不是一回事。
这个数是从哪儿来的
比例是一个决定,而这个决定背后有一根算术骨架。项目先定下新账本的规模,再拿它去除以这次迁移必须吸收掉的旧单位数量。商就是比例,这也是为什么比例与两个供应量数字总能对上:把合格的旧供应量乘以比例,就应该得回为兑换预留的新供应量。
设一个项目把新供应量定在 400,000,000 个单位,而合格迁移的旧单位是 1,000,000,000 个。比例就是前者除以后者,于是每一个旧单位换到一个新单位的 40%。反过来读,就是五个旧单位产出两个新单位。
这条推导给了你一个可以拿去核任何公告的检查。如果一个项目同时公布了两个供应量数字和一个比例,这三个数必须互相对得上。对不上的时候,要么这三个里有一个是错的,要么合格集合比你以为的窄;而弄清是哪一种,比拿一个对不上的数去重算自己的余额更重要。
算你自己该拿多少
方向和比例都定下来之后,你自己那个数就是一次乘法:旧余额乘以比例。12,500 个旧单位、比例 40%,换到 5,000 个新单位。这一步不依赖任何价格,也不依赖你在窗口里的哪一天去兑换。
这次乘法要用你钱包显示的那种单位来做,因为那才是你能拿去和公告对照的形态。合约做的是同一次乘法,但用的是另一套单位体系,而两者只有在小数位对齐时才一致。那是下一道检查,也是最容易把答案整个差出若干个数量级的那一道。
| 你需要什么 | 去哪里读 | 少了它会怎样 |
|---|---|---|
| 比例,以及它是朝哪个方向的 | 公告,并与两个供应量数字对账 | 算出来的结果是倒的 |
| 两个代币各自的小数位 | 每个代币合约上的 decimals 函数 | 结果差出若干个数量级 |
| 取整规则 | 兑换函数内部的整数运算 | 有一笔余数留在旧合约里 |
| 哪一笔余额是合格的 | 公告,以及合约实际会接受什么 | 你把兑换不会收的单位也算了进去 |
小数位是第二次换算,也是最容易被跳过的那次
代币合约不存小数量。它们存的是整数,另有一个值记着小数点该放在哪里。在 ERC-20 标准里,可选的 decimals 函数返回这个代币使用的小数位数;规范用一个取值为八的代币来举例说明:存储的数量要除以一亿,才得到它面向用户的表示。
正因为这个函数是可选的,标准写明:接口与其他合约不得预设这个值一定存在。当它不在时,小数位数就成了一个你得用别的办法确定下来的约定,而拿一个你自己假定的默认值去填这个空缺,正是一笔余额被读错若干个数量级的来路。
两个代币小数位不同的迁移,会在比例之上再叠一层缩放。如果旧代币用十八位小数、新代币用六位,同样一个显示出来的数量,存成整数会差 1,000,000,000,000 倍。兑换合约内部会处理这层缩放,所以一个同时拿到两个 decimals 值的钱包,显示给你的数是对的。而从区块链浏览器上直接抄下来的原始整数是另一回事:从一次合约调用里直接读到的值是以基本单位计的,把一个代币的基本单位数字与另一个代币的基本单位数字并排比较,比的是两把不同的尺子。
与其读公告,不如把比例从合约里读出来
公告是散文,而真正付钱的是兑换合约。打开它已验证的源码,找到兑换函数用来乘和除的那两个常数。那两个常数就是这个比例被强制执行的形态。如果它们与公告不一致,你的余额会被送进去的是那两个常数。
顺手把两个代币合约上的 decimals 值也读了。两个常数加两个 decimals 值,就是这道计算的全部,而这四个都是不花钱的公开读取。
然后,在你把余额交出去之前,先把结果确认一遍。兑换合约要先拿到一笔代币授权才能动你的旧代币,而授权可以只授一个很小的数量,不必是整笔余额。先兑一小笔,拿到账的数与你自己的算术对一对,然后才去授权其余的部分 —— 这样这道计算就从“推出来的”变成了“看见过的”。
取整,以及被留下的那些单位
合约在整数里做运算,而整数除法是截断的。当你的旧数量不是比例分母的整数倍时,除法会把余下的部分丢掉,而不是进位。在十八位小数上,被丢掉的那一小片是一个小到没有显示形态的分数 —— 而它照样是真的。
当支付被切得更粗时,这笔余数就会显出来。12,502 个旧单位,同样按 40% 的比例,算出来是 5,000 个新单位再加一个零头;一个只按整数单位入账的合约会给你 5,000 个,零头留在原地。事先算清楚:那笔剩下的东西,是一个你可以不管的取整余数,还是一笔窗口关上之后你还会拿在手里的旧余额。
比例没告诉你的那件事:价值
兑换比例定的是数量,对价值不作任何主张。你手里单位的个数变了,而这就是比例所保证的全部。把小于一的比例读成亏损、把大于一的比例读成盈利,是把一次算术换算当成了一次价格变动。
迁移真正改变的,是市场给哪一个账本定价。两个代币同时存在之后,它们各自独立地交易,价格来自各自遇到的需求,而不是来自那个把两者供应量连起来的比例。你拿到的那个 ERC-20 代币是一份有自己市场的新合约,而比例是唯一被带过去的固定的东西。
| 比例定死了什么 | 它把什么留给市场 |
|---|---|
| 你的余额会换成多少个新单位 | 一个新单位值多少钱 |
| 两个供应量数字之间的关系 | 新代币会比旧代币交易得更高还是更低 |
| 兑换合约执行的那次算术 | 兑换之后你这个仓位的价值 |
小结
兑换比例是一次乘法,外面裹着三道检查。用两个供应量数字对账,定下比例是朝哪个方向的;读出两个代币的小数位,好让缩放不会把你的答案挪掉若干个数量级;找出取整规则,好知道什么会被留下。
然后是核实,而不是相信:兑换合约里的那两个常数才是真正会被套到你身上的比例,而一笔小额试兑,能把你的算术变成一次观察。想系统学习更多加密基础知识,可以关注 Bitbase(币贝)学院的后续内容。
相关阅读
币贝上与本主题相关的其他文章:
- 如何撤回治理委托
风险披露:本文为 Bitbase(币贝)学院的科普内容,仅供教育与信息参考,不构成任何投资、交易、税务或财务建议。加密资产波动剧烈,请自行评估风险。本文撰写于 2026 年 9 月,请以官方最新信息为准。
参考资料
[1] 以太坊改进提案,ERC-20: Token Standard(EIP-20,Final),decimals 方法 eips.ethereum.org
[2] ethereum.org 开发者文档,ERC-20 Token Standard ethereum.org






