Wie behebe ich „benötigtes Gas überschreitet Freibetrag oder Transaktion schlägt immer fehl“, wenn ich versuche, Ether zu senden?

Dies ist der Beispiel-Smart-Vertrag, den ich ausführen möchte. Alle Methoden funktionieren, außer "payVendor" - es schlägt fehl, wenn das benötigte Gas die Freigrenze überschreitet oder die Transaktion immer fehlschlägt . Ich habe versucht, das Gas zu erhöhen, aber es hilft nicht.

contract vendorContract {

    uint public vendorID;
    uint public ownerID;
    uint256 public contractValue;
    string public contractDescription;
    string public contractStatus;
    string public paymentStatus;
    address public contractOwner;
    address public contractVendor;
    string constant newcon = "New";
    string constant wipcon =  "WIP";
    string constant reqcon  = "Requested";
    string constant shipcon = "Shipped";
    string constant endcon = "Completed";
    string constant err = "Error";


    modifier isOwner()
    {
        if (msg.sender != contractOwner) throw;
        _ ;
    }

    modifier isVendor()
   {
        if (msg.sender != contractVendor) throw;
        _ ;
    }

    function vendorContract(uint _vid, string _desc) public {
        vendorID = _vid;
        contractStatus="New";
        contractOwner=msg.sender;
        contractDescription= _desc;

    }

      function acceptContract(uint256 _cvalue, uint _vidd) public {
        if (vendorID !=  _vidd) {
            contractStatus = err;
            throw;
        }

        contractStatus=wipcon;
        contractValue = _cvalue;
        contractVendor = msg.sender;
        }

    function requestPayment() isVendor {
    paymentStatus=reqcon;
    contractStatus=shipcon;
    }

    function paymentStatus() returns (string) {
    return paymentStatus;
    }


    function payVendor() payable isOwner {   
     if  (!contractVendor.send(contractValue))
        throw;
    //contractVendor.send(contractValue);
    contractStatus = endcon;


    }

   }

Antworten (1)

Bei mir scheint es gut zu funktionieren. Es gibt ein paar Dinge, die dies verursachen können:

  1. Sie senden weniger ETH als contractValue, und es wirft ab, weil der Vertrag nicht genug ETH zum Senden enthält.

  2. Stellen Sie sicher, dass Sie den Vertrag korrekt mit dem Wert initialisieren. Jeder übergebene Wert ist in WEI .

Als Anregungen sind in diesem Vertrag noch weitere Dinge zu beachten:

  1. Die Art und Weise, wie Sie Ihren Konstruktor aufgerufen haben, ist zugunsten der constructorFunktion veraltet.

  2. throwwird zugunsten von revert, require, und verworfen assert.

Shane - danke für deine Antwort! Ich stelle den Vertrag über den Remix Solidity-Browser bereit. Um ETH an den Vertrag zu senden, habe ich versucht, einen Wert ungleich Null in das Feld "Wert" einzugeben, und ich erhalte den gleichen Fehler "Erforderliches Gas überschreitet ...". Hilfe!
Sieht so aus, als müsste ich dem Konstruktor "zahlbar" hinzufügen - es funktioniert jetzt - danke für Ihre Hilfe.