使用nameFunction.value(N)(nameFunction参数)和address.transfer(10)有什么区别?
我知道,在address.transfer的情况下,我会将金额发送给回退函数,以便合同中包含该金额。但在第一种情况下,寄出的金额在哪里?
而且,作为最后一件事,nameFunction.value是否像address.call.value()()一样容易受到重入攻击?
我对此有点困惑。谢谢。
发布于 2017-12-06 12:50:30
调用address.transfer(10)将发送以太(10卫)到目标地址。如果所述地址是合同,并且实现了回退应付款功能,则将在目标合同中触发该地址。
另一方面,nameFunction.value(n)(parameters of nameFunction)将调用所选函数,同时发送参数和值指定的以太。要使其工作,所述功能也必须标记为应付款项。
因此,当您只想将醚发送到另一个契约(或EOA)时,您可以使用address.transfer(10),如果该合同碰巧实现了它的回退功能,则由它决定(受2300个气体津贴的限制)。
当您知道要在另一个契约上执行上述函数时,您将使用nameFunction.value(n)(parameters of nameFunction),该契约要求将乙醚发送到工作地点。
假设合同B具有以下功能:
function doSomethingWithEther(string _param) public payable{
balances[msg.sender] = msg.value;
}如果合同A执行此功能并提供所述功能所需的以太功能,它将执行以下操作:
contractB.doSomethingWithEther.value(1 ether)("This is a string param");nameFunction.value(n)(parameters of nameFunction)确实容易受到重新进入的攻击。它可以从您的合同中执行一项功能,它破坏了它的内部平衡,允许它在实际的以太转移完成之前耗尽资金。(这可以通过遵循检查-效果-交互模式来防止)。
https://ethereum.stackexchange.com/questions/32618
复制相似问题