Wie vermeidet man die Warnung vor einer erneuten Eintrittsschwachstelle?

Überweisen Sie den Betrag an eine beliebige Adresse, die immer die Wiedereintritts-Schwachstellenwarnung anzeigt. Wie vermeide ich diese Warnung?

function completeChallenge(address _challengerAddress,address _challengeAddress,uint _index) internal returns(bool) {
   _challengerAddress.transfer(safeMul(challengeList[_challengerAddress][_challengeAddress][_index].challengeChargeAmountWei,2));
   return true;
}

Geben Sie hier die Bildbeschreibung ein

Vermeiden Sie Warnungen nicht, hören Sie auf Warnungen, finden Sie das Problem und beheben Sie es. Intelligente Verträge handhaben Geld, wie Sie wissen.

Antworten (2)

Sie sollten den Status aktualisieren, bevor Sie die Übertragungsmethode aufrufen. Denn wenn Sie den Status nicht aktualisieren, kann der Empfänger, wenn er ein Smart Contract ist, Ihre Vertragsmethode zurückrufen, um immer wieder zu übertragen, bis Ihr Vertragssaldo Null wird

Teilen Sie ein beliebiges Echtzeitbeispiel
Sie können den sehr bekannten DAO-Fork durchsuchen, um mehr über die Re-Entry-Schwachstelle zu erfahren

Die Warnung kann in Solidity nicht reproduziert werden. Welche Version verwenden Sie? pragma solidity ^0.4.17;ist das neuste.

Vielleicht möchten Sie versuchen, die transferAmountseparat zuzuweisen. Dadurch wird zumindest der Code von SafeMathsafeMul aus dem .transferMethodenaufruf entfernt.

function completeChallenge(address _challengerAddress,address _challengeAddress,uint _index) internal returns(bool) {
    uint transferAmount = safeMul(challengeList[_challengerAddress][_challengeAddress][_index].challengeChargeAmountWei, 2);
   _challengerAddress.transfer(transferAmount);
   return true;
}

Ich hoffe, das hilft.

die neueste ^0.4.17 und nach der obigen Änderung wird immer noch dieselbe Warnung angezeigt. Sie sehen diese Warnung im Analyseabschnitt des Remix-Compilers.