Heim > Technologie-Peripheriegeräte > IT Industrie > Solidität Fallstricke: Zufällige Zahlenerzeugung für Ethereum

Solidität Fallstricke: Zufällige Zahlenerzeugung für Ethereum

尊渡假赌尊渡假赌尊渡假赌
Freigeben: 2025-02-16 10:44:09
Original
671 Leute haben es durchsucht

Solidity Pitfalls: Random Number Generation for Ethereum

Dieser Artikel wird von IOLITE gesponsert und erstellt. Vielen Dank, dass Sie die Partner unterstützt haben, die SitePoint ermöglicht haben.

Solidität ist eine relativ neue Sprache, die Probleme im Zusammenhang mit dem Code und seiner beabsichtigten Verwendung enthält, da es keinen perfekten Code gibt. In diesem Artikel werden Sie Best Practices und Fallstricke leiten, wenn Sie Zufallszahlen als Eingabe in Smart Contracts von Ethereum verwenden.

Schlüsselpunkte

  • Soliditätssprache selbst kann aufgrund ihrer deterministischen Natur und den hohen Kosten komplexer Algorithmen keine echten Zufallszahlen erzeugen. Entwickler müssen sich bewusst sein, dass in einigen Fällen ein Angreifer die Ergebnisse vorhersagen kann.
  • Ein häufiger Weg, um Pseudo-Random-Zahlen in der Solidität zu erzeugen, besteht darin, den LCG-Algorithmus für Kongruenzgenerator (LCG) zu verwenden. Es funktioniert jedoch nicht für Kennwortsicherheitsanwendungen und stützt sich auf block.timestamp und block.difficulty, Bergarbeiter können diese Werte manipulieren.
  • kettenlink vrf (verifizierte zufällige Funktion) liefert eine Lösung, um nachgewiesene Zufallszahlen in der Solidität zu erzeugen. Es verwendet zufällige Überprüfung und Kennwortmischung, um sicherzustellen, dass die Zahlen wirklich zufällige Zahlen sind.
  • Andere Mechanismen zur Erzeugung von Zufallszahlen sind: Ethereum -Wecker für die Planung von Transaktionen; intelligente Verträge.

Soliditätsnummer Erzeugung

Solidität können keine Zufallszahlen erstellen. Tatsächlich sind alle Algorithmen, die zufällige Zahlen erzeugen, Pseudo-Random-keine Sprache kann vollständig zufällige Zahlen erzeugen. Das Problem mit Solidität ist, dass komplexe Algorithmen zu teuer sind und daher eine grundlegende Lösung verwendet wird. Abgesehen davon sollte der Soliditätscode deterministisch sein, da er auf mehreren Knoten ausgeführt wird. Wir brauchen einen Algorithmus, der gleichzeitig eine Zufallszahl erzeugen und auf mehreren Knoten verwenden kann. Informationen wie die Uhrzeit sind nicht verfügbar, um Zufallszahlen zu generieren. Daher müssen wir nach anderen Optionen suchen. Als Entwickler sollten Sie sich dieses Problems bewusst sein, da ein Angreifer in bestimmten Situationen Ergebnisse vorhersagen kann.

Einer der am häufigsten verwendeten Algorithmen ist der "lineare Kongruenzgenerator" (LCG). Es ist einer der ältesten Algorithmen, schnell und leicht zu verstehen. LCGs sind eine gute Wahl für eingebettete Systeme, da sie nur einen begrenzten Speicher haben. Es funktioniert jedoch nicht mit Passwort -Sicherheitsanwendungen. Trotzdem wird es immer noch in intelligenten Verträgen verwendet, da schnelle Algorithmen in Bezug auf die Gaskosten billiger sind.

Der Algorithmus selbst führt die folgenden Schritte aus:

  • Eingabe
  • Akzeptieren
  • Algorithmus auf Eingabe
  • ausführen
  • Holen Sie sich den Modul des Ausgangs (geteilt durch die maximale Zahl im gewünschten Bereich)
  • Ausgabe 0 zum Wert zwischen der maximalen Zahl im gewünschten Bereich

Lassen Sie uns verschiedene Möglichkeiten untersuchen, um zufällige Zahlen mit dem Lottery Smart Contract -Beispiel zu erstellen. Benutzer können sich der Lotterie anschließen, indem sie 0,1 Ether an den Vertrag und eine Ganzzahl zwischen 0 und 250 senden.

  1. block.timestamp & block.difficulty

Wenn der Bergmann eine Transaktion bestätigt, wird ein block.timestamp zugewiesen. Kein Spieler in unserem Lotterievertrag kann dies kontrollieren. Schauen wir uns diesen Code an, der zum Erstellen von Zufallsnummern verwendet wird.

function random() private view returns (uint8) {
  return uint8(uint256(keccak256(block.timestamp, block.difficulty))%251);
}
Nach dem Login kopieren
Nach dem Login kopieren

Finden Sie hier Gist .

Dieser Code hasht zuerst den Block -Zeitstempel und die Schwierigkeit. Als nächstes konvertieren wir den Hash -Wert in eine Ganzzahl und teilen ihn durch 251, um eine Ganzzahl zwischen 0 und 250 zu erhalten. Das Problem mit diesem Code ist jedoch, dass wir den Bergleuten nicht vertrauen sollten, um den Gewinner zu wählen.

  1. Lotterieeingabe - JEDE Daten

Wir benötigen mehr willkürliche Daten, um unseren Gewinner auszuwählen. Wir können die Adresse der Spieler verwenden, die in unseren Lotterie -Smart -Vertrag abgeschlossen haben, aber wir müssen sie verbergen, weil sie ihn möglicherweise missbrauchen. Da alle Informationen auf der Blockchain aufgezeichnet werden, können diese Informationen nicht versteckt werden.

Die Zahlen, die an unseren Lotterie -Smart -Vertrag übermittelt werden können. Benutzer müssen die Hashing -Nummer haben, die sie mit ihrer Ethereum -Adresse ausgewählt haben. Dies gibt uns eine ziemlich zufällige Zahl.

  1. kettenlink vrf

Wenn dies gesagt wird, ist Zufälligkeit möglich, aber Sie müssen nur ein Orakel verwenden, um die Zufallszahl von außerhalb der Blockchain zu erhalten. Das Problem bei der Verwendung externer Daten ist, dass es sehr schwierig ist zu beweisen, dass die Zahl tatsächlich zufällig ist und sicherzustellen, dass die Entität außerhalb des Ketten die Zufallszahl in keiner Weise manipuliert. Hier kommt Chainlink VRF ins Spiel. ChainLink VRF (verifizierte zufällige Funktion) ist, wie wir nachweisliche Zufallszahlen in der Solidität erhalten.

ChainLink VRF fügt der Blockchain ein Ereignis hinzu, aus dem der ChainLink -Knoten das Ereignis liest und eine Zufallszahl zurückgibt. Zufälligkeitsprüfungen auf Ketten werden über den sogenannten VRF-Koordinator durchgeführt. Dies verwendet einen bestimmten Schlüssel -Hash aus dem Orakel und einer Saatgutphrase des Benutzers sowie einer Kryptographie, um sicherzustellen, dass die Zahl eine echte Zufallszahl ist. Auf diese Weise können wir eine unvoreingenommene Zufallszahl erhalten.

  1. Andere Mechanismen

4.1 Ethereum Wecker

Entwickler müssen überlegen, wann sie einen Gewinner auswählen sollen. Informationen wie die Uhrzeit sind in der virtuellen Maschine von Ethereum nicht verfügbar, da der Code zu verschiedenen Zeiten auf mehreren Knoten ausgeführt wird. Dies macht es schwieriger, den Gewinner zu wählen. Eine Möglichkeit besteht darin, eine Funktion in Ihrem Smart -Vertrag zu implementieren, die die Lotterie ausschaltet und den Gewinner auswählt. Dies ist nicht so dezentralisiert, wie wir es uns erhofft hätten. Der Besitzer des Vertrags kann die Lotterie schließen, wenn festgestellt wird, dass sein Freund gewinnen wird. Wir müssen diese Art von Betrug vermeiden.

Eine bessere Option ist die Verwendung des Ethereum -Weckers. Es ist ein Dienst, mit dem die Planung von Transaktionen später in der Ethereum -Blockchain ausgeführt werden kann. Dieser Service ist völlig vertrauenslos, was bedeutet, dass der gesamte Service als intelligenter Vertrag ausgeführt wird. Grundsätzlich verwendet der Ethereum -Alarm Blocknummern, um Transaktionen zu planen. Beachten Sie, dass dies nicht bedeutet, dass der Vertrag von selbst beginnt. Es beruht auf dem Interesse des Benutzers, die Funktion "Gewinner auszuwählen" (Ether Belohnung). Wenn niemand Ihre Funktion aufruft, fällt Ihnen natürlich fehl.

4.2 Zufällige Dateneingabe

random.org stellt eine API bereit, die eine zufällige Datenquelle über JSON bereitstellt. Ethereum Smart Contracts können diese Datenquelle verwenden, um Algorithmen zur Auswahl von Zufallszahlen zu füttern. Da Sicherheit wichtig ist, können digitale Signaturen verwendet werden. Zufällige Daten werden von random.org signiert. Sie können die Integrität der Daten überprüfen, damit Sie nachweisen können, dass sie tatsächlich von random.org stammen und dass die Daten nicht manipuliert wurden.

Randao ist ein neues Projekt im Blockchain -Bereich, das sich ausschließlich auf die Bereitstellung von Zufallszahlen konzentriert. Sie verwenden eine Kombination aus Orakel und intelligenten Verträgen, um Ihnen zufällige Zahlen zu geben. Randao Services sind jedoch derzeit sehr langsam. Wenn Sie eine App haben, die Sie häufig verwenden, ist dies nicht ideal.

4.3 Blocknummer Monitor

Sie können auch einen Monitor in Ihrem Code verwenden, der die Blocknummer überprüft, bis er mit der von Ihnen festgelegten Zielnummer übereinstimmt.

function random() private view returns (uint8) {
  return uint8(uint256(keccak256(block.timestamp, block.difficulty))%251);
}
Nach dem Login kopieren
Nach dem Login kopieren

Quelle. GIST .

4.4 IOLITE Smart Contract Creation

iOLite erstellt ein Produkt, das natürliche Sprache akzeptiert, um intelligente Verträge zu erstellen. Es verwendet die NLP -Motor (Stanford Natural Language Processing), die als Fast Adaptation Engine (FAE) bezeichnet wird. IOLITE verlässt sich auf Solidity -Experten für die Schulung der Gemeinschaft. Ein Solidity -Experte (Mitwirkender) kann eine Struktur definieren, die einen oder mehrere Sätze enthält und sie dem entsprechenden Smart Contract Code anhängen.

Die Stanford NLP Engine ist so konzipiert, dass sie komplexe Sprachen verstehen. Die Komplexität der Sprache hängt von der Menge des Maschinentrainings ab. Nach ordnungsgemäßem Training kann der Motor komplexe intelligente Verträge schaffen. FAE ist in der Lage, solche Verträge zu schaffen, da komplexe Verträge nicht so kompliziert sind. Experten können die Anfrage in mehrere kleinere Codeausschnitte aufteilen und an einen Satz anhängen.

Wenn jemand mehrere Sätze betritt, sucht er nach der entsprechenden Struktur/dem entsprechenden Satz, um einen "komplexen" Vertrag zu erstellen. Mitwirkende erhalten IOLITE -Token -Belohnungen durch den Bergbauprozess der neuen Struktur.

Der Vorteil der Verwendung von IOLITE besteht darin, dass Smart Contract -Experten Probleme wie die Zufallszahlengenerierung für Sie lösen können. Weitere Informationen finden Sie unter iOLite.io.

Schlussfolgerung

Wie Sie sehen können, ist es nicht einfach, echte zufällige Eingaben zu erzeugen. Verlassen Sie sich nicht auf block.timestamp, now und block.blockhash als Quellen der Zufälligkeit. Eine gute Lösung umfasst die Kombination mehrerer Pseudo-Random-Dateneingaben und die Verwendung von Oracles oder intelligenten Verträgen, um sie zuverlässiger zu gestalten. Sie müssen sich zu 100% sicher sein, sicher, dass niemand die in den Smart -Vertrag eingegebenen Daten manipulieren kann.

Bitte seien Sie vorsichtig und überlegen Sie sich zweimal, bevor Sie die Logik der Zufallszahlengenerierung implementieren.

FAQ für die Zufallszahlenerzeugung in Solidität (FAQ)

Warum ist es schwierig, zufällige Zahlen in Solidität zu generieren?

Solidität (die Programmiersprache zum Schreiben von Ethereum-Smart Contracts) verfügt nicht über integrierte Funktionen, um Zufallszahlen zu generieren. Dies liegt daran, dass Blockchain (die Grundtechnologie von Ethereum) im Wesentlichen deterministisch ist. Dies bedeutet, dass die Ausgabe bei einer Reihe von Eingängen immer gleich ist. Diese Sicherheit ist entscheidend für die Aufrechterhaltung der Integrität und Sicherheit der Blockchain. Es macht jedoch die Erzeugung echter Zufallszahlen zu einer Herausforderung, da das Konzept der Zufälligkeit von Natur aus nicht deterministisch ist.

Was sind die üblichen Methoden, um zufällige Zahlen in der Solidität zu erzeugen?

Entwickler verwenden verschiedene Methoden, um Pseudo-Random-Zahlen in Solidität zu generieren. Eine gemeinsame Methode besteht darin, die Keccak256 -Hash -Funktion zu verwenden, deren Eingabe schwer vorherzusagen ist, wie z. Ein anderer Ansatz ist die Verwendung eines Oracle-Dienstes, der zufällige Zahlen aus Off-Chain-Quellen bietet. Jeder Ansatz hat jedoch seine eigenen Einschränkungen und potenziellen Sicherheitsrisiken.

Was sind die Risiken für die Verwendung der Keccak256 -Hash -Funktion, um Zufallszahlen zu generieren?

Obwohl die Keccak256-Hash-Funktion verwendet werden kann, um Pseudo-Random-Zahlen zu generieren, stellt sie einige potenzielle Sicherheitsrisiken dar. Da Eingänge zu Hash -Funktionen wie aktuelle Block -Zeitstempel und Blockschwierigkeiten auf der Blockchain öffentlich verfügbar sind, können böswillige Bergleute diese Werte so manipulieren, um die nach Zufallszahlen generierte Ausgabe zu beeinflussen.

Wie generiere ich zufällige Zahlen in Solidität mit Oracle Service?

Originaldienste können zufällige Zahlen aus Off-Chain-Quellen bereitstellen. Diese Dienste fungieren als Brücke zwischen der Blockchain und der Außenwelt und ermöglichen es intelligenten Verträgen, mit Daten zu interagieren, die der Blockchain selbst nicht zur Verfügung stehen. Die Verwendung von Oracle Services führt jedoch ein Vertrauensniveau ein, da intelligente Verträge auf Orakel stützen müssen, um genaue und unvoreingenommene Zufallszahlen bereitzustellen.

Engagement-Was spielt die Rolle, Schemata bei der Erzeugung von Zufallszahlen aufzudecken?

Verpflichtungspflichtschema ist eine Möglichkeit, zufällige Zahlen auf dezentrale und sichere Weise zu generieren. Im Verpflichtungspflicht begehen die Teilnehmer zunächst eine geheime Zahl, und dann werden alle geheimen Zahlen gleichzeitig bekannt gegeben, und eine zufällige Zahl wird basierend auf diesen Geheimnissen generiert. Dieser Ansatz verhindert, dass ein einzelner Teilnehmer die durch Zufallszahlen erzeugte Ausgabe beeinflussen kann.

Warum ist es wichtig, echte Zufallszahlen in intelligenten Verträgen zu generieren?

reale Zufallszahlen sind für viele Arten von intelligenten Verträgen von entscheidender Bedeutung, beispielsweise für Spiele von Zufall, Lotterie und anderen Anwendungen, die Zufälligkeit erfordern. Wenn die in diesen Verträgen verwendeten Zufallszahlen vorhergesagt oder betroffen sind, kann dies zu unfairen Ergebnissen führen und sogar böswillige Akteure den Vertrag ausnutzen.

Kann die BlockHash -Funktion verwendet werden, um Zufallszahlen in Solidität zu generieren?

Die Blockhash-Funktion in Solidität kann verwendet werden, um Pseudo-Random-Zahlen zu erzeugen. Diese Funktion gibt den Hash -Wert der angegebenen Blocknummer zurück, der unvorhersehbar ist und mit jedem Block variiert. Diese Methode hat jedoch ihre Einschränkungen. Beispielsweise funktioniert die BlockHash -Funktion nur in den neuesten 256 Blöcken, und der Blockhash zukünftiger Blöcke kann vor dem Mining nicht bekannt sein.

Was sind die Einschränkungen bei der Verwendung des aktuellen Block -Zeitstempels, um Zufallszahlen zu generieren?

Es besteht eine große Begrenzung für die Verwendung des aktuellen Block -Zeitstempels als Eingabe, um Zufallszahlen zu generieren. Bergleute haben einen gewissen Einfluss auf die Zeitstempel der Blöcke, die sie abbauen, was bedeutet, dass sie die Zeitstempel manipulieren können, um die durch Zufallszahlen erzeugte Ausgabe zu beeinflussen.

Wie generiere ich zufällige Zahlen mit Randao Beacon?

Randao (zufällige Zahl DAO) Beacon ist eine dezentrale und transparente Möglichkeit, Zufallszahlen zu generieren. Die Teilnehmer der Randao Beacon versprechen geheime Zahlen, die dann enthüllt und kombiniert werden, um eine Zufallszahl zu generieren. Dieser Ansatz soll verhindern, dass ein einzelner Teilnehmer die durch Zufallszahlen erzeugte Ausgabe beeinflussen kann.

Gibt es bevorstehende Verbesserungen oder Vorschläge, um zufällige Zahlen in der Solidität zu generieren?

Forschungen und Vorschläge zur Verbesserung der Zufallszahlerzeugung bei Solidität und anderen Blockchain -Plattformen sind im Gange. Beispielsweise wird erwartet, dass Ethereum 2.0 (ein bevorstehendes Upgrade in das Ethereum-Netzwerk) einen integrierten Zufallszahlengenerator umfasst. Bevor diese Verbesserungen jedoch umgesetzt werden, müssen Entwickler weiterhin bestehende Ansätze und ihre inhärenten Einschränkungen und potenziellen Sicherheitsrisiken verwenden.

Das obige ist der detaillierte Inhalt vonSolidität Fallstricke: Zufällige Zahlenerzeugung für Ethereum. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage