我刚刚学到了很多关于稳固的知识,并决定把它付诸实践。我真正不明白的是,我如何能够绕过这种编程语言的限制。
假设以下情况:
我们有某种ICO,用户可以用自己的硬币来交换自己的硬币,比如CoinA。
今天CoinA =1美元
明天我们设定CoinA =1.5美元
后天,我们设定CoinA =1.75美元
现在让我们假设,金币的价值是稳定的:
Altcoin1 =0.222美元
Altcoin2 =0.7美元
我的问题是,坚固性不允许我们使用小数。答案,我发现说,使用所有的所有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_]);
}
}Brief描述
assignICOPrice函数允许我们手动分配"CoinA“,从$1到$1.5,到$1.75。我们的问题是以后什么也做不了。因为uint256是整数。我们如何解决这个问题?
createTokenPrice允许我们定义AltcoinPrice。例如,对于Altcoin1 =0.222美元和Altcoin2 =0.7美元
有什么合适的解决办法来绕过这个问题吗?我也试着阅读EtherDelta的智能合同,但它似乎没有类似的东西。
发布于 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。类似地,在将智能契约显示给用户之前,您需要对从智能协议中读取的任何内容进行除法。
发布于 2019-04-06 21:03:18
十进制符号是人类解释的符号。
Ethereum本身使用18位小数位的精度,但实际上是用非常大的整数表示的。18小数点的精度也是令牌合同的一个新兴标准。十进制数用只读变量向用户界面发送信号,这样他们就知道在人类可读的UI中放置点的位置了。
所有操作都使用整数表示(最小的可能单位),因此契约不必考虑小数单位。这就是为什么你没有在代码中看到它的证据。
例如,小数点18位的1.75是1,750,000,000,000,000,000或1.75 * 10 ** 18。这种计算是由客户端完成的,因此合同发送/接收非常大的整数。
希望能帮上忙。
https://ethereum.stackexchange.com/questions/69351
复制相似问题