这是退出 Solidity 合同的一种干净方式吗?

Is this a clean way to withdraw from a contract in Solidity?

我一直在寻找如何在没有成功的情况下从以太坊合约中提取资金。 Remix 编辑器警告说此函数可能会导致无限循环。

Gas requirement of function KOTH.cleanTheKingsChest() high: infinite. If the gas requirement of a function is higher than the block gas limit, it cannot be executed. Please avoid loops in your functions or actions that modify large areas of storage (this includes clearing or copying arrays in storage)

还有…… 我应该为此函数使用 Open-Zeppelin's 安全数学吗?

function cleanTheKingsChest() public isOwner {
  uint bal = address(this).balance;
  address(owner).transfer(bal);
}

这会将合约持有的所有以太币转移到所有者的地址。你这样做没有问题。

出现警告的原因是您正在向另一个地址发出呼叫。该地址本身可以是具有自定义定义的 transfer 或回退函数(如果未定义 transfer 方法)的合约。由于 Remix 不知道该实现可能会做什么,因此无法估计气体使用量。这不是问题,因为 transfer 调用仅限于 2100 gas 津贴。

你不需要SafeMath那个函数,因为你没有做任何可能导致溢出的事情。但是,总的来说,使用它是个好主意。