Solidity 实现的合约中,函数操作都是原子操作,旷工本地执行,取得共识后发布到区块链上。
实际发布到区块链上的不存在并发,全节点同步状态到本地。
Solidity 中有三种方式进行转账,address.transfer、address.send、address.call。
Solidity 重入攻击是当我们用 address.call 的形式进行转账时,如果合约制定者没有指定 fallback 函数,
有恶意的外部合约 可能会 调用当前合约的这个转账函数时 自定义一个 fallback,在 fallback 中再次转账,
这样就陷入了不断取款的循环,直到我们的合约没有余额、Gas 不够、调用栈超出。
这种情况下将陷入灾难,著名案例事件是 TheDAO。
有几种处理方式我们可以做到更安全,第一就是在转账前,把取款者能取的余额设为 0,第二就是使用 transfer 的转账方式。