Security
這個支付片段是什麼意思?
我正在嘗試理解以下付款程式碼片段:
if (collectedFees >= minFeePayout) { if (!owner.send(collectedFees)) { // Potentially sending money to a contract that // has a fallback function. So instead, try // tranferring the funds with the call api. if (owner.call.gas(msg.gas).value(collectedFees)()) { collectedFees = 0; }
程式碼片段來自此契約:
https://etherscan.io/address/0x9f1d916a456b96146e9f0dbbd0e107a1f389a061#code
.所以我的問題是:
- 為什麼這個契約使用一
send
和一call
?- 安全嗎?我正在使用一些安全工具來檢查這份契約,並且不知何故這部分被標記為“易受攻擊”。我只是不明白。
send
和call
在這種情況下的主要區別在於send
不轉發任何額外的氣體(僅 2300),但call
您可以指定要轉發的氣體量。如果
send
操作失敗(氣體耗盡),則返回false
. 因此,在程式碼中,如果send
失敗,它將接下來嘗試collectedFees
通過call
提供所有剩餘的氣體 (msg.gas
) 來發送 - 這樣它就有更高的成功機會。在發送 VS 呼叫中閱讀更多資訊- 差異以及何時使用和何時不使用給接收合約(如果是合約)所有剩餘的gas會打開各種漏洞——最明顯的是重入攻擊。如果接收合約有足夠的gas,它可以再次呼叫呼叫合約,在某些情況下會獲得優勢。您可以在此處閱讀有關重入攻擊的更多資訊:https ://medium.com/@gus_tavo_guim/reentrancy-attack-on-smart-contracts-how-to-identify-the-exploitable-and-an-example- of-an-attack-4470a2d8dfe4