《我学区块链》—— 十六、以太坊安全之 fallback 函数

十六、以太坊安全之 fallback 函数

       当我们调用某个智能合约时,如果指定的函数找不到,或者根本就没指定调用哪个函数(如向合约发送 ether)时,fallback 函数就会被调用。

       fallback函数被设计成不能做太多事,合理的做法是在 fallback 函数里打印一些log(或称event),以通知客户端(通常是web3.js)一些相关信息。所以你如果给该调用不设置任何 gas(就像 send() 一样),系统会默认给予 2300 的 gas 上限来执行 fallback 函数。

       但是当你通过 addr.call.value()() 的方式发送 ether,情况就不一样了。和 send() 一样,fallback 函数会被调用,但是传递给 fallback 函数可用的 gas 是当前剩余的所 gas(可能会是很多),这时 fallback 函数可以做的事情就有很多(如写 storage、再次调用新的智能合约等等)。一个精心设计的用于做恶的 fallback 可以做出很多危害系统的事情。

       所以避开这个安全漏洞,结论就是:总是用 send() 来发送 ether,而不是用 call.value()。

猜你喜欢

转载自blog.csdn.net/xuguangyuansh/article/details/81329616