Der Anfängerführer, den ich mir vor ein paar Monaten gewünscht hätte, bevor ich mich mit diesem Zeug befasst hätte
Was du brauchen wirst:
- ein Informatik-Hintergrund
- die Grundlagen von Ethereum
- die Grundlagen der Analysis (Constraints-Optimierung)
Was du bekommst:
- die Grundlagen von wissensfreien SNARKs
- die Grundlagen der Merkle-Bäume
- wie Ethereum dank SNARKs auf Tausende von Transaktionen pro Sekunde skaliert werden kann
Mit SNARKs kann ein Prüfer einem Prüfer beweisen, dass er eine Lösung W für das Problem F mit gemeinsam genutzten / bekannten Eingaben X hat, ohne W preiszugeben.
Das Finden der Lösung des Problems kann eine enorme Menge an Rechenleistung und Speicher erfordern.
Der Verifizierer kann also grundsätzlich zu 100% sicher sein, dass der Prüfer ordnungsgemäß funktioniert hat (und eine Lösung gefunden hat). Sie müssen weder die Arbeit selbst wiederholen, um die Lösung zu überprüfen, noch die Lösung überhaupt kennen. Es ist Magie!
Der Prozess besteht aus 3 Schritten:
- SETUP - Das Problem F (das als quadratisches Rechenprogramm ausgedrückt werden muss, siehe unten) ist für SNARKs vorbereitet. Dieser Prozess ist sehr speicher- und rechenintensiv, abhängig von der Komplexität des Problems (→ Anzahl der Eingaben und Einschränkungen → Die Dimension der Matrix des Problems der Erfüllung von Einschränkungen). Der Spieler, der das Setup ausführt (könnte der Prüfer selbst sein), muss von allen Parteien als vertrauenswürdig eingestuft werden, da die Ausgabe des Setups in den nächsten Phasen verwendet wird. Das Setup erfolgt normalerweise mit libsnark, eine C ++ - Bibliothek, die die beliebteste Implementierung für zkSNARKs ist.
- PROVING - Der Prüfer, der eine Lösung W für das Problem F mit gemeinsam genutzten Eingängen X hat (möglicherweise hat er / sie große Mengen an CPU und Speicher aufgewendet, um sie zu finden!), Verwendet libsnark und die Ausgabe der Einrichtung Phase, um einen Beweis zu erstellen 𝚷. Dieser Prozess ist definitiv sehr speicher- und rechenintensiv (abhängig von der Komplexität des Problems, wie oben). Die Größe der Ausgabe (dh Beweis 𝚷) ist stattdessen prägnant und konstant, unabhängig von der Komplexität des Problems. Der Prüfer muss darauf vertrauen, wer die Setup-Phase durchgeführt hat, da er die Ausgabe verwendet.
- ÜBERPRÜFEN - Ein Prüfer - der als Eingabe den Ausgang der Setup-Phase, die gemeinsamen Eingänge X und den Beweis 𝚷 angibt - prüft den Beweis. Wenn die Überprüfung erfolgreich ist, konnte der Prüfer einem Prüfer nachweisen, dass er die Lösung W für das Problem F gefunden hat… ohne W! Das Schöne daran ist, dass nicht nur der Proof prägnant ist und immer die gleiche Länge hat. Der Überprüfungsprozess ist schnell und überhaupt nicht speicher- / rechenintensiv. Im Gegensatz zu den beiden vorherigen Phasen… kann die Überprüfung mit einem Smartphone in Millisekunden durchgeführt werden!
Eine gute Zusammenfassung (Quelle):
Wie kann das passieren? Nun, es ist Merlin-Magie! Wenn Sie die Mathematik dahinter haben wollen, von hier aus starten.
Wie kann ich meine Software in ein quadratisches Rechenprogramm umwandeln?
Wie oben erwähnt, muss das Problem F der Setup-Phase ein quadratisches Rechenprogramm sein. Die Spielregeln sind hart:
- Die Eingaben Ihrer Software sollten Zahlen sein. Konvertieren Sie Ihre Inhalte (Arrays, Strings usw.) in Zahlen. Das ist trivial.
- Ein "quadratisch beschränktes Gleichungssystem" bedeutet:
Dabei ist x der n-dimensionale Vektor Ihrer Eingaben, m die Anzahl der Einschränkungen (dh die Anzahl der Gleichungen Ihres Systems), C die n-mal-n-Koeffizientenmatrix und q ein n-dimensionaler Koeffizientenvektor. Wenn Sie Matrix und Vektoren nicht mögen, ist hier der Fall n = 3 und m = 2 (3 Eingaben, 2 Einschränkungen):
- Die Implementierung ist eine arithmetische Schaltung, was bedeutet, dass das Ergebnis ist Problem gelöst (das System ist gelöst, dh alle Polynome sind gleich 0) oder Problem nicht gelöst (alle anderen Fälle). Mit anderen Worten: „Diese Eingaben sind / sind keine der Lösungen für dieses Problem“.
- C₁, C₂,…, C𝚖, q₁, q₂,…, q𝚖 Koeffizienten sind die Einschränkungen des Systems. Dies ist im Grunde das, was Ihre Software definiert. Ändern Sie sie ... und Sie erhalten eine andere Software! Zurück zur Funktionsweise von SNARKs: C₁, C₂,…, C𝚖, q₁, q₂,…, q𝚖 sind die Eingaben der Setup-Phase. Die Ausgabe der Setup-Phase (die Sie zum Prüfen und Überprüfen benötigen) hängt daher eng mit den C₁, C₂,…, C𝚖, q₁, q₂,…, q𝚖 zusammen und funktioniert nur für dieses Problem. Wenn Sie sie ändern, definieren Sie eine andere Software / ein anderes Problem und müssen die Setup-Phase erneut ausführen! x₁, x₂,…, x𝗇 sind die Variablen (dh was Sie erraten müssen, um die Lösung eines Systems zu erhalten). Wenn wir also sagen "Lieber Prüfer, könnten Sie bitte eine geheime Lösung W für Problem F mit gemeinsam genutzten / öffentlichen Eingaben X finden", meinen wir zum Beispiel "Lieber Prüfer, können Sie die Werte x₁, x₂, ..., x𝗇 finden, die das System lösen mit zum Beispiel x₇ = 2393, x₅₂₆ = 5647? ” Sie können mit allen x𝗇 tun, was Sie wollen, mit Ausnahme von x₇ und x₅₂₆, die auf die gemeinsam genutzten / öffentlichen Eingaben beschränkt sind.
Es ist ein hartes Leben, aber Sie können überleben ... Wenn Sie Schleifen benötigen, können Sie diese entfalten und den gleichen Vorgang viele Male wiederholen. Oder wenn Sie zum Beispiel x₁⁴ x₂⁵ benötigen, definieren Sie eine neue Eingabe x₃ = x₁⁴ x₂⁵ und verwenden x₃ in Ihren Einschränkungen. Es geht darum, Variablen und Einschränkungen hinzuzufügen… Selbst für ziemlich einfache Software ist es einfach, Hunderte von Millionen oder Milliarden von Eingaben und Einschränkungen zu erreichen!
Möchten Sie mehr wissen? Lesen hier. Und schauen Sie sich auch diese Grundlagen an code_to_r1cs.py aus dem Ethereum / Forschung.
Was ist ein Merkle-Baum?
Eine Hash-Funktion ist eine Regel, die eine Eingabe beliebiger Größe einer Ausgabe fester Größe zuordnet. Wir könnten eine ziemlich nutzlose Hash-Funktion "Verketten Sie die ersten beiden mit den letzten beiden Buchstaben" erfinden, die "Woody Allen" in "Woen" und "Paul McCartney" in "Paey" verwandelt.
Ein Merkle-Baum ist eine Datenstruktur, in der jeder Elternteil der Hash seiner beiden Söhne ist. Oben finden Sie die Wurzel, die der Hash der beiden Söhne der Stufe 1 ist. Unten ist jedes Blatt der Hash einer externen Eingabe.
Mit unserer fiktiven Hash-Funktion „Woody Allen“ → „Woen“:
Wenn sich ein Blatt ändert, wird die Änderung bis zur Wurzel weitergegeben. Wenn sich ANTHONY ändert, ändern sich auch ANNY (Blatt), CENY und CECO (Wurzel). Unabhängig davon, welches Blatt sich ändert, ändert sich auch die Wurzel.
Sie benötigen nicht den gesamten Baum, um die Wurzel neu zu berechnen. Wenn sich in unserem Beispiel ANTHONY ändert und Sie sowohl JACO als auch CECILY kennen, können Sie die Wurzel leicht neu berechnen, selbst wenn Sie JAMES, MARCO, JAES und MACO vollständig ignorieren. Bei riesigen Bäumen spart das viel Zeit!
So what?
Merkle-Bäume eignen sich hervorragend für Datenintegritätsprüfungen. Normalerweise: Sie wissen, welches der gültige Stamm ist, und Sie überprüfen, ob die empfangenen Daten mit diesem Stamm übereinstimmen. Zum Beispiel: Eine vertrauenswürdige Partei, die Ihnen nicht den gesamten Datensatz der Vornamen von Menschen auf der Erde geben kann (keine Zeit, keine Bandbreite oder vielleicht hat sie die Daten überhaupt nicht), gibt Ihnen nur die Wurzel (z "CECO"). Nachworte: Sie erhalten Millionen von Vornamen in Bezug auf die Blattnummer von Tausenden nicht vertrauenswürdigen Parteien. Nun, da Sie die richtige Wurzel haben, können Sie überprüfen, auf wen Sie sich verlassen können, wer Ihnen gefälschte Daten gibt ...
Merkle-Bäume gehören auch zu Ihrem Leben! Wenn Sie eine 3-GB-Torrent-Datei herunterladen, wird Ihre Datei in Millionen kleiner Teile aufgeteilt. Der Hash jedes Stücks wird in einem Blatt gespeichert. Da Sie wissen, welches die gültige Wurzel des Baums ist, können Sie jedes Mal, wenn Sie einen Teil der Datei von jemandem erhalten, überprüfen, ob er korrekt ist. Wenn dies nicht der Fall ist, können Sie das gleiche Stück an eine andere Person senden.
Sie können dies auch dann tun, wenn Sie noch nicht den gesamten Baum / alle Blätter heruntergeladen haben: Wenn Sie wissen, dass die Wurzel CECO ist und Sie JACO vertrauen, können Sie dies überprüfen, wenn Sie den Block ANTHONY erhalten, auch wenn Sie ihn nicht heruntergeladen haben doch die Brocken MARCO und JAMES.
Warum Merkle-Bäume in der verteilten Hauptbuchtechnologie nützlich sind, ist unkompliziert: Sie verwenden Konsensprotokolle (langsam, teuer) nur, um einen Konsens über die Wurzel zu erzielen. Dann können die nicht vertrauenswürdigen Knoten des Netzwerks Daten effizient und direkt gemeinsam nutzen… und dank Integritätsprüfungen mit dem Root sicher und gesund schlafen.
Als Gott Ethereum bat, zwei Supermächte zwischen Sicherheit, Skalierbarkeit und Dezentralisierung auszuwählen, opferte Ethereum die Skalierbarkeit. Tatsächlich gibt es keine starke Obergrenze für „Transaktionen pro Sekunde“: Die Obergrenze betrifft die Gasmenge jedes Blocks - was vereinfacht die Menge der Operationen darstellt, die ich in jedem Block ausführen kann. Diese Grenze liegt bei 2 Millionen Gas. Dies kann viele „winzige“ Transaktionen (keine an die Transaktionen angehängten Daten, keine mit diesen Daten auszuführenden Vorgänge) oder wenige große Transaktionen bedeuten. Es liegt an den Knoten von Ethereum, die Transaktionen einreichen, und an den Bergleuten von Ethereum, die die Transaktionen in den Block aufnehmen, die mehr bezahlen.
Ein Block wird abgebaut alles, ~ 15 Sekunden. Das bedeutet ~ 32 Millionen Gas pro Minute, was definitiv nicht ausreicht, wenn wir wollen, dass die Dapps von Ethereum zum Mainstream werden.
Übrigens: Hören Sie mit diesen langwierigen Vergleichen zwischen Ethereum und Visa auf. Ein zentrales System wird immer Sei schneller als Ethereum ... von Natur aus! Sie machen verschiedene Sachen und man braucht sie in verschiedenen Situationen. Wenn Sie keine Dezentralisierung und kein vertrauensloses Umfeld benötigen, sollten Sie sich natürlich für Visa entscheiden. Zusamenfassend: Die Tatsache, dass sich Ihr Mixer schneller dreht als Ihre Waschmaschine, bedeutet nicht, dass Sie Ihre Hose in einem Mixer reinigen!
Lassen Sie uns das Puzzle zusammensetzen! Stellen Sie sich vor, Sie könnten dank SNARKs viele kleine Transaktionen in einer großen Transaktion „komprimieren“. Wenn das bei dieser großen Transaktion ausgegebene Gas geringer ist als die Summe des bei den kleinen Transaktionen verbrauchten Gases, bedeutet dies, dass Sie Gas sparen.
Und Benzin sparen heißt:
- Benutzer geben insgesamt weniger für Transaktionen aus → Dies wäre ein Schub für das gesamte Ökosystem
- In der Lage sein, mehr Zeug in einen Block zu stecken → Ethereum dreht sich schneller als Ihr Mixer!
Wie funktioniert es?
Es gibt Benutzer, einen Relayer (oder mehrere Relayer), die Transaktionen zusammenfassen, und einen intelligenten Vertrag.
- Benutzer, die bereit sind, dieses Spiel zu spielen, senden ihren Ether (oder ihre Token) an einen öffentlich geprüften Smart-Vertrag. Für jeden neuen Spieler wird ein neues Blatt in einem Merkle-Baum erstellt. Das Blatt enthält Informationen über den Eigentümer des Ethers (seine Adresse, die auch der öffentliche Schlüssel ist), die Menge an Ether und Nonce (den Transaktionszähler dieses Kontos, der beim Hinzufügen des Blattes 0 ist).
- Wenn A Ether an B senden möchte (beide müssen ein Blatt / Konto im Smart-Vertrag haben), packt A eine Transaktion, die die Adresse des enthält fürKonto, das zu Konto, das Nuntius des von Konto, das Betrag von Äther übertragen werden und die Stempel, Unterschrift der Transaktion (offensichtlich mit dem privaten Schlüssel des "Von" -Kontos signiert). Sie / er sendet dann die gepackte Transaktion an den Relayer.
- Der Relayer aggregiert alle in einem bestimmten Zeitfenster (z. B. einer Stunde) eingegangenen Transaktionen, aktualisiert den Merkle-Baum mit den Beträgen der neuen Salden und erstellt einen SNARK-Beweis, der beweist, dass alle Signaturen und die Wurzel des neuen Merkle-Baums gültig sind. Der Relayer sendet schließlich den neuen Status und den Beweis an den Smart-Vertrag.
- Der Smart-Vertrag validiert den Proof in der Kette. Wenn es gültig ist, speichert es die Merkle-Baumwurzel des neuen Zustands im internen Speicher des Vertrags.
Grundsätzlich zeigt die Merkle-Baumwurzel den gesamten Zustand aller Konten. Und Sie können es nicht ändern (= Geld stehlen), es sei denn, Sie können die Gültigkeit der Signaturen nachweisen, deren Transaktionen zu dem neuen Status führen, der durch den neuen Stamm zusammengefasst wird, den Sie einreichen.
Kurz gesagt: Benutzer haben superschnelle und fast kostenlose Transaktionen wie bei Coinbase, ohne dem Relayer vertrauen zu müssen, der im Gegensatz zu Coinbase ohne Ihre Unterschrift nichts tun kann.
Es ist eine nicht verwahrende Seitenkette, deren Zustand durch eine Merkle-Baumwurzel zusammengefasst wird.
Lassen Sie uns das, was wir oben über SNARKs gelernt haben, mit dem verbinden, was wir gerade über Skalierung besprochen haben. Dafür gibt es verschiedene Möglichkeiten. Ich werde 2 Rezepte vergleichen: Vitalik's Version und barryWhiteHat's Version.
Das SETUP erfolgt durch…
Der Typ, der das Projekt startet und der auch den intelligenten Vertrag erstellt. Je überprüfbarer es ist, desto besser. Du solltest ihr / ihm vertrauen ... es ist ein vertrauenswürdiges Setup!
Der intelligente Vertrag spart…
2 Merkle-Wurzeln (Bytes32-Werte): Der erste Baum enthält die Adressen der Konten (öffentliche Signaturen), die Salden und Nonces der zweiten Konten
PROVING wird gemacht von…
Der Relayer
Der Relayer sendet an den Smart-Vertrag…
- die 2 Merkle-Wurzeln des neuen Staates (Adressbaum und Salden + Nonces-Baum)
- die Liste der Transaktionen ohne Signaturen. „Jede Transaktion kostet 68 Gas pro Byte. Für eine regelmäßige Überweisung können wir daher mit Grenzkosten von 68 * 3 (von) + 68 * 3 (bis) + 68 * 1 (Gebühr) + 68 * 4 + 4 * 2 (Betrag) + 68 * 2 rechnen (nonce) oder 892 Gas ”
Die bekannten Eingaben des PROVING-Prozesses sind…
- die 2 alten staatlichen Merkle-Wurzeln
- die 2 neuen staatlichen Merkle-Wurzeln
- Transaktionsliste
Der PROVING-Prozess beweist, dass…
Gegeben
- die 2 alten staatlichen Merkle-Wurzeln (bereits im Vertrag gespeichert)
- die 2 neuen staatlichen Merkle-Wurzeln (gesendet in der Aggr. Transaktion)
- die Transaktionsliste (gesendet in der Aggr. Transaktion)
… Der Relayer hat gültige Signaturen, um mit diesen Transaktionen vom Status mit 2 alten Wurzeln zum Status mit 2 neuen Wurzeln zu wechseln.
Die Überprüfung erfolgt durch…
Der kluge Vertrag (in Solidität codiert, vyper, wie Sie möchten!)
Die bekannten Eingaben des Überprüfungsprozesses sind…
Das gleiche PROVING verarbeitet bekannte Eingaben, klar…!
Grenzen der Skalierbarkeit
Jede aggregierte Transaktion verwendet 650 Gas für die SNARK-Überprüfung (Fixkosten) plus ~ 900 Gas von Grenzkosten pro Transaktion (Das Senden von Daten kostet!). Mit dem gesamten Block kann der Relayer also höchstens aggregieren:
was ~ 544 tx pro Sekunde
barryWhiteHat's Version
Das SETUP erfolgt durch…
Der Typ, der das Projekt startet.
Der intelligente Vertrag spart…
1 Merkle Wurzel mit dem aktuellen Zustand. Jedes Blatt ist der Hash-Status eines Kontos.
Wollen erstellen ein Konto?
state = AccountState (Pubkey, Balance, Nonce)
state.index = self._tree.append (state.hash ())
PROVING wird gemacht von…
Der Relayer
Der Relayer sendet an den Smart-Vertrag…
- Beweis 𝚷
- die neue staatliche Merkle-Wurzel
- Beweis 𝚷
Die bekannten Eingaben des PROVING-Prozesses sind…
- die alte staatliche Merkle-Wurzel
- die neue staatliche Merkle-Wurzel
Der PROVING-Prozess beweist, dass…
Gegeben
- die alte Merkle-Wurzel (bereits im Vertrag gespeichert)
- die New Merkle Wurzel (senti in der Aggr. Transaktion)
… Der Relayer verfügt über eine Liste von Transaktionen mit gültigen Signaturen, um vom Status mit altem Stamm zum Status mit neuem Stamm zu wechseln
Die Überprüfung erfolgt durch…
Der kluge Vertrag (in Solidität codiert, vyper, wie Sie möchten!)
Die bekannten Eingaben des Überprüfungsprozesses sind…
Das gleiche PROVING verarbeitet bekannte Eingaben, klar…!
Grenzen der Skalierbarkeit
Der Relayer sendet keine Transaktionsdaten an den Smart-Vertrag (was kostspielig ist), daher ist das Limit tatsächlich die Menge an Gas, um den SNARK-Nachweis zu überprüfen.
Erwähnung von Howard Wu Arbeit über die Ausführung der PROVING-Phase von SNARK auf verteilten Systemen, barryWhiteHat optimistisch gibt an, dass es möglich ist, 16666 Transaktionen in einem riesigen SNARK zu bestätigen (1 Milliarde Einschränkungen!).
barryWhiteHat auch denkt Es ist möglich, den Nachweis 𝚷 in der Kette mit 500 Gas zu überprüfen, was bedeutet, dass Sie 16 SNARKs (8 Millionen / 500) pro Block einsetzen können ~ 1.07 SNARKs pro Sekunde… was ~ 17,832 tx pro Sekunde bedeutet (16,666 * 1.07).
In die Unendlichkeit und viel weiter
- Alles, was glänzt, ist nicht Gold / 1. Die Menge an Rechenleistung und Speicher, die Sie in der Testphase benötigen, kann buchstäblich schockierend sein. Besonders in der Version von barryWhiteHat, in der ein Teil der Komplexität außerhalb der Kette verschoben wird. Barry schreibt "Auf einem Laptop mit 7 GB RAM und 20 GB Swap-Speicher können nur 20 Transaktionen pro Sekunde zusammengefasst werden.". Nun, wenn das Ziel 17,832 tx pro Sekunde ist ... LOL. Dies führt zu nicht trivialen Herausforderungen bei der parallelen Berechnung. Aber wenn die durchschnittlichen Kosten pro Transaktion weitaus günstiger sind als die gewöhnliche No-SNARKs-Option, ist das Spiel die Kerze wert.
- Alles, was glänzt, ist nicht Gold / 2. Es gibt ein relevantes Problem mit der Datenverfügbarkeit! Da nur der Stamm des Baums im Vertrag gespeichert ist, müssen Sie sicherstellen, dass immer eine vollständige Version des Baums (oder, wie es ist, der gesamte Transaktionsverlauf) verfügbar ist. Wenn keine Daten verfügbar sind, kann der Relayer selbst bei gültigen signierten Transaktionen nichts tun, da er den alten Zustand → Transaktionen → neuer Zustand nicht nachweisen kann.
- Damit der Relayer vertrauenswürdig ist und Ethers im Vertrag den gleichen Wert wie Ethers außerhalb haben (Liquiditätsproblem)… sollten Benutzer in der Lage sein, Geld aus dem Smart-Vertrag abzuheben, wenn sie dies möchten, ohne sich auf einen (bestimmten) Relayer verlassen zu müssen. Wie? Dies ist nicht im Umfang dieses Beitrags enthalten, aber Sie können dies in den beigefügten Links lesen.
- Möchten Sie mehr darüber erfahren, wie der aktuelle Status (Adressen, Salden und Nonces) mit einem Merkle-Baum behandelt werden kann? Ein Blatt hinzufügen, ein Blatt aktualisieren usw.? Auschecken diese Bibliothek (Testdatei hier), die diesen Basiswert verwendet Modulen. Danke HarryR!
- Möchten Sie Ihre persönliche Ethereum-SNARK-Umgebung einrichten? Beginnen wir außerhalb der Kette mit C ++ (Setup, Proving, Verifying) hier. Dann können Sie mit Zokrates zu Ethereum wechseln (vergessen Sie nicht, nur die Überprüfung erfolgt in der Kette!)Repo, der Dokumentation für den Einstieg).
- Wie wäre es mit RSA-Akkus anstelle von Merkle-Bäumen? Google "Rsa akkumulatoren ethereum" anfangen…
Viel Spaß damit!
Twitter @marco_derossi
- 7
- Konto
- Alle
- unter
- Verfügbarkeit
- Grundlagen
- Milliarde
- Fälle
- Übernehmen
- Schecks
- coinbase
- Computing
- Konsens
- Vertrag
- Kosten
- Strom
- Aktuellen Zustand
- DApps
- technische Daten
- Datensatz
- Dezentralisierung
- Abmessungen
- Verteiltes Hauptbuch
- verteilte Ledger-Technologie
- Arbeitsumfeld
- Äther
- Astraleum
- EU
- EV
- Fälschung
- Endlich
- Vorname
- Frei
- Funktion
- Spiel
- GAS
- GitHub
- Unterstützung
- Gold
- gut
- groß
- Guide
- Hash-
- hier
- High
- Geschichte
- Ultraschall
- hr
- HTTPS
- riesig
- hunderte
- ia
- Index
- Information
- IP
- IT
- Job
- Wesentliche
- Laptop
- grosse
- führen
- Ledger
- Niveau
- LG
- Bibliothek
- Liquidity
- Liste
- Mainstream
- Landkarten
- mittlere
- Million
- Miners
- Geld
- Monat
- Am beliebtesten
- schlauer bewegen
- Namen
- Netzwerk
- Fiber Node
- Zahlen
- Einkauf & Prozesse
- Auftrag
- Andere
- Eigentümer
- AUFMERKSAMKEIT
- Personen
- Spieler
- Beliebt
- Werkzeuge
- privat
- Private Key
- Programm
- Projekt
- Beweis
- Beweist
- Öffentlichkeit
- public Key
- rekapitulieren
- rsa
- Ohne eine erfahrene Medienplanung zur Festlegung von Regeln und Strategien beschleunigt der programmatische Medieneinkauf einfach die Rate der verschwenderischen Ausgaben.
- Laufen
- safe
- Einsparung
- Skalierbarkeit
- Skalieren
- Skalierung
- Wissenschaft
- Sicherheitdienst
- kompensieren
- Teilen
- von Locals geführtes
- Short
- Einfacher
- Größe
- schlafen
- smart
- Smart-Vertrag
- Smartphone
- So
- Software
- solide
- Lösungen
- LÖSEN
- Raumfahrt
- Ausgabe
- Anfang
- begonnen
- Bundesstaat
- Staaten
- erfolgreich
- System
- Systeme und Techniken
- Technologie
- Test
- Zeit
- Tokens
- Top
- Schwall
- Transaktion
- Transaktionen
- Vertrauen
- Updates
- Nutzer
- Wert
- Verification
- Visum
- W
- WHO
- Worte
- Arbeiten
- Werk
- wert
- X