He estado siguiendo el tutorial de Ethereum Pet Shop y estoy fascinado por cómo funciona todo esto.
Sin embargo, tengo algunas preguntas.
Antes de entrar en esto, aquí está el código:
solidez de pragma ^0.4.17;
contract Adoption {
Pet[16] pets;
struct Pet {
address owner;
uint256 price;
}
function returnEth() public payable {
msg.sender.transfer(msg.value);
}
// Adopting a pet
function adopt(uint petId) public payable returns (uint) {
require(petId >= 0 && petId <= 15);
require(msg.value >= pets[petId]['price'] * 0.5);
pets[petId] = Pet({owner: msg.sender, price: 100});
return petId;
//return value;
}
// Retrieving the adopters
function getAdopters() public view returns (Pet[16]) {
return pets;
}
}
Entiendo que hay 16 mascotas en total, con identificaciones numéricas que van del 0 al 15, inclusive. También entiendo que solo una persona puede "poseer" una mascota a la vez.
¿El dueño actual de una mascota es inmutable? Si es así, ¿cómo cambio esta propiedad?
Digamos que después de que un usuario "compre" una mascota, quiero cambiar el precio de la mascota a .5 * precio inicial, donde initalPrice
actualmente no existe. El saldo restante en eth en el contrato luego se devuelve al primer comprador. ¿Cómo sería esa lógica?
Supongo que declararía alguna variable initialPrice
en algún lugar de mi contrato, de modo que initialPrice
sea igual a algún valor arbitrario en wei, y luego agregaría algo similar a la siguiente línea:
require(msg.value == initialPrice * .5);
¿Cómo devolvería el eth restante al propietario anterior?
Por favor, hágamelo saber si algo de esto no está claro.
Editar: he estado tratando de usar el código desde la primera respuesta, pero no puedo compilar el contrato. El error que estoy recibiendo es el siguiente:
Adoption.sol:19:17: TypeError: Type address is not implicitly convertible to expected type struct Adoption.Pet storage ref. pets[petId] = msg.sender; ^--------^
El propietario actual no es inmutable. Para cambiarlo, simplemente llame a la adopt()
función desde una dirección diferente.
En cuanto al precio, su enfoque funciona si desea tener el mismo precio para todas las mascotas. Para tener diferentes precios para diferentes mascotas, podrías definir un pet
struct
, como este:
struct Pet {
address owner;
uint256 price;
}
y en lugar de almacenar a los adoptantes como address[16] public adopters;
, mantenlos como:
Pet[16] pets;
Luego requiere que el precio sea mayor o igual price * .5
y eventualmente aumente el precio:
require(msg.value >= pets[petId].price * 0.5);
pets[petId].price = pets[petId].price * 0.5;
Para enviar fondos al propietario anterior, puede enviarlos antes de configurar el nuevo propietario:
pets[petId].owner.send(your_amount)
oxidado
TypeError: Indexed expression has to be a type, mapping or array (is struct Adoption.Pet storage ref) require(msg.value >= pets[petId]['price'] * 0.5);
Nuevo en Solidity, así que no estoy seguro de cómo abordar la depuración. ¿Algunas ideas?Tudor Constantino
uint256
o algo y no una dirección como lo es ahora. No estoy en la computadora en este momento y no puedo editar mi respuesta.oxidado
uint price;
dentro de la estructura todavía da como resultado el mismo error.oxidado
Tudor Constantino
oxidado
Tudor Constantino
Tudor Constantino
oxidado
Tudor Constantino
Pet
estructura. Dado que cambió las cosas que almacena en laadopters
matriz de direcciones aPet
s, el código anterior no funciona. Ese es el problema de hacer varias preguntas a la vez y tratar de iterar el desarrollo en una sola pregunta: la versión actualizada no refleja la pregunta original.oxidado
pets[petId].owner.send(your_amount)
. Todo lo que intento hacer aquí es recopilar los cambios sugeridos.Tudor Constantino
pets[petId] = Pet({owner: msg.sender, price: 100})
oxidado
require(msg.value >= pets[petId].price * 0.5);
declaración aún no se compila con el mismo TypeError.Tudor Constantino
oxidado
pets[petId].price = pets[petId].price * 0.5;
con su cambio, que erapets[petId] = Pet({owner: msg.sender, price: 100})
. La línearequire(msg.value >= pets[petId].price * 0.5);
aún no se compila y veo el mismo error anterior. Nada dice "el mismo TypeError". Esto es lo que estoy viendo (el mismo TypeError):TypeError: Indexed expression has to be a type, mapping or array (is struct Adoption.Pet storage ref) require(msg.value >= pets[petId]['price'] * 0.5);
Tudor Constantino
require(msg.value >= pets[petId].price * 0.5)
oxidado
TypeError: Operator * not compatible with types uint256 and rational_const 1/2