ERC20 代幣上的小數
我在使用我編寫的一些 ERC20 代幣合約時遇到了一個奇怪的問題:
當我指定一個十進制值時,為了簡單起見,我們在這裡說 4,這些值在 Mist 和 etherscan 中的顯示方式不同。
例如,如果我創建一個供應量為 1 且小數為 4 的代幣,代幣在 Mist 中顯示為 0.0001,但在 etherscan 中顯示為 1;但是,如果我點擊 etherscan 中的 ERC20 圖示以查看代幣的詳細資訊,則它與 Mist 一致並聲明代幣供應量為 0.0001。
因此,我知道合約將使用代幣的最小單位,由建構子中的小數值設置;但我不太確定如何獲取令牌本身的價值,而不是更小的單位,以在 Mist 和 etherscan 中顯示。讓我知道這是否沒有意義。
我考慮這個的方式是令牌的數量是:
tokenSupply = tokensIActuallyWant * (10 ** 小數)
如果我想要 1 個能夠以小數點後 2 位精度細分它的令牌,我將其表示為 100。
同樣,如果我想要 1 個能夠將其細分到小數點後 18 位的令牌,我需要將其表示為 1000000000000000000(1 有 18 個零)。
希望有幫助。
像加密貨幣(例如錢包)中的許多詞一樣,術語令牌有幾個不同的定義,主要取決於上下文。
Token:通常是乙太坊主網上 ERC20 代幣的縮寫。
代幣(或用代幣名稱或符號代替):智能合約用於記賬的單位(智能合約處理整數,因此不能有任何小數)。將其視為可能的最小單位,可與乙太坊的wei相媲美。
代幣(或用代幣名稱或符號代替):用於向使用者顯示的單位(在任何 UI 中,從錢包到交易所或任何 Dapp)。這與使用 18 位小數顯示的 Ether 相當。當為 18 位小數標記顯示 1080250000000000000000 時,將其顯示為 1'080.25會更加使用者友好。
為了保持精度,請確保在 JS 中使用大整數,並在清理使用者輸入之後/之前轉換為浮點數。在你的智能合約中,你只能用整數推理
$$ see notes below $$,這是它期望作為交易數據接收的唯一類型的數字。 如果您使用少於 18 位小數,請格外小心,使用 0 更是如此。當應用於少量(或不那麼小,您會感到驚訝)的代幣時,部門將表現出逐步的行為,並且您的智能合約可能會表現得很奇怪。它甚至可能阻礙代幣有效交易,甚至在交易所上市的能力。
$$ notes $$Solidity 可以處理分數和高精度計算,但是在儲存結果時,它只能儲存整數值。使用最常見和最優化的類型 ,
uint256
您將能夠儲存大至 1077 的數字。 如果您的 ERC20 代幣使用 18 位小數,您的“顯示代幣”最大總供應量約為 1059。uint192
由於 EVM 的工作方式,使用較小的類型(例如 )沒有任何好處,並且在 18 位小數處已經在兩個方向(總供應量和除法精度)上有足夠的空間。保留預設的 18 位小數,除非您真的知道自己在做什麼、為什麼以及會產生什麼後果。