首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过定义十进制值创建令牌交换

通过定义十进制值创建令牌交换
EN

Ethereum用户
提问于 2019-04-06 19:33:47
回答 2查看 93关注 0票数 0

我刚刚学到了很多关于稳固的知识,并决定把它付诸实践。我真正不明白的是,我如何能够绕过这种编程语言的限制。

假设以下情况:

我们有某种ICO,用户可以用自己的硬币来交换自己的硬币,比如CoinA。

今天CoinA =1美元

明天我们设定CoinA =1.5美元

后天,我们设定CoinA =1.75美元

现在让我们假设,金币的价值是稳定的:

Altcoin1 =0.222美元

Altcoin2 =0.7美元

我的问题是,坚固性不允许我们使用小数。答案,我发现说,使用所有的所有18个小数,提供,然而,我真的很困惑。在实际的场景中,没有人展示实现的方法。

考虑以下代码:

代码语言:javascript
复制
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_]);
  }
}

Brief描述

assignICOPrice函数允许我们手动分配"CoinA“,从$1到$1.5,到$1.75。我们的问题是以后什么也做不了。因为uint256是整数。我们如何解决这个问题?

createTokenPrice允许我们定义AltcoinPrice。例如,对于Altcoin1 =0.222美元和Altcoin2 =0.7美元

有什么合适的解决办法来绕过这个问题吗?我也试着阅读EtherDelta的智能合同,但它似乎没有类似的东西。

EN

回答 2

Ethereum用户

发布于 2019-04-06 20:12:44

典型的解决方案就是你提到的那个。用一个很大的乘数。

例如,不要存储1、1.5和1.75存储库1000、1500和1750。更典型的智能契约,因为以太本机使用18小数点,是乘以10^18,所以存储1* 10^18,1.5 * 10^18和1.75 *10^18。

您通常不会在智能契约中的任何地方看到这样的乘法器,因为乘法通常发生在UI层,可能是浏览器中的JavaScript。类似地,在将智能契约显示给用户之前,您需要对从智能协议中读取的任何内容进行除法。

票数 0
EN

Ethereum用户

发布于 2019-04-06 21:03:18

十进制符号是人类解释的符号。

Ethereum本身使用18位小数位的精度,但实际上是用非常大的整数表示的。18小数点的精度也是令牌合同的一个新兴标准。十进制数用只读变量向用户界面发送信号,这样他们就知道在人类可读的UI中放置点的位置了。

所有操作都使用整数表示(最小的可能单位),因此契约不必考虑小数单位。这就是为什么你没有在代码中看到它的证据。

例如,小数点18位的1.75是1,750,000,000,000,000,000或1.75 * 10 ** 18。这种计算是由客户端完成的,因此合同发送/接收非常大的整数。

希望能帮上忙。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/69351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档