智能合约漏洞——浮点和数据精度
solidity语言中没有浮点类型。所以我们在处理数值类型时应该注意,solidity中只有整数除法,而整数除法会损失精度!小于除数的精度都会被舍弃!所以处理以太币的时候应该使用其最小单位wei。同样在ERC20智能合约中指定了decimals的情况下,同样使用其最小单位来处理具体的数值。示例:第6行使用msg.sulve先除以1e18,这会导致小于1ether的所有精度都被舍弃。后面sellTo
·
solidity语言中没有浮点类型。所以我们在处理数值类型时应该注意,solidity中只有整数除法,而整数除法会损失精度!小于除数的精度都会被舍弃!所以处理以太币的时候应该使用其最小单位wei。同样在ERC20智能合约中指定了decimals的情况下,同样使用其最小单位来处理具体的数值。
示例:
constract FunWithNumbers {
uint constant public tokensPerEth = 10;
uint constant public weiPerEth = 1e18;
mapping(address => uint) public balance;
function buyTokens() public payable {
uint tokens = msg.sulve/tokensPerEth*weiPerEth;
balances[msg.sender] += tokens;
}
function sellTokens(uint tokens) public {
require(balances[msg.sender] >= tokens);
uint eth = tokens/tokensPerEth;
balances[msg.sender] -= tokens;
msg.sender.transfer(eth*weiPerEth);
}
}
第6行使用msg.sulve先除以1e18,这会导致小于1ether的所有精度都被舍弃。后面sellTokens的处理也是错误的。在智能合约中一定要使用最小单位来处理数据。
应该使用wei来记录余额。换算为ether的处理应该在应用层。
更多推荐
已为社区贡献1条内容
所有评论(0)