51 large

send 和 call 的区别

rubyu2 · 于 发布 · 最后由 rubyu2回复 · 2037 次阅读

fallback 函数可以做尽量多的计算至到 gas 耗尽。

有 两种方法可以触发 fallback 函数:recipient.send, recipient.call.value(),。方法2存在安全隐患,同时也是 theDAO 被攻击的关键点之一。

方法1: 有2300 gas限制
如果调用 recipient.send 函数的话,被 send 唤起的 fallback 函数最多只能消耗 2300 gas。这种情况和 web3.eth.sendTransaction({to:recipient, gas:21000, ...})的做法相同。

方法2: 会使用尽量多的gas,所以要注意安全问题
recipient.call.value(...) 会使用尽量多的gas,另外两个函数callcodedelegatecall,也是如此。
如果想要和send方法达到同样的安全效果,调用者必须指定 gas limit为0,recipient.call.gas(0).value(...)

相关文章:
http://ethereum.stackexchange.com/questions/5992/how-much-computation-can-be-done-in-a-fallback-function/5993#5993

http://ethfans.org/posts/128

http://solidity.readthedocs.io/en/latest/control-structures.html?highlight=callcode

  • 830 large
    flfq

    这样的技术贴挺好。多来点。赞

  • 128
    naituida

    很奇怪的是一直以来很多solidity程序员都喜欢用recipient.call.value()
    recipient.send更简洁易懂却不用

  • 51 large
    rubyu2

    @naituida 如果是send,其他合约的fallback函数有其他处理,send可能会因为gas受限而失败。
    所以DAO是为了更好的兼容参与方,不一定是account,也可以是合约。