Angenommen, ich möchte zur Veranschaulichung eine dezentrale Version von Yelp erstellen.
Ein zentralisierter Ansatz wäre, eine restaurants
Tabelle und eine reviews
Tabelle in einer MySQL-Datenbank zu haben. Was ist im Fall einer DApp die beste Vorgehensweise zum Speichern von nicht transaktionalen Daten?
Meine derzeitige Überlegung, einen Restaurant.sol
Vertrag und einen Review.sol
Vertrag zu haben, die jeweils eine Zuordnung von der Datensatz-ID als Schlüssel zum Datensatzobjekt als Wert haben. Jedes Mal, wenn ein Restaurant hinzugefügt wird, rufen wir eine addRecord()
Methode in auf Restaurant
, die die neuen Restaurantdaten zu ihrer aktuellen Zuordnung hinzufügt. (Ähnlicher Ablauf für Review
)
Ist dieser Ansatz, einen Vertrag wie eine RDBMS-Tabelle zu behandeln, robust? Oder übersehe ich etwas?
Wie hoch ist die maximale Datenmenge, die bei der Abbildung eines Vertrages gespeichert werden kann?
BEARBEITEN: Nach meinem Verständnis würde das Ändern der Zuordnung des Restaurant
Vertrags Äther kosten. Das bedeutet also, dass jeder neue Datensatz, der der „Datenbank“ hinzugefügt wird, Geld kostet? Was ist eine wirtschaftlich tragfähige Möglichkeit, eine App auszuführen, ohne dass die Benutzer zahlen müssen?
Bitte beraten.
Erstens sollten Sie sich Verträge nicht analog zu Tabellen vorstellen. Jeder Vertrag kann mehrere Zuordnungen von Informationen enthalten. Sie könnten ein einziges ReviewSystem.sol haben, das Zuordnungen für Restaurants und Bewertungen enthält, und in Übereinstimmung mit dem, was Sie zuvor vorgeschlagen haben, könnten Sie Methoden haben addRestaurant()
, addReview()
die Datensätze zu den im Vertrag gespeicherten Zuordnungen hinzufügen würden.
Allerdings haben Verträge keine sehr guten Mechanismen für normalisierte relationale Daten. Wenn Sie in einer relationalen Datenbank einen „Restaurant“-Datensatz hätten, könnten Sie eine Abfrage für alle Bewertungen zu einem bestimmten Restaurant ausführen, und mit der Leistungsfähigkeit von Indizes und Abfrageplanern erhalten Sie diese Informationen sehr schnell zurück. Bei Ethereum sind Ihre Möglichkeiten eingeschränkter. Wenn Sie keinen Index haben, müssen Sie jede Bewertung in Ihrem System durchsuchen, um festzustellen, ob sie sich auf das betreffende Restaurant bezieht. Wenn Sie einen Index haben, erhöhen Sie die Kosten für das Schreiben von Aufzeichnungen in Ihren Vertrag. Sie können die Daten auch für schnellere Suchen denormalisieren, wiederum auf Kosten einer höheren Vertragsspeicherung.
Eine Möglichkeit besteht darin, einige Ihrer Informationen außerhalb der Kette zu halten. Beispielsweise können Sie Ihre Restaurants und Bewertungen in Ihrem Vertrag mit einem Verweis von Bewertung auf Restaurant behalten. Unabhängig davon haben Sie möglicherweise eine herkömmliche Datenbank, die die Beziehung von Bewertungen zu Restaurants indiziert. Wenn jemand eine Bewertung über Ihre DApp hinzufügt, speichert der Vertrag die kanonischen Informationen und die separate Datenbank bewahrt eine Kopie der Informationen auf. Wenn jemand die Bewertungen zu einem bestimmten Restaurant nachschlagen möchte, kann er eine von der Datenbank unterstützte API abfragen, die die IDs für die Bewertungen schnell zurückgeben kann, und er kann die Bewertungen selbst aus der Blockchain abrufen. In diesem Fall sind alle kritischen Informationen on-chain verfügbar und der Off-Chain-Index kann aus dem Vertragsstatus rekonstruiert werden. Um mehr über die Nachverfolgung von Vertragsereignissen außerhalb der Kette zu erfahren,Ereignisse und Protokolle .
Wie Sie in Ihrer Bearbeitung angemerkt haben, kostet jede Information, die Sie in einem Vertrag speichern, Gas, und dieses Gas wiederum kostet Ether. Einen Dienst wie Yelp mit Hunderttausenden von Unternehmen und Tausend Wortbewertungen zu betreiben, könnte sich als sehr teuer erweisen. Sie könnten einige der Kosten mindern, indem Sie mehr Informationen außerhalb der Kette speichern. Vielleicht besteht eine Bewertung in der Kette aus einer Sternebewertung und dem Hash der schriftlichen Bewertung, dann wird der Bewertungstext aus einer Off-Chain-Quelle wie der zuvor besprochenen Datenbank oder vielleicht einem anderen dezentralen System wie ipfs abgerufen.
Im Allgemeinen sehe ich die Ethereum-Blockchain jedoch als den Ort, an dem Sie Informationen speichern, deren Verwaltung Sie nicht Dritten anvertrauen möchten. Dinge wie ERC20-Token, ENS und verteilte Börsen sind ein großartiger Anwendungsfall, da es sonst schwierig wäre, Vertrauen in eine zentralisierte Einheit aufzubauen. Es wäre zwar nett, so etwas wie einen dezentralisierten Überprüfungsdienst zu haben, aber die Kosten für die Vertragsspeicherung in Kombination mit dem relativ geringen Risiko, einem Dritten die Verwaltung dieser Informationen anzuvertrauen, machen es zu einem weniger attraktiven Anwendungsfall für die Blockchain.
Zunächst zur Beantwortung Ihrer Fragen:
„Ist dieser Ansatz, einen Vertrag wie eine RDBMS-Tabelle zu behandeln, robust? Oder übersehe ich etwas?“
Ja, diese Lösung ist robust , vorausgesetzt, Sie meinen zuverlässig oder "wird es jedes Mal funktionieren". Tatsächlich ist Robustheit eines der attraktivsten Merkmale beim Schreiben von Verträgen, die auf der Ethereum-Blockchain laufen: Sie haben mehr Redundanz, als irgendjemand jemals brauchen würde. Es gibt gerade 25,5xx
Knoten [ 1 ]. Jeder dieser Knoten speichert eine Kopie Ihrer Daten, Ihres Codes und führt jede Codezeile in Ihrem Vertrag aus.
„Wie hoch ist die maximale Datenmenge, die bei der Abbildung eines Vertrages gespeichert werden kann?“
Diese Frage wird hier von einer maßgeblichen Persönlichkeit in der Ethereum-Community beantwortet, daher werde ich davon absehen, darauf einzugehen, außer zu sagen, dass Sie entweder wahrscheinlich nicht so viele Daten haben oder es sich sicherlich nicht leisten können, so viel zu speichern, wie es die Blockchain könnte. nehmen". Da jedoch jeder Knoten eine Kopie der Daten der Blockchain speichert, würden Sie, wenn Sie es sich leisten könnten, jeden der Knoten belasten und möglicherweise dazu führen, dass weniger Knoten existieren, da der Betrieb eines Knotens aufgrund der Größe der Daten mehr kosten würde riesig.
„Nach meinem Verständnis würde das Ändern der Zuordnung des Restaurantvertrags Äther kosten. Das heißt, jeder neue Datensatz, der der „Datenbank“ hinzugefügt wird, kostet Geld?“
Ja, das Ändern der Zuordnung ändert den Zustand der Blockchain und kostet Benzin.
Was ist eine wirtschaftlich tragfähige Möglichkeit, eine App auszuführen, ohne dass die Benutzer zahlen müssen?
Sie haben einige Möglichkeiten:
Ethereum/Dapp-Datenspeicherung zum Mitnehmen
640,000
Benzin640,000
Gaskosten $0.08
- $0.90
unter Verwendung der aktuellen Etherpreise, je nachdem, wie schnell Ihre Transaktion abgebaut/bestätigt werden sollJede noch so kleine Änderung an der Blockchain kostet Gas (oder „Geld“ im alten Sprachgebrauch)
send()
Methode 21,000
GasGtransaction 21000 Paid for every transaction.
Also kostet jede Sendung mindestens 21,000
– das sind die MindestkostenDas Abrufen von Daten aus der Blockchain ist jedoch kostenlos:
public
Variable in unseren Verträgen
erstellt werdenuint public numRestaurants = 42;
erstellt die Zeile: eine Funktion, die wir aus unserem Vertrag aufrufen könnenthis.numRestaurants()
web3
Client könnten wir diese Funktion mit aufrufencontractInstance.numRestaurants.call()
constant
oder view
Funktionen
function f(uint a, uint b) view returns (uint) { return a * (b + 42) + now; // does math but doesn't change state! }
LogUpdateRestaurant('mandalay', 8.7, 'restaurant')
in der Funktion, die Ihre Restaurantdaten speichertevent LogUpdate(indexed string restaurantName, uint8 rating, TypeEnum type);
Ich werde zu einem späteren Zeitpunkt mehr darüber erzählen, wie wir an die Speicherung unserer Daten in einer nahezu vollständig dezentralisierten Anwendung herangegangen sind. Und danke, dass Sie mir beigebracht haben, was ich durch das Schreiben dieser Antwort gelernt habe (wie view
ist jetzt ein Alias für constant
)
ruby_neuling