Truffle Error-VM-Ausnahme während der Verarbeitung der Transaktion: zurücksetzen

Ich erstelle einen Testfall der Solidität in Trüffel und meine Soliditätsfunktion ist unten angegeben, für die ich Testfälle erstelle

function isValidBuyer(uint256 buyTokenQty, uint256 senderValue) public  constant returns (bool)
    {
        if(!isUserExist(msg.sender))
        {
            msg.sender.transfer(senderValue); //Refund Ether
            return false ; 
        }
        else 
        {
            return true ;
        }
    }

Und meine Testfälle sind wie unten angegeben

it('TCC001: should check invalid buyer and should return false',   async () => {
let tempRes1=await instChain.isValidBuyer(100,1,{from:account2,gas:'220000'});

 assert.isTrue(!tempRes1);
}); 

Beim Testen der if-Klausel der Funktion in diesem Test erhalte ich einen Fehler

VM-Ausnahme während der Verarbeitung der Transaktion: Zurücksetzen

Ein interessanter Fall ist die Funktion isValidBuyer() , wenn ich 1 wei übergebe, gibt es die oben erwähnte Ausnahme, aber wenn ich 0,99 oder weniger sende, wird sie erfolgreich ohne Fehler ausgeführt.

Antworten (1)

Hier ist nicht ganz klar, was Sie erreichen wollen. Es scheint, dass Sie versuchen, Token oder Ether zurückzuerstatten, die noch nicht übertragen wurden?

Aber hier sind ein paar Anmerkungen zu Ihrem Code:

ich. Wenn Sie Ether überweisen, müssen Sie den Betrag nicht als Funktionsargument angeben. Aber Sie müssen das Schlüsselwort hinzufügen payableund den Wert so übertragen:

instChain.isValidBuyer(100,1,{from:account2,gas:'220000',value:<AMOUNT IN WEI>});

ii. Sie verwenden das Schlüsselwort constantfür eine Statusänderungsoperation (Schreiboperation) und es kann nicht funktionieren, da dieses Schlüsselwort ausschließlich für die Nur-Lese-Funktion bestimmt ist. Sie können keine Operation aufrufen, die den Status ändert (wie Geld übertragen oder Daten speichern). Art Funktion.

iii. Sie würden einfach prüfen require, ob das Mitglied existiert, und den an den Vertrag übergebenen Betrag + verbleibendes Gas zurückerstatten.

function isValidBuyer(uint256 buyTokenQty, uint256 senderValue) public  payable returns (bool) {
    // access value with `msg.value`

    require(isUserExist(msg.sender)) {

    return true
}
Deine Vermutung ist richtig. Ich möchte Ether zurücküberweisen, wenn die Bedingung nicht erfüllt ist. Wie Sie vorgeschlagen haben, require zu verwenden, aber das Problem ist, wenn die Bedingung erfüllt ist, gibt es true zurück, aber wenn die Bedingung nicht erfüllt ist, wird eine Ausnahme ausgelöst, die ich nicht möchte, stattdessen sollte es false zurückgeben.