区块链安全

智能合约安全审计之转账函数检测

问题的目的是变成这一合约的guests,并且将合约的balance归零。

outputo-20211209-092009-310-kudt.png

在程序代码中能够看见,变成合约的guests就表示着须要将合约中的guests取值为咱们的address,有3种方法:

1.调用函数contribute函数

2.调用函数receive函数

这儿须要表明一下下,constructor函数是合约的构造方法,是合约在重置的情况下创建的,而wxpay这一局部变量表示的是现阶段和合约互动的客户。所以说,contructor函数的wxpay不太可能是除开创建者以外后面客户。

如要调用函数contribute函数,则须要向合约转款,转入的eth大于1500才可以变成onwer,并且每一次仅有转低于0.001eth,显而易见不行得通。

那麼假如调用函数receive函数,只须要转款超过0就可以变成guests。那麼这一receive函数如何调用函数呢?

这一变量显著看起来就和正常的变量不同,沒有function装饰。

这儿的情况下最先说明一下什么叫fallback

换句话说,立即向合约转款,应用address.get(ethertosend)向某一合约立即转账时,因为这一操作沒有上传其他数据,因此收到合约一直会调用函数fallback变量。或是当调用函数找不到时便会调用函数fallback变量。

那麼这一fallback和receive又有什么关系呢?在0.7以后的版本,fallback变量的写法就没有这样写了反而是:

fallback()external{

}

receive()payableexternal{

currentBalance=currentBalance+msg.value;

}

fallback和receive没有正常变量,反而是新的函数类型,有特殊的含意,因此在他们前边加function这一关键词。再加上function以后,他们就变成了正常的变量,仅有按正常变量来来去去调用函数。

每一个合约数最多有个没有其他参数没有function关键词的fallback和receive函数。

receive函数种类务必是payable的,并且里边的句子仅有在利用外部地址往合约里转款的情况下实行。fallback函数类型可以是payable还可以没有payable的,要不是payable的,可以往合约上传非转款买卖,假如买卖里含有转款数据,交易会被revert;如果是payable的,当然也就可以接收转款了。

虽然fallback可以是payable的,但并不建议这样做,申明为payable以后,其所损耗的GAS最很多便会被限制在2200。