Solidity

我應該用什麼面額發行我的 ERC20 代幣?

  • July 10, 2017

按照 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。

引用自:https://ethereum.stackexchange.com/questions/20811