receive() external payable {
require(msg.value >= prize || msg.sender == owner);
king.transfer(msg.value);
king = msg.sender;
prize = msg.value;
}
这里犯了常见的错误未有考虑调用者为另一智能合约的情况。
基本上只要king的地址为一智能合约,而该智能合约又并未定义fallback或是receive,transfer就会失败。 未定义fallback或是receive的智能合约收到transfer传送的以太币会以exception处理。
因此只要一个未定义fallback或是receive的智能合约占用king,合约就会在transfer时出现错误,令king的地址永远属于该智能合约。
另外,transfer和send都只限使用2300 gas. 如果fallback和receive里面逻辑很多的话,得用call.