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
block.timestamp
und block.difficulty
, Bergarbeiter können diese Werte manipulieren. 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:
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.
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); }
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.
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.
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.
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.
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.
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); }
Quelle. GIST .
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)
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.
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.
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.
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.
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.
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.
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.
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.
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.
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!