Remix-Warnung - Keine Sichtbarkeit angegeben, Verletzung von Checks-Effects-Interaction-Pattern, Funktionszustandsveränderlichkeit kann auf rein beschränkt werden - Kann ignoriert werden?

Vor zwei Monaten habe ich einen Smart Contract mit Remix.ethereum.org abgeschlossen. Zeile 1 meines Codes hat:

pragma solidity ^0.4.11;

Es kompiliert fein ohne Fehler und noch Warnungen. Ich habe jede Funktion in Ropsten getestet und es hat gut funktioniert.

Jetzt nähere ich mich dem Einsatz im Hauptnetz. Ich sehe, dass sich Remix geändert hat. Nun heißt es:

Statische Analyse hat 50 Warnung(en) ausgegeben, die Ihre Aufmerksamkeit erfordern.

Auf der Registerkarte „Analyse“ gibt es viele Warnungen, die ich nicht lösen kann. Ein Beispiel ist,

Potenzielle Verletzung des Checks-Effects-Interaction-Musters in TestContract.testFunction(address): Kann möglicherweise zu einer Re-Entrancy-Schwachstelle führen. Hinweis: Modifikatoren werden derzeit von dieser statischen Analyse nicht berücksichtigt.

Ein weiteres Beispiel ist,

Gasbedarf von Funktionsbrowser/TestContract 8.sol:MintableToken.transferFrom(address,address,uint256) unbekannt oder nicht konstant. Wenn der Gasbedarf einer Funktion höher ist als die Sperrgasgrenze, kann sie nicht ausgeführt werden. Bitte vermeiden Sie Schleifen in Ihren Funktionen oder Aktionen, die große Speicherbereiche ändern (dazu gehört das Löschen oder Kopieren von Arrays im Speicher).

Ein weiteres Beispiel ist,

Fallback-Funktion des Vertragsbrowsers/TestContract 8.sol:Test benötigt zu viel Gas (Null). Wenn die Fallback-Funktion mehr als 2300 Gas erfordert, kann der Vertrag kein Ether empfangen.

Ein weiteres Beispiel ist,

Test.transferFrom(address,address,uint256): Sollte potenziell konstant sein, ist es aber nicht. Hinweis: Modifikatoren werden derzeit von dieser statischen Analyse nicht berücksichtigt.

Jedes der obigen Beispiele kommt mehrfach vor. Kann ich alle diese Warnungen ignorieren? Wenn nicht, wie löse ich sie?

Unter Einstellungen wurde Solidity Version 0.4.11 verwendet. Wenn ich dies auf 0.4.17 ändere, erhalte ich auch Dutzende von Warnungen unter der Registerkarte Compile. Ein Beispiel ist,

browser/TestContract 8.sol:15:3 Warnung: Keine Sichtbarkeit angegeben. Standardmäßig auf "öffentlich":

Funktionsregister (String-Schlüssel) {

^

Über mehrere Zeilen hinweg.

Ich kann "public" nach der schließenden Klammer für die Parameter in jeder der Funktionen hinzufügen, um die obigen Warnungen zu beheben, aber ich bin mir nicht sicher, ob das richtig ist.

Ein weiteres warnendes Beispiel ist,

browser/TestContract 8.sol:100:3 Warnung: Die Veränderbarkeit des Funktionszustands kann auf rein beschränkt werden

Funktion mil(uint256 a, uint256 b) interne Konstante gibt zurück (uint256) {

^

Über mehrere Zeilen hinweg.

Ich habe keine Ahnung, wie ich die obige Warnung lösen kann.

Liege ich richtig in der Annahme, dass ich 0.4.17 ignorieren und zu 0.4.11 zurückkehren kann?

0.4.11 bis 0.4.16 zeigen diese Warnungen nicht auf der Compiler-Registerkarte. Sollte ich 0.4.16 verwenden?

Mein Code ist hier zu sehen

Antworten (2)

Im Algemeinen

Sie können den Code laufen lassen und dabei die Compiler-Warnungen ignorieren, aber es ist immer gut, dies nicht zu tun. Compiler-Warnungen warnen Sie meistens vor etwas, das einen Fehler in Ihrem Code verursachen könnte. Im Vergleich zu Compilerfehlern besteht der Unterschied darin, dass Ihr Code syntaktisch korrekt ist und daher kompiliert werden kann, aber zu Problemen führen kann, insbesondere wenn jemand versucht, etwas zu tun, was Sie von anderen nicht erwarten.

Compiler-Warnungen weisen auf Dinge hin, die Probleme verursachen oder unbeabsichtigte Auswirkungen haben könnten, die dem Programmierer nicht bewusst waren.

Eine gute Lektüre dazu finden Sie hier , und Sie können sich auch auf diese Frage beziehen . Lesen Sie vor allem die Sicherheitsüberlegungen in Solidity-Dokumentation. Das kann Ihr Leben retten!

Wie auch immer, der Compiler ist nicht so intelligent wie Sie und behauptet, was ihm in Note:folgenden Anweisungen fehlt:

Hinweis: Modifikatoren werden derzeit von dieser statischen Analyse nicht berücksichtigt.

Manchmal weisen diese Hinweise darauf hin, dass Sie diese Warnungen ignorieren können.


Beispiel

Eine Fehlerwarnung, die Sie erwähnt haben, ist:

browser/TestContract 8.sol:15:3 Warnung: Keine Sichtbarkeit angegeben. Standardmäßig auf "öffentlich":

Nehmen wir an, Sie haben function A(uint val) {}. Sie möchten, dass es aufgrund einiger vorheriger Validierungen, die Sie durchführen müssen, nur innerhalb des Vertrags verwendet wird (Dies ist nur ein Beispiel ;)). Und wenn die Funktion ohne Validierung aufgerufen wird, kann dies zu einigen unerwünschten Ausführungen führen. Und die einzige Verwendung function Abesteht darin, es innerhalb einiger anderer Funktionen innerhalb des Vertrags zu verwenden.

pragma solidity ^0.4.0;

contract Example {


    function A(uint val) {
       //do something with val 
    }

    function B(uint val){
        //validation of val
        A(val);
    }

}

Wenn Sie jetzt den Vertrag wie oben beibehalten, da function A()er standardmäßig auch auf öffentlich eingestellt ist, kann jeder, der Ihren Vertrag verwendet, ihn function Amit jedem beliebigen uintWert verwenden, und das kann zu Problemen führen. Aber wenn Sie den Zugriffsmodifikator von function Aals deklariert privatehatten, wird dieses Problem nicht auftreten, da function Anicht öffentlich zugegriffen werden kann. Und da Ihre Anforderung auch darin besteht, function Adie anderen Funktionen innerhalb des Vertrages zu nutzen, ist Ihr Ziel auch erreicht.

Wenn kein Zugriffsmodifikator deklariert wird, geht der Compiler davon aus, dass eine Funktion öffentlich ist, und warnt Sie, dass er die Funktion öffentlich macht, und fordert Sie auf, zu prüfen, ob sie wirklich öffentlich sein sollte. Im obigen Fall erhalten Sie Warnungen bezüglich der Funktionen und der Einstellung function Aauf privat, und function Bum öffentlich zu sein, werden die Warnungen entfernt, da der Compiler jetzt weiß, dass Sie absichtlich function Böffentlich und function Aprivat machen.

pragma solidity ^0.4.0;

contract Example {


    function A(uint val) private {
       //do something with val 
    }

    function B(uint val)public {
        //validation of val
        A(val);
    }

}

Die Warnung bezüglich function Bder Veröffentlichung ist eine Art Warnung, die Sie getrost ignorieren können, da Ihre Absicht auch dieselbe ist, aber die Warnung bezüglich function Aist etwas, das Sie wirklich berücksichtigen sollten.


Was ich vorschlage ,

  • Ignorieren Sie die Warnung nicht, sondern gehen Sie sie durch und prüfen Sie, ob sie wirklich wichtig sind, wie Sie erwarten, dass sich der Code verhält, und versuchen Sie, sie zu lösen.

  • Versuchen Sie, die neueste Compiler-Version (atm 0.4.17) zu verwenden, da neuere stabile Versionen tendenziell weniger Fehler und mehr Funktionen haben (daher werden neue Warnungen generiert).


Einige Einblicke in einige andere Warnungen, die Sie erhalten

browser/TestContract 8.sol:100:3 Warnung: Die Veränderbarkeit des Funktionszustands kann auf rein beschränkt werden

Sie können sich auf diese Antwort und diese Frage bezüglich der Einführung von viewund Typfunktionen beziehen pure.

Potentielle Verletzung des Checks-Effects-Interaction-Musters in TestContract.testFunction(address):

Dies liegt daran, dass Sie nicht dem Muster von Checks-Effects-Interactions folgen, wie es hier in der Dokumentation beschrieben wird. Sehen Sie sich die Funktion an, die diese Warnung erhält, und befolgen Sie das in der Dokumentation definierte Muster, um die Warnung zu vermeiden.

Und gemäß dem Code, der in dem von Ihnen geposteten Link zu finden ist, closeSale()sollte die Warnung wahrscheinlich darauf zurückzuführen sein, dass der Compiler davon ausgeht, dass die Möglichkeit eines erneuten Eintritts besteht , da Sie das Member-Ereignis LogSaleClosed(uint256 issuedSupply, uint256 restrictedTokens)nach Interaktionen mit dem Token-Vertrag aufrufen.

Was ich vorschlagen kann, ist, dieses Ereignis im Vertrag zu haben token. Sie können hier die Re-Entrancy-Schwachstelle sehen. Es heißt nur, wenn der schlechte Code es einem anderen Vertrag ermöglicht, mehrmals Geld abzuheben, weil sie die Zustandsvariablenanteile nach dem Senden der Transaktion ändern, was einige Zeit dauern kann, sodass der andere Vertrag dieselbe Funktion mehrmals aufruft, da der msg.senderWert bis dahin ungleich Null bleibt Die Transaktion wird ausgeführt. Wenn Sie dort den guten Code sehen, setzen Sie ihn zuerst shares[msg.sender]auf Null. Da Sie derjenige sind, der dies entwickelt hat, kennen Sie den Fluss der erwarteten Ereignisse und können sicher sein, dass kein erneuter Eintritt auftritt. Sie können ihn sicher ignorieren.

Test.transferFrom(address,address,uint256): Sollte potenziell konstant sein, ist es aber nicht. Hinweis: Modifikatoren werden derzeit von dieser statischen Analyse nicht berücksichtigt.

Was konstant bedeutet, ist, dass es den Zustand nicht ändern würde. Das heißt, es wird keine Zustandsvariable geändert. Normalerweise werden diese Funktionen als konstante Funktionen bezeichnet und mit dem Schlüsselwort Konstante definiert. Sie können dies lesen .

Wenn Ihre Funktionen also keine Statusvariablen ändern, können Sie sie als konstant deklarieren. Solidity erinnert Sie daran.

Ich habe „Vertrag Vertrag1 ist Vertrag2“. Wenn Contract1-Funktionen Contract2-Funktionen aufrufen, aber nicht von anderen Verträgen oder Transaktionen aufgerufen werden, sollten Contract2-Funktionen „intern“ oder „privat“ sein? Was ist mit den anderen Warnhinweisen wie „Potential Violation of Checks-Effects-Interaction…“ oder „Gasbedarf der Funktion…“? Wie löse ich die? Mit dieser Warnung: „[Funktion]: Potenziell sollte konstant sein, ist es aber nicht“ soll die Funktion Token übertragen. Ich verstehe nicht, wie das eine Konstante sein kann. Wie behebe ich diese Warnung? FYI, ich habe einen Link zu meinem Code in meinem ursprünglichen Beitrag hinzugefügt.
Danke für deine Antwort. Remix zur Bereitstellung des ABI /JSON-Schnittstellencodes. Nun, ich sehe es nicht. Wie bekommen wir das?
Ja, es muss hier eine interne Prüfung sein .
Ich habe die Antwort checks-effects-interactionam Ende der Antwort aktualisiert
Danke für Ihre Hilfe! Ich komme näher. Ich habe die Checks-Effects-Interaction-Warnung für 2 der 3 Funktionen behoben. Ich kann die Funktion TestSale.closeSale nicht verwenden. Bitte sehen Sie sich den Code unter gist.github.com/anonymous/3497e6b4e09953a009a4fdbacd11946a an. Ich glaube nicht, dass dies lösbar ist. Was denken Sie? Ich erhalte auch die Warnung "Möglicherweise sollte konstant sein, ist es aber nicht" bei 3 Funktionen: TestToken.transfer, TestToken.transferFrom und TestSale.selfDestruct. Weißt du, wie man es löst?
Es gibt auch Warnungen für Variablen mit ähnlichen Namen, aber ich denke, ich werde diese Warnungen ignorieren. Ich habe 28 Warnungen von „Gasbedarf der Funktion _____ unbekannt oder nicht konstant. Wenn der Gasbedarf einer Funktion höher als die Blockgasgrenze ist, kann sie nicht ausgeführt werden. Bitte vermeiden Sie Schleifen in Ihren Funktionen oder Aktionen, die große Speicherbereiche verändern (dazu gehört das Löschen oder Kopieren von Arrays im Speicher)“ Wie behebe ich diese Warnungen?

browser/TestContract 8.sol:100:3 Warnung: Die Veränderbarkeit des Funktionszustands kann auf rein beschränkt werden

Antwort: Funktionen können als rein deklariert werden, in diesem Fall versprechen sie, den Status nicht zu lesen oder zu ändern.

. http://solidity.readthedocs.io/en/develop/contracts.html#pure-functions