Security

這個支付片段是什麼意思?

  • August 9, 2019

我正在嘗試理解以下付款程式碼片段:

       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.

所以我的問題是:

  1. 為什麼這個契約使用一send和一call
  2. 安全嗎?我正在使用一些安全工具來檢查這份契約,並且不知何故這部分被標記為“易受攻擊”。我只是不明白。

sendcall在這種情況下的主要區別在於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


引用自:https://ethereum.stackexchange.com/questions/73760