Fragen Sie mehrere abgeleitete Verträge von Contract Factory ab

Angenommen, eine Vertragsfabrik wird verwendet, um mehrere untergeordnete Verträge mit jeweils zugehörigen Daten zu erzeugen. Der Vertragsfaktor speichert alle Adressen der abgeleiteten Verträge zusammen mit einem eindeutigen Namen für jeden Vertrag. Gibt es eine einfache und effiziente Möglichkeit, Informationen über alle untergeordneten Verträge hinweg abzufragen?

Angenommen, die untergeordneten Verträge repräsentieren Personen; Ist es möglich, eine Abfrage zu schreiben, um alle untergeordneten Verträge mit einem bestimmten Alter, Namen und Geburtsort zurückzugeben (wobei diese Eigenschaften Elementvariablen der untergeordneten Verträge sind). Dies führt praktisch dazu, dass eine SQL-Abfrage über alle untergeordneten Verträge ausgeführt wird.

Die naive Lösung besteht eindeutig darin, alle untergeordneten Verträge von der Karte innerhalb der Fabrik zu durchlaufen. Das ist in keinster Weise optimal. Alternativ könnte eine Offchain-Lösung erstellt werden, bei der eine Verknüpfungstabelle mit den zugehörigen Vertragsadressen offchain erstellt wird. Diese Lösung ist wirklich nicht ideal, da ich bei einer On-Chain-Lösung bleiben möchte. Dies führt auch zu einer Duplizierung von Daten in der Kette, wodurch die Blockchain überflüssig wird.

Einfach ausgedrückt: Gibt es eine Möglichkeit, eine effiziente Abfragestruktur aufzubauen, um nach Verträgen zu suchen, wenn die Vertragsadressen bekannt sind? Das klingt sehr nach einer relationalen Datenbank, die jedoch on-chain läuft. IPFS wird in diesem Zusammenhang nicht helfen, da Sie effektiv mit demselben Abfrageproblem stecken bleiben; wie man effektiv alle Datensätze nach bestimmten Unterinformationen innerhalb von Einträgen durchsucht.

Antworten (1)

Ich hatte an einen ähnlichen Ansatz gedacht, als ich neu in der Solidität war, dh eine Fabrik zu erstellen und einen neuen Vertrag für jede Entität zu erstellen. Dies ist nicht effizient und wird Sie in mehr als einer Hinsicht schmerzen.

  1. Was passiert, wenn Sie diese untergeordneten Vertragsobjekte aktualisieren (einen Fehler beheben oder ein Verhalten ändern) müssen?
  2. Es funktioniert nicht wie eine Datenbank und das Abfragen jeder von ihnen wird ein sehr ineffizienter und langsamer Prozess sein

Was mir im Laufe der Zeit klar geworden ist, ist, dass solche Anwendungsfälle nicht die besten sind, die mit einer öffentlichen Blockchain gelöst werden können (ich habe etwas Ähnliches in Hyperledger Fabric gesehen). Aber wenn Sie es trotzdem tun möchten, können Sie Folgendes in Betracht ziehen:

  1. Erstellen Sie einen separaten „Datencontainer“-Vertrag, um alle Ihre Objekte zu speichern, die nicht betroffen sind, wenn Sie Ihren Geschäftsvertrag aktualisieren

  2. Als Idee kann der Datencontainer nur Schlüssel/Wert speichern, sodass Sie für neue Attribute Ihren Datenvertrag in Zukunft nicht ändern müssen. Dieser Vertrag wird wie eine Datenbank aus dem Geschäftsvertrag referenziert.

  3. Welche Aggregate (Anzahl, Summe) Sie auch benötigen, Sie berechnen und speichern sie im Voraus, wenn der Wert in Ihrem Datenvertrag gespeichert wird. (Nicht sehr effizient, aber immer noch eine bessere Lösung als Iteration bei Bedarf)
  4. Denken Sie daran, dass das Iterieren über ein Array in einem Vertrag sowohl unsicher als auch sehr teuer ist.

Idealerweise sollte eine öffentliche Blockchain nur verwendet werden, um die Authentizität einiger Daten/Zustände zu beweisen. Und der Rest solcher Geschäftsabfragen und -analysen kann mit einem privaten Speicher durchgeführt werden, der dieselben Daten enthält.