在solidity中,某些低级函数/全局函数会产生返回值作为执行结果,而不是像我们直接使用智能合约类型的变量进行函数调用那样,在调用的函数执行失败时会使当前执行直接失败;对于这些低级函数,如果没有对其返回值进行判断,则很容易出现逻辑错误。需要注意的低级函数有:send、call、callcode、delegatecall和staticcal
比如在下列中:
contract Lotto {
bool public paedOut = false;
address public winner;
uint public winAmount;
// 其他功能函数
...
function sendToWinner() public {
require(!payedOut);
winner.send(winAmount);
payedOut = true;
}
function withdrawLeftOver() public {
require(payedOut);
msg.sender.send(this.balance);
}
}
在第九行使用转账函数send,但是没有判断其返回值,这样即使send函数转账失败,第10行的状态修改依然会执行,这显然是错误的。