你好,可以执行这个“多重”函数吗?假设我以所有者身份将1个ETH放入契约,但当黑客将2个ETH发送到乘法器时,this.balance在函数开始时变为3,然后它总是大于msg.value。我想知道我是不是错过了什么。
contract Multiplicator
{
address public Owner = msg.sender;
function() payable{}
function withdraw() payable public
{
require(msg.sender == Owner);
Owner.transfer(this.balance);
}
function multiplicate(address adr) payable
{
if(msg.value >= this.balance)
{
adr.transfer(this.balance+msg.value);
}
}
}发布于 2018-02-11 22:20:22
在“应付”方法的主体执行之前,this.balance的值由msg.value增加。如果合同的起始余额为1,并且传入msg.value为2,则在执行时,应付方法已经有了3的this.balance。
multiplicate函数吗?是。如果契约的初始余额为零,并且传入msg.value为零,则该函数很可能在没有错误的情况下完成。我写了“最有可能”,因为如果接收地址是一个合同,接收合同仍然可能使它失败。
在您的示例中,契约以1以太开头,您使用2醚的multiplicate调用msg.value,该示例也将成功执行,但调用transfer的内部条件将被跳过。在执行this.balance主体之前,multiplicate将跳转到3。
发布于 2017-11-06 12:38:50
您应该做的是添加一个状态变量来跟踪合同的平衡。这样你就能做到:
function multiplicate(address adr) payable
{
require (contractBalance + msg.value <= this.balance); // The contract should have enough funds...
if(msg.value >= contractBalance)
{
contractBalance += msg.value;
uint moneyToTransfer = contractBalance;
contractBalance = 0;
adr.transfer(moneyToTransfer);
}
}每次您接收或传输contractBalance时,您都必须跟踪它。
发布于 2021-07-12 03:22:15
是的,我认为这次更新伴随着稳健性0.6.0
this.balance应改为
address(this).balance希望这能有所帮助
https://ethereum.stackexchange.com/questions/29991
复制相似问题