Kann keine Möglichkeit finden, sich zu protokollieren, wenn revert() im Remix verwendet wird

Ich arbeite zum ersten Mal mit Solidity und bin bald auf ein Problem gestoßen.

Wenn eine Adresse nicht über genügend Guthaben verfügt oder nicht berechtigt ist, Münzen hinzuzufügen, möchte ich einen Fehler protokollieren. Wenn diese Ausnahmen auftreten, tut das Skript das, was es tun soll, nämlich return. Das Problem ist, dass ich meine Protokolle nirgendwo finden kann.

Dies ist der Code:

pragma solidity ^0.4.0;

contract Testcoin {
    address public creator;
    mapping (address => uint) public balances;

    event Delivered(address from, address to, uint amount);
    event StringLogger(string message);

    function TestCoin() {
        creator = msg.sender;
    }

    function create(address receiver, uint amount) {
        if (msg.sender != creator){ 
            emit StringLogger('This Account is not allowed too create tokens.');
            revert();
        }
        balances[receiver] += amount;
    }

    function transfer(address receiver, uint amount) {
        if (balances[msg.sender] < amount){         
            emit StringLogger('Not enough balance');
            revert();
        }
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        emit Delivered(msg.sender, receiver, amount);
    }

}

Wenn der Absender zum Beispiel ein Guthaben von 3000 hat und versucht, 4000 an die x-Adresse zu senden, erhalte ich ein Protokoll, dass die Transaktion abgebaut wurde, aber fehlgeschlagen ist, aber die Ausgabe und die Protokolle sind leer.

Wie kann ich die Protokolle anzeigen, damit ich genau sehen kann, was passiert ist?

Antworten (1)

Eine zweiteilige Antwort.

Erstens, was wir versuchen sollten zu tun. Machen Sie sich keine Sorgen über Trapping-Fehler. Dies ist das Gegenteil von anderen Plattformen und Stilen, bei denen es als schlechte Form angesehen wird, einen harten Stopp ungefangen hochsprudeln zu lassen.

Unveränderliche Software bedeutet hier, unnötige Komplexität zu vertreiben. Die Kommunikation des Grundes führt immer zu unnötiger Komplexität. Eine bewährte Methode ist Fail Early. Hart scheitern.

Diese Abteilung

if (msg.sender != Ersteller){ emit StringLogger('Dieses Konto darf keine Token erstellen.'); zurückkehren(); }

revert()wird einen Fehler auslösen, der zum Aufrufen von Vertragsfunktionen und schließlich zum EOA führt, der die Transaktion unterzeichnet hat. Sie erhalten eine fehlgeschlagene Transaktion, was bedeutet, dass sich der Zustand nicht geändert hat (außer verfallenem Gas). Das Ereignis emitwar eine Zustandsänderung, aber leider kam es nicht dazu, weil das revert()später kam.

Das ist nichts, was du bekämpfen willst.

require(msg.sender == creator);

Erledigt. Es gibt keine Erklärung für den Benutzer.

Und hier:

if (balances[msg.sender] < amount){         
  emit StringLogger('Not enough balance');
  revert();
}

Das wird es tun:

require(balances[msg.sender] >= amount)

Es ist geplant, revert()dies um einen Grund zu erweitern, und das wird eine willkommene Verbesserung sein. In der Zwischenzeit würde ich empfehlen, dass der Vertragsstatus von den Kunden vollständig auffindbar sein sollte und inakzeptable Transaktionen ohne Erklärung hart gestoppt werden sollten.

Ich hoffe es hilft.

Das war eine äußerst hilfreiche Antwort, Rob, da dies für jemanden, der gerade erst anfängt, zu einer ziemlich steilen Lernkurve führt. Ich komme von Javascript, wo ich beim Testen buchstäblich alles protokolliere.