Solidity

Buy() 函式未按預期執行

  • January 15, 2018

我正在試驗MyAdvancedToken程式碼: https ://www.ethereum.org/token

   function setPrices(uint256 newSellPrice, uint256 newBuyPrice) onlyOwner public {
       sellPrice = newSellPrice;
       buyPrice = newBuyPrice;
   }

   function buy() payable public {
       uint amount = msg.value / buyPrice;               // calculates the amount
       _transfer(this, msg.sender, amount);              // makes the transfers
   }

如果是amount purchased = msg.value/buyPrice,怎麼可能購買價值低於 1ETH 的代幣? buyPrice不能是小於 1 的小數。換句話說,我想要一個人可以發送 1 個 ETH 並接收 10 個令牌。這個數學不允許(buyPrice不能是 0.1)。

一些文件是這樣說的,value應該buyPrice是 wei,而不是 ETH。在這種情況下,我可以使數學工作。但是,在使用 MyEtherWallet 和 Ethereum Wallet 應用程序進行測試時,我看到msg.value了 ETH。如果我發送 1 個 ETH,buyPrice = 10使用者最終會購買 0.1 個代幣。

msg.value讓wei 代替 ETH有什麼訣竅嗎?

謝謝。

契約之內,msg.value始終是在偉。前端應用程序有時會將 Eth 中的值顯示為對使用者的“方便”,但在交易中它始終是 Wei。

請注意,契約中的代幣值也是如此。例如,此MyAdvancedToken令牌已decimals設置為 18(與 Ether 相同)。當您購買 0.1 個代幣時,您實際上是在購買 10 17 個代幣。使用者界面可以使用該decimals參數將其轉換為 0.1 以進行顯示。


$$ To expand on this now I’m no longer on mobile. $$ 對於乙太幣和代幣,你有兩件事發生:

  1. 內部表示,始終為整數。對於 Ether,這是 Wei。
  2. 使用者界面表示,可以不同。UI 知道 1 Eth = 10^18 Wei(即 18 位小數)。ERC20 代幣通過參數告訴 UI 有多少內部單元組成一個完整的代幣decimals。這通常也是 18 歲,但不是必須的。

在您的範例中,MyAdvancedToken等於decimals18,與 Ether 相同。所以你不能發行比進入的乙太幣數量更多的代幣,因為buyPrice它是一個或更大的整數。

如果您想為 1 個 Eth 發行 10 個代幣,您可以執行以下操作之一:

  • 設置buyPrice為 1 和decimals17。每個 Wei 將購買 1 個代幣,但 UI 會將其顯示為 10 倍。
  • 設置buyPrice為 10 17和decimals0。每個 Ether 將購買 10 個基礎代幣,它們將顯示為整個代幣。
  • 設置為buyPrice10 x和。decimals``17 - x

或者你可以忘記所有這些,只乘以buyPrice(10) 的倒數,而不是除以買入價。這可能是最簡單的。


這當然是一個巨大的頭痛。我真的很討厭 ERC20 代幣decimals概念。這是一個關於它的長時間討論。我贊成硬編碼decimals為 0,fwiw。

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