Buy() 函式未按預期執行
我正在試驗
MyAdvancedToken
程式碼: https ://www.ethereum.org/tokenfunction 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. $$ 對於乙太幣和代幣,你有兩件事發生:
- 內部表示,始終為整數。對於 Ether,這是 Wei。
- 使用者界面表示,可以不同。UI 知道 1 Eth = 10^18 Wei(即 18 位小數)。ERC20 代幣通過參數告訴 UI 有多少內部單元組成一個完整的代幣
decimals
。這通常也是 18 歲,但不是必須的。在您的範例中,
MyAdvancedToken
等於decimals
18,與 Ether 相同。所以你不能發行比進入的乙太幣數量更多的代幣,因為buyPrice
它是一個或更大的整數。如果您想為 1 個 Eth 發行 10 個代幣,您可以執行以下操作之一:
- 設置
buyPrice
為 1 和decimals
17。每個 Wei 將購買 1 個代幣,但 UI 會將其顯示為 10 倍。- 設置
buyPrice
為 10 17和decimals
0。每個 Ether 將購買 10 個基礎代幣,它們將顯示為整個代幣。- 設置為
buyPrice
10 x和。decimals``17 - x
或者你可以忘記所有這些,只乘以
buyPrice
(10) 的倒數,而不是除以買入價。這可能是最簡單的。這當然是一個巨大的頭痛。我真的很討厭 ERC20 代幣
decimals
概念。這是一個關於它的長時間討論。我贊成硬編碼decimals
為 0,fwiw。