Wie gehen Sie mit einer nicht deterministischen Änderung während der Smart Contract-Ausführung um?

Ich habe den folgenden E-SO-Beitrag und auch mehrere Threads in Ethereum/Solidity-Foren zu Smart Contracts und externen Servern (alles, was mit einem Socket zu tun hat) gelesen:

Warum können Verträge keine API-Aufrufe tätigen?

Ich verstehe, dass die Idee darin besteht, deterministischen Code beizubehalten, und der Zugriff auf einen externen Server bricht diese Vereinbarung. Ich verstehe auch, dass es ein Sicherheits- oder Logistikproblem schafft, wenn es um Smart Contract Code geht, der Socket-Anrufe tätigt.

Kann mir jemand sagen, wie Sie mit einem Szenario wie dem folgenden umgehen würden?

Angenommen, ein Smart Contract ist an der Übertragung eines Vermögenswerts wie einer Immobilienurkunde oder eines Eigentumstitels beteiligt, der treuhänderisch aufbewahrt wird, bis die Bedingungen des Smart Contracts erfüllt sind.

Angenommen, in der Mitte des Vertrags wird festgestellt, dass die Landurkunde betrügerisch ist. Was ich nicht verstehe, ist, wie man einen intelligenten Vertrag schreibt, der nicht mit einem externen Server interagiert, der diese Invalidierungsbedingung während der Ausführung überprüfen kann, bevor der Vertrag erfüllt wird?

Ich habe gehört, dass Leute Orakel erwähnt haben, aber ich habe immer noch kein Dokument gesehen, das einen konkreten Weg beschreibt, mit den sehr realen Lebensumständen umzugehen, die ich gerade beschrieben habe. Abstrakter gesagt, jeder reale Umstand, der während der Ausführung eines Smart Contracts auftritt, der die Transaktion im Wesentlichen ungültig macht. Techniken irgendjemand?

Antworten (1)

Der Vertrag selbst kann nur Daten von Blockchain + Transaktion verwenden. Völlig deterministisch. Sie können jedoch in Ihrem Vertrag eine spezielle vertrauenswürdige Adresse haben, die berechtigt ist, Daten in den Vertrag einzugeben.

Ein vertrauenswürdiger Off-Chain-Prozess überprüft also alle gewünschten Bedingungen (in Ihrem Beispiel Betrug), sendet diese Daten an den Vertrag in der Kette und verarbeitet sie dann vertraglich. Leute nannten solchen Prozess Oracle.

Aus Entwicklersicht sieht es nach einer neuen Methode im Vertrag aus, die einige Daten akzeptiert:

function takeOracleData(uint newImportantExternalValue) {
    require(msg.sender == trustedOracleAddress);
    storedImportantExternalValue = newImportantExternalValue;
}

Und dann verwenden Sie einfach gespeicherte Werte als Daten aus der realen Welt. takeOracleDataJetzt müssen Sie regelmäßig anrufen . Sie erstellen also einfach einen Prozess (z. B. Python-Skript), der alle 10 Minuten neue Daten erhält und die Funktion aufruft. Das ist alles.

Hier ist ein Beispiel von Oracle, das neue Vertragsereignisse beobachtet.

Ich habe Ihre Antwort positiv bewertet, aber das ist der Punkt, an dem ich immer hängen bleibe, wenn ich diese Frage stelle, und bisher keine gute Antwort bekommen konnte. Ich brauche wirklich ein Codebeispiel oder Dokument, das mir zeigt, wie ein Smart Contract mit einem vertrauenswürdigen Off-Chain-Prozess interagiert. Hast du einen Link für so etwas?
OK, ich habe keinen Link, also habe ich meine Antwort erweitert. Fühlen Sie sich frei, nach allem zu fragen.
Danke schön. Habe deine Antwort akzeptiert. Wenn Sie Dokumente/Webseiten haben, die sich intensiv mit dem Nachrichtenfeld "Absender" befassen und wie man es programmiert, wäre das großartig. Ich bin mir sicher, dass das Hinzufügen zu Ihrer Antwort auch anderen helfen würde.
Also. Das ist nur eine Endlosschleife, die die Vertragsmethode aufruft. Oder auf der Suche nach neuen Vertragsereignissen. Hier ist ein Beispiel : medium.com/@mustwin/…
großartig, danke. Wenn Sie Ethereum-Programmierungsberatung gegen eine angemessene Gebühr durchführen, lassen Sie es mich wissen. Wenn ja, folge mir auf Twitter (Suche nach „roschler“) und wir können in DM weitermachen.
Klar, gefolgt. Füge mich hinzu, Regresscheck.