Wann ist es sinnvoll, Node Server für eine Anwendung mit Smart Contracts zu verwenden?

Ich frage mich, ob es Beispielfälle gibt, in denen es sinnvoll wäre, eine typische Node.js-Client-Server-App zu verwenden, bei der der Blockchain-Knoten auf dem Server ausgeführt wird. Auf den ersten Blick würde dies die Probleme der Zentralisierung im Zusammenhang mit dem Vertrauen in den Server zurückbringen, wenn es der Server selbst ist, auf dem der Knoten ausgeführt wird. Ich habe mich jedoch gefragt, ob es reale Fälle gibt, in denen dies angemessen wäre (hier gibt es Fragen von Leuten, die dies zu tun scheinen - dies , dies zum Beispiel).

Zur weiteren Klarstellung: Ich habe diesen Beitrag gelesen, in dem behauptet wird, dass die für die Dapp-Entwicklung erforderlichen Tools noch nicht gesammelt wurden. Daher habe ich mich gefragt, ob ich an Alternativen denken könnte, die die Zuverlässigkeitsfunktionen usw. der Blockchain weiterhin nutzen könnten, aber in einem Client-Server-Framework laufen.

Antworten (5)

Ich denke, dass die Antwort von @JohnAllen für mich keinen Sinn ergibt. Die üblichste Praxis besteht gerade darin, die Front-End-UI einer DApp als NodeJS-Anwendung zu implementieren, die die Web3-JavaScript-Bibliothek verwendet, um mit einem Ethereum-Knoten zu kommunizieren, der lokal ausgeführt wird, dh auf demselben Server wie die NodeJS-Anwendung.

Hier betreibt der NodeJS-Server selbst nicht den Ethereum-Knoten. (Achten Sie darauf, hier zwischen den beiden Verwendungen des Begriffs „Knoten“ zu unterscheiden.) Sowohl der Ethereum-Knoten (der Geth, Parity, Pyethapp oder jede andere Ethereum-Client-Software sein könnte) als auch die NodeJS-Anwendung laufen auf demselben Computer. Der Ethereum-Knoten ist ein Client der Ethereum-Blockchain, mit der er synchronisiert wird. Die NodeJS-Anwendung, die mit einem lokal laufenden Ethereum-Knoten kommuniziert, reduziert tatsächlich die Zentralisierung, da verschiedene Anwendungen keinem bestimmten entfernten Ethereum-Knoten vertrauen müssen. Außerdem werden Konten immer auf einem lokalen Knoten erstellt, da die generierten privaten Schlüssel auf dem lokalen Computer verbleiben sollten. Die Befehle zum Erstellen und Verwalten von Konten befinden sich in derweb3.eth.personalSchnittstelle, die standardmäßig nur über IPC (Inter-Process Communication) aktiviert ist, dh nur auf einem lokalen Ethereum-Knoten ausgeführt werden kann.

ZUSÄTZLICH: Wenn die Front-End-Schnittstelle einer DApp von einer NodeJS-Anwendung bedient wird, die auf einem bestimmten Server ausgeführt wird, führt dies zu einer gewissen Zentralisierung. Solange die DApp jedoch den Zustand ihres Modells (unter Verwendung von „Modell“ im Sinne von MVC) beibehalten kann, selbst wenn der NodeJS-Server ausfällt, und wenn jemand anderes die NodeJS-Anwendung hosten könnte, wird so die „Ansicht“ von MVC wiederhergestellt und Bereitstellung des Zugriffs auf das Backend (auf der Blockchain bereitgestellter Vertragscode), dann wird der Nachteil der Zentralisierung minimiert. Mein Punkt ist also, dass Zentralisierung/Dezentralisierung keine Schwarz-Weiß-Klassifizierung ist. Jede Anwendung liegt irgendwo auf einem Spektrum. Eine DApp könnteseine Benutzeroberfläche auch dezentralisiert bedienen lassen, z. B. habe ich gehört, dass Swarm & IPFS dafür vorgeschlagen wurden, aber ich weiß nicht mehr Details darüber, wie das gemacht werden würde. Es hängt alles vom Einzelfall ab und davon, wie viel Dezentralisierung wirklich benötigt wird.

Danke für die Klarstellungen! Ich glaube, ich verstehe, was du meinst. Wäre es dann richtig zu sagen, dass in einer nodejs-App das web3 const web3 = new Web3(new Web3.providers.HttpProvider(provider));immer im clientseitigen Code und niemals im serverseitigen Code enthalten wäre. Ist das richtig?
„Die häufigste Praxis besteht darin, die Front-End-Benutzeroberfläche einer DApp als NodeJS-Anwendung zu implementieren.“ NodeJS ist überhaupt kein Front-End oder keine Benutzeroberfläche.
Die NodeJS-Anwendung stellt HTML/JS/CSS für einen normalen Browser bereit, den Endbenutzer verwenden können, um mit der DApp zu interagieren. Es ist das Front-End der DApp, wobei das Back-End der Vertragscode ist, der auf der Blockchain bereitgestellt wird. Ich werde nach einer klareren Erklärung dafür suchen.
Als Antwort auf den obigen Kommentar von @ mcansado web3könnte sich das Objekt entweder auch im clientseitigen oder serverseitigen Code befinden - bezogen auf den Zusatz zu meiner Antwort. Das wären unterschiedliche Ebenen der Zentralisierung. Ich denke, wenn Sie den Mist-Browser ausführen, befindet sich das web3Objekt nur auf der Clientseite.
@AjoyBhatia. Ich habe eine Frage. Wenn ich meine Brieftasche / Konten clientseitig mit web3.eth.accounts erstelle, wie kann ich sie auf meinem lokalen Knoten "veröffentlichen"? Mein Provider ist ein Websocket.
@Underdog - Sie sollten das als separate neue Frage stellen, damit andere mit derselben Frage sie durch Suchen finden können.

Das macht meistens keinen Sinn für mich, hier ist der Grund:

wo der Blockchain-Knoten auf dem Server laufen würde

Die Definition von a blockchain nodeist einer von vielen Tausend Ethereum-Knoten, die die Blockchain-Daten speichern und häufig auf Anfragen zu diesen Daten antworten.

Wenn Sie also eine Architektur mit Ethereum nodeeinem Node.jsServer und einem Client haben – was würde der Node.js-Server tun?

Wird normalerweise Node.jsverwendet, um auf serverseitige Anforderungen zu antworten, Logik auszuführen und eine zentralisierte Datenbank abzufragen; aber mit Dapps fragen die Blockchain und web3(das ist eine Server- oder Client-Bibliothek) die Blockchain-Daten ab und ein Ethereum-Knoten antwortet mit den angeforderten Daten, die dann an den Client zurückgegeben werden.

Sie erwähnen das Speichern von Daten Node.jsin einem Kommentar. Eine weitere Option ist die zentrale Speicherung der Daten oder IPFS. Sie können einen einfachen Hash oder CID (Content Identifier) ​​on-chain speichern und die Daten, auf die der Hash verweist, in einer zentralisierten Datenbank speichern, die on-chain gespeicherten Hashes abfragen (deren Inhalt im Hash kodiert ist) und Ihre Daten abfragen per Hash, führen Sie dieselbe Hash-Funktion für die abgefragten Daten aus, um zu überprüfen, ob sie identisch sind, und geben Sie diese Daten dann an Ihren Client zurück.

Ich bin mir auch nicht sicher (daher die Frage), aber es könnte sein, dass es von Vorteil sein könnte, wenn sich die App nur für einen Teil ihrer Funktionsweise auf die Blockchain verlässt, es von Vorteil sein könnte, wenn der Node-Server den Rest erledigt (was er schnell erledigen kann). , wobei die Blockchain nur für kritische Daten verwendet wird. Beispielsweise könnten Sie große Datenmengen zentral speichern und Integritätsprüfungen in der Blockchain durchführen, die bei Bedarf verwendet werden könnten.
Ja, das ist ein mögliches Muster. Sie können den Hash von Inhalten in der Blockchain und den Inhalt in zentralisierten Lösungen speichern. Wir sind bei Disten.se fast diesen Weg gegangen, haben uns aber für IPFS entschieden, um Inhalte zu speichern (und nur einen Hash in einem Vertrag zu speichern: github.com/Distense/distense/blob/… ). Wenn Sie Ihre Daten zentral speichern, könnten Sie dies zulassen oder machen Sie den Inhalt bequem rehashing, damit Benutzer überprüfen können, ob der Inhalt derselbe ist.
Danke für die Antwort! Meine Folgefrage hier ist jedoch: Sicher, dass ein Server für die Handhabung von Verbindungen zu einer zentralisierten DB und für das Routing verwendet werden könnte. In einem solchen Fall müsste jedes Mal, wenn ein Dokument/Datensatz erstellt wird, clientseitig ein Hash generiert und an die Blockchain gesendet werden. In Anbetracht dessen konnten wir jedes Mal, wenn der Server antwortete, einen Hash der Antwort berechnen und ihn mit dem vergleichen, den wir ursprünglich in der Kette gespeichert hatten. Nichts davon würde jedoch funktionieren, wenn der Server derjenige ist, auf dem der Knoten ausgeführt wird. Wenn der Zugriff auf die Kette über einen Server erfolgt, könnte die Integrität des Hash usw. in Frage gestellt werden.
(keine Zeichen mehr vorhanden). In diesem Fall wäre die Architektur, die am sinnvollsten wäre, ein Client-Server, der Knoten verwendet, aber Clients erlaubt, gleichzeitig einen Knoten zur Blockchain zu betreiben. Der Server müsste keinen ausführen. Ist das richtig? Entschuldigung für die langen Kommentare, ich möchte nur sichergehen, dass ich das richtig verstanden habe.
if the server is the one running the node<- Meinen Sie, wenn der geth nodeund der Node.js-Server auf demselben Computer laufen, könnte der Hash auf dem Weg zur Speicherung in der Kette kompromittiert werden? Das ist wahrscheinlich der Fall, aber dann könnte im Grunde alles kompromittiert werden. Denken Sie nur an den Node.jsServer und geth nodesind zwei sehr separate, unterschiedliche Dinge
Was ich meine ist, wenn nur der Server mit der Blockchain verbunden ist und die Interaktionen des Clients damit nur über die Serverseite erfolgen. Und ich stimme zu, in diesem Fall wäre alles kompromittiert, was die ursprüngliche Bedeutung der Frage war. Ist das sinnvoll?

In einer dezentralisierten Welt ist es sehr sinnvoll, Blockchain-Knoten an allen möglichen Orten zu haben. Manchmal hat Ihr Kunde Zugriff darauf, manchmal nicht. Hoffentlich werden sie das immer öfter tun, aber während wir auf leichtere Clients und skalierbarere Netzwerke warten, ist es sehr sinnvoll, Zeiten in Betracht zu ziehen, in denen Sie vielleicht auch einen Blockchain-Client auf einem Server ausführen möchten.

Clientseitige Blockchain-Clients machen wirklich nur Sinn, wenn der Benutzer ein Mensch mit einem Webbrowser ist. Bei jeder Machine-to-Machine-Transaktion wäre ein NodeJS-Prozess sinnvoller.

Auch wenn Web3 sehr praktisch ist, weil die API möglicherweise bereits im Browser des Benutzers vorhanden ist, ist es weit entfernt von einer optimalen Lookup-API. Sie können einen serverseitigen Knoten nur ausführen, um für Ihre App relevante Informationen zu indizieren, damit Sie sie den Benutzern schneller bereitstellen können.

Was das Signieren betrifft, denke ich definitiv, dass es sicherer ist, Schlüssel in den Händen des Benutzers zu lassen, aber es ist nicht unangemessen zu erwarten, dass einige Dienste im Namen der Benutzer von einem serverseitigen Prozess signieren.

Ein Blockchain-Client ist nur eine Software, die einem anderen Kontext den Zugriff auf die Blockchain ermöglicht. Es gibt nichts daran, was es in den einen oder anderen Kontext zwingt, und wenn das dezentrale Web wirklich abhebt und Skalierbarkeit und Leistung liefert, wird die schwieriger zu beantwortende Frage meiner Meinung nach lauten: „In welchem ​​Kontext würden Sie jemals KEINEN Blockchain-Client wollen in?"

Ich habe mich gefragt, ob ich an Alternativen denken könnte, die die Zuverlässigkeitsfunktionen usw. der Blockchain weiterhin nutzen könnten, aber in einem Client-Server-Framework laufen.

Sie können hybride Webanwendungen erstellen, die Python/Node/was auch immer als zentralen Back-End-Server für einige Aufgaben verwenden und die Blockchain für andere Aufgaben nutzen.

Ein zu stark vereinfachtes Beispiel für hybride Dapps wäre eine Dapp zur Verpfändung eines ERC20-Tokens im Austausch gegen ETH. Nun wollen Kreditgeber und Kreditnehmer über Zinsen und Laufzeit des Darlehens verhandeln. Der Kreditnehmer möchte auch wissen, ob jemand bereit ist, ihm bessere Zinsen anzubieten. Dieser Entdeckungsprozess kann über einen zentralisierten Dienst erfolgen, ohne dass ETH für jede Nachricht für Gas ausgegeben werden muss. An dieser Stelle könnte es zu einer gewissen Zensur kommen, wenn Ihnen Kreditgeber mit niedrigeren Zinsen aus irgendeinem Grund nicht angezeigt werden, Sie aber kein Risiko eingegangen sind und sich trotzdem aus dem Prozess zurückziehen können.

Sobald die Verhandlungen abgeschlossen sind, können sowohl der Kreditgeber als auch der Kreditnehmer einfach auf eine Schaltfläche auf der Webseite klicken und einen intelligenten Vertrag auf der Blockchain erstellen, der Informationen über alle Bedingungen der Hypothek enthält und sich entsprechend verhalten wird. An diesem Punkt müssen Sie nicht darauf vertrauen, dass die zentralisierte Website oder der Kreditgeber Ihre Sicherheiten sicher verwahrt, da sie in einem Vertrag eingeschlossen wären.

Sie opfern also in einem Schritt die Vertrauenslosigkeit für Geschwindigkeit und Kosten und nutzen die Vertrauenslosigkeit in einem anderen Schritt für die Sicherheit.

Sicher. Stellen Sie sich beispielsweise vor, Sie haben einen E-Commerce-Shop (z. B. den Verkauf von Smartphones), der in node.js geschrieben ist. Sie möchten es mit der Blockchain verbinden, um zB Zahlungen zu kontrollieren. Kunden zahlen also über Metamask oder Mist an Ihre Adresse und Ihr Shop-Backend wird mit dem Ethereum-Knoten (der sich möglicherweise auf demselben Server befindet) verbunden, um zu überprüfen, ob die Zahlung erfolgt ist, und die Bestellung fortzusetzen.

In diesem Anwendungsfall ist ein Server mit Ethereum-Knoten keine Möglichkeit, die App zu zentralisieren, sondern nur eine Möglichkeit, auf intelligente Verträge/Konten durch das Computersystem zuzugreifen, nicht durch den Menschen selbst.