一個項目遷到新合約,公布一個比例,開一個兌換窗口。你的錢包裡顯示的還是舊代幣餘額,而你最後會拿到多少,哪裡都沒寫。把一個公布出來的比例變成真正到帳的餘額,要過三道各自獨立的檢查,而出問題的那一道,往往不是你以為的那次乘法。
兌換比例說的到底是甚麼
兌換比例是兩個帳本之間的一個固定兌換率:舊代幣的每一個單位能換到多少個新代幣單位。比例由項目設定,由兌換合約執行,而且不隨行情變動。無論你兌換那天這兩個代幣在市場上是甚麼價,你拿到的比例就是當初寫下的那個比例。
第一件要先弄清的事是方向,因為一個寫成「一比四」的比例可以有兩種讀法。它可以是每四個舊單位換一個新單位,也可以是每一個舊單位換四個新單位,而這兩種讀法之間差着十六倍。把讀法錨在一個你能獨立核對的東西上:拿新的總供應量與舊的比一比。如果新供應量是兩者中較小的那個,那麼每一個舊單位換到的必然不足一個新單位,任何說反了的讀法都是倒着的。
第二件要弄清的事是這個比例適用於哪一筆餘額。一次遷移會劃定一個合格集合:某個快照時點持有的餘額、仍然留在舊合約裡的餘額,或者在兌換合約停止支付之前被送進去的餘額。這個集合之內所有人適用同一個比例,所以下面所有算法都假定你的餘額在集合裡。而兌換窗口現在還開不開着,是另一個問題,與「如果開着它會付多少」不是一回事。
這個數是從哪裡來的
比例是一個決定,而這個決定背後有一根算術骨架。項目先定下新帳本的規模,再拿它去除以這次遷移必須吸收掉的舊單位數量。商就是比例,這也是為甚麼比例與兩個供應量數字總能對上:把合格的舊供應量乘以比例,就應該得回為兌換預留的新供應量。
設一個項目把新供應量定在 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






