¿Cómo se obtiene un valor de cadena de msg.data en la función de reserva?

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

Respuestas (1)

SI la función de respaldo solo obtiene 2300 de gas , no puede escribir para contratar el almacenamiento y aquí hay 2 ideas.

Opción 1

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.valuefácilmente sin analizar el ABI .

opcion 2

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).

Ok, lo intentaré, pero logré cambiar una cadena con la función de respaldo. Tenía una cuerda diciendo que no. Y cambiándolo en la función de respaldo, a sí. ¿Pero eso no es escribir en el contrato de almacenamiento?
Entonces, ¿te refieres a tener un filtro dentro de la función de respaldo, luego tener una aplicación que escuche ese filtro y ejecute la función que mencionas aquí? Estoy tratando de evitar tener una función que el usuario tenga que llamar. He usado una función que usa un modificador que establece un precio en la función. Pero luego el usuario tiene que obtener el contrato y llamar a la función y todo. Me encantaría que la gente pudiera enviar dinero y convertirse instantáneamente en un usuario premium con la dirección de correo proporcionada.
Sí, su idea es buena para "evitar tener una función que el usuario tenga que llamar". Agregué una opción2 a la respuesta. Para su primer comentario, agregué detalles faltantes a ethereum.stackexchange.com/questions/5992/… .
Gracias, veré para qué tengo tiempo, ¡tendré un taller mañana! ¡Lo concederé como respuesta final cuando lo haga funcionar!
@vonGohren No hay problema, ¡buena suerte con el taller!