Wie erhalten Sie einen Zeichenfolgenwert von msg.data in der Fallback-Funktion?

Ich versuche, das zu tun, was The DAO tat, und etwas zu tun, als ein Absender Geld an meine Vertragsadresse schickte. Aber ich bin mir nicht sicher, wie. Das, was ich tun möchte, ist, einfach einen neuen Benutzer in einem Mapping mit der im msg.data-Objekt gesendeten Zeichenfolge zu erstellen.

Ich habe von der Fallback-Funktion gehört und dachte, ich könnte die msg.data extrahieren. Aber das scheinen Bytes zu sein. Muss ich es konvertieren? Wenn ja, wie machst du das?

Hier ist mein Code:

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

Antworten (1)

Wenn die Fallback-Funktion nur 2300 Gas erhält , kann sie nicht in den Vertragsspeicher schreiben, und hier sind 2 Ideen.

Option 1

Sie könnten dem Vertrag eine explizite Funktion wie receiveEther(string senderName) hinzufügen. web3.js kann wie verwendet werden contractInstance.receiveEther("name of the sender", {value: web3.toWei(1, "ether"), ...})und der Vertrag könnte auf den Absendernamen zugreifen und das msg.valueohne Parsing der ABI .

Option 2

Wenn Sie vermeiden möchten, dass der Benutzer eine Funktion aufrufen muss, geben Sie in Ihrer Vertrags-Fallback-Funktion ein Ereignis mit aus msg.data. Die App wartet auf das Ereignis und kann die Ereignisdaten dann parsen und in einer Datenbank speichern, oder wenn Sie die Daten im Vertrag speichern möchten, führt die App eine Transaktion zum Vertrag durch, um die Daten zu speichern.

Ein Unterschied zu Option1 besteht darin, dass das Speichern der Daten im Vertrag eine zweite Transaktion ist. Für den Benutzer ist es einfacher, dass er keine Funktion aufrufen muss, aber die App muss robust aufgebaut sein, damit die Daten gespeichert werden (was auch immer auf das Ereignis wartet, kann ausfallen).

Ok, ich versuche es, aber ich habe es geschafft, eine Zeichenfolge mit der Fallback-Funktion zu ändern. Hatte eine Zeichenfolge, die nein sagte. Und ändern Sie es in der Fallback-Funktion auf ja. Aber ist das nicht das Schreiben an den Vertragsspeicher?
Meinen Sie also, einen Filter in der Fallback-Funktion zu haben, dann eine App zu haben, die auf diesen Filter lauscht und die Funktion ausführt, die Sie hier erwähnen? Ich versuche zu vermeiden, dass der Benutzer eine Funktion aufrufen muss. Ich habe eine Funktion verwendet, die einen Modifikator verwendet, der einen Preis für die Funktion festlegt. Aber dann muss der Benutzer den Vertrag bekommen und die Funktion aufrufen und alles. Ich würde es lieben, wenn Leute einfach Geld senden und sofort ein Premium-Benutzer mit der angegebenen E-Mail-Adresse werden könnten.
Ja, Ihre Idee ist gut, um "zu vermeiden, dass der Benutzer eine Funktion aufrufen muss". Ich habe der Antwort eine Option2 hinzugefügt. Für Ihren ersten Kommentar habe ich fehlende Details zu ethereum.stackexchange.com/questions/5992/… hinzugefügt .
Danke, ich werde sehen, wofür ich Zeit habe, morgen einen Workshop abhalten! Ich werde es als endgültige Antwort gewähren, wenn ich es zum Laufen bekomme!
@vonGohren Kein Problem, viel Erfolg beim Workshop!