Empfohlener Datentyp für "Daten" in Ethereum-Transaktionen

Ich sende Daten mit meiner Transaktion auf folgende Weise

var tx = {from: eth.coinbase, to:eth.accounts[1], value: web3.toWei(1, "ether"),data:web3.toHex("Test Data")}

personal.sendTransaction(tx, "password")

Wie wir sehen können, verwende ich einfache Zeichenfolgen in Daten, die in Hex konvertiert werden. Ich habe einige Fragen dazu

  1. Gibt es einen empfohlenen Datentyp, um ihn im Datenfeld zu verwenden?
  2. Gibt es eine Standardmethode, um JSON-Daten in dieses Datenfeld einzufügen.

(Hinweis: Derzeit sende ich JSON-Daten, indem ich die Daten auf folgende Weise manuell in JSON-Strings konvertieredata:web3.toHex("{\"key1\":\"Data1\",\"key2\":\"Data2\"}"))

Antworten (1)

Das Codieren einer JSON-Zeichenfolge scheint keine gute Idee zu sein. Siehe das .

Anstatt ein Objekt als Daten bereitzustellen, sollten Sie Ihre Vertragsfunktion so definieren, dass sie die relevanten Eingaben (z. B. function f(string key1, uint key2){}) entgegennimmt und eine Transaktionsbibliothek wie ethereumjs-tx verwendet, um die Daten gemäß Ihren Parametern zu berechnen. Hier ist ein Beispiel mit nur Web3.

Demnach werden die Daten im Vertragsspeicher gespeichert, aber ich möchte Daten auf der Blockchain als Transaktion speichern, z. Wenn wir das Beispiel der Verwaltung von Büroanlagen nehmen, wenn ich eine neue Maus von einem Hardware-Typen bekomme, sollte ich in der Blockchain gespeichert werden, was ist der beste Weg, das zu tun.
Das Speichern von Daten als Transaktion ist eine interessante Idee, aber der Standardweg besteht darin, sie in einem Vertrag zu speichern. Es wird leichter zugänglich sein. Sie benötigen lediglich die Vertragsadresse und ABI. So stellen Sie Daten von einem TX wieder her. Hash (oder Quittung) benötigen Sie wahrscheinlich eine komplexere und spezialisiertere Software.
Es wurde keine spezielle Software benötigt, Sie können einen Hash im Eingabefeld von Transaktionsdaten erhalten und ihn in ASCII konvertieren, um die Eingabefelder zu erhalten. Das einzige große Problem ist jedoch, dass das Datenfeld in der Transaktion nur Zeichenfolgendaten akzeptiert. Es gibt ein Beispiel dafür Transaktionvar tx = {from: eth.coinbase, to:eth.accounts[1], value: web3.toWei(10, "ether"),data:web3.toHex("D1:Testing Data")}
Können Sie mir ein gutes Beispiel für die Speicherung von Daten im Vertragsspeicher vorschlagen, das für den oben genannten Anwendungsfall für die Vermögensverwaltung geeignet ist?
Das Datenfeld ist normalerweise die RLP-Codierung des Funktionsnamens, der Parameternamen und -werte. Jedes einfache Vertragsanrufbeispiel reicht aus. Sie können es nicht einfach hex-codieren "name: value"und als Daten einfügen. Wenn Sie dies tun, muss Ihr Vertrag ein komplexes Parsing durchführen, das habe ich als spezielle Software bezeichnet.
Vielen Dank für die Erklärung. Was ich aus dieser Diskussion verstehe, ist, dass wir Daten im Vertrag statt in einer Transaktion speichern sollten. Wenn ich Sie richtig verstanden habe, können Sie einen Link zu einem Beispiel vorschlagen, wie Daten im Vertrag gespeichert werden
Es ist so einfach wie eine Variable zu definieren und ihr einen Wert zuzuweisen. Eine Variable kann ein primitiver Datentyp, eine Struktur, ein Array oder eine Kombination davon sein. Ich denke, jedes Solidity-Beispiel wird diese haben. Überprüfen Sie diese Frage .
Ich denke, ich bin immer noch verwirrt mit dieser Notwendigkeit, mein Verständnis rückgängig zu machen, übrigens danke für die wirklich gute Erklärung