首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nameFunction.value与address.transfer的差异

nameFunction.value与address.transfer的差异
EN

Ethereum用户
提问于 2017-12-06 11:09:15
回答 1查看 71关注 0票数 1

使用nameFunction.value(N)(nameFunction参数)和address.transfer(10)有什么区别?

我知道,在address.transfer的情况下,我会将金额发送给回退函数,以便合同中包含该金额。但在第一种情况下,寄出的金额在哪里?

而且,作为最后一件事,nameFunction.value是否像address.call.value()()一样容易受到重入攻击?

我对此有点困惑。谢谢。

EN

回答 1

Ethereum用户

回答已采纳

发布于 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具有以下功能:

代码语言:javascript
复制
function doSomethingWithEther(string _param) public payable{
 balances[msg.sender] = msg.value;
}

如果合同A执行此功能并提供所述功能所需的以太功能,它将执行以下操作:

代码语言:javascript
复制
contractB.doSomethingWithEther.value(1 ether)("This is a string param");

nameFunction.value(n)(parameters of nameFunction)确实容易受到重新进入的攻击。它可以从您的合同中执行一项功能,它破坏了它的内部平衡,允许它在实际的以太转移完成之前耗尽资金。(这可以通过遵循检查-效果-交互模式来防止)。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/32618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档