再学:合约继承 、抽象合约 solidity接口、库、事件 合约重入攻击
目录
1.合约继承
2.抽象合约
3.接口
4.库
5.事件
6.重入攻击
1.合约继承
这里的代码解释:B继承A
B可以访问A的set()方法(即便是internal也可以),也可以拿到A的a变量。
只要这些在A的东西不是private就行
若想在子类可以重写这个方法
要在父类加上virtual,在子类加上override
2.抽象合约
3.接口
使用
new
关键字时,你不需要手动传递合约地址,因为new
操作符会自动处理地址分配。而使用接口时,你需要传递合约地址,因为接口需要知道它应该与哪个具体的合约实例进行交互。这是接口提供灵活性和抽象性的代价,它允许你在不知道具体合约实现的情况下编写代码。
这里的uint public count; 也会创建一个get的,所以在接口的地方也要写一个count()方法
接口必须是external,因为外部要调用
4.库
纯计算
内部库
也可以用以下的调用方式
链接外部库
5.事件
用地址作为索引
事件会记录在日志当中。
6.重入攻击
攻击者会不断地从银行withdraw fallback withdraw fallback.. 直到银行里没有钱。
两种解决方法
1.先检查 - 再修改 -最后交互
先将余额全部提取出来,然后将余额设置为0,这样即便call完,又想重复进入withdraw,余额都是0
2.重入锁控制
解释:攻击者会在调用完call后,就执行withdraw方法,因此若有重入锁的话,第一次进入withdraw方法,locked默认为0,可以执行,然后locked变成1,当攻击者想循环进入withdraw时,因为locked一直为1,从而无法进入下一个withdraw