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;
}
Wenn die Fallback-Funktion nur 2300 Gas erhält , kann sie nicht in den Vertragsspeicher schreiben, und hier sind 2 Ideen.
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.value
ohne Parsing der ABI .
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).
von Göhren
von Göhren
eth
von Göhren
eth