Bei einem Mietvertrag funktioniert die payRent-Funktion nicht oder aktualisiert sich nicht auf MIST!

Ich möchte einen Mietwagenvertrag abschließen.

Im Kundenvertrag gibt es nur 4 Felder. Und eine registerToProvider-Funktion. Im Anbietervertrag gibt es zwei Funktionen zum Festlegen der Miete und der Registrierungsgebühr. All dies funktioniert gut. Wenn sich ein Kunde beim Anbieterdienst registriert und der Anbieter eine Miete und eine Registrierungsgebühr festlegt, funktioniert es und in MIST wird es angezeigt.

Aber wenn der Kunde die payRent- oder payRegistration-Gebühr anruft, funktionieren diese nicht und es gibt kein Update auf MIST. Können Sie bitte meinen Code überprüfen und sagen, was das Problem ist.

contract CarRentalServiceCustomer is GeneralAccount{
    string public customerName;
    string public postalAddress;
    string public phoneNumber;
    string public emailAddress;

    mapping(address=>CarRentService) public rentCar;

    struct CarRentService{ 
        bool active;
        uint lastUpdate;
        uint registrationFee;   
        uint rent;              
    }

    function CarRentalServiceCustomer(string _name,string _postalAddress,string _phoneNumber,string _emailAddress){
        customerName  = _name;
        postalAddress = _postalAddress;
        phoneNumber   = _phoneNumber;
        emailAddress  = _emailAddress;
    }

    function registerToCarRentalServiceProvider(address _providerAddress) onlyOwner {

        rentCar[_providerAddress] = CarRentService({
                                    active: true, 
                                    lastUpdate: now,
                                    registrationFee: 0,
                                    rent: 0
                                    });
    }

    function setRegistrationFee(uint _registrationFee) {
        if(rentCar[msg.sender].active){
            rentCar[msg.sender].lastUpdate      = now;
            rentCar[msg.sender].registrationFee = _registrationFee;
        }
        else{
            throw;
        }
    }

    function setCarRent(uint _rent) {
        if(rentCar[msg.sender].active){
            rentCar[msg.sender].lastUpdate = now;
            rentCar[msg.sender].rent       = _rent;
        }
        else{
            throw;
        }
    }

    function payRegistrationFeeToCarRentalServiceProvider(address _providerAddress) returns (bool){

        bool regFeeStatus = true;
        if(_providerAddress.send(rentCar[_providerAddress].registrationFee))
        {
            rentCar[_providerAddress].registrationFee = 0;
            return regFeeStatus;
        }
        else{
            return !regFeeStatus;
        }
    }

    function payRentToCarRentalServiceProvider(address _providerAddress) returns (bool){

        bool payStatus = true;
        if(_providerAddress.send(rentCar[_providerAddress].rent))
        {
            rentCar[_providerAddress].rent = 0;
            return payStatus;
        }
        else{
            return !payStatus;
        }
    }

    function unsubscribeFromCarRentalService(address _providerAddress){
        if(rentCar[_providerAddress].active = false && rentCar[_providerAddress].rent == 0 
        && rentCar[_providerAddress].registrationFee == 0 ){
            rentCar[_providerAddress].active = false;
        } else {
            throw;
        }
    }
}

Wenn ich diese Funktion aufrufe, funktioniert die Transaktion ordnungsgemäß, aber der Status ändert sich nicht. Bitte sehen Sie sich das folgende Bild an. Ich möchte, dass nach dem Absenden der Miete sowohl die Miete als auch die Anmeldegebühr 0 betragen.

Geben Sie hier die Bildbeschreibung ein

Möglich, den Rest des Vertrages aufzuhängen? Dies hat undefinierte Strukturen und andere Probleme, sodass es nicht kompiliert werden kann. Wir sehen nirgendwo .rent gesetzt und das ist ein Problem ( send(0) ), aber es ist nicht unbedingt das Problem. Muss mal schauen was der Rest macht.
Ich habe den vollständigen Code hochgeladen .... können Sie bitte einen Blick darauf werfen ...
Danke. Ich habe es zum Kompilieren gebracht, indem ich "is General Account" und die onlyOwner-Modifikatoren entfernt habe. Gut genug für die Fehlersuche. Einige Probleme gefunden.
Ist das Problem mit dem inhärenten Vertrag oder Modifikator. Modifikator ist imp für Sicherheit. Sorry bin totaler Neuling. Bitte zögern Sie nicht, mich vorzuschlagen, diesen Vertrag zu entwickeln.
Ich habe einen Plan, einige Funktionen hinzuzufügen, wie #Kunde kann Auto wählen # zum Beispiel hat der Anbieter 5 Autos, dann kann der Kunde das Auto nicht mieten und eine Nachricht wird alle gebuchten Autos beschlagen. #provider hat eine datenbank wie viele kunden im service registriert sind.... aber wie kann ich abbilden das ich keine ahnung habe....
Hilfreich. Danke. Der Vertrag gilt also für einen Mietwagenschalter im Einzelhandel (bleiben wir bei einem Geschäft), wie ich es behandelt habe, und sie haben eine Flotte von Autos, die jeweils nur an eine Person gemietet werden können, der Preis wird vom Büro festgelegt und Vertragspartner ist der Kunde. Es sind also drei Dinge. 1) Das Inventar und die Verfügbarkeit. 2) Der Mietpreis (variiert nach Vereinbarung), der so vom Serviceschalter festgelegt wird, und dann 3) der Kunde bezahlt die Rechnung, wenn das Auto zurückgegeben wird. Einige ziemlich knifflige Interaktionen rund um Preis und Prozess. Ungefähr richtig? Hartes erstes Projekt! :-)

Antworten (1)

Ich bin ziemlich verwirrt darüber, was los sein soll. Fehlendes "GeneralAccount", also davon ausgegangen, dass sich dort die kostenpflichtigen Funktionen befinden.

Nach einigem Fummeln habe ich die Sequenz gefunden, aber ich bin sehr verwirrt darüber, wer wer ist und warum wir bestimmte Dinge tun.

Ich habe geringfügige Änderungen vorgenommen, um den Test zu unterstützen:

  1. Entfernt ist GeneralAccount(fehlt)
  2. Entfernt onlyOwner(fehlt)
  3. Do-Nothing-Funktion hinzugefügt payTestFunds() payable.

Prüfen:

Ich habe mir die verschiedenen Dinge angesehen, die zuerst passieren müssen, damit diese Funktion funktioniert, und mir eine Sequenz ausgedacht:

  1. Vertrag etwas Eth mit der payableFunktion gesendet, die ich hinzugefügt habe. Ganz wichtig, denn wenn der Vertrag kein Geld hat, send()wird er scheitern.
  2. Habe meine Adresse an gesendetregisterToCarRentalServiceProvider

Geben Sie hier die Bildbeschreibung ein

  1. "1" an gesendetsetCarRent Geben Sie hier die Bildbeschreibung ein

  2. Geprüft rentCar[myAddress]. 1. Richtig.Geben Sie hier die Bildbeschreibung ein

  3. Habe meine Adresse an gesendetpayRentToCarRentalServiceProvider Geben Sie hier die Bildbeschreibung ein

  4. Mietwagen[meineAdresse] überprüft. 0. Richtig.Geben Sie hier die Bildbeschreibung ein

Ich habe Probleme, der Geschäftslogik zu folgen, aber die Werte werden wie erwartet festgelegt .

Die Funktionen, die send()strukturell unsicher sind , aber nicht zum Thema gehören, also beiseite legen.

Ich hoffe es hilft.

Ich denke, das ist das Problem. Ich habe auch den Vertrag GeneralAccount und seinen Modifikator onlyowner. Mein Kundenvertrag erbt diesen Vertrag. Ich denke, mein Problem ist, dass ich meinem Vertragskonto keinen Ether gegeben habe. Ich dachte, die Ether of Send-Funktion wird von meinem externen Konto abgezogen. Ich hab mich geirrt. Wenn ich jetzt meinen Kundenvertrag mit einem Ethar einsetze, erhalte ich den folgenden Fehler in meiner MIST-Brieftasche. "Es scheint, dass diese Transaktion fehlschlägt, wenn "Sie sie einreichen, kann sie das gesamte Gas verbrauchen, das Sie senden." .... und ich habe die folgende zahlbare Funktion Funktion payTestFunds() zahlbar{ } Tnx viel hinzugefügt
einfaches Hinzufügen einer Funktion payTestFunds() zahlbar{ } war nicht genug, dann habe ich meinen Konstruktor auch zahlbar gemacht. Jetzt habe ich auf meinem Vertragskonto 5 Ether, jetzt bezahle ich die Rechnung, aber immer noch der alte Wert. Wird nach Zahlung der Miete nicht zu 0.
bearbeitete meine Antwort mit Bildern. Ich denke, dieser Vertrag könnte zu beschäftigt sein, um einen festen Stand zu finden.
seltsame Sache ... ich habe auch ähnliches versucht .... aber funktioniert nicht ...
Eine Sache, die während des Tests auffiel, war die inkonsistente Verwendung von übergebenen Adressen und msg.sender. Ich musste aufpassen, dass die Adressen, die ich an Funktionen übergebe, mit msg.sender in setCarRent() übereinstimmen würden, da der Code so funktioniert.
Entschuldigung, Mann, ich habe dich sehr gestört ... ich kann dieses kleine Problem nicht lösen, wie kann ich ein großes Projekt bauen ... ich bin verrückt .... für den letzten Versuch hier ist mein vollständiger Code ethereum.github.io/ Browser-Solidität/…