我應該用什麼面額發行我的 ERC20 代幣?
按照 ethereum.org 上的“創建加密貨幣”教程,我最終得到了以下功能(精簡):
function () payable { if (msg.value == 0) { return; } uint256 tokens = msg.value * 100; owner.transfer(msg.value); balance[msg.sender] += tokens; }
因為
msg.value
在 中wei
,發送 0.01 ETH,將導致收到 1e18 個代幣。我想發行更少量的代幣,理想情況下,每 0.01 ETH 1 ERC20 就像教程一樣,但這不會引入浮點精度錯誤嗎?
Solidity 不能做浮點運算。這就是我們使用小數可用的最小單位儲存和交易的原因。它們是唯一實際存在的單位,即:乙太中的 Wei。“1 Ether”是一種幻想。它僅表示 1000000000000000000(或 1e18)魏。
乙太幣有 18 位小數。假設我們使用 6 位小數,而您想購買 10 個代幣,每 0.01 ETH 價值 1 ERC20。
uint public decimals = 6
;因此,我們的乘數是 1e6,即 1000000。六位小數。乙太坊的將是 1e18。
uint MULTIPLIER = 1000000; // six decimals to the left
uint price = 10000000000000000; // 1e16 wei per token
;如果你發送 0.1 ETH,你發送 1e17。一個代幣的價格是 1e16。
uint amount = msg.value; // msg.value is 1e17
uint tokens = amount / price * MULTIPLIER; // or 1e17 / 1e16 * 1e6
// amount / price will be 10. then 10 * 1000000 gets you 10,000,000, a.k.a Ten of your ERC20 tokens valued at 1,000,000 "erc20 wei" each.
代幣是代幣的數量,精確到小數點後六位,您可以在
token.transfer(address to, uint amount)
方法中用作數量。每當您將其顯示給最終使用者時,您需要將結果除以乘數以獲得實際的代幣數量,因為我們儲存在 ERC20“wei”中。
如果您將令牌添加到 Metamask 或在 Etherscan 上訪問它,它將能夠提取“小數”變數並進行數學運算以準確顯示它。這就是所有乙太坊代幣顯示正確值的方式。錢包很聰明,知道 ERC20 標準,並尋找一個稱為小數的變數。
其中很多是虛擬碼,我確信數學是可以破解的,但總體構想就在那裡。您可能希望在處理之前檢查最低出價是否為 1e16,否則您最終會出現浮點錯誤(即,如果有人發送 1e15 wei 而您將其除以 1e16)。
編輯:同樣,你說
Because msg.value is in wei, sending 0.01 ETH, would result in receiving 1e18 tokens
的不正確,1 ETH = 1e18 wei。0.01 eth 將導致 1e16 wei。