乙太坊代幣和小數
創建貨幣時處理小數的最佳方法是什麼?
讓我們舉個例子。我有 KARLCOIN (KARL),我有 1,000,000 個,代幣有 6 個小數位。該代幣還將有一個眾籌,其中 100 KARL = 1 ETH (0.01 ETH / KARL)。
創建此契約時,我應該執行以下操作:
// Constructor function token() { owner = msg.sender; totalSupply = 1000000; balances[owner] = totalSupply; decimals = 6; symbol = "KARL"; }
然後那個token也有轉賬的功能。
現在,我如何計算、轉移和顯示這些金額?例如,1,000,000 KARL 是我硬幣的最小單位的 1,000,000,000,000。我們稱它為 microKarl 或 mk。
這是否意味著我的建構子中的 totalSupply 實際上應該是 1,000,000,000,000?當我將金額轉給他人時,我是否將其轉入 mK?基本上是多少 Karl * 1,000,000 才能將它變成 microKarl 形式?MyEtherWallet 和 MetMask 等如何知道如何顯示正確的金額?
如果我使用 web3 來顯示它,我可以自己計算並顯示它。獲取以 mK 為單位的金額,乘以 0.000001,然後上路。對?還是我在這裡偏離軌道?
我做了一個代幣並做了這樣的事情(這是一個漫長的夜晚)並將代幣發送給自己,在 MetaMask 中它顯示了正確的數量。在 Etherscan 上它沒有,它顯示的數量要小得多,並且當 MetaMask 僅通過粘貼合約地址將它們抓取為 6 時,它還顯示小數是“18”。
我只是對令牌的十進制化有點困惑,並且覺得我沒有我正在做的調試的基礎。任何清晰度將不勝感激。
如果您的代幣遵循 ERC20 標準(如果您希望它由錢包或客戶端應用程序處理,則應該這樣做),您可以包含(這不是強制性的,但由大多數客戶端處理)小數資訊。
因此,您的契約應包含以下內容:
uint8 public constant decimals = 6;
並且您的程式碼應該假設金額是最小的可能單位。
按如下方式使用它:
uint256 public constant decimals = 6; uint256 public constant totalSupply = 1000000*10**decimals;