Solidity 實現的合約中,函數操作都是原子操作,曠工本地執行,取得共識后發布到區塊鏈上。
實際發布到區塊鏈上的不存在並發,全節點同步狀態到本地。
Solidity 中有三種方式進行轉賬,address.transfer、address.send、address.call。
Solidity 重入攻擊是當我們用 address.call 的形式進行轉賬時,如果合約制定者沒有指定 fallback 函數,
有惡意的外部合約 可能會 調用當前合約的這個轉賬函數時 自定義一個 fallback,在 fallback 中再次轉賬,
這樣就陷入了不斷取款的循環,直到我們的合約沒有余額、Gas 不夠、調用棧超出。
這種情況下將陷入災難,著名案例事件是 TheDAO。
有幾種處理方式我們可以做到更安全,第一就是在轉賬前,把取款者能取的余額設為 0,第二就是使用 transfer 的轉賬方式。
