Gaslimit überschritten, obwohl die Funktion nicht komplex ist

Ich schreibe eine Funktion, die eine bytes32-Nachricht aufnimmt und anhand einer Signatur validiert (dies geschieht ohne Hashing, um Gas zu sparen). Ich kann die Wiederherstellungsfunktion aufrufen und ausführen lassen, aber ich erhalte ein Gaslimit für die DeliveryVsPayment-Methode, obwohl sie nicht viel mehr Rechenaufwand erfordert als die Wiederherstellung selbst. Warum ist das?

//buyer pays all the fees, seller doesn't even need to have ether to do trade
function deliveryVSpayment(bytes32 offer, uint8 v, bytes32 r,
    bytes32 s) public payable returns(bool)
{
    var (seller, quantity, price) = recover(offer, v, r, s);

    bool agreementIsValid = balances[seller] >= quantity;
    if(agreementIsValid && msg.value > uint(price) * uint(quantity))
    {
        //send over ether and tokens
        balances[msg.sender] += uint(quantity);
        balances[seller] -= uint(quantity);
        uint commission = (msg.value / 100) * transferFee;
        uint sellerAmt = msg.value - commission;
        seller.transfer(sellerAmt);
        admin.transfer(commission);
        numOfTransfers++;
        return true;
    }
    else revert();
}

// to test: suppose the offer is to sell 2 tickets at 0.102ETH
// which is 0x16A6075A7170000 WEI
// the parameters are:
// "0x000000000000000000000000000000000000000000000000016a6075a7170002", 27, "0x0071d8bc2f3c9b8102bc03660d525ab872070eb036cd75f0c503bdba8a9406d8","0xb1649086e9df334e9831dc7d57cb61808f7c07d1422ef150a43f9df92c48665c"  */


function recover(bytes32 offer, uint8 v, bytes32 r, bytes32 s) public pure
    returns (address seller, uint16 quantity, uint256 price) {
    quantity = uint16(offer & 0xffff);
    price = uint256(offer >> 16 << 16);
    seller = ecrecover(offer, v, r, s);
}

Remix gibt bei jedem Aufruf den folgenden Fehler aus und ich habe festgestellt, dass meine Transaktion auch beim Aufruf von web3j fehlschlägt: https://rinkeby.etherscan.io/tx/0x4f6eb1449fa53c16033cebe7f8619b72e1e868f30d2af16287630f98508d8cbb

Nachricht:

transact to TicketPro.buyATicketFromContract errored: Gas required exceeds limit: 3000000.  An important gas estimation might also be the sign of a problem in the contract code. Please check loops and be sure you did not sent value to a non payable function (that's also the reason of strong gas estimation). 

Hinweis: Ich habe der Transaktion einen Wert zugeordnet, der dem in der Bytes32-Angebotsvariablen festgelegten Preis entspricht, und der von mir verwendete Schlüssel hat einen Saldo, der diesen übersteigt.

Antworten (1)

Gelöst: Das Problem mit dem Gaslimit wurde einfach getroffen, weil es zurückgesetzt wurde (daher das Gas ausgeht).

Ich hatte einen dummen Fehler, bei dem der Nummer einige Nullen fehlten. Nach der Korrektur war dieses Problem behoben.