通過定義十進制值創建令牌交換
我剛剛學到了很多關於 Solidity 的知識,並決定將其付諸實踐。我真正不明白的是如何繞過這種程式語言的限制。
假設以下場景:
我們有某種 ICO,使用者可以用他們的山寨幣換取我們自己的硬幣,例如 CoinA。
今天 CoinA = $1
明天我們設置 CoinA = $1.5
明天之後我們設置 CoinA = $1.75
現在讓我們假設山寨幣具有穩定的價值:
山寨幣 1 = 0.222 美元
山寨幣2 = 0.7 美元
我遇到的問題是solidity 不允許我們使用小數。我發現的答案說使用乙太坊提供的所有 18 位小數,但我真的對此感到困惑。沒有人展示在實際場景中實現的方法。
考慮以下程式碼:
pragma solidity ^0.4.24; contract Ballot { uint256 icotokenPrice; mapping(string => uint256) tokensPrice; function assignICOPrice(uint256 _tokenPrice) public returns(bool){ icotokenPrice = _tokenPrice; return true; } function createTokenPrice(string symbol_, uint256 price_) public returns(bool){ tokensPrice[symbol_] = icotokenPrice / price_; return true; } function returnPrice(string symbol_) public view returns(uint256){ return(tokensPrice[symbol_]); } }
簡要描述;簡介
assignICOPrice 函式允許我們手動分配“CoinA” $ 1 to $ 1.5,至 1.75 美元。我們遇到的問題是,我們無法在之後做任何事情。因為 uint256 是整數。我們如何解決這個問題?
createTokenPrice 允許我們定義 AltcoinPrice。例如,對於山寨幣 1 = $ 0.222 and for Altcoin2 = $ 0.7
繞過這個問題的任何適當的解決方案?我也嘗試閱讀 EtherDelta 的智能合約,但它似乎沒有類似的東西。
典型的解決方案是您提到的那個。使用大乘數。
例如,儲存 1000、1500 和 1750 而不是儲存 1、1.5 和 1.75。在智能合約中更典型的是,因為乙太幣本身使用 18 個小數點,所以乘以 10^18。所以儲存 1 * 10^18、1.5 * 10^18 和 1.75 * 10^18。
你通常不會在智能合約的任何地方看到這樣的乘數,因為乘數通常發生在 UI 層,可能是瀏覽器中的 JavaScript。同樣,您需要先從智能合約中讀取任何內容,然後再將其顯示給使用者。
十進制符號是人類解釋的符號。
乙太坊本身使用 18 位小數精度,但實際上是由非常大的整數表示的。18 位小數精度也是代幣合約的新興標準。小數位數通過只讀變數通知給 UI,以便他們知道在人類可讀的 UI 中放置點的位置。
所有操作都使用整數表示(可能的最小單位),因此合約不必關心小數單位。這就是為什麼您在程式碼中看不到它的證據。
例如,小數點後 18 位的
1,750,000,000,000,000,000
1.75 或 1.75 * 10 ** 18。此計算是在客戶端完成的,因此合約發送/接收非常大的整數。希望能幫助到你。