Analysieren Sie JSON in Solidity

Wie kann ich JSON solide analysieren?

Die Idee ist, eine Funktion oder ähnliches zu haben, die JSON innerhalb eines Solidity-Vertrags analysieren kann.

Mit einem einfachen JSON-Objekt (nur Schlüsselwert-Strings, wie {'A': 'a', 'B': 'b'}) sollte die Lösung in der Lage sein, es in eine Zuordnung (String => String) umzuwandeln.

Antworten (3)

Ich gehe davon aus, dass Sie eine externe Quelle aufrufen möchten, über die Sie keine Kontrolle haben, und dass Sie die Oraclize-Datenquelle json() verwenden, um nur den richtigen Teil des Service-json zu erhalten, der zurückgegeben wird, wenn Sie seine URL aufrufen wie in der Dokumentation Verfügbare Datenquellen von Oraclize angegeben .

Im Moment denke ich, dass Sie keine Möglichkeit haben, Oraclize dazu zu bringen, etwas anderes als einen String zurückzugeben. Das bedeutet, dass Sie den zurückgegebenen Json als String-Parameter Ihrer Oraclize- __callbackFunktion erhalten müssen.

Aber dann müssen Sie, wie Sie fragen, den Json in ein Array parsen. Dies wäre sehr kostspielig, selbst wenn Sie einen Weg finden, dies zu tun.

Die kurze Antwort wäre also, dass das, was Sie verlangen, nicht möglich ist.

Lassen Sie mich jedoch die folgenden, nicht ganz zufriedenstellenden Problemumgehungen vorschlagen. Ich weiß, dass es nur Workarounds sind, die wahrscheinlich nicht Ihren Anforderungen entsprechen, aber ich denke, dass das, was Sie tun möchten, im Moment nicht möglich ist. Versuchen wir also einfach, dem Ziel so nahe wie möglich zu kommen.

Problemumgehungen:

  1. Verwenden Sie eine Proxy-Website, die in der Lage wäre, Ihren ursprünglichen Dienst anzufordern, den Sie nicht kontrollieren, und analysieren Sie den resultierenden JSON mit dem, was Sie als serverseitige Sprache verwenden können. formatieren Sie das Ergebnis als einzeiligen String mit Trennzeichen (dh einem Komma). Weisen Sie dann Oraclize an, diesen Proxy anstelle des ursprünglichen Dienstes abzufragen. Ihr Vertrag erhält dann die Zeichenfolge, die einfacher und kostengünstiger zu analysieren und aufzuteilen ist. Sie können eine Split-Funktion basierend auf dieser Solidity-Zeichenfolge utils lib erstellen . Beachten Sie, dass Sie in dieser Bibliothek keine Split-Funktion finden, um Ihre Zeichenfolge in mehr als 2 Slices aufzuteilen, aber dies ist ein guter Ausgangspunkt.
  2. Mit der Oraclize Json() URL-Funktion können Sie XPath verwenden, um auf einen Wert im JSON-Ergebnis abzuzielen. Sie können die Kosten für das Aufteilen einer Ergebniszeichenfolge mit den Kosten für das mehrmalige Aufrufen von Oraclize vergleichen, um jedes Ergebniselement separat anzusprechen. Ich kann nicht sagen, was billiger ist, auch wenn ich vermute, dass es wirklich von der Länge Ihrer Ergebniselemente abhängt.
  3. Wenn Sie Ihren Vertrag nur von einer Dapp verwenden, schlage ich vor, dass Sie den ursprünglichen Dienst direkt mit dem clientseitigen JS aufrufen und Oraclize vergessen, Werte daraus extrahieren und dann eine Methode aufrufen, in der Sie jeden Wert als Parameter übergeben können. Aber ich denke, wenn Sie Oraclize verwenden, möchten Sie wahrscheinlich, dass Ihr Vertrag autonom ist.
Danke für die Workarounds, vielleicht sollte ich meine Vertragsarchitektur ändern, weil ich es an dieser Stelle so nicht lösen kann

Das Analysieren von Zeichenfolgen wird innerhalb der EVM wahrscheinlich unerschwinglich teuer sein. Warum wollen Sie das Parsen innerhalb der EVM durchführen, wenn Sie es trivialerweise von außen tun und die Daten bereits im richtigen Format übergeben könnten?

Wenn Sie in Ihrem speziellen Beispiel nur eine String->String-Zuordnung laden möchten, können Sie zwei String-Arrays als Parameter übergeben, von denen eines die Schlüssel und das zweite die Werte sind. Ein einfacher for-Zyklus könnte es ohne Parsing-Overhead in ein Solidity-Mapping laden.

Ich muss eine Antwort von Oraclize.it erhalten und es ist ein JSON, also sollte die Eingabe des JSON in Teilen 2 Abfragen an Oraclize kosten

Ich weiß, dass diese Frage ziemlich alt ist, aber ich werde trotzdem meine Meinung hinzufügen.

Wenn Ihr JSON klein genug ist, kann es sich lohnen, es on-chain zu parsen, um den Aufwand und die Kosten von zwei oder mehr orchestrierten Aufrufen eines Orakels zu vermeiden. Ich habe gerade die erste Version eines JSON-Parsers für Solidity auf Github veröffentlicht: https://github.com/chrisdotn/jsmnSol

Wenn Sie es verwenden möchten, sollten Sie:

  1. Stellen Sie sicher, dass das JSON klein ist. Der beste Weg, dies zu tun (wenn Sie oraclize.it verwenden), besteht darin, einen geeigneten JSONPath zu finden, damit der JSON nur die Elemente enthält, an denen Sie interessiert sind.
  2. Analysieren Sie das kleinere JSON on-chain mit dem Parser. Danach haben Sie Metainformationen zum JSON-String, mit denen Sie die Elemente lokalisieren und ihren Inhalt abrufen können.

Eine umfassendere Einführung finden Sie auf Medium: https://medium.com/@chrisdotn/a-json-parser-for-solidity-9cc73b4b42

Im Wesentlichen bietet diese Antwort also eine Möglichkeit, Option (2) von Nicolas Antwort zu verwenden.