Transactions

通過定義十進制值創建令牌交換

  • December 16, 2020

我剛剛學到了很多關於 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,0001.75 或 1.75 * 10 ** 18。此計算是在客戶端完成的,因此合約發送/接收非常大的整數。

希望能幫助到你。

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