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.
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:
GeneralAccount
(falta)onlyOwner
(desaparecido)payTestFunds() payable
.Prueba:
Examiné las diversas cosas que tienen que suceder primero para que esta función funcione y se me ocurrió una secuencia:
payable
función que agregué. Bastante importante, porque si el contrato no tiene dinero, send()
fracasará.registerToCarRentalServiceProvider
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.
Rob Hitchens
TAMIM HAIDER
Rob Hitchens
TAMIM HAIDER
TAMIM HAIDER
Rob Hitchens