¡En un contrato de alquiler, la función payRent no funciona o no se actualiza en MIST!

Quiero implementar un contrato de alquiler de coches.

En el contrato del Cliente hay un extracto con 4 campos. Y una función registerToProvider. En el contrato del proveedor hay dos funciones para establecer el alquiler y la tarifa de registro. Todos estos están funcionando bien. Si un cliente se registra en el servicio del proveedor y el proveedor establece una tarifa de alquiler y registro, funciona y se muestra en MIST.

Pero cuando el cliente llama a payRent o payRegistration fee, estos no funcionan y no hay actualizaciones en MIST. ¿Puedes revisar mi código y decir cuál es el problema?

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;
        }
    }
}

cuando llamo a esta función, la transacción funciona correctamente pero el estado no cambia. Por favor vea la imagen de abajo. Quiero que después de enviar el alquiler tanto el alquiler como la cuota de inscripción sean 0.

ingrese la descripción de la imagen aquí

¿Es posible poner el resto del contrato? Esto tiene estructuras indefinidas y otros problemas, por lo que no se puede compilar. No vemos .rent configurado en ninguna parte y esto es un problema ( enviar (0) ) pero no es necesariamente el problema. Hay que ver qué hace el resto.
He subido el código completo... por favor, puede echar un vistazo...
Gracias. Lo compilé eliminando "is General Account" y los modificadores onlyOwner. Lo suficientemente bueno para solucionar problemas. Encontré algunos problemas.
Es el problema con el contrato o modificador inherente. El modificador es imp por seguridad. Lo siento, soy totalmente un novato. Por favor, siéntase libre de sugerirme para desarrollar este contrato.
Tengo un plan para agregar algunas funcionalidades como #el cliente puede elegir el auto #, por ejemplo, el proveedor tiene 5 autos, entonces el cliente no puede alquilar el auto y un mensaje mostrará todos los autos reservados. #proveedor tiene una base de datos de cuántos clientes están registrados en el servicio.... Pero, ¿cómo puedo mapear que no tengo idea...?
Útil. Gracias. Entonces, el contrato es para un mostrador de alquiler de autos minorista (vamos a ceñirnos a una tienda) como el que he tratado, y tienen una flota de autos que solo se pueden alquilar a una persona a la vez, la tarifa la establece la oficina y el cliente es parte del contrato. Entonces, son tres cosas. 1) El inventario y disponibilidad. 2) La tarifa de alquiler (varía según el acuerdo) establecida por el mostrador de servicio, y luego 3) el cliente paga la factura cuando se devuelve el automóvil. Algunas interacciones bastante complicadas en torno al precio y el proceso. ¿Sobre la derecha? ¡Primer proyecto duro! :-)

Respuestas (1)

Estoy bastante confundido acerca de lo que se supone que debe estar pasando. Falta "CuentaGeneral", suponiendo que ahí es donde están las funciones de pago.

Después de un poco de manipulación, encontré la secuencia, pero estoy muy confundido acerca de quién es quién y por qué estamos haciendo ciertas cosas.

Hice cambios menores para apoyar la prueba:

  1. Eliminado es GeneralAccount(falta)
  2. Eliminado onlyOwner(desaparecido)
  3. Se agregó una función de no hacer nada payTestFunds() payable.

Prueba:

Examiné las diversas cosas que tienen que suceder primero para que esta función funcione y se me ocurrió una secuencia:

  1. Envié un contrato de Eth con la payablefunción que agregué. Bastante importante, porque si el contrato no tiene dinero, send()fracasará.
  2. Envié mi dirección aregisterToCarRentalServiceProvider

ingrese la descripción de la imagen aquí

  1. Enviado "1" asetCarRent ingrese la descripción de la imagen aquí

  2. Comprobado rentCar[myAddress]. 1. Correcto.ingrese la descripción de la imagen aquí

  3. Envié mi dirección apayRentToCarRentalServiceProvider ingrese la descripción de la imagen aquí

  4. RentCar verificado [myAddress]. 0. Correcto.ingrese la descripción de la imagen aquí

Tengo problemas para seguir la lógica comercial , pero está configurando los valores como se esperaba .

Las funciones que send()son estructuralmente inseguras pero están fuera de tema, así que déjalo a un lado.

Espero eso ayude.

Supongo que este es el problema. Tengo el contrato CuentaGeneral y su modificador solopropietario también. Mi contrato de cliente hereda ese contrato. Supongo que mi problema es que no le di ningún éter a mi cuenta de contrato. Pensé que el éter de la función de envío se deducirá de mi cuenta externa. Me equivoqué. Ahora, cuando implemento mi contrato de cliente con algún ethar, recibo el siguiente error en mi billetera MIST. "Parece que esta transacción fallará, si "la envía, puede consumir todo el gas que envía". ... y he agregado la siguiente función de pago función payTestFunds () pagadero {} Tnx mucho
simplemente agregar una función payTestFunds() payable{ } no fue suficiente, entonces hice que mi constructor también fuera pagadero. Ahora en mi cuenta de contrato tengo 5 éter ahora pago la factura pero aún así muestra el valor anterior... no se convierte en 0 después de pagar el alquiler...
Edité mi respuesta con imágenes. Creo que este contrato podría estar demasiado ocupado para encontrar una base firme.
cosa extraña ... también he intentado algo similar ... pero no funciona ...
Una cosa que saltó a la vista durante las pruebas fue el uso inconsistente de las direcciones pasadas y msg.sender. Tenía que tener cuidado de que las direcciones que pasé a las funciones coincidieran con msg.sender en setCarRent() porque el código funciona de esa manera.
lo siento, te molesté mucho... no puedo resolver este pequeño problema, ¿cómo puedo construir un gran proyecto... estoy desquiciado... para el último intento aquí está mi código completo ethereum.github.io/ solidez del navegador/…