Estoy tratando de hacer lo que hizo The DAO y hacer algo cuando un remitente envió dinero a mi dirección de contrato. Pero no estoy seguro de cómo hacerlo. Lo que quiero hacer es simplemente crear un nuevo usuario en un mapeo con la cadena enviada en el objeto msg.data.
Escuché sobre la función de respaldo y pensé que podría extraer msg.data. Pero eso parece ser bytes. ¿Tengo que convertirlo? Si es así, ¿cómo haces eso?
Aquí está mi código:
Premium.sol
struct User {
address user;
bool paid;
}
mapping(string => User) PremiumUsers;
address owner;
function Premium() {
owner = msg.sender;
}
function () {
var mail = byteconverterToString(msg.data);
var newUser = PremiumUsers[mail];
newUser.user = msg.sender;
newUser.paid = true;
}
SI la función de respaldo solo obtiene 2300 de gas , no puede escribir para contratar el almacenamiento y aquí hay 2 ideas.
Podría agregar una función explícita como receiveEther(string senderName
) en el contrato. web3.js se puede usar como contractInstance.receiveEther("name of the sender", {value: web3.toWei(1, "ether"), ...})
y el contrato podría acceder al nombre del remitente y msg.value
fácilmente sin analizar el ABI .
Si desea evitar tener una función que el usuario debe llamar, entonces en su función de reserva de contrato emite un evento con msg.data
. La aplicación escucha el evento y luego puede analizar y almacenar los datos del evento en una base de datos o, si desea almacenar los datos en el contrato, la aplicación realiza una transacción en el contrato para almacenar los datos.
Una diferencia con la opción 1 es que almacenar los datos en el contrato es una segunda transacción. Es más fácil para el usuario que no necesite llamar a una función, pero la aplicación debe construirse de manera sólida para que los datos se almacenen (lo que sea que esté escuchando el evento podría fallar).
Von Gohren
Von Gohren
ética
Von Gohren
ética