Der Bitcoin-Entwickler-Kurs - Baue dein eigenes Bitcoin-Wallet! | Humberto Cezar | Skillshare

Playback-Geschwindigkeit


1.0x


  • 0.5x
  • 0.75x
  • 1x (normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Der Bitcoin-Entwickler-Kurs - Baue dein eigenes Bitcoin-Wallet!

teacher avatar Humberto Cezar, Software Developer & Bitcoin Pleb

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Einheiten dieses Kurses

    • 1.

      Einführung

      7:10

    • 2.

      Den Bitcoin Core Node und den IntelliJ IDEA Download herunterladen, konfigurieren und ausführen

      6:33

    • 3.

      Was ist Bitcoin?

      3:03

    • 4.

      Bitcoin-Transaktionen und private Schlüssel

      6:32

    • 5.

      Bitcoin Wallets, die Blockchain und Mining

      3:51

    • 6.

      Das Bitcoin-Netzwerk, das Ökosystem und die Prinzipien

      5:49

    • 7.

      Das Projekt starten

      2:59

    • 8.

      Die GUI konfigurieren

      9:55

    • 9.

      Unseren ersten Test erstellen

      10:18

    • 10.

      Mnemonic Samen

      2:11

    • 11.

      Dialogfenster Brieftasche erstellen

      11:56

    • 12.

      Den Mnemonic Seed erstellen

      7:33

    • 13.

      Schaltflächen und Validierungen des Dialogfensters einer Brieftasche erstellen

      10:30

    • 14.

      Das aktuelle Wallet Beobachtbar

      11:16

    • 15.

      Der Reiter Bitcoin empfangen

      8:29

    • 16.

      Bitcoin-Adressen und HD-Wallets

      13:52

    • 17.

      Die erweiterten öffentlichen Schlüssel unseres Wallets erstellen

      16:40

    • 18.

      Segwit-Adressen generieren

      10:19

    • 19.

      Segwit-Adressen und -Einführung in Bitcoin-Netzwerkumgebungen verstehen

      4:34

    • 20.

      Segwit-Adressen generieren – Teil II

      9:10

    • 21.

      Support für Hauptnetz, Test Net und Reg-Testumgebungen hinzufügen

      7:41

    • 22.

      Unseren Bitcoin-Core-Knoten für die Kommunikation mit unserem Wallet vorbereiten

      3:13

    • 23.

      Den Node-Client zum Erstellen und Auflisten von Wallets erstellen

      15:06

    • 24.

      Node-Clients für das Laden einer Brieftasche, die Erhalte eine neue Adresse, die Überprüfung unseres Guthabens und den Mining von Bitcoins

      11:21

    • 25.

      Bitcoins vom Knoten zur Anwendung senden

      14:25

    • 26.

      Die Adresstabelle

      8:42

    • 27.

      Unsere Anwendungsadressen in unseren Bitcoin-Knoten importieren

      10:18

    • 28.

      Unseren Bitcoin-Knoten asynchron aufrufen

      9:50

    • 29.

      Auf Transaktionen vom Knoten aus mit ZeroMQ hören

      14:09

    • 30.

      Bitcoin-Transaktionen: Eingänge, Ausgänge, Skripts und das UTXO-Set

      18:31

    • 31.

      UTXOs vom Knoten erhalten und sie filtern

      11:46

    • 32.

      Die aktuellen Wallet-Adressen aktualisieren

      11:07

    • 33.

      Adressinformationen in der Adresstabelle anzeigen

      13:21

    • 34.

      Weitere Testszenarien für den Erhalt von Bitcoins und die Vermeidung der Adresswiederverwendung

      14:09

    • 35.

      Den Erhalt von Bitcoin-Tests verbessern. Mehr Transaktionen als Adressen erhalten

      10:33

    • 36.

      Mehr Adressen generieren

      15:50

    • 37.

      Bestätigungen testen

      7:33

    • 38.

      Die Transaktionstabelle

      8:03

    • 39.

      Die Transaktionstabelle auffüllen

      14:03

    • 40.

      Tests für die Transaktionstabelle verbessern und unsere Anwendung im Testnetz ausführen

      17:10

    • 41.

      Auf Blöcke hören und Formatierungswaagen formatieren

      12:55

    • 42.

      Das Guthaben der gesamten Geldbörse

      5:50

    • 43.

      Den Gesamtguthaben des Wallets berechnen und anzeigen

      8:57

    • 44.

      Weitere Tests für die Funktion "Gesamtbalance" hinzufügen

      3:37

    • 45.

      Der Reiter Bitcoin senden

      11:11

    • 46.

      Transaktionsgebühren und -größen

      6:48

    • 47.

      Den Transaktionsgrößenrechner und den The Node Estimate Smart Fee-Client erstellen

      13:33

    • 48.

      Münzenauswahl und Staub

      6:08

    • 49.

      Den Staubrechner und andere Dienstprogramme implementieren

      9:24

    • 50.

      Den Münz-Selektor für einzelne zufällige Ziehungen implementieren

      8:40

    • 51.

      So werden Segwit-Transaktionen erstellt und validiert

      7:44

    • 52.

      Den Transaction Creator implementieren

      14:03

    • 53.

      Das Dialogfenster Transaktion senden

      14:21

    • 54.

      Transaktionsdaten im Dialogfenster Bitcoin senden anzeigen

      15:43

    • 55.

      So funktionieren Transaktionssignaturen

      5:25

    • 56.

      So verarbeiten unsere Wallet und unser Knoten gesendete Transaktionen

      3:25

    • 57.

      Segwit-Transaktionen signieren und senden

      16:49

    • 58.

      Transaktions-, Adress- und Adressbuchstaben auf Tabellen und Guthaben fixieren

      18:13

    • 59.

      Ändern der Adressen. Fehleralarm für falsche Passwörter hinzufügen

      20:53

    • 60.

      Mehr Fehlermeldungen und Tests für die Bitcoin-Senden-Funktion

      14:55

    • 61.

      Ein notwendiges Refactor

      17:39

    • 62.

      Ein notwendiges Refaktor, Teil II

      26:45

    • 63.

      Verschachtelte Segwit-Adressen

      7:50

    • 64.

      Bitcoin in verschachtelten Segwit-Adressen erhalten

      17:01

    • 65.

      Bitcoin an verschachtelte Segwit-Adressen senden und unser Wallet im Test Net testen

      9:54

    • 66.

      Bitcoin an Legacy-Adressen senden

      14:23

    • 67.

      Unser Wallet speichern und verschlüsseln

      16:31

    • 68.

      Das Menü Wallet laden

      14:03

    • 69.

      Eine Brieftasche laden

      11:47

    • 70.

      Plausible Ablehnbarkeit, Refactoring und mehr Tests für die Load Wallet-Funktion

      19:08

    • 71.

      Adressen, Transaktionen und Guthaben fixieren

      12:13

    • 72.

      Die Anzahl der generierten Adressen aktualisieren und Tests optimieren

      11:54

    • 73.

      Eine Brieftasche mit dem Mnemonic Seed importieren

      19:27

    • 74.

      Adressen validieren

      19:24

    • 75.

      Einen Fortschrittsbalken erstellen

      13:27

    • 76.

      Abhängigkeiten aktualisieren

      7:17

    • 77.

      Unser Wallet in der Haupt-Netzumgebung ausführen

      7:46

    • 78.

      Extra-Kurs - Bitcoin Core v26

      3:14

  • --
  • Anfänger-Niveau
  • Fortgeschrittenes Niveau
  • Fortgeschrittenes Niveau
  • Jedes Niveau

Von der Community generiert

Das Niveau wird anhand der mehrheitlichen Meinung der Teilnehmer:innen bestimmt, die diesen Kurs bewertet haben. Bis das Feedback von mindestens 5 Teilnehmer:innen eingegangen ist, wird die Empfehlung der Kursleiter:innen angezeigt.

90

Teilnehmer:innen

--

Projekt

Über diesen Kurs

Willkommen beim Bitcoin-Entwickler-Kurs! Mein Name ist Humberto und ich freue mich, dir den ersten und einzigen Kurs zu präsentieren, in dem du Bitcoin lernen kannst, indem du eine Desktop-Bitcoin-Wallet erstellst!

In diesem Kurs lernst du, wie Bitcoin aus technischer Sicht funktioniert. Genauer gesagt wirst du lernen, wie ein Bitcoin-Wallet im Detail funktioniert. Außerdem lernst du, wie ein Bitcoin-Knoten funktioniert und wie du ihn ausführen kannst. Wir werden sehen, wie es mit unserer Brieftasche und anderen Knoten interagiert. Wir lernen auch, wie das Bitcoin-Netzwerk funktioniert und wie es einen Konsens erreicht.

Zu den wichtigsten Bitcoin-Konzepten, die wir erlernen werden, gehören Transaktionen, Adressen, Samen, Schlüssel, Guthaben, die Blockchain, das Mining und das Wallet.

Da wir eine Desktop-Anwendung entlang des Kurses erstellen, hat der Student die Möglichkeit, die folgenden Fähigkeiten der Software-Entwicklung, die in der Software-Branche sehr gefragt sind, zu üben:

  • Das objektorientierte Programmierparadigma, auf dem unsere Brieftasche basiert.
  • Testgetriebene Entwicklung (TDD). Die meisten Funktionen, die wir erstellen, folgen der TDD-Methode, die Dinge zu tun. Wie der Name dieses Ansatzes schon sagt, erstellen wir für jede Funktion die Tests zuerst und sie werden die Weiterentwicklung der Funktionen leiten.
  • Best Practices für die Anwendungssicherheit. Wir werden uns viel um die besten Praktiken für die Anwendungssicherheit kümmern und die Anwendung als ein unternehmenskritisches System behandeln. Ich persönlich habe Skin im Spiel mit dieser Anwendung und ich bemühe mich sehr, die Chance zu minimieren, dass jemand mit dieser Anwendung Geld verliert.
  • Beste Programmierpraktiken. SOLID-Prinzipien und Clean Code durchdringen die Kultur unseres Codes. Dieser Kurs enthält viele Beispiele für beste Programmierpraktiken.

Learning by Doing. Etwa 17% dieses Kurses besteht aus Theorie. Der Rest besteht aus praktischen Kursen. Der Kurs ist stark code-fokussiert und wird bei Bedarf mit einigen Präsentationen eingespielt. Unter jedem Video findest du zusätzliche Links und Studienmaterial auf der Seite Projekte und Ressourcen. Du baust ein Desktop-Bitcoin-Wallet auf und lernst dabei wichtige Bitcoin-Konzepte kennen.

Es wird empfohlen, dass der/die Teilnehmer/in über gute Kenntnisse in objektorientierter Programmierung verfügt, bevor du diesen Kurs besuchst. Java-oder ähnliche Sprachenkenntnisse sind erforderlich. Obwohl dieser Kurs verschiedene Software-Engineering-Konzepte präsentiert, konzentrieren wir uns auf das Verständnis von Bitcoin. Wenn der/die Teilnehmer/in einige der Software-Engineering-Konzepte im Detail wissen möchte, die in diesem Kurs behandelt werden, muss er andere Quellen entlang des Kurses verwenden, um sie besser zu verstehen.

Triff deine:n Kursleiter:in

Teacher Profile Image

Humberto Cezar

Software Developer & Bitcoin Pleb

Kursleiter:in

I have 5+ years of experience as a Professional Software Developer, working especially in the e-commerce industry.

I’ve been a bitcoin enthusiast since 2016. I’ve been heavily studying Bitcoin since then. I’ve developed the open-source bitcoin-java library.

I’ve built the Bitcoin Education initiative to concentrate on providing Bitcoin education for developers worldwide.

Vollständiges Profil ansehen

Skills dieses Kurses

Entwicklung Webentwicklung
Level: Intermediate

Kursbewertung

Erwartungen erfüllt?
    Voll und ganz!
  • 0%
  • Ja
  • 0%
  • Teils teils
  • 0%
  • Eher nicht
  • 0%

Warum lohnt sich eine Mitgliedschaft bei Skillshare?

Nimm an prämierten Skillshare Original-Kursen teil

Jeder Kurs setzt sich aus kurzen Einheiten und praktischen Übungsprojekten zusammen

Mit deiner Mitgliedschaft unterstützt du die Kursleiter:innen auf Skillshare

Lerne von überall aus

Ob auf dem Weg zur Arbeit, zur Uni oder im Flieger - streame oder lade Kurse herunter mit der Skillshare-App und lerne, wo auch immer du möchtest.

Transkripte

1. Einführung: Hallo, Willkommen zum Bitcoin-Entwicklerkurs. Mein Name ist Alberto und ich freue mich, Ihnen den ersten und einzigen Kurs präsentieren zu können, in dem Sie Bitcoin lernen, indem Sie eine Desktop-Bitcoin-Brieftasche erstellen. Lassen Sie uns zunächst erklären, was Sie in diesem Kurs lernen werden. Kurz gesagt, Sie werden lernen, wie Bitcoin aus technischer Sicht funktioniert. Insbesondere erfahren Sie, wie eine Bitcoin-Wallet im Detail funktioniert. Außerdem erfahren Sie, wie ein Bitcoin-Knoten funktioniert und wie man ihn ausführt. Wir werden sehen, wie es mit unserer Brieftasche und anderen Knoten interagiert . Ich werde auch erfahren, wie das Bitcoin-Netzwerk funktioniert und wie es einen Konsens erzielt. Konzepten, die wir lernen werden, gehören Transaktionen, Adressen , Samen, Schlüssel, Guthaben , Blockchain, Mining und Wallet. Da wir während des Kurses eine Desktop-Anwendung erstellen werden, hat der Student die Möglichkeit, die folgenden Fähigkeiten im Bereich der Softwaretechnik zu üben folgenden Fähigkeiten im Bereich der Softwaretechnik , die in der Softwarebranche sehr gefragt sind. Das objektorientierte Programmierparadigma , auf dem unser Wallet basiert. Die meisten Funktionen werden gebaut folgen der testgetriebenen Entwicklungsmethode. Wie der Name dieses Ansatzes schon sagt, werden für jedes Feature zuerst seine Tests erstellt , und die Tests werden die Funktion leiten , die Weiterentwicklung wird sich auch sehr um die Anwendung kümmern . Bewährte Sicherheitsmethoden und behandeln Sie die Anwendung als geschäftskritisches System. Ich persönlich habe in dieser Anwendung Skin in the Game und ich habe große Anstrengungen unternommen, um die Wahrscheinlichkeit zu minimieren, dass jemand damit Geld verliert. Außerdem enthält dieser Kurs viele bewährte Programmierpraktiken, Beispiele, solide Prinzipien und sauberer Code durchdringen die Kultur unseres Codes. Lassen Sie uns nun sehen, wie Sie in diesem Kurs lernen werden. Wir folgen der Methodologie von Learning by Doing. Etwa 17% dieses Kurses bestehen aus Theorie, der Rest besteht aus praktischem Unterricht. Der Kurs ist also stark auf Code ausgerichtet und bei Bedarf mit einigen Präsentationen interkaliert. Unter jedem Video finden Sie zusätzliche Links und Studienmaterial auf der Seite Projekte und Ressourcen. Sie erstellen eine Desktop-Bitcoin-Brieftasche lernen dabei wichtige Bitcoin-Konzepte kennen. Lassen Sie uns nun die empfohlenen Voraussetzungen für die Teilnahme an diesem Kurs auflisten . Es wird empfohlen , dass der Student über gute Kenntnisse in objektorientierter Programmierung verfügt . Der Student muss Java oder ähnliche Sprachen beherrschen bevor er an diesem Kurs teilnehmen kann. Obwohl in diesem Kurs verschiedene Konzepte der Softwaretechnik vorgestellt werden, liegt unser Schwerpunkt auf dem Verständnis von Bitcoin. Wenn der Student einige der in diesem Kurs angesprochenen Konzepte der Softwaretechnik im Detail kennenlernen möchte Konzepte der Softwaretechnik . Es wird während des Kurses andere Quellen verwenden müssen , um sie besser zu verstehen. Sie benötigen einen Computer mit Windows, macOS oder Linux mit einer Internetverbindung. Wir werden diesen Kurs unter Windows präsentieren. Da Java jedoch plattformübergreifend kompatibel ist, funktioniert jeder Code in diesem Kurs auf diesen drei Betriebssystemen auf dieselbe Weise. Der einzige Unterschied besteht darin , die erforderliche Software auf jeder Plattform zu installieren , die erforderliche Software auf jeder Plattform Sie können jedoch leicht Anleitungen finden, um sie auf diesen Betriebssystemen zu installieren. Sie benötigen mindestens 30 GB freien Speicherplatz, um den Bitcoin-Knoten in der Testnetzumgebung auszuführen. Wenn Sie die Anwendung in der Hauptnetzumgebung ausführen möchten, benötigen Sie optional die Anwendung in der Hauptnetzumgebung ausführen möchten, mindestens 430 GB Speicherplatz, um die Hauptnetz-Blockchain herunterzuladen. Aber keine Sorge, wir werden die Hauptnetzumgebung nur im letzten Video des Kurses verwenden die Hauptnetzumgebung . Sie haben also genügend Zeit, um es herunterzuladen, bevor Sie es benötigen. Lassen Sie uns nun etwas mehr über die Brieftasche sprechen, die Sie im Laufe des Kurses aufbauen werden. Ich werde dieses Wallet als BYOD W bezeichnen, eine Abkürzung für Build Your Own Wallet werde mit der Entwicklung dieser Anwendung mit Java 16 beginnen, aber wir werden sie später im Kurs aktualisieren. Diversion 19 wird das Spring Boot Framework Version 2.5, 0.4 verwenden , das einen Dependency Injection Container und viele Funktionen zur Verfügung stellt, die uns bei der Erstellung unserer Anwendung helfen werden einen Dependency Injection Container und . Später im Kurs werden wir es auf Version 2.7, 0.5 aktualisieren. Wir werden Java FX Version 16 im Projekt verwenden. Wir werden es später auf Version 19 aktualisieren. Diese Bibliothek wird Klassen bereitstellen, die uns helfen die grafische Benutzeroberfläche der Anwendung, auch bekannt als Gooey, zu erstellen . Zum Testen verwenden wir Groovy, das Spark-Framework und Test Ethics, um Wallets, Seed-Adressen, Transaktionen und andere Bitcoin-Operationen zu erstellen , Transaktionen und andere Bitcoin-Operationen Wir verwenden die Open-Source-Bitcoin-Java-Bibliothek die ich extra für diesen Kurs gebaut habe. Wir werden den Bitcoin Core Node Version 22 für die Kommunikation mit der Blockchain verwenden . Später im Kurs werden wir es auf Version 23 aktualisieren. Der Bitcoin Core-Knoten kann zwar Wallets und Adressen generieren, verwendet ihn jedoch nur, um Daten aus der Blockchain abzurufen und Daten an die Blockchain zu senden. Vorgänge wie die Generierung von Startkapital, Adressen, Erstellung und Unterzeichnung von Transaktionen werden von unserer Anwendung ausgeführt. Die Ausnahme bilden die Tests. In diesen Fällen verwenden wir die Bitcoin Core Node RPC-API, um Adressen zu generieren, Transaktionen zu senden und Blöcke in den Testumgebungen zu minen. Daher werden wir uns mit den wichtigsten vertraut machen Bitcoin Core Note RPC-API-Methoden und erstellen Sie einen Client, um von unserer Anwendung aus mit ihm zu kommunizieren. Da die Datenbank die SQL-Java-Implementierung verwenden wird , verwendet H SQL DB diese reibungslose Integration die Spring Boot Data JPA-Bibliothek um mit der Datenbank zu kommunizieren. Schließlich werden wir IntelliJ Idea als IDE verwenden , um dieses Projekt zu erstellen. Der gesamte in diesem Kurs vorgestellte Code ist Open Source und auf unserer GitHub-Seite verfügbar. Für jede praktische Lektion enthält die Seite Projekte und Ressourcen zur Vereinfachung der Schüler einen Link mit dem Codeunterschied zwischen den letzten beiden praktischen Klassen . Lassen Sie uns nun vorstellen, wer ich bin. Mein Name ist Alberto Salazar und ich werde Ihr Lehrer in diesem Kurs sein. Ich habe mehr als fünf Jahre Erfahrung als professioneller Softwareentwickler und arbeite insbesondere in der E-Commerce-Branche. Ich bin seit 2016 ein Bitcoin-Enthusiast. Seitdem habe ich intensiv Bitcoins studiert. Ich entwickle die Open-Source-Bitcoin-Java-Bibliothek, die wir in diesem Kurs verwenden werden. Ich habe die Bitcoin-Bildungsinitiative ins Leben gerufen, um meine Bemühungen auf die Bereitstellung von Bitcoin-Schulungen für Entwickler auf der ganzen Welt zu konzentrieren meine Bemühungen auf die Bereitstellung von . Folgen Sie uns auf Twitter, um unsere neuesten Updates zu erhalten. Ich habe den gesamten Code für diesen Kurs, einschließlich der Bitcoin-Java-Bibliothek, auf unserer GitHub-Seite konzentriert . Wir haben auch eine Website , deren Adresse www dot bitcoin education dot site lautet . Wir haben dort einige technische Artikel, die als zusätzliches Studienmaterial dienen können. Schau es dir als letztes Wort an. Ich möchte sagen , dass viel Arbeit in die Erstellung dieses Kurses gesteckt wurde. Die Entstehung dauerte über zwei Jahre und fast meine gesamte Freizeit in dieser Zeit. Wenn Sie also Schwierigkeiten oder Probleme mit diesem Kurs haben, kontaktieren Sie mich bitte , bevor Sie ihn schlecht bewerten, damit wir Ihnen bei Ihrem Problem helfen können. Ich werde gerne alles tun, damit Sie eine großartige Lernerfahrung haben. Vielen Dank für Ihre Aufmerksamkeit und wir sehen uns im nächsten Video. 2. 0 Installieren von Anforderungen Skillshare 2: In diesem Video stellen wir Ihnen die erforderliche Software vor, die Sie herunterladen und installieren müssen , bevor Sie mit den nächsten Videos des Kurses fortfahren können. Beginnen wir also mit dem Bitcoin Core Node. Der Bitcoin Core Node ist die ursprüngliche Implementierung von Bitcoin. Es ist verantwortlich für die Kommunikation mit der Blockchain, das Erstellen, Empfangen, Senden und Validieren von Bitcoin-Transaktionen, Empfang von Blöcken und mehr. Wie wir im vorherigen Video gesagt haben, die Hauptfunktionen vom Bitcoin Core-Knoten ab und beziehen sich auf die Kommunikation mit der Blockchain. Gehen wir also zur Website Bitcoin core.org. Wird Bitcoin Core Version 22 installieren. Sie fragen sich vielleicht, warum nicht Version 23 installieren? Als ich anfing, diesen Kurs zu machen, war die neueste verfügbare Version 22. Es gibt einen kleinen Unterschied in der gRPC-API in Version 23, der dazu führt, dass eine Methode unserer Anwendung nicht richtig funktioniert. In einem der neuesten Videos des Kurses werden wir den Bitcoin Node Two Version 23 aktualisieren und unsere Anwendung damit kompatibel machen. Aber lassen Sie uns vorerst Version 22 installieren. Klicken Sie dazu oben auf dem Bildschirm auf die Schaltfläche zum Auslösen und dann auf den Link Bitcoin Core 22. Klicken Sie anschließend auf der Seite auf diesen Link. Diese Seite enthält Installationsdateien für jedes Betriebssystem. Da ich Windows verwende, lade ich das herunter, das mit Punkt EXE endet. Wenn du macOS verwendest, lädst du dasjenige herunter, das mit dem Punkt DNG endet. Wählen Sie für Linux-Distributionen die passende Dot-GZ-Datei entsprechend der Distribution aus, die Sie verwenden Auf der Seite Projekte und Ressourcen gibt es Links mit Installationsanweisungen für jede Betriebssystem. Für Windows öffnen Sie die Datei nach dem Herunterladen und folgen Sie den Installationsanweisungen auf dem Bildschirm. Ich werde das nicht tun, weil ich es bereits auf meinem Computer installiert habe. Aber es ist ein unkomplizierter Prozess. In der letzten Phase der Installation werden Sie gefragt, ob Sie die Software öffnen möchten. Öffne es noch nicht. Interagiert mit dem Bitcoin-Knoten über die Befehlszeilenschnittstelle. Wenn Sie den Knoten öffnen, indem Sie auf sein Symbol klicken, öffnet er eine grafische Benutzeroberfläche und beginnt die Blockchain in die Hauptnetzumgebung herunterzuladen, was wir noch nicht tun möchten. Lassen Sie uns nun unseren Bitcoin-Knoten konfigurieren. Dazu müssen wir eine Datei mit dem Namen bitcoin.com und den entsprechenden Ordner der Bitcoin-Anwendung erstellen bitcoin.com und den entsprechenden Ordner . Dieser Ordnerspeicherort hängt davon ab , welches Betriebssystem Sie verwenden. Diese Website auf dem Bildschirm zeigt den Standardspeicherort, an dem Sie diese Datei für jedes Betriebssystem erstellen müssen. Um es zu erstellen, öffnen Sie eine Textdatei und speichern Sie sie unter dem Namen bitcoin.com aus dem entsprechenden Ordner für Ihr Betriebssystem. Schreiben Sie nun dieselbe Konfiguration, die Sie auf dem Bildschirm sehen, in Ihre Datei, oder kopieren Sie den Inhalt von der Seite Projekte und Ressourcen und fügen Sie ihn ein. Keine Sorge, wir werden in einem späteren Video erklären, was jede Zeile dieser Datei bedeutet. Zunächst müssen Sie entscheiden, wo Sie die Blockchain-Daten auf Ihrem Computer speichern möchten die Blockchain-Daten auf Ihrem Computer speichern Sie müssen einen Pfad mit Zugriff auf mindestens 30 GB für die Testnetz-Blockchain oder weitere 430 GB wählen mindestens 30 GB für die Testnetz-Blockchain gb für die Hauptnetz-Blockchain. Legen Sie optional die Daten-DIR-Konfiguration auf den ausgewählten Pfad in dieser Datei fest. In meinem Fall habe ich beschlossen, die Blockchain-Dateien auf dem E-Laufwerk im Bitcoin-Datenordner zu speichern die Blockchain-Dateien , wie Sie auf dem Bildschirm sehen. Wenn wir nun den Bitcoin-Knoten mit dieser Konfiguration ausführen, läuft er im Hauptnetz und beginnt mit dem Herunterladen der Hauptnetz-Blockchain. Wie der Name schon sagt, ist die Hauptnetzumgebung die wichtigste Bitcoin-Umgebung, in der die Blockchain groß ist und die Bitcoins einen Wert haben Die Hauptnetzumgebung wird nur in der letzten Video des Kurses. Vorher wird es in der Testnetzumgebung ausgeführt, die für Tests verwendet wird. Um unsere Notiz zur Testnetzumgebung auszuführen, fügen wir in der Datei bitcoin.com eine Zeile mit Testnetz gleich eins hinzu. nun mit dem Terminal zu dem Ordner, Gehen wir nun mit dem Terminal zu dem Ordner, in dem Sie den Bitcoin Core Node installiert haben. Sie im Dämonenordner Führen Sie im Dämonenordner die Bitcoin D-Anwendung wie folgt aus. In den Konsolenprotokollen. Beachten Sie, dass wir Indeed in der Testnetzumgebung ausführen und alle Daten im angegebenen Ordner gespeichert werden. Gut, das bedeutet, dass unser Knoten mit der Konfiguration arbeitet , die wir in der Datei bitcoin.com festgelegt haben. Warten wir nun, bis unser Knoten eine Verbindung zu anderen Knoten hergestellt hat, und beginnen wir mit dem Herunterladen und Validieren der Blockchain. Okay, die Zeilen, die mit dem Hinweis zur Textaktualisierung beginnen , deuten darauf hin, dass mit dem Herunterladen der Blockchain begonnen wurde. Jede dieser Zeilen gibt einen Block heruntergeladener Bitcoin-Transaktionen an. Der Fortschritt in jeder Zeile gibt an, wie stark die Blockchain gesunken ist. In meinem Fall bedeutet dies, dass etwa 98% der Testnetz-Blockchain heruntergeladen wurden. Wenn dieser Wert gleich eins ist, bedeutet dies, dass unsere Kopie der Blockchain vollständig mit denen von anderen Knoten synchronisiert ist . der Testnetzumgebung kann es einige Stunden dauern, bis dies geschieht. Sie können es sinken lassen, während Sie sich den Rest des Kurses ansehen, da wir es erst nach einigen Videos verwenden werden. Um die Anwendung zu beenden, können Sie Strg plus C oder Befehl plus C drücken , wenn Sie Mac OS verwenden Wenn Sie die Notiz erneut starten, wird die Blockchain dort heruntergeladen , wo sie aufgehört hat. Nachdem Sie den Download der Testnetzumgebung abgeschlossen haben, können Sie optional die Bitcoin Dot Conf-Datei ändern und mit dem Herunterladen der Hauptnetz-Blockchain beginnen , indem Sie die Notiz in der Hauptnetzumgebung ausführen. wird nur die Hauptnetzumgebung im letzten Video des Kurses verwenden , sodass du genügend Zeit hast, es herunterzuladen. Die andere erste Anforderung dieses Kurses ist die IntelliJ Idea Java IDE. Es ist die Software, die verwendet wird, um den Code zu schreiben und unsere Anwendung auszuführen. Wenn Sie es nicht haben, rufen die Website auf dem Bildschirm auf, um es herunterzuladen. Laden Sie die Community Edition für Ihr Betriebssystem herunter und installieren Sie sie, indem den Anweisungen auf der Website folgen. 3. Was ist Bitcoin?: Hallo, willkommen zurück zum Bitcoin-Entwicklerkurs. In diesem Kursabschnitt erhalten Sie einen Überblick über Bitcoin. den in diesem Abschnitt vorgestellten Konzepten werden wir das Grundwissen vermitteln, das erforderlich ist, um zu verstehen, was im weiteren Verlauf des Kurses auf Sie zukommt. Also werde ich mit der Frage beginnen, was ist Bitcoin? Bitcoin mit einem großen B ist ein Kommunikationsprotokoll. Dieses Protokoll besteht aus einer Reihe von Regeln, die den Austausch von Nachrichten zwischen den am Bitcoin-Netzwerk beteiligten Einheiten ermöglichen Nachrichten zwischen den am Bitcoin-Netzwerk beteiligten Einheiten . Bitcoin mit einem Kleinbuchstaben b ist eine Kryptowährung. Eine Kryptowährung ist eine Form der digitalen Währung, die wir gegen Waren oder andere Vermögenswerte eintauschen können . Der Krypto-Teil des Namens stammt aus der Kryptografie, die Transaktionen und andere Bitcoin-Operationen schützt. Bitcoin ist auch ein Zahlungssystem. Wir können Bitcoin-Zahlungen an und von anderen Teilnehmern des Bitcoin-Netzwerks senden und empfangen. Apropos Netzwerke Bitcoin ist auch ein Peer-to-Peer-Netzwerk, was bedeutet, dass es aus Entitäten oder Knoten besteht , die direkt zwischen ihnen kommunizieren , ohne : Bitcoin ist auch ein Peer-to-Peer-Netzwerk, was bedeutet, dass es aus Entitäten oder Knoten besteht , die direkt zwischen ihnen kommunizieren, ohne dass zentralisierte Server. Die nächste Frage ist, wann wurde Bitcoin erfunden? Bitcoin wurde 2008 von Satoshi Nakamoto mit der Veröffentlichung des Whitepapers Bitcoin, äh, Peer-to-Peer Electronic Cash System erfunden Satoshi Nakamoto mit der Veröffentlichung des Whitepapers Bitcoin, . In diesem Artikel, den ich sehr empfehlen kann, zu lesen, beschreibt Satoshi die grundlegenden Teile von Bitcoin. Niemand weiß, wer Hitoshi Nakamoto wirklich ist, oder ob es sich überhaupt um einen echten Namen oder mehrere Personen handelt. Wer auch immer Satoshi ist, 2009 veröffentlichte er den ersten Bitcoin-Block, den Genesis-Block, und brachte das Bitcoin-Netzwerk zum Laufen. Wenn Sie nicht wissen, was ein Bitcoin-Block ist, machen Sie sich keine Sorgen. Ich werde es kurz erklären. Was ist also so toll an Bitcoin? Was ist die Innovation von Bitcoin? Bitcoin war die erste, sehr erfolgreiche digitale Währung. Vor Bitcoin gab es einige Versuche, digitale Währungen zu schaffen, aber alle scheiterten an Problemen, die Bitcoin später löst. Eines dieser Probleme ist das Problem der doppelten Ausgaben, das Bitcoin als erstes dezentral gelöst hat. Es passiert, wenn eine Person das Zweifache einer Währungseinheit ausgibt. Eine der Transaktionen wird also später für ungültig erklärt, wodurch der Empfänger der ungültigen Transaktion Geld verliert. Bitcoin war auch für die Erfindung der Blockchain verantwortlich , das Problem der doppelten Ausgaben gelöst wurde. Die Blockchain ist eine Datenstruktur für die Speicherung aller Bitcoin-Transaktionen verantwortlich ist. Es ermöglicht die Validierung all seiner Transaktionen für jeden, der Zugriff darauf hat, aber dazu später mehr. Bitcoin führte auch das Konzept der digitalen Knappheit ein. Das bedeutet, dass Bitcoin im Gegensatz zu Dateien auf Ihrem Computer die auf unbestimmte Zeit kopiert und verteilt werden können, , die auf unbestimmte Zeit kopiert und verteilt werden können, nur von seinem Besitzer übertragen und nicht frei kopiert und verteilt werden kann. 4. Bitcoin Transaktionen und private Schlüssel: Jetzt werden wir etwas tiefer in die inneren Details von Bitcoin eintauchen. Ich werde Bitcoin von Mikro bis Makro erklären. Das heißt, ich werde über Bitcoin-Transaktionen und private Schlüssel sprechen , dann ein wenig über Blockchain und Mining. Dann werde ich den Überblick beenden, indem das Bitcoin-Ökosystem erkläre. Lassen Sie uns also mit der Frage beginnen, wo sind die Kryptowährung und das System? Oder mit anderen Worten, wo ist der Bitcoin mit einem Kleinbuchstaben b im System? Die Antwort ist, es ist in einer Transaktion. Diese Abbildung zeigt eine übliche Bitcoin-Transaktion mit einem Eingang und zwei Ausgängen. Eine Bitcoin-Transaktion kann viele Ein- und Ausgänge haben, aber in vielen Fällen haben sie nur einen Eingang und zwei Ausgänge. Bei einer Bitcoin-Transaktion haben wir die Information, woher der Bitcoin in der Eingabe stammt und wohin der Bitcoin in der Ausgabe geht. In diesem Beispiel enthält Eingabe Null eine Anweisung, die besagt, dass diese Eingabe von John stammt, von John signiert wurde und einen Bitcoin enthielt. Die erste Ausgabe, die Ausgabe Null genannt wurde, sagt Mary, enthält 0,9 Bitcoin. In der ersten Ausgabe heißt es zu John, dass er 0,099 Bitcoin enthält. Diese Ausgabe ist die Änderung der Transaktion. In den meisten Fällen müssen wir eine Änderung einbeziehen , denn wenn Sie Bitcoin aus einer Transaktion ausgeben, müssen Sie alle Einheiten aus der Eingabe ausgeben. Dies führt also zu der Notwendigkeit , einen zusätzlichen Output zu erzeugen, was die Änderung darstellt. Wenn deine Eingabe also mehr Bitcoins enthält, dann möchtest du sie an eine andere Person senden, dann musst du eine zusätzliche Ausgabe erstellen, die Änderung an dich selbst. Wir haben das Konzept von UTXO, was nicht ausgegebene Transaktionsleistung bedeutet. Ein Bitcoin befindet sich genauer gesagt in einem UTXO. Eine Transaktionseingabe muss sich auf einen UTXO aus einer früheren Transaktion beziehen , um diesen Bitcoin für diese Transaktion ausgeben zu können . Wenn Sie feststellen, dass die Summe der Ausgaben geringer ist als die Menge in der Eingabe. Warum ist das so? Der Unterschied ist auf die geringe Gebühr zurückzuführen. jeder Bitcoin-Transaktion muss ein Betrag für die geringe Gebühr separat berechnet werden, damit Ihre Transaktion von einem Minderjährigen in die Blockchain aufgenommen werden kann. Die Höhe der Transaktionsgebühr ist also die Differenz zwischen der Summe der Bitcoins in den Ausgaben und der Summe der Bitcoins in den Eingaben. Eine weitere wichtige Information ist, dass Bitcoin in 100 Millionen Satoshi unterteilt werden kann. Daher hätten wir in dieser Beispieltransaktion sagen können, dass die Eingaben 100 Millionen Satoshi enthielten , die Ausgabe Null enthält 90 Millionen Satoshi und die Ausgangstransaktion 9.900.000 Satoshis. Die geringe Gebühr betrug 100.000 Satoshis. Dies sind weitere Beispiele für Bitcoin-Transaktionen. Ich habe sie nur hier platziert, um zu zeigen, dass Sie Transaktionen mit mehr als einer Eingabe und einem Ausgang haben können . Sie können z. B. eine Transaktion mit zwei Eingängen und einer Ausgabe haben. Diese Transaktion hat keine Änderung. Sie können eine Transaktion mit zwei Eingängen und zwei Ausgängen haben. In diesem Fall enthält die Transaktion Eingaben von zwei verschiedenen Personen und Ausgaben für zwei verschiedene Personen. Diese spezielle Art von Transaktion wird als Coinjoin-Transaktion bezeichnet. Dies ist eine Art von Transaktion, die den Datenschutz erhöht, da Sie bestimmte Eingaben nicht mit bestimmten Ausgaben verknüpfen können . Sie können eine Transaktion mit drei Eingängen und zwei Ausgängen haben. Es gibt noch andere Arten von Transaktionen, wie z. B. Transaktionen mit mehreren Signaturen über die wir jetzt nicht sprechen werden, aber wir können sie später in einen zusätzlichen Kursabschnitt aufnehmen , wenn genügend Nachfrage besteht. Lassen Sie uns etwas mehr über die Details einer Transaktion erfahren. In diesem Bild gibt es zwei Transaktionen, Transaktion eins und Transaktion zwei. Beide Transaktionen haben einen Input und einen Output. Die Eingabe besteht aus drei Feldern, der vorherigen Transaktions-ID und der Ausgangsnummer einer früheren Transaktion sowie einer gültigen Signatur. Die Ausgabe hat zwei Felder, Schicksal, Adresse und Menge, was sich auf den Bitcoin-Betrag in der Ausgabe bezieht . In diesem Fall gibt die Eingabe von Transaktion zwei die Ausgabe Null von Transaktion eins aus. Geben Sie dazu eins von Transaktion bis ein, das sich auf die Transaktions-ID von Transaktion eins beziehen muss . Es muss sich auch auf die Ausgangsnummer von Transaktion eins beziehen , die in diesem Fall Null ist. Schließlich muss es eine gültige Signatur enthalten, die mit dem privaten Schlüssel erstellt wurde , der verwendet wurde, um die Zieladresse von der Ausgabe Null abzuleiten . Weitere Informationen zu diesem Vorgang finden Sie auf der nächsten Folie. Wie Sie vielleicht feststellen, sind private Schlüssel ein grundlegender Bestandteil von Bitcoin. Private Schlüssel werden verwendet, um Bitcoins zu empfangen und zu empfangen. Private Schlüssel werden durch Multiplikation elliptischer Kurven in öffentliche Schlüssel umgewandelt . Nach einer Hash-Funktion werden dann öffentliche Schlüssel in Bitcoin-Adressen umgewandelt. Dies sind die Bitcoin-Adressen, die Sie anderen Personen zeigen können , um Bitcoins zu erhalten. Private Schlüssel werden auch verwendet , um Bitcoin-Transaktionen zuzuweisen. Signaturen sind erforderlich, um Bitcoins von einer Adresse zur anderen zu übertragen . In diesem Bild haben wir eine unsignierte Transaktion. Wenn wir den privaten Schlüssel mit einer Insider-Transaktion unter Verwendung des Elliptic Curve Digital Signature Algorithm ( ECDSA) kombinieren einer Insider-Transaktion unter Verwendung des Elliptic Curve Digital Signature Algorithm , erstellen wir eine Signatur , die wir in diese Transaktion einbeziehen. Somit wird es zu einer signierten Transaktion. Derselbe private Schlüssel, der die Adresse erzeugt hat, die mit einer Eingabe Null versehen wurde, wird auch verwendet, um diese Gelder und die aktuelle Transaktion durch Erstellung der Signatur freizuschalten . Somit wird ein privater Schlüssel indirekt verwendet, um Gelder an einer Adresse zu sperren und Gelder von derselben Adresse durch Erstellung einer Signatur freizuschalten. Das Wichtigste an privaten Schlüsseln und ihren Transformationen ist, dass Sie keinen privaten Schlüssel aus einem öffentlichen Schlüssel und aus einer Bitcoin-Adresse keinen öffentlichen Schlüssel erzeugen können . Sie können auch keinen privaten Schlüssel aus einer Signatur erstellen. Diese Operationen erfolgen nur in eine Richtung, genau wie diese Pfeile zeigen. Ein weiteres wichtiges Merkmal von Bitcoin-Transaktionen ist, dass jeder, der Zugriff auf eine Transaktion hat, Signaturen validieren kann. Dies ist möglich, wenn Sie einen öffentlichen Schlüssel, die Signatur und die Nachricht haben , was in diesem Fall die Transaktion ist. Sie können überprüfen, ob eine Signatur für diesen öffentlichen Schlüssel gültig ist. Und eine Signatur ist nur dann für einen öffentlichen Schlüssel gültig, wenn sie mit einem privaten Schlüssel erstellt wurde , der denselben öffentlichen Schlüssel erzeugt hat. 5. Bitcoin Wallets, die Blockchain und das Mining: Sie nun Grundkenntnisse über private Schlüssel haben, können wir anfangen, über Wallets zu sprechen. Eine Bitcoin-Wallet ist, kurz gesagt, eine Sammlung von privaten Schlüsseln. Es gibt viele Arten und Standards von Geldbörsen. Wallets wurden unabhängig von anderer Bitcoin-Software wie Nodes entwickelt . Eine Grundregel für den Besitz von Bitcoin ist nicht das Mantra. Deine Schlüssel, deine Bitcoins, nicht deine Schlüssel, nicht deine Bitcoins. Dies liegt daran, dass der Besitzer eines privaten Schlüssels Bitcoins übertragen kann , die durch seinen privaten Schlüssel und andere Transaktionen gesperrt sind. Was haben Bitcoin-Wallets gemeinsam? Sie haben eine sichere Möglichkeit, private Schlüssel zu generieren und zu speichern. Sie können mit Bitcoin-Knoten kommunizieren. Sie können Bitcoin-Transaktionen erstellen, signieren und versenden. Sie können Bitcoin-Adressen generieren. Beachten Sie, dass die meisten dieser Fähigkeiten dank der Transformationen privater Schlüssel möglich sind . Jeder Vorgang, der private Schlüssel verwendet , kann offline durchgeführt werden. Sie müssen nur online sein, wenn mit Bitcoin-Knoten kommunizieren, um Informationen aus der Blockchain abzurufen und Informationen an die Blockchain zu senden. Apropos Blockchain, lassen Sie uns endlich sehen, was dieses Schlagwort bedeutet. Die Blockchain wurde verwendet, um das Problem der doppelten Ausgaben dezentral zu lösen. Dazu werden die Transaktionen in einer Blockkette organisiert , sodass gültige Blöcke keine Transaktionen mit einem UTXO enthalten können , die im selben Block oder in früheren Blöcken aufgetreten sind. Um zu verstehen, was die Blockchain ist, schauen wir uns diese Abbildung an. Diese Blöcke stellen Blöcke aus der Blockchain dar. Einige ihrer Daten werden in diesen kleineren Rechtecken dargestellt. In jedem Block. Ein Block besteht aus vielen Transaktionen, einem Feld namens previous hash, das, wie der Name schon sagt, der Hash des vorherigen Blocks ist. Ein Feld namens Timestamp, das das Datum speichert, an dem der Block erstellt wurde, und ein Feld namens Nonce, über das wir auf der nächsten Folie sprechen werden. Jeder Block erzeugt einen Hash , der in den nächsten Block eingefügt wird. Die Blöcke werden in einem Prozess namens Mining erstellt und der Blockchain hinzugefügt . Mining ist der Prozess, bei dem Blöcke in die Blockchain aufgenommen werden. Die Knoten, die diesen Prozess ausführen, werden Miner genannt. Um Blöcke in die Blockchain aufzunehmen, müssen Miner Transaktionen sammeln und sie in einem Block organisieren. Dann müssen Minderjährige den Proof of Work lösen , einen Algorithmus, der zur Erstellung gültiger Blöcke erforderlich ist. Arbeitsnachweis besteht aus den folgenden Schritten. Zuerst wird ein Block gehasht, dann wird die Anzahl der ersten Nullen des resultierenden Hashs überprüft. Wenn diese Zahl größer oder gleich der erforderlichen Anzahl von Nullen ist , um den Block in die Blockchain aufzunehmen. Der Block ist in der Blockchain enthalten. Wenn nicht, ändert der Minor die Nonce und wiederholt den Vorgang. Das ist also die Funktion der Nonce. Sein einziger Zweck besteht darin, einem Block Variabilität zu bieten , um verschiedene Hashes zu erzeugen. Proof-of-Work hat ein interessantes Merkmal. Je mehr Nullen für einen gültigen Arbeitsnachweis erforderlich sind, desto schwieriger ist es, ihn zu finden. Dadurch ist der Schwierigkeitsgrad des Bergbaus leicht einstellbar. Bei Bitcoin wird der Mining-Schwierigkeitsgrad automatisch angepasst, sodass die durchschnittliche Zeit für das Minen eines Blocks 10 Minuten beträgt. Wenn einem Minderjährigen ein Block etwas ausmacht, erhält er eine Blockprämie und alle Gebühren für Blocktransaktionen. Die Blockbelohnung ist die einzige Möglichkeit, neue Bitcoins zu erstellen. Bei einem Ereignis, das als Haben bezeichnet wird, sinkt sie alle vier Jahre um die Hälfte . So wird das Angebot an neu ausgegebenen Bitcoins alle vier Jahre knapper. Und es wird berechnet, dass der letzte Bitcoin gegen 21:40 Uhr abgebaut wird , wenn das gesamte Bitcoin-Angebot 21 Millionen betragen wird. 6. Das Bitcoin-Netzwerk, das Ökosystem und die Prinzipien: Lassen Sie uns nun über das Bitcoin-Netzwerk sprechen. Sehen wir uns die grundlegenden Schritte zur Funktionsweise des Bitcoin-Netzwerks an. Zunächst werden neue Transaktionen an die Knoten gesendet. Jeder Miner sammelt die Transaktionen in einem Block. Jeder Miner versucht so schnell wie möglich einen Block Proof of Work zu finden . Wenn ein Miner einen Arbeitsnachweis findet, überträgt der Minderjährige seinen Gedankenblock an das Netzwerk. Andere Knoten überprüfen, ob der Block gültig ist. Damit ein Block gültig ist, muss er allen Konsensregeln folgen, z. B. allen Transaktionen, und er muss gültig sein und der vorherige Block-Hash muss dem Block-Cache des letzten gültigen Blocks entsprechen . Wenn der Block gültig ist, fügen die Knoten ihn zu ihrer Blockchain hinzu. Kopieren. Kleinerer Beginn der Arbeit an neuen Blöcken wobei das Hash-Feld des letzten Mind-Blocks als vorherigen Hash verwendet wird. Du fragst dich vielleicht, was passiert, wenn zwei Miner gleichzeitig einen gültigen Block minen. Nun, wenn das passiert, führt es zu einer Spaltung des Netzwerks. Teil der Knoten wird eine Version der Blockchain mit einem Block von einem Nebenblock enthalten der Blockchain mit einem Block von einem und der andere Teil des Netzwerks wird einen Block aus dem anderen Nebenblock enthalten. Diese Trennung ist jedoch nur vorübergehend. Wenn der nächste Block abgebaut wird, betrachten die beiden Gruppen von Knoten nur die Blockchain mit mehr Blöcken als die echte Blockchain und die andere Blockchain wird verworfen, die Wahrscheinlichkeit, dass Die Netzwerkaufteilung bleibt bestehen und nimmt mit der Zeit ab. Man kann also davon ausgehen , dass nach sechs Blöcken eine Transaktion für immer in der Blockchain abgewickelt wird. Die Unveränderlichkeit und Sicherheit von Bitcoin-Transaktionen beruht auf der Tatsache, dass es fast unmöglich ist , eine gültige Blockchain mit mehr Blöcken als die ursprüngliche zu erstellen eine gültige Blockchain mit . Eine solche Leistung würde eine immense Menge an Rechenleistung erfordern , um die Geschwindigkeit der Blockgenerierung des ursprünglichen Netzwerks für eine ausreichende Zeit zu übertreffen . wir nun die verschiedenen Teile von Bitcoin kennengelernt haben, wollen wir uns ansehen, wie sie innerhalb des Bitcoin-Ökosystems interagieren . Bitcoin-Benutzer kontrollieren Brieftaschen. Wallets sind, wie Sie gelernt haben, Sammlungen von privaten Schlüsseln. Und diese privaten Schlüssel können verwendet werden, um Transaktionen zu signieren und Adressen für den Empfang von Transaktionen zu erstellen . Börsen können Bitcoins gegen andere Kryptowährungen und Fiat-Währungen wie den Dollar eintauschen. Sie können Bitcoins auch gegen Waren von Händlern eintauschen. Mit wem auch immer Sie Geschäfte tätigen, alle Ihre Transaktionen werden an Bitcoin-Knoten gesendet. Wenn ein Minderjähriger Ihre Transaktion sieht, kann er sie in einen Block aufnehmen. Der Miner erstellt einen Block mit vielen Transaktionen und fährt mit dem Mining des Blocks fort. Das heißt, er beginnt, den Blockproof-of-Work mit seiner Hardware zu berechnen . Wenn ein Minderjähriger den Block endlich als Arbeitsnachweis findet, überträgt er den Block an andere Bitcoin-Knoten. Die anderen Knoten erhalten den kürzlich bestätigten Mindblock. Wenn der Block gültig ist, fügen die Knoten ihn zu ihrer Kopie der Blockchain hinzu. Auf diese Weise erreicht das Netzwerk einen Konsens über den aktuellen Stand der Blockchain. Lassen Sie uns über die Bitcoin-Prinzipien sprechen. Die Bitcoin-Prinzipien sind wichtig, um die technischen Entscheidungen zu verstehen , die während der Bitcoin-Entwicklung getroffen wurden . Eines dieser Prinzipien ist das Bitcoin-Höchstangebot von 21 Millionen Bitcoins. Dieses Limit wurde zu Beginn des Projekts festgelegt. Eine Änderung würde zu diesen Regelungen in der Bitcoin-Wirtschaft führen . Deshalb ist es wichtig , dass es so bleibt. Zensurwiderstand ist ein weiteres wichtiges Bitcoin-Prinzip. Die Tatsache, dass viele Menschen Bitcoin-Knoten betreiben können, macht es einer Behörde fast unmöglich , das Netzwerk herunterzufahren. Bitcoin-Entwickler legen Wert auf eine hohe Zensurresistenz. Open Source zu sein ist ein weiteres Bitcoin-Prinzip. Sie finden die Bitcoin Core-Software kostenlos auf der GitHub-Website. Wie bei vielen anderen Entwicklern können Sie den Code überprüfen und auf Fehler überprüfen. Sie können auch an seiner Entwicklung teilnehmen. Bitcoin hat eine starke Entwickler-Community die für seine Sicherheit und neue Funktionen verantwortlich ist. Und Open Source zu sein ist das, was es ermöglicht. Bitcoin ist erlaubnislos, was bedeutet , dass jeder einen Bitcoin-Knoten betreiben, Bitcoins minen und Transaktionen tätigen darf. Das ist eine der größten Stärken von Bitcoin und was ihn heute auf der ganzen Welt so beliebt macht. Bitcoin-Transaktionen sind pseudonym. Das bedeutet, dass keine Informationen, die in einer Bitcoin-Transaktion enthalten sind, allein mit Personen in Verbindung gebracht werden können. Im Gegensatz zu dem Beispiel vom Anfang der Übersicht könnte vorgeschlagen haben, dass Bitcoin-Transaktionen nicht die Namen und IDs von Empfängern und Absendern enthalten . Eine Bitcoin-Transaktion zeigt nur Übertragungen zwischen Bitcoin-Adressen, die wie zufällige Ansammlungen von Zeichen aussahen. Wenn jemand herausfindet, dass eine Adresse einer bestimmten Person gehört, kann er die Menge an Bitcoin und anderen Transaktionen dieser Person verfolgen . Aber das ist eine andere Geschichte. Bitcoin strebt eine hohe Fungibilität an. Fungibilität ist ein Merkmal , das dafür sorgt, dass eine Währungseinheit genauso bewertet wird wie jede andere Einheit derselben Währung. Das bedeutet, dass im Idealfall jeder Bitcoin gleich bewertet und behandelt wird. Es wird oft argumentiert, dass Bitcoin nicht fungibel ist, weil Bitcoins aus verschiedenen Transaktionen zurückverfolgt und unterschiedlich behandelt werden können. Ich würde sagen, dass, obwohl dies in der Praxis zutrifft, die meisten Bitcoins gleich behandelt werden und Sie Möglichkeiten haben , Transaktionen privater und fungibler zu gestalten. Die Irreversibilität von Transaktionen ist ein weiteres Bitcoin-Prinzip. Sobald eine Transaktion in der Blockchain abgewickelt ist, kann sie nicht mehr rückgängig gemacht werden. Dies ist ein wichtiges Sicherheitsmerkmal , da es die Konfiszierung von Bitcoin erschwert. Es verlagert aber auch die Verantwortung für eine Transaktion auf das Bitcoin-Zentrum. Daher müssen Sie Ihre privaten Schlüssel sicher aufbewahren. 7. 5 Starten des Projekts skillshare 2: In diesem Video richten wir ein neues Spring Boot-Projekt ein , das unsere Bitcoin-Wallet sein wird. Dazu verwenden wir das Spring-Initializer-Tool von der Website start dot spring dot io. Also betritt die Website. Wählen Sie das Maven-Projekt. Die Sprache ist Java, ich verwende diese Version von Spring Boot, aber wenn sie für Sie nicht verfügbar ist, können Sie die Standardversion als Gruppennamen wählen. Sie können einen beliebigen Namen festlegen. In meinem Fall stelle ich es als BYOD w Dot Wallet ein. Ich verwende BYOD W als Artefaktnamen, als Beschreibung. Ich werde die Bitcoin-Wallet verwenden. Wir verwenden die neueste Version von Java. Wenn Sie nur frühere Versionen von Java kennen, machen Sie sich keine Sorgen Ältere Java-Funktionen funktionieren immer noch der neuesten Version, da Java abwärtskompatibel ist. Klicken Sie abschließend auf Generieren, um das Projekt herunterzuladen, öffnen und seinen Inhalt in den gewünschten Ordner zu extrahieren zu öffnen und seinen Inhalt in den gewünschten Ordner zu extrahieren. Jetzt öffnen wir das Projekt mit intelligenter Idee. Nachdem Sie das Programm gestartet haben, klicken Sie auf Öffnen und wählen Sie dann den Ordner aus, den Sie gerade extrahiert haben. Klicken Sie auf Trust Project. Warten Sie, bis IntelliJ idea alle Projektdateien indexiert. Danach können Sie die Dateien untersuchen, die Spring Initializer automatisch erstellt hat. Um zu überprüfen, ob das Projekt korrekt eingerichtet wurde. Klicken Sie auf der rechten Seite des Bildschirms auf Maven. Doppelklicken Sie dann im Lifecycle-Ordner auf Test. Ups, wir haben einen Maven-Fehler. Um diesen Fehler zu beheben, klicken wir auf den Konfigurationsdialog. Lasst uns den Maven-Startpfad auf gebündeltes Maven Three ändern. Klicken Sie dann auf Anwenden. Okay. Bevor ich erneut auf Test klicke, überprüfe ich, ob meine Projektstruktur korrekt eingerichtet wurde. Also klicke ich auf Datei. Dann stellt die Projektstruktur sicher, dass das Projekt-SDK die Java-Version enthält die Sie als Spring-Initializer ausgewählt haben. Wenn dies nicht der Fall ist, klicken Sie auf SDK hinzufügen und laden Sie das SDK herunter, wählen Sie die richtige Java-Version und eine ihrer Implementierungen klicken Sie auf Download. In meinem Fall werde ich das nicht tun, weil ich bereits die richtige Version habe. Also klicke ich auf Abbrechen. Stellen Sie sicher, dass das Projekt-Sprachniveau auch auf die richtige Java-Version eingestellt ist. Lassen Sie uns den Test nun erneut durchführen. Warte, bis der Test bestanden ist. Großartig. Die Konsole zeigt an , dass der Test bestanden wurde. Wir sind bereit, mit der Arbeit an unserer Brieftasche zu beginnen. 8. 6 Konfigurieren des GUI 2: In diesem Video beginnen wir mit der Erstellung des ersten Fensters unserer Brieftasche. Dazu fügen wir zunächst einige Abhängigkeiten zu unserem Projekt hinzu. Öffnen Sie die Palm Dot-XML-Datei im Stammverzeichnis des Projekts. Die Palm Dot-XML-Datei enthält alle externen Abhängigkeiten des Projekts. Wir werden einige Java FX-Abhängigkeiten hinzufügen. Java FX ist ein Framework für grafische Benutzeroberflächenfunktionen verantwortlich ist. Es ist in der Java-Community sehr bekannt. Die Version ist 16. Die nächste Abhängigkeit ist JavaFX, FXML. Die Version ist ebenfalls 16. Wir werden auch ein Plugin hinzufügen. Es heißt Java FX Maven Plugin. Die Version ist 0.0, 0.6. Um diese Abhängigkeiten in Ihr Projekt zu laden, klicken Sie auf dieses Symbol. Das Projekt hat alle Abhängigkeiten geladen. Lassen Sie uns nun den Code machen zum Booten unserer Anwendung erforderlich ist. Dieser Prozess erfordert eine gewisse Abstimmung zwischen der Art und Weise, wie Spring Boot und Java-Effekte beginnen. Dazu erstellen wir zunächst eine neue Java-Klasse namens GUI-Anwendung. Diese Klasse muss die Anwendungsklasse von Java-Effekten erweitern . Und wir müssen die Startmethode aus derselben Klasse implementieren . Wir fügen eine private Eigenschaft mit dem Typ konfigurierbarer Anwendungskontext hinzu. Wir verwenden als Nächstes. Wir fügen hier die Init-Methode hinzu, die vor der Startmethode während der Anwendungsinitialisierung ausgeführt wird . Der Code, den ich gerade eingebe, ist für die Initialisierung der in die Spring Boot-Anwendung injizierten Abhängigkeiten verantwortlich Initialisierung der in die Spring Boot-Anwendung . Gehen wir nun zur BYOD W-Anwendungsklasse. Lassen Sie uns die Hauptmethode ändern. Die Hauptmethode dieser Klasse ist die erste Methode, die aufgerufen wird, wenn wir unsere Anwendung ausführen. Wenn der Code, den ich gerade eingebe, ausgeführt wird, ruft er zuerst die Init-Methode der GUI-Anwendungsklasse auf und nicht die Startmethode derselben Klasse. Kehren wir zur GUI-Anwendungsklasse zurück. Lassen Sie uns die Startmethode weiter implementieren. Jetzt rufen wir die Methode publish event für die Context-Eigenschaft auf und übergeben ein neues, von der GUI gestartetes Ereignisobjekt, das next als Argument erstellt wird. Lassen Sie uns die Gooey Start-Event-Klasse erstellen. Wir erstellen es in einem neuen Event-Ordner. Aufgrund der Art und Weise, wie wir diese Klasse erstellt haben, wusste die ID bereits, welche Klasse wir erweitern mussten, und sie hat automatisch erstellt, der Boilerplate-Code muss sehr praktisch sein, nicht wahr? Jetzt werden wir unseren Konstruktor weiter implementieren. Wir rufen den Superkonstruktor auf und übergeben ein GUI-Anwendungsobjekt als Argument. Und wir weisen das Argument Primary Stage der Phase zu. Private Property erstellt auch einen Listener für diese Ereignisklasse in einem Paket namens Listeners. Wir werden die Komponentenannotation zu dieser Klasse hinzufügen. Sie werden diese Anmerkung im Laufe des Kurses häufig sehen. Es ist von Spring Boot und hat den Zweck ein Objekt einer Klasse für die Injektion verfügbar zu machen . Andere Objekte des Projekts implementieren auch die Application Listener-Schnittstelle für diese Klasse, wobei das Gooey Start-Event als Typparameter übergeben wird. Dies ist notwendig, damit Spring Boot diese Klasse als Ereignis-Listener für ein klebriges gestartetes Ereignis interpretieren diese Klasse als Ereignis-Listener für ein kann. Jetzt implementieren wir die erforderliche Methode der Schnittstelle. Benötigt auch einen Konstruktor. Dieser Konstruktor verwendet ein Ressourcenobjekt mit einer Wertanmerkung, die auf eine Datei namens Main Window Dot FXML verweist , die dem Projekt später hinzugefügt wird. Der Konstruktor verwendet auch ein Anwendungskontextargument . Dann initialisieren wir private Eigenschaften mit demselben Namen wie die Konstruktorargumente. Macht beide Eigenschaften endgültig. Okay, jetzt, da wir unsere Abhängigkeiten in diese Klasse eingefügt haben , wollen wir den Code der Anwendungsereignismethode implementieren. Dieser Code ist dafür verantwortlich, dass das Hauptfenster unserer Brieftasche angezeigt wird , wenn wir das Programm starten. Also instanziieren wir zuerst ein FXML-Loader-Objekt. Dann erhalten wir das Stage-Objekt aus dem GUI-Start-Event. Dazu fügen wir die Methode gets stage zur Klasse gooey started Event hinzu. Diese Methode gibt das Stage-Objekt zurück. Wir fügen der Brieftasche einen Titel hinzu, indem die set-Titel-Methode des Stage-Objekts verwenden. Es kann eine beliebige Zeichenfolge sein. Ich stelle es als BYOD W Wallet ein. Dieser Text wird in der oberen Leiste des Programmfensters angezeigt. Ruft auch die Methode set scene auf und übergibt ein neues Szenenobjekt als Parameter, übergibt ein neues Szenenobjekt als das mit einem Objekt instanziiert wird, das von einer neuen Methode zurückgegeben wird, die FXML initialisieren wird. Diese Methode beginnt mit der Deklaration einer Variablen vom Typ parent namens root. In einem try-catch-Block wird dann die Methode set location aus der FXML-Loader-Variablen verwendet , die den URL-Standort unserer FXML-Eigenschaft übergeben wird. Wir setzen die Controller-Factory des FXML-Loaders auf eine Referenz der Good Bean-Methode der Context-Eigenschaft. Dies ist erforderlich, damit das JavaFX-Framework Controller-Klassen erkennen kann, die mit der Komponentenannotation annotiert sind. Wir setzen auch die Root-Variable auf das Ergebnis des Aufrufs der Lademethode Der FXML-Loader fängt eine IOException ab und löst sie als Runtime-Exception aus. Wir geben die Root-Variable zurück. Schließlich wird bei der Methode ohne Anwendung die Show-Methode der Stufe aufgerufen, wodurch das Fenster auf dem Bildschirm angezeigt wird. Jetzt erstellen wir die FXML-Datei, aber wir haben auf die Wertanmerkung der FXML-Eigenschaft des Listener-Konstruktors verwiesen . Und eine FXML-Datei ist ein Dateityp, der zum Kodieren von GUI-Elementen einer JavaFX-Anwendung verwendet wird . Wie eine HTML-Datei kodiert es Webseiten, FXML-Dateien und Code. Java-Effektfenster erstellen diese Datei innerhalb des neuen FXML-Pfads , der erstellt wird. Dieses Verzeichnis befindet sich im Ressourcenpfad. Wir nennen es Main Underscore Window Dot FXML. Lassen Sie uns das automatisch generierte Boilerplate löschen. Lassen Sie uns ein Randbereichs-Tag hinzufügen. Wir werden einige Attribute hinzufügen. Fügt eine Fx-ID hinzu, die es ermöglicht, auf das Border Pane-Tag innerhalb seiner Controller-Klasse zu verweisen , das später erstellt wird. Lassen Sie uns einige Attribute hinzufügen , um die Fenstergröße festzulegen. Schließlich fügen wir einige Metallattribute , um das Dateischema festzulegen. Das ist es. Lassen Sie uns die Anwendung ausführen , um zu sehen, ob alles gut gegangen ist. im Maven-Tab Klicken wir im Maven-Tab auf Plug-ins, Spring Boot und Spring Boot werden ausgeführt. Großartig. Das erste Fenster unserer Brieftasche ist auf dem Bildschirm aufgetaucht. Gute Arbeit. 9. 7 Erstellen unseres ersten wallet 1 Skillshare 2: In diesem Video beginnen wir mit der Erstellung eines Tests für die erste Funktion unseres Wallets. Die erste Funktion unserer Brieftasche wird die Option sein, eine Brieftasche zu erstellen. Insbesondere erstellen wir ein Menü mit einer Schaltfläche , die beim Anklicken ein Dialogfeld auf dem Bildschirm öffnet. Dieses Dialogfeld enthält zunächst ein TextField, in dem der Benutzer den Wallet-Namen definiert und eine Schaltfläche „Erstellen“, die beim Anklicken einen zufälligen mnemonischen Startwert generiert. Werde lernen, was der mnemonische Samen ist. Im nächsten Video werden wir alle Funktionen unseres Wallets mithilfe des testgetriebenen Entwicklungs - oder TDD-Ansatzes erstellen . Dieser Ansatz besteht darin , zunächst einen Integrationstest zu erstellen handelt es sich um einen Test, der beschreibt, was wir mit dieser Funktion erreichen wollen. Dann implementieren wir die Funktion und führen den Test durch, bis er bestanden ist. Während der Implementierung können wir auf Situationen stoßen, in denen wir neue Klassen oder Methoden entwickeln müssen , um unsere Ziele zu erreichen. Wenn das der Fall ist, erstellen wir Unit-Tests für diese Klassen als Methoden und implementieren sie mit TDD. Am Ende jedes TDD-Zyklus überarbeiten wir unseren Code bei Bedarf. Mal sehen, wie das in der Praxis funktioniert. Aber lassen Sie uns zunächst einige Abhängigkeiten zu unserem Projekt hinzufügen. Wir werden einige Abhängigkeiten im Zusammenhang mit dem Spark-Framework hinzufügen . Das Spark-Framework ist ein Testframework in Groovy, einer Programmiersprache, die mit Java kompatibel ist. Es enthält Funktionen, die Bautests erleichtern, wird auch eine mit Spock kompatible Version von Test FX verwenden. Test FX ist ein Framework , das Funktionen zum Testen von JavaFX-Anwendungen bereitstellt . Lassen Sie uns nun Groovy Version 3.0, 0.6 zu unserer POM-Datei hinzufügen . Und fügen wir Spock Spring hinzu. Die Version wird 2.0 sein, Groovy 3.0. Sein Umfang wird getestet. Die nächste Abhängigkeit, die hinzugefügt wird, ist Spark Core. Die Version wird dieselbe wie Spock Spring sein. Der Umfang wird getestet. Die nächste Abhängigkeit wird Test FX Spock sein. Die Version wird 4.0 sein, 0.16 Alpha wird auch ein G Maven-Plugin hinzufügen. Okay, ich habe vergessen den richtigen Umfang und die Test-FX-Abhängigkeit anzugeben. Wir werden auch einige Ziele im GI Maven-Plugin hinzufügen. Es wird notwendig sein, dass Groovy korrekt funktioniert. Jetzt nehmen wir eine Änderung in der Datei mit den Punkteigenschaften der Anwendung vor. Spring erstellt standardmäßig einen Webserver, aber wir benötigen keinen in unserer Anwendung. Also müssen wir diese Eigenschaft auf „Keine“ setzen. Spring erstellt also beim Booten keinen Webserver. Jetzt erstellen wir unseren ersten Test. Aber zuerst löschen wir diese Datei. BYOD W application test , der vom Spring-Initializer automatisch generiert wurde, erstellt in diesem Ordner ein Paket namens gooey , das alle unsere grafischen Benutzer enthält Schnittstellentests. In diesem Paket erstellen wir den Test. jedoch zuerst in der Palm Dot-XML-Datei Klicken Sie jedoch zuerst in der Palm Dot-XML-Datei auf die Schaltfläche Maven Changes laden. Jetzt können wir mit der IDE tolle Klassen erstellen. Lassen Sie uns also einen namens Create Wallet Test erstellen. Wir fügen dieser Klasse eine Spring Boot-Test-Annotation diese Klasse um die Klasse der Anwendungsspezifikationsklasse erweitert. Dies ist sowohl für Spring Boot als auch für test fx erforderlich , um diese Klasse als Testklasse zu betrachten. Jeder Integrationstest muss diese Anmerkung und Erweiterung enthalten. Wir müssen die Startmethode aus der Anwendungsspezifikation implementieren . Wir werden auch die Unit- und Stop-Methoden implementieren. Innerhalb der Init-Methode wird dieser Code hinzugefügt , der für die Testinitialisierung erforderlich ist. Die Stop-Methode enthält einen Code, der zum Beenden des Tests erforderlich ist. Bei der Stark-Methode müssen wir den Code angeben, der für die Anzeige des ersten Bildschirms unserer Anwendung erforderlich ist. Dieser Code wird dem Code ähneln, der in der GUI gestarteten Listener-Klasse vorhanden ist. Wir instanziieren also einen FXML-Loader der die FXML-URL als Argument übergibt, erstellen dann die private Eigenschaft FXML mit derselben Wertanmerkung, die in der GUI gestarteten Listener-Klasse vorhanden ist. Groovy transformiert jede Methode bei der Getter in einer Objekteigenschaft gesetzt Wir können diese URL hier verwenden. Anstelle von get URL wird die Controller-Factory-Eigenschaft auf die Context-Get-Bean-Methodenreferenz gesetzt . Fügen wir der Klasse das Kontextfeld hinzu. Oben. Die automatische verkabelte Anmerkung wird eingefügt. Diese Anmerkung ist erforderlich, damit Spring Boot das Anwendungskontextobjekt aus seinem Abhängigkeitsinjektionscontainer das Anwendungskontextobjekt aus in diese Variable einfügen kann. Als Nächstes erstellen wir die Root-Variable mit der Lademethode aus dem FXML-Loader. Dann legen wir den Titel der Bühne die Szene fest und rufen die Stage-Show-Methode genauso wie der Code im Gooey Start-Listener. Okay, wir sind bereit, am Code unseres ersten Tests zu arbeiten. Der Name des Tests lautet should create wallet. Der Test enthält die Anforderungen der Funktion, die wir implementieren möchten, und verwendet das Schlüsselwort, wann, um die Aktionen zu beschreiben, die der Testbenutzer ausführen wird. Also lasst es uns umsetzen. Der Benutzer klickt auf eine Schaltfläche mit dem bekannten Text. Dann klickst du auf eine Schaltfläche mit der Text-Wallet. Dann in einem Textfeld mit einer FX-ID oder einem Namen. Wenn wir auf eine FX-ID verweisen möchten, setzen wir den Namen der ID nach einem Rautenzeichen wie diesem. Dann schreibt der Benutzer die Wörter MyText Wallet. Dann klickt er auf eine Schaltfläche mit dem Erstellungstext. Als Nächstes sucht der Test nach dem Inhalt eines Textbereichs mit einer Ethik-ID von mnemonic seed. Es wird den Inhalt dieses Feldes der mnemonischen Startvariablen zuweisen . Schließlich verwenden wir dann das Schlüsselwort , um zu definieren, was wir erwarten , nachdem der Benutzer alle Aktionen innerhalb des Windblocks ausgeführt hat. Wir erwarten, dass die mnemonische Startvariable einen Wert ungleich Null enthält. Dazu fügen wir einfach die mnemonische Seed-Variable in den Thann-Block ein. Wenn der mnemonische Startwert gesetzt ist, wird der Block als wahr ausgewertet und der Test wird bestanden. Andernfalls wird es als falsch bewertet und der Test wird nicht bestanden. Lassen Sie uns diesen Test durchführen , um zu sehen, was passiert. Zuerst klicken wir auf Build und dann auf Rebuild project , um sicherzustellen, dass die IDE alle Änderungen lädt , die wir am Code vorgenommen haben. Dann klicken wir auf der Registerkarte Maven Config auf Test . *****. Die IDE hat sich erneut über Maven beschwert, lassen Sie uns das schnell beheben. Jetzt. Lassen Sie uns den Test noch einmal durchführen. Der Test ist erwartungsgemäß fehlgeschlagen. Haben Sie bemerkt, dass während des Tests schnell ein Fenster auf dem Bildschirm auftauchte ? Es zeigt zumindest, dass unser Fenster geöffnet ist. Lassen Sie uns die Ergebnisse unserer Tests auf der Konsole überprüfen. Es heißt, dass die Abfrage new keine Knoten zurückgibt. Der Test öffnete unsere Anwendung und versuchte dann, ein Element zu finden, dessen Text bekannt war, da es nicht gefunden Er schlug schnell fehl und schloss die Anwendung. Im nächsten Video erfahren wir, was ein mnemonischer Samen ist. In dem Video nach dem nächsten erstellen wir dann unser erstes Wallet und lassen diesen Test bestehen. Wir sehen uns. 10. Mnemonic Seeds: In diesem Video erfahren wir mehr über mnemonische Samen. Also, was ist der mnemonische Samen? Ein mnemonischer Samen ist ein Satz, der 121-51-8201 oder 24 Wörter enthält . Es wird verwendet, um alle Wallets, privaten Schlüssel und Adressen abzuleiten . Die Regeln der mnemonischen Samengenerierung , die wir verwenden werden, sind im Bitcoin Improvement Proposal 39 oder BIP 39 beschrieben . Viele Wallets nutzten die BIP 39-Regeln , um mnemonische Samen zu generieren. Mnemonische Samen werden mit der Zeichenfolge mnemonic plus einem optionalen Passwort kombiniert , um einen Root-Seed zu erzeugen , der hier im Hexadezimalformat dargestellt wird. Das optionale Passwort wird allgemein als Passphrase bezeichnet , aber der Einfachheit halber verwenden wir das Wort Passwort. Dann generiert der Roots-Seed mithilfe anderer Algorithmen private Schlüssel, öffentliche Schlüssel und Adressen Die Einzelheiten dieser Operationen erfahren Sie in einem späteren Video. Konzentrieren wir uns nun darauf, wie mnemonische Samen erzeugt werden. Um einen mnemonischen Startwert zu erzeugen, müssen wir zunächst eine zufällige Folge von Bits erzeugen, die als Entropie bezeichnet wird und deren Länge 128 Bit entspricht. Wenn wir einen mnemonischen Ausgangswert von 12 Wörtern wollen, 160 Bit, wenn wir einen mit 15 Wörtern wollen, 192 Bit, wenn wir einen mit 18 Wörtern wollen, 224 Bit, wenn wir einen mit 21 Wörtern wollen, oder 256 Bit, wenn wir einen mit 24 Wörtern wollen, dann berechnen wir die Prüfsumme. Dazu berechnen wir die Entropielänge geteilt durch 32 und erhalten die Prüfsummengröße. Dann erhalten wir die ersten Bits der Prüfsummengröße des SHA-256-Hashs der Entropie. Das Ergebnis ist die Prüfsumme. Die Prüfsumme wird verwendet, um zu überprüfen, ob ein bestimmter mnemonischer Startwert gültig ist. Wir hängen die Prüfsumme an das Ende der ursprünglichen Entropie an. Das Ergebnis wird in Gruppen von 11 Bit aufgeteilt. Jede Gruppe von 11 Bit wird in eine Zahl 0-2047 umgewandelt. Diese Zahlen werden als Indizes in einer Wortliste verwendet. Die entsprechenden Wörter bilden den mnemonischen Samen. 11. 9 Erstellen unserer ersten Wallet Teil 2 skillshare 2: In diesem Video werden wir weiterhin die Funktion „Wallet erstellen“ unserer Anwendung implementieren . Der erste Schritt besteht darin, eine Schaltfläche hinzuzufügen , auf der der Text neu geschrieben ist. Lass uns das machen. Öffnen Sie das Hauptfenster mit der Punkt-FXML-Datei. Ab sofort verwenden wir das IDE Scene Builder-Tool , um die Fenster unseres Projekts zu erstellen. Mit Scene Builder können wir die grafische Benutzeroberfläche unserer Anwendung interaktiv und einfach erstellen die grafische Benutzeroberfläche unserer . Klicken Sie unten auf dem Bildschirm auf die Schaltfläche Scene Builder . In meinem Fall erschien dieses Fenster. Wenn Sie jedoch Java FX oder Scene Builder nicht installiert haben , erscheint oben auf Ihrem Bildschirm eine Schaltfläche zum Herunterladen . Nachdem Sie sie heruntergeladen und installiert haben, wird dieses Fenster angezeigt. Jetzt fügen wir dem Hauptfenster eine obere Menüleiste hinzu. Dazu klicken wir auf Steuerelemente und ziehen dann die Menüleistenkomponente per Drag & Drop in den oberen Teil des Rahmenfenstermenüs unten. Jetzt haben wir eine Menüleiste mit drei Menüpunkten. Lassen Sie uns die Bearbeitungs- und Hilfestellungen löschen. Lassen Sie uns das Dateimenü mit der Bezeichnung two new ändern. Großartig. Jetzt haben wir unseren neuen Button. Schauen wir uns unseren Test an, um zu sehen, was als Nächstes zu tun ist. Die nächste Aktion, die unser Benutzer ausführen wird, ist, auf die Wallet-Schaltfläche zu klicken . Lass es uns erstellen. Zurück zum Hauptfenster. Wir fügen dem neuen Menü einen Menüpunkt hinzu. In diesem Fall haben wir bereits einen Menüpunkt. Lassen Sie uns also das Etikett in Wallet ändern. Wenn der Benutzer auf die Wallet-Schaltfläche klickt, muss ein neues Dialogfenster erscheinen. Lassen Sie uns es im Scene Builder implementieren. Klicken Sie auf den Wallet-Menüpunkt. Wir fügen dieser Schaltfläche eine Aktion hinzu. Klicken Sie auf Code, geben Sie den Dialog Wallet erstellen ein. Wenn wir unten auf dem Bildschirm auf die Schaltfläche Text klicken und die FXML-Datei überprüfen. Wir werden feststellen, dass die IDE dem Menüeintrags-Tag das Attribut on action mit dem Wert hinzugefügt hat Menüeintrags-Tag das Attribut on action mit dem , den wir gerade eingegeben haben. Um nun eine Aktion für diese Schaltfläche zu erstellen, muss ein Controller erstellt werden. Aber lassen Sie uns zuerst etwas Refactoring in unserem Code vornehmen. Wir erstellen ein neues Paket innerhalb des BYOD W-Pakets. Nennen wir es gooey, überträgt die Events- und Listener-Pakete darauf und fügt diesem Paket alle Klassen hinzu, die sich auf die grafische Benutzeroberfläche der Anwendung beziehen die sich auf die grafische Benutzeroberfläche der Anwendung . Zurück zum Hauptfenster, fügt dem Border Pane-Tag ein FX-Controller-Attribut hinzu und setzt es auf den neuen Controller, den wir erstellen werden, um den neuen Controller, den wir erstellen werden es in einem neuen Controller-Paket zu erstellen. In der klebrigen Verpackung. Sein Name wird Main Window Controller sein. Jede FXML-Datei kann einen Controller haben , der verwendet wird, um die Aktionen zu definieren , die als Reaktion auf die Interaktionen des Benutzers mit dem von diesem FXML codierten Fenster ausgeführt werden. In unserem Fall enthält der Hauptfenstercontroller Code , der Aktionen als Reaktion auf Ereignisse im Hauptfenster definiert . Zurück zur Punkt-FXML-Datei im Hauptfenster. Wenn wir auf das Dialogattribut Open create wallet klicken und Alt plus Enter drücken, zeigt die IDE die Option zum Erstellen einer Methode im Hauptfenster-Controller an. Klicken Sie auf diese Option. Die IDE hat die Methode automatisch im Hauptfenster-Controller generiert . Lassen Sie uns das Aktionsereignisargument löschen , da wir es nicht benötigen. In dieser Methode wird der Code enthalten, der für das Öffnen des Dialogs „Brieftasche erstellen“ verantwortlich ist. Wenn wir auf den Wallet-Menüpunkt klicken, wird zuerst ein Dialogobjekt vom Typ Button instanziiert . Dann setzen wir die Dialoge in seinem Besitzer auf das Randfenster, um anzuzeigen, dass der Dialog zum Randbereich des Hauptfensters gehört . Zurück zur Punkt-FXML-Datei im Hauptfenster. Wir können auf das Ethik-ID-Attribut des Randpane-Tags klicken , Alt plus Eingabetaste drücken und die Randbereichs-Eigenschaft im Hauptfenster-Controller erstellen die Randbereichs-Eigenschaft . Die IDE hat die Eigenschaft automatisch generiert. Setzen wir es auf privat und fügen die FXML-Annotation darüber ein, um anzuzeigen, dass es sich auf eine FXML-Komponente bezieht. Dann legen wir den Titel des Dialogs fest, um ein neues Wallet zu erstellen. In einem try-catch-Block wird nun ein FXML-Loader-Objekt instanziiert. Diese Argumente weiterzugeben. Anschließend erstellen wir die Dialogeigenschaft „ Wallet erstellen und die Context-Eigenschaft. Dann erstellen wir einen Konstruktor , um beide Eigenschaften zu initialisieren. Beide Eigenschaften werden automatisch vom Spring-Abhängigkeitsinjektionscontainer eingefügt . Der Container fügt eine Wertanmerkung Argument des Dialogkonstruktors create wallet übergibt den Pfad eines FXML Datei, die als Nächstes erstellt wird. Dann setzen wir den Inhalt des Dialogs auf das Ergebnis des Aufrufs der Methode load. Der FXML-Loader fängt dann eine IOException ab und löst sie als Runtime-Exception aus. Schließlich rufen wir die Dialogshow and Wait-Methode auf, um den Dialog zu öffnen. Vergessen Sie nicht, die Komponentenannotation zu dieser Klasse hinzuzufügen . Lassen Sie uns nun unsere Anwendung ausführen , um zu sehen, was wir bisher haben. im Maven-Tab in den Plugins und Spring Boot Klicken Sie im Maven-Tab in den Plugins und Spring Boot auf Spring Boot Run. Wir haben unsere obere Menüleiste mit der Schaltfläche „Neu“ und der Brieftaschen-Schaltfläche. Wenn wir auf die Wallet-Schaltfläche klicken, löst die Anwendung eine Ausnahme aus. Das liegt daran, dass die FXML-Datei mit dem Dialogfeld „ Wallet erstellen“ nicht gefunden wurde. Lass es uns erstellen. Nachdem Sie es erstellt haben, klicken Sie auf Scene Builder. Lassen Sie uns dieses Ankerfenster löschen. Ziehe den Dialogschmerz und lege ihn hier ab. Gut. Lassen Sie uns die Größe anpassen. Klicken Sie auf Layout. Geben Sie dann im Feld Pref-Höhe 500 ein, im Feld Pref-Breite den Wert 50. Stellen Sie dann die benutzerdefinierte Vorbereitungsgröße die Felder Min-Breite und Min-Höhe ein. Jetzt fügen wir dem Fenster einen Header-Text hinzu. Geben Sie in das Header-Textfeld ein. Gib deinem Wallet einen Namen und klicke auf Erstellen. Lassen Sie uns etwas Polsterung hinzufügen. Gut. Lassen Sie uns nun ein Rasterfenster hinzufügen. Ziehen Sie diese Komponente per Drag-and-Drop in das Dialogfenster unten. In der ersten Zelle des Rasterfensters wird eine Bezeichnung wie diese hinzugefügt. Und dieser beschriftete Text wird den Namen der Text-Brieftasche enthalten. Wir fügen dem Rasterbereich auch ein Textfeld hinzu. Lassen Sie uns seine Koordinaten ändern und seinen Spaltenindex auf eins setzen. Lassen Sie uns nun dem Rasterbereich eine Schaltfläche hinzufügen. Ändern Sie seinen Zeilenindex in eins und seinen Spaltenindex in eins. Lassen Sie uns den Text ändern, um ihn zu erstellen. Kehren wir zu unserem Test zurück, um zu überprüfen, was er sonst noch benötigt. Es wird versucht, auf eine Komponente mit einer Ethik-ID oder einem Namen zu klicken . Fügen wir also dem Textfeld eine Fx-ID des Namens hinzu. Danach wird es versuchen, meine Text-Wallet in das Textfeld zu schreiben . Dann klickt es auf eine Komponente mit dem Text Create, create mit einem Großbuchstaben C. Wenn es darauf klickt, der Test nach dem Inhalt eines Textbereichs mit einer FX-Idee von mnemonic seed. Lassen Sie uns also diesen Textbereich erstellen. Ziehen Sie es in das Rasterfenster darunter. Ändern Sie dann seinen Zeilenindex auf zwei und seinen Spaltenbereich auf zwei, sodass das mnemonische Startfeld den Platz von zwei Spalten einnimmt. Gut. Wir werden auch eine Bezeichnung für das Feld mnemonisches Saatgut hinzufügen. Aber zuerst fügen wir dem Rasterbereich eine weitere Zeile hinzu. Gut. Erhöhen wir den Zeilenindex des mnemonischen Startfeldes auf drei. Dann ziehen wir ein Label in den Rasterbereich. Passen Sie den Zeilenindex auf zwei an und ändern Sie den Text auf mnemonischen Startwert. Fügen wir nun dem Textbereich eine Fx-ID von mnemonic seed hinzu. Lassen Sie uns nun unsere Anwendung ausführen und sehen, was passiert. zuerst das Projekt neu und klicken Sie auf Spring Boot Run. Großartig. Aber wenn wir auf Erstellen klicken, passiert nichts. Wir müssen uns auch um den Abschluss unseres Dialogs kümmern. Klicken Sie vorerst auf Stopp. Die Positionierung dieser Felder stört mich ein bisschen. Lass uns das reparieren. Klicken Sie auf die Schaltfläche Text. Wir haben das Rasterfenster in das Header-Tag des Dialogs eingefügt. Der richtige Ort , um es aufzunehmen, ist im Content-Tag. Lass es uns ändern. Lassen Sie uns jetzt sein Aussehen im Scene Builder überprüfen. Toll, jetzt sieht es viel besser aus. Im nächsten Video werden wir die Funktion „Wallet erstellen“ weiter implementieren . Wir sehen uns. 12. 10 Erstellen unseres ersten wallet 3 skillshare 2: In diesem Video werden wir weiterhin die Funktion „Wallet erstellen“ implementieren und schließlich unseren ersten GUI-Testbestand bestehen. Um dies zu tun, fügen wir dem Projekt eine Abhängigkeit hinzu. Wir werden Bitcoin -, Java- und Open-Source-Bibliotheken hinzufügen , die exklusiv für diesen Kurs erstellt wurden. Diese Bibliothek enthält viele Hilfsprogramme im Zusammenhang mit Bitcoin, z. B. Methoden zur Generierung zufälliger mnemonischer Samen, Build-Transaktionen und vieles mehr. Damit diese Bibliothek korrekt funktioniert , müssen wir ein Plugin-Ziel hinzufügen, das die Dateiwortliste Punkt TXT von Bitcoin Java während der Kompilierungsphase der Anwendungen in das Projekt kopiert Bitcoin Java während der Kompilierungsphase der Anwendungen in das Projekt Bauprozess. Wordless Dot TXT enthält alle gültigen Wörter für die mnemonische Samengenerierung. Öffnen Sie nun den Dialog Wallet erstellen mit dem Punkt FXML. Wechseln Sie zur Textansicht. Wir fügen diesem FXML einen Controller hinzu, um der Schaltfläche Erstellen eine Aktion hinzuzufügen. Lassen Sie uns also das FX-Controller-Attribut zum Dialogue-Schmerztag hinzufügen . Der Name des Controllers wird erstellt, Wallet Dialogue Controller, und wir fügen ihn dem Controller-Paket hinzu. Wie bei jedem Controller wird die Komponentenannotation hinzugefügt. Lassen Sie uns die mnemonische Seed-Eigenschaft in diesem Controller erstellen . Im FXML fügen wir der Schaltfläche Erstellen eine Aktion hinzu. Lass es uns hier hinzufügen. Wir geben der Aktion den Namen create mnemonic seed. Und wir erstellen es im entsprechenden Controller. Wenn der Benutzer also auf die Schaltfläche Erstellen klickt, wird diese Methode aufgerufen und der Textbereich zeigt einen zufälligen mnemonischen Startwert an. Also setzen wir die mnemonischen Seed-Texte auf das Ergebnis der create-Methode, die der mnemonische Seed-Service als Nächstes erstellt. Lassen Sie uns den mnemonischen Seed-Service in diese Klasse einbauen. Lassen Sie uns nun die mnemonische Seed-Service-Klasse innerhalb des neuen Pakets namens api dot services innerhalb des BYOD W-Pakets erstellen des neuen Pakets namens api dot . Grundsätzlich wird jede Business Class, die nichts mit der grafischen Benutzeroberfläche zu tun wird jede Business Class, die nichts mit der grafischen Benutzeroberfläche im API-Paket platziert. Lassen Sie uns die Methode create zum mnemonischen Seed-Service hinzufügen. Fügen Sie die Service-Annotation zu dieser Klasse hinzu. Zweck ist identisch mit der Komponentenannotation, aber sie ist eher für Serviceklassen geeignet . Lassen Sie uns nun die Eigenschaft mnemonic Seed Service im Create Wallet-Konstruktor initialisieren . Lassen Sie uns nun diese Methode implementieren, da wir TDD verwenden, um unsere Anwendung zu erstellen. Wir erstellen zunächst einen Komponententest für diese Klasse. Lassen Sie uns ein API-Paket im Testordner erstellen. Erstellen Sie darin eine tolle Klasse namens mnemonic Seed Service Test. Als Unit-Test muss diese Klasse nur die Spezifikationsklasse von Spock erweitern. Jetzt erstellen wir einen Test namens should return random mnemonic seed. Und wir erwarten, dass der mnemonische Seed-Service einen Wert ungleich Null zurückgibt. Lassen Sie uns hier den mnemonischen Seed-Service instanziieren. Lassen Sie uns diesen Test durchführen, um zu überprüfen, was passiert. Es ist wie erwartet gescheitert. Lassen Sie uns diese Methode implementieren. Dazu verwenden wir die Methode generate random der mnemonic Seed Generator-Klasse von Bitcoin Java. Wir müssen die Anzahl der Bits der Entropien, die wir als Argument für den mnemonischen Samen haben wollen, an 56 übergeben Bits der Entropien, die wir als Argument für den mnemonischen Samen haben wollen . Denken Sie daran, dass eine Entropie von 256 Bit einen mnemonischen Ausgangswert von 24 Wörtern erzeugt. Schließlich rufen wir bei Rückgabe dieser Methode die Methode get sentenced auf und geben das Ergebnis zurück. Wie bei jedem Job, einer überprüften Ausnahme, müssen wir auch den Satz throws fileNotFoundException zur Create-Methodensignatur hinzufügen . Dasselbe müssen wir mit der Methode create mnemonic seed im Create Wallet Dialogue Controller tun. Lassen Sie uns diesen Test noch einmal durchführen. Toll, der Test ist bestanden. Lassen Sie uns nun überprüfen, was passiert , wenn wir unsere Anwendung ausführen. Hoppla, und ein Fehler ist aufgetreten. Oh, es ist in diesem Tag mit einem großen W überschrieben. Dieses Gruppen-ID-Tag ist ebenfalls falsch. Eigentlich ist es nur Bitcoin-Bindestrichbildung. Lassen Sie uns unsere Anwendung erneut ausführen. Großartig. Wir haben erfolgreich einen mnemonischen Startwert generiert, aber ich möchte, dass der Text umbrochen wird. Lass es uns reparieren. Gehen wir zum Dialogfeld „ Wallet erstellen“ Punkt FXML. Klicken Sie im Scene Builder auf den Textbereich und dann auf das Kontrollkästchen The Wrap Text. Lassen Sie uns das Projekt erneut ausführen. Okay, viel besser. Lassen Sie uns jetzt alle unsere Tests durchführen. Großartig. Sie haben alle bestanden. 13. 11 Erstellen unseres ersten wallet 4 skillshare 2: In diesem Video werden wir die Funktion „Wallet erstellen“ in unseren Anwendungen weiterentwickeln . Fügt dem Dialog „Brieftasche erstellen“ eine Schaltfläche „OK“ und eine Schaltfläche zum Abbrechen hinzu. Wenn der Benutzer auf die Schaltfläche OK klickt, wird sein Wallet erstellt und der Name der Brieftasche wird oben auf dem Bildschirm angezeigt. Wenn er auf die Schaltfläche Abbrechen klickt, wird der Dialog einfach geschlossen. Außerdem fügen wir der Schaltfläche Okay eine Einschränkung hinzu , sodass sie standardmäßig deaktiviert ist und nur aktiviert wird , wenn der Name und die mnemonischen Startfelder erfüllt sind. Schließlich fügen wir ein optionales Passwortfeld sodass der Benutzer nur nach Eingabe des richtigen Passworts auf sein Wallet zugreifen und damit Transaktionen tätigen kann auf sein Wallet zugreifen und damit Transaktionen . Lassen Sie uns diese neuen Funktionen zuerst in unserem Create Wallet-Test hinzufügen . Zuerst fügen wir eine Aktion zum Klicken auf die Schaltfläche OK hinzu. Dann erwarten wir, dass der Etappentitel dem Namen unserer Anwendung entspricht . Dash ist der Name unseres Wallets, das ist mein Test-Wallet. Lassen Sie uns nun die Stage-Eigenschaft erstellen. Wir initialisieren es in der Startmethode. Lassen Sie uns nun einen weiteren Test erstellen, um zu überprüfen, was passiert, wenn der Benutzer versucht , auf die Schaltfläche Abbrechen zu klicken. Dazu erstellen wir einen Test mit dem Namen sollte die Wallet-Erstellung stornieren. Wir erwarten also, dass keine Ausnahme ausgelöst wird, wenn der Benutzer auf ein neues Wallet klickt und es storniert . Lassen Sie uns diese Tests durchführen , um zu sehen, was passiert. Die Tests sind erwartungsgemäß fehlgeschlagen. Lassen Sie uns diese Funktionen implementieren. Gehen Sie zum Dialogfeld „Brieftasche erstellen“ (Punkt FXML-Datei). Klicken Sie auf das Dialogfenster auf der linken Seite. Fügen Sie dann eine OK-Schaltfläche hinzu und dieses Feld für Schaltflächentypen. Klicken Sie auf Plus und fügen Sie dann eine Schaltfläche zum Stornieren hinzu. Jetzt fügen wir das Passwortfeld hinzu. Aber lassen Sie uns zuerst eine weitere Zeile im Rasterbereich hinzufügen. Verschieben wir nun den Namen, Bezeichnung und das Feld in die erste Zeile. Dann fügen wir in der nächsten Zeile eine Passwortbezeichnung und ein Passwortfeld hinzu. Fügen wir dem Passwortfeld auch eine Fx-Idee für ein Passwort hinzu. Lassen Sie uns nun den Text der Dialogüberschrift wie folgt ändern . Wenn wir schon dabei sind, lassen Sie uns das Feld für den mnemonischen Startwert nicht bearbeitbar machen . Dies ist eine Sicherheitsmaßnahme , da wir nicht möchten, dass der Benutzer seinen mnemonischen Startwert versehentlich ändert. Wechseln Sie zur Textansicht. Wir werden einige Änderungen an diesen Schaltflächen hinzufügen, Tags in der Schaltfläche Okay, wir werden eine Fx-Idee von okay hinzufügen. Die Schaltfläche Abbrechen löscht Inhalt und fügt eine Fx-Idee zum Abbrechen hinzu. Wir fügen außerdem den Wert storniert in der Nähe der Attributschaltflächendaten hinzu. Wir fügen dem Textattribut auch die Abbruchzeichenfolge hinzu. Dies ist erforderlich, denn wenn wir die standardmäßige Schaltfläche zum Abbrechen verwenden, wird der Text in die Sprache des Computers übersetzt, und das wollen wir nicht. Lassen Sie uns nun einige Änderungen am Create Dialogue Controller vornehmen. Fügt eine Methode namens initialize hinzu. Aber zuerst kehren wir zu seinem FXML zurück und fügen dem Dialogue-Schmerztag eine Fx-ID von Dialogue Pain hinzu. Lassen Sie uns nun die Eigenschaften mit einer FX-ID zum Controller hinzufügen . Wird das mit den Eigenschaften Passwort Dialog Pain, OK und Cancel tun. Nun zurück zur initialisierten Methode. Diese Methode wird nach der Initialisierung des Dialogs ausgeführt . Wird dort Code enthalten, um die Aktionen der einzelnen Tasten zu definieren. Zunächst definieren wir die Aktion der Schaltfläche Abbrechen. Wenn ein Benutzer darauf klickt, wird der Dialog ausgeblendet. Also nennen wir die Lookup Button Method des Dialogs als Schmerz und geben dabei die Schaltfläche Abbrechen als Argument weiter. Dann fügen wir einen Event-Handler hinzu und übergeben das Aktionsargument und einen Callback, übergeben das Aktionsargument der die Hide-Methode des Dialog-Pains-Fensters aufruft . Dasselbe machen wir mit der Schaltfläche Okay. Aber stattdessen nennen wir im Callback die Methode create wallet. Fügen wir den gleichen Code um das Fenster bei der Create Wallet-Methode vorerst auszublenden und die Anwendung auszuführen , um zu sehen, was passiert. Wenn wir auf die Schaltfläche Abbrechen klicken, wird der Dialog ausgeblendet. Das Gleiche passiert, wenn wir auf die Schaltfläche Okay klicken. Gut. Aber wenn wir auf das X an der Seite des Dialogs klicken, passiert nichts. Lass uns das reparieren. Gehen Sie zum Hauptfenstercontroller. Sie müssen den folgenden Code angeben, um das Dialogfenster zu schließen , wenn wir auf die X-Schaltfläche klicken. Lassen Sie uns nun die Anwendung ausführen und es erneut versuchen. Gut, das hat es behoben. Lassen Sie uns auch die im Dialog aufgerufene Show and Wait-Methode ändern Dialog aufgerufene Show and Wait-Methode um einfach zu zeigen, dass das die Dinge ein wenig vereinfacht. Führen Sie die Anwendung nun erneut aus. Alles funktioniert weiterhin wie erwartet. Aber es gibt noch ein anderes Problem mit dem Dialog. Es ermöglicht die Erstellung von Wallets ohne Namen und Gedächtnischarakter. Wir möchten, dass jede Brieftasche einen Namen und einen mnemonischen Samen hat. Also müssen wir die Schaltfläche Okay deaktivieren, wenn eine nicht erfüllt wird . Lass uns das reparieren. Gehen Sie zum Dialog-Controller „Wallet erstellen“. Jetzt erstellen wir eine private Eigenschaft vom Typ Boolesche Bindung mit dem Namen „ Alle erforderlichen Eingaben sind voll“. Wir legen diese Eigenschaft in der initialisierten Methode mit dem folgenden Code fest. Hier verwenden wir eine anonyme Java-Klasse , die die boolesche Bindung erweitert. Dann initialisieren wir die Klasse mit der bind-Methode übergeben den Namen und die mnemonischen Seed-Texteigenschaften als Argumente. Dann enthält die Compute-Value-Methode einen Code, der nur dann true zurückgibt, wenn die Felder Name und mnemonic seed nicht leer sind. Jetzt erstellen wir eine Getter-Methode für diese Eigenschaft. Schließlich rufen wir die Methode für deaktivierte Eigenschaften auf der Schaltfläche Okay auf. Dann rufen wir bind für das Ergebnis auf und übergeben die Methode get all required inputs are all required inputs are full und rufen die Methode darauf auf. Lassen Sie uns zuerst eine kleine Korrektur an dieser Methode vornehmen, sie muss eine boolesche Bindung zurückgeben. Und lass uns das entfernen, danach suchen. Gut. Lassen Sie uns jetzt unsere Anwendung erneut ausführen. Okay, die Schaltfläche Okay ist standardmäßig deaktiviert. Wenn wir etwas in das Feld für den Walletnamen eingeben, bleibt es deaktiviert. Wenn wir jedoch auf die Schaltfläche Erstellen klicken, wird sie aktiviert. Großartig. Lassen Sie uns unsere Tests noch einmal durchführen. Dieser sollte den Wallet-Test erstellen ist fehlgeschlagen, da wir den Code zur Änderung des Anwendungstitels noch nicht implementiert haben. Lass uns das im nächsten Video machen. 14. 12 Erstellen unseres ersten wallet 5 skillshare 2: In diesem Video werden wir eine Funktion implementieren, mit der die Anwendung das Wallet lädt und seinen Namen im Titel der Anwendung anzeigt. Nachdem der Benutzer die Brieftasche erstellt hat. Erstellt Code, der später nützlich sein wird , wenn wir Funktionen anderer Wallets wie Adressen auf dem Bildschirm anzeigen möchten . Nachdem wir diese Funktion implementiert haben, wird dieser Test erfolgreich sein, da der Titel der Stufe dem BYOD W-Walletspace, dem Dash Space und dem Namen der Brieftasche entspricht . Also lasst es uns umsetzen. Zuerst. Wir gehen zum Create Wallet Controller. Bei dieser Methode wird dann ein Wallet mit einem neuen Dienst namens create wallet service und einer Methode namens create erstellt. Wir geben den Namen, das Passwort und den mnemonischen Startwert der Brieftasche an die Methode weiter. Jetzt erstellen wir die Wallet-Klasse. Wir fügen ein neues Paket in BYOD W hinzu, nennen es Domains. Darin wird ein neuer Java-Record namens Wallet hinzugefügt. Vorerst fügen wir diesem Datensatz nur ein Zeichenkettenattribut namens name hinzu. Ein Java-Record ist ein neues Feature der Sprache. Jedes Datensatzattribut hat einen eingebauten Getter und einen Konstruktor, sodass wir sie nicht hinzufügen müssen. Importieren Sie nun den Wallet-Datensatz in den Dialogcontroller „Brieftasche erstellen“. Jetzt fügen wir den Create Wallet Service in diese Klasse ein. Und wir werden diese Klasse innerhalb des API-Services-Pakets erstellen . Fügt die Komponentenannotation zu dieser Klasse hinzu. Lassen Sie uns diesen Service in den Konstruktor dieser Klasse einfügen. Jetzt erstellen wir die Methode create innerhalb des Create-Wallet-Dienstes. Vorerst geben wir nur eine neue Brieftasche zurück, die den Namen als Parameter an den Dialogcontroller „Brieftasche erstellen“ zurückgibt . Nachdem wir das Wallet erstellt haben, wird ein Ereignis veröffentlicht , das die erstellte Brieftasche als Parameter verwendet. Dieses Ereignis wird von einer Klasse abgehört , sodass der Listener, wenn der Benutzer ein Wallet erstellt, das aktuell von der Anwendung geladene Wallet aktualisiert . Lassen Sie uns den Anwendungskontext in diese Klasse einfügen. Lassen Sie uns nun das erstellte Wallet-Ereignis im Event-Paket erstellen. Ruft dann den Superkonstruktor übergibt den Dialogcontroller Create Wallet. Und wir legen ein neues Wallet-Feld das Wallet-Konstruktorargument zuweisen wird auch ein Getter für dieses Feld enthalten. Lassen Sie uns nun einen Listener für dieses Ereignis erstellen , der als created wallet listener bezeichnet wird. Und wir werden es im Listener-Paket erstellen. Es implementiert die Application-Listener-Klasse mit dem erstellten Wallet-Ereignis als Parameter. Implementiert die Methode dann bei einem Anwendungsereignis. Es ruft eine Methode von einem neuen Dienst namens Update Current Wallet Service auf. Diese Methode namens Update verwendet die Events-Wallet als Parameter. Lassen Sie uns diesen neuen Service in diese Klasse einfügen und den Service erstellen. Wir werden es in ein neues Servicepaket aufnehmen. In der klebrigen Verpackung. Wird dann die Aktualisierungsmethode darin erstellen. Wir werden ihm auch eine Service-Anmerkung hinzufügen. Vorerst setzt die Aktualisierungsmethode nur den Namen der aktuellen Brieftasche auf den neu erstellten Wallet-Namen. Lassen Sie uns nun in BYOD W ein neues Paket namens Observables erstellen . In diesem Paket wird die aktuelle Wallet-Klasse erstellt. Zurück zum Aktuellen Wallet-Dienst instanziiert das aktuelle Wallet in seinem Konstruktor. In der aktuellen Wallet-Klasse wird die Komponentenannotation enthalten sein. Diese Klasse steht für das aktuelle Wallet, das von der Anwendung geladen wurde. Jede Änderung, die die Anwendung an dieser Klasseninstanz vornimmt wird in der grafischen Benutzeroberfläche der Anwendung angezeigt. Wir haben es in ein Paket namens Observable aufgenommen, da jede Eigenschaft dieser Klasse nicht beobachtbar sein wird. Und Observable ist eine Art von Objekt , bei dem jede Zustandsänderung abgehört und von anderen Objekten ausgeführt werden kann . Die erste beobachtbare Eigenschaft wir hinzufügen werden, ist der Name. Es wird den einfachen String-Eigenschaftstyp haben. Dieser Typ implementiert das Observable-Interface und löst ein Änderungsereignis aus, wenn sich der Zeichenkettenwert ändert. Wir instanziieren es hier. Und wir werden einen Getter für dieses Feld erstellen. Idee von Intellij identifizierte, dass es sich um ein Observable handelt, und schuf zwei Getter. Eine für die Eigenschaft namens Name-Eigenschaft und die andere für den Eigenschaftswert namens getName erstellt ebenfalls einen Setter für dieses Feld, um den Wert der Namenseigenschaft festzulegen. Machen wir dieses Feld endgültig. Ich werde auch einen Test für diese Serviceklasse „Wallet erstellen“ durchführen. Wir hätten den Test erstellen sollen , bevor wir diese Methode implementiert haben, da wir TDD verwenden. Aber wenn man bedenkt, dass wir die Funktionalität dieser Methode erhöhen werden , sofern dies verziehen wird. Lassen Sie uns den Test erstellen. Jetzt. Wir erstellen zunächst eine Eigenschaft für den Create-Wallet-Dienst und instanziieren sie innerhalb der Setup-Methode , die vor jedem Test ausgeführt wird. Dann erstellen wir einen Test namens should create wallet. Vorausgesetzt, wir haben einen Namen, ein Passwort und einen mnemonischen Startwert. Wenn wir die Methode create vom Create Wallet-Dienst mit diesen Parametern aufrufen . Dann erwarten wir, dass der Wallet-Name der Namensvariablen entspricht. Lass uns den Test machen. Der Test ist bestanden. Lassen Sie uns nun zusammenfassen, was wir bisher getan haben. Wenn der Benutzer auf die Schaltfläche OK klickt, die Methode „Wallet erstellen“ aus dem Dialogcontroller wird die Methode „Wallet erstellen“ aus dem Dialogcontroller „Brieftasche erstellen“ aufgerufen und das Wallet wird vom Wallet-Dienst erstellt. Dazu verwendet es die Methode create, wobei der Name, das Passwort und der vom Benutzer gewählte mnemonische Startwert verwendet werden. Derzeit gibt diese Methode nur eine neue Brieftasche mit ihrem Namen zurück. Dann übergeben wir das erstellte Wallet an ein neu erstelltes Wallet-Ereignis und veröffentlichen dieses Ereignis. In diesem Fall wird die erstellte Wallet-Listener-Methode bei einem Anwendungsereignis ausgelöst . Es erhält das erstellte Wallet-Ereignis als Parameter. Wir müssen die Komponentenannotation zu dieser Klasse hinzufügen und den Update Current Wallet-Dienst in ihren Konstruktor einfügen . Die Anwendungsereignismethode ruft also die Aktualisierungsmethode vom Aktualisierungsdienst für die aktuelle Brieftasche übergibt die Brieftasche aus dem Ereignis als Parameter. Schließlich die Aktualisierungsmethode. Wir setzen den Namen der aktuellen Brieftasche auf den Namen der neu erstellten Brieftasche. Gehen wir nun zurück zum Hauptfenstercontroller. Hier wird eine initialisierte Methode erstellt, die ausgeführt wird, bevor das Hauptanwendungsfenster angezeigt wird. Darin wird der aktuellen Wallet-Eigenschaft ein Listener hinzugefügt . Lassen Sie uns zuerst die aktuelle Brieftasche in diese Klasse injizieren. Innerhalb der Ad-Listener-Methode wird ein Callback übergeben , der drei Parameter sowie einen beobachtbaren und alten Wert benötigt , und ein neuer Wert im Callback-Body erhält die Windows-Stufe und weisen Sie es der Stufenvariablen zu. Wir müssen seinen Typ auf die Bühne bringen. Dann setzen wir den Titel auf BYOD W wallet space, dash space, new value. Die neue Wertvariable enthält den neuen Wert des Namens der aktuellen Brieftasche. Immer wenn sich der aktuelle Wallet-Name ändert, wird diese Änderung durch diesen Callback berücksichtigt und auch der Etappentitel ändert sich zu dem Satz, den wir gerade gesagt haben. Lassen Sie uns die Anwendung ausführen , um zu überprüfen, ob das funktioniert. Wir erstellen ein neues Wallet mit dem Namenstest, dann einem mnemonischen Startwert und klicken auf, Okay, super, es hat funktioniert. Der Fenstertitel wurde in BYU OWL geändert, ein Dashtest. Lassen Sie uns eine weitere Brieftasche mit einem anderen Namen erstellen , um zu sehen, was passiert. Wie erwartet. Es wurde geändert, um es der neu erstellten Brieftasche anzupassen. Lassen Sie uns jetzt alle unsere Tests durchführen. Großartig. Alle Tests wurden bestanden. Gute Arbeit. 15. 13 Erstellen unseres ersten wallet 6 skillshare 2: In diesem Video beginnen wir mit Implementierung einer Funktion , mit der wir Adressen erstellen können , die später für den Empfang von Bitcoins verwendet werden . Als erstes erstellen wir den Tab Empfangen. Dieser Tab enthält die abgeleiteten Adressen unserer Brieftasche. Gehen Sie also zum Hauptfenster mit der Punkt-FXML-Datei. Im Scene Builder wird ein V-Feld in der Mitte des Randbereichs enthalten . In der V-Box befindet sich ein Tab-Bereich. Löscht den zweiten Tab , der erstellt wurde, automatisch. Ändern Sie den Text der verbleibenden Tabs, der empfangen werden soll. Im VBox-Konfigurationsmenü wird die Pref-Höhe auf 300 gesetzt. Auf der Registerkarte Empfangen befindet sich ein Rasterbereich. Aus irgendeinem Grund können wir mit dem Scene Builder keinen Rasterbereich in eine Registerkarte einbinden . Kein Problem. Wir machen das mit dem Texteditor. Stattdessen. Wir fügen ein Etikett hinzu. Der Text entspricht der Empfangsadresse. Darin werden einige Tags hinzugefügt, um die Ränder festzulegen. Jetzt fügen wir ein Textfeld hinzu. Es wird nicht bearbeitbar sein. Es wird 350 als bevorzugte Breite haben. Und sein Spaltenindex wird gleich eins sein dieselben Randtags für Rasterfenster enthalten , die wir zuvor verwendet haben. Der Scene Builder funktioniert aufgrund des Rasterfensters, das wir in die Registerkarte aufgenommen haben, nicht mehr . Kein Problem. Wir werden sehen, wie die Anwendung aussieht, wenn wir sie ausführen. Großartig, unsere Brieftasche ist jetzt bereit, eine Adresse in diesem neuen Feld zu erhalten , das wir gerade erstellt haben. Der Test zum Erstellen einer Brieftasche enthält einen Code, mit dem überprüft werden kann, ob eine Adresse erstellt und nach der Erstellung der Brieftasche in das Feld für die Empfangsadresse eingefügt wurde. Nachdem der Test also auf die Schaltfläche OK geklickt hat, wird auf die Registerkarte Empfangen geklickt. Und der Test sucht den Inhalt des Empfangsadressfeldes nach und speichert ihn in der Adressvariablen. Dann wird der Test bestätigen, wenn die Adresse nicht bekannt ist, lassen Sie uns den Test ausführen, um zu sehen, was passiert. Der Test ist erwartungsgemäß fehlgeschlagen. Lassen Sie uns nun etwas Refactoring und unsere FXML-Datei im Hauptfenster durchführen. Wir sehen jetzt, dass unsere FXML-Hauptdatei immer größer wird. Es ist besser, eine neue FXML-Datei nur für die Registerkarte „Empfangen“ zu erstellen , die sich das Hauptfenster später beziehen wird. Also lass es uns erstellen. Wir nennen es den Tab Empfangen Punkt FXML kopiert den gesamten Inhalt der Registerkarte auf den Tab Empfangen, Punkt FXML. Die einzige Änderung, die wir vornehmen werden, betrifft das Tab-Tag. Wir ändern es in f x colon root. Dann verwenden wir die Tab-Klasse als Typattribut. Wir müssen auch das Metaattribut XML und S Colon FX einbeziehen . Jetzt importieren wir die anderen Tags. Zurück zum Hauptfenster wird dot FXML das Tab-Tag und seinen gesamten Inhalt löschen. Enthält den Tag-Receive-Tab-Controller , der jetzt erstellt wird. Wir erstellen es im Controller-Paket. Und lassen Sie uns es in den Hauptfensterpunkt FXML importieren. Zurück zur Registerkarte Empfangen fügt der Controller die Komponentenannotation zu dieser Klasse hinzu. Wir erstellen einen Konstruktor, der eine Ressource mit einer Wertanmerkung übergibt , die auf die Registerkarte „Empfangen“ zeigt. Die FXML-Datei übergibt auch den Anwendungskontext. Hier konfigurieren wir eine neue FXML-Loader-Instanz mit Parametern, die denen ähneln, die wir für die anderen Controller verwendet haben. Dann stellen wir seinen Controller darauf ein. Wir werden auch seinen Weg dorthin festlegen. Dann rufen wir die Lademethode darauf auf. Okay, wir müssen noch etwas tun, damit es funktioniert. in der Gooey Start-Listener-Klasse hier den folgenden Code hinzu. Dieser Code ist erforderlich, um Java FX mitzuteilen , wie benutzerdefinierte Komponenten erstellt werden sollen, z. B. den Receive Tab Controller, wenn er ihn in den FXML-Dateien sieht. Dieser Code veranlasst Java FX die Methode Context to Get Bean zu verwenden um eine Komponente zu erstellen, wenn ein Receive-Tab-Controller-Tag angezeigt wird. Wann immer Java FX also ein Receive-Tab-Controller-Tag erstellen muss , verwendet es die Receive-Tab-Controller-Klasse, um es zu erstellen. Für andere Tags wird der Standard-Java FX-Builder verwendet. Das ist es. Jetzt weiß Java FX, wie man unser neues benutzerdefiniertes FXML-Tag erstellt. Lassen Sie uns unsere Anwendung ausführen , um zu überprüfen, ob alles gut geht. ***** und ein Fehler ist aufgetreten. Es heißt, dass der Root-Controller keine Tab-Instanz ist. Ich weiß, wie man das repariert. Wir müssen dafür sorgen, dass der Receive Tab Controller die TAP-Klasse erweitert. Mal sehen, ob es funktioniert. Okay, es funktioniert genauso wie zuvor. Wenn wir also ein neues Wallet erstellen, erwarten wir, dass das Feld für die Empfangsadresse mit der neuen Bitcoin-Adresse gefüllt wird. In den nächsten Videos werden wir den Prozess der Ableitung einer Bitcoin-Adresse verstehen und diese Funktion in unser Wallet implementieren. Siehst du, ja. 16. Bitcoin Adressen und Addresses: In diesem Video erfahren wir mehr über HD-Wallets und Bitcoin-Adressen. Also, was ist eine Bitcoin-Adresse? Eine Bitcoin-Adresse ist ein Wort, das einen öffentlichen Schlüssel, den Hash eines öffentlichen Schlüssels oder einen Skript-Hash codiert . Es wird verwendet, um Bitcoins bei einer Transaktion zu erhalten. Um Bitcoins durch eine Bitcoin-Transaktion zu erhalten, zeigen Sie Ihre Adresse einer anderen Person , damit diese Person Bitcoins an Ihre Adresse senden kann. Es gibt verschiedene Arten von Bitcoin-Adressen und die Regeln für deren Generierung sind in vielen VIPs wie VIP, VIP 3d2 und BIP 44 enthalten. Lassen Sie uns jetzt über HD-Wallets sprechen. Hd Wallets stehen für hierarchische deterministische Geldbörsen. Sie sind hierarchisch, weil sie aus vielen Schlüsselebenen bestehen, und sie sind deterministisch, weil ein einziger Startwert immer dieselben Adressen und privaten Schlüssel generiert. Und HD Wallet ist eine Art Wallet, bei der aus einem einzigen Startwert Ableitungspads verwendet werden, um private Schlüssel, öffentliche Schlüssel und Adressen abzuleiten . Spezifikationen für HD-Wallets wurden ursprünglich in BI P32 definiert , wobei andere BIPs diese Spezifikation erweiterten. Lassen Sie uns nun eine Folie aus unserer letzten PPT-Präsentation zusammenfassen. In dieser Präsentation haben wir gelernt, wie man einen mnemonischen Samen erzeugt. Und wir haben erwähnt , dass wir durch die Kombination eines mnemonischen Startwerts mit einer optionalen Passphrase eines mnemonischen Startwerts mit einer optionalen Passphrase einen Root-Seed mit dem Algorithmus P vk df two generieren könnten . Aus diesem Root-Seed könnten wir private Schlüssel, öffentliche Schlüssel und Adressen generieren . In dieser Präsentation werden wir uns mit den Details des letzten Teils befassen , dem es darum geht, wie private und öffentliche Schlüssel und Adressen aus einem Root-Seed generiert werden. Ausgehend von einem Root-Seed , der 512 Bit groß ist den HMAC SHA-512-Hash-Algorithmus darauf anwenden, erhalten wir den Masterschlüssel , der auch 512 Bit vom Masterschlüssel enthält. Durch die Anwendung der Funktion CKD, die für Child Key Derivation steht, können wir verschiedene erweiterte Schlüssel erhalten, indem verschiedene Indizes als Parameter verwenden. Wenn n der Index für diese Funktion ist , kann n um 0-2 bis 32 minus eins variieren. Jeder erweiterte Schlüssel kann mithilfe der CKD-Funktion mehr erweiterte Schlüssel generieren mithilfe der CKD-Funktion mehr erweiterte Schlüssel und somit vielen untergeordneten Tasten übergeordnet sein . Dieses Ableitungsschema ermöglicht die Bildung eines Schlüsselbaums mit einer unbestimmten Anzahl von Generationen. Sehen wir uns mehr Details zu CKD-Funktionen an. Es gibt zwei Arten von erweiterten Schlüsseln. Sie können erweiterte private Schlüssel oder erweiterte öffentliche Schlüssel sein. Und ein erweiterter privater Schlüssel , dessen serialisierte Version mit x PRV oder einem anderen Buchstaben plus PRV beginnt, wird mithilfe der privaten CKD-Funktion generiert. Wenn der Index, der an diese Funktion übergeben wird gleich oder größer als zwei mit einer Potenz von 31 ist, handelt es sich um eine gehärtete Ableitung. Und es hieß, dass der generierte erweiterte private Schlüssel ein hartes Kind ist. Gehärtete Schlüssel verfügen über zusätzliche Sicherheitsfunktionen , die wir kurz erläutern werden ist es möglich, einen erweiterten öffentlichen Schlüssel zu generieren Mithilfe der öffentlichen CKD-Funktion ist es möglich, einen erweiterten öffentlichen Schlüssel zu generieren. Wenn öffentliche Schlüssel serialisiert wurden, beginnen sie mit X Pub oder einem anderen Buchstaben plus Pub. Es ist auch möglich, einen erweiterten öffentlichen Schlüssel aus einem anderen erweiterten öffentlichen Schlüssel zu generieren , indem Sie die öffentliche CKD-Funktion verwenden Zwei Ableitungen sind nicht möglich. Generierung eines erweiterten privaten Schlüssels aus einem erweiterten öffentlichen Schlüssel und eines gehärteten erweiterten öffentlichen Schlüssels aus einem erweiterten öffentlichen Schlüssel. Wie kommen wir also von erweiterten Schlüsseln zu Adressen? Ausgehend von einem erweiterten privaten Schlüssel extrahieren wir daraus einen privaten Schlüssel. Ein privater Schlüssel ist Teil eines erweiterten privaten Schlüssels. Diese Extraktion ist also eine einfache Operation. Dann generieren wir durch eine Operation als elliptische Kurvenmultiplikation bezeichnet wird, , die als elliptische Kurvenmultiplikation bezeichnet wird, einen öffentlichen Schlüssel aus einem privaten Schlüssel. Schließlich erhalten wir durch Hashing und Codierung des öffentlichen Schlüssels eine Bitcoin-Adresse. Es gibt verschiedene Arten von Hashing und Kodierung von öffentlichen Schlüsseln, um verschiedene Arten von Adressen zu erzeugen. werden wir mehr über diese Operationen erfahren kommenden Videos werden wir mehr über diese Operationen erfahren. Wir verwenden private Schlüssel auch , um Transaktionssignaturen zu erstellen und Bitcoins an andere Adressen zu übertragen. Transaktionssignaturen werden mithilfe des digitalen Signaturalgorithmus Elliptic Curve (ECDSA) erstellt . Sie können Adressen auch mit einem erweiterten öffentlichen Schlüssel generieren . Das tun Sie, indem Sie den öffentlichen Schlüssel daraus extrahieren. Dann wird eine Bitcoin-Adresse aus dem öffentlichen Schlüssel durch Hashing und Kodierung generiert dem öffentlichen Schlüssel durch Hashing und , wie zuvor erklärt. Denken Sie daran, dass ein öffentlicher Schlüssel nicht in einen privaten Schlüssel umgewandelt werden kann . Daher kann es nicht zum Signieren von Transaktionen und zur Übertragung von Bitcoins verwendet werden . Lassen Sie uns nun das Konzept der Ableitungspfade verstehen, beginnend mit dem Hauptschlüssel, der in einem Baum erweiterter Schlüssel die Tiefe Null hat. Indem wir einen erweiterten Schlüssel ableiten, der Null als Argument für eine CKD-Funktion übergibt , erhalten wir einen erweiterten Schlüssel mit einer Tiefe von eins. den Vorgang mit dem neu generierten erweiterten Schlüssel wiederholen , erhalten wir einen erweiterten Schlüssel mit einer Tiefe von zwei. Dann können wir den Vorgang wiederholen, indem wir einen als Index übergeben und einen erweiterten Schlüssel mit einer Tiefe von drei erhalten . Aus diesem letzten erweiterten Schlüssel können wir einen öffentlichen Schlüssel und eine Adresse extrahieren. Es wird gesagt, dass diese Adresse einen Ableitungspfad von Null Schrägstrich Null Schrägstrich eins hat einen Ableitungspfad von Null Schrägstrich Null Schrägstrich , da dieser Index verwendet wird, um den erweiterten Schlüssel abzuleiten, der diese Adresse generiert hat. Anwendung derselben Begründung. In diesem anderen Beispiel erhalten wir eine Adresse mit einem Ableitungspfad von einem Schrägstrich Null Schrägstrich zwei. Dieses andere Beispiel zeigt, dass Sie andere Zahlen als Indizes für CKD-Funktionen an jeder erweiterten Taste in einem Tastenbaum verwenden können, wodurch eine nahezu unendliche Anzahl von Ableitungspfade und Adressen. Dieses andere Beispiel zeigt die Generierung eines verhärteten untergeordneten Elements, indem wir ein einzelnes Anführungszeichen nach dem Index verwenden. Wir können Indizes darstellen, die verhärtete untergeordnete Elemente in einem Ableitungspfad generieren . Null, gefolgt von einem einzelnen Anführungszeichen, steht für den ersten gehärteten Index , der zwei potenziert von 3011 ist, gefolgt von einem einfachen Anführungszeichen ist der zweite Härtungsindex usw. Diese Notation wird verwendet, um die Beschreibung eines Ableitungspfads zu erleichtern , sodass wir kleine Zahlen verwenden können , um ihn zu beschreiben. Es ist wichtig, das hinzuzufügen. Um Bitcoins von einer Adresse aus auszugeben, muss ein privater Schlüssel mit demselben Ableitungspfad erstellt werden, der zur Ableitung dieser Adresse verwendet wurde. Sie können also öffentliche CKD-Funktionen verwenden , um erweiterte öffentliche Schlüssel und Adressen zu erstellen. Um jedoch Gelder aus diesen Adressen auszugeben, müssen Sie private CKD-Funktionen verwenden, um erweiterte private Schlüssel und private Schlüssel zu erstellen. Ein weiteres Merkmal von HD-Wallets und ihren Ableitungspfaden ist ihre Beziehung zur Todesfunktion. Jeder Ebene in einem Tastenbaum ist eine Funktion zugewiesen. Bi P32 definiert die Tiefe, eins steht für Kontotiefe zwei verschiedene Ketten und Tiefe für drei verschiedene Adressen. Bip 44 hatte verschiedene Definitionen , die heutzutage in den meisten HD-Wallets häufiger verwendet werden. Je nach Tiefe von 44 dient ein gehärteter, verlängerter Schlüssel für unterschiedliche Zwecke. Tiefe zum Aushärten von Schlüsseln verschiedene Münztypen, Tiefe drei gehärtete Schlüssel, verschiedene Konten. Depth for definiert, ob abgeleitete Adressen zur Änderung verwendet werden sollen nicht auf boolesche Weise und Deathfive für verschiedene Adressen steht. Um besser zu verstehen , wie das in der Praxis funktioniert, sehen wir uns einige Beispiele für Ableitungspfade und ihre Funktionen an. Und mit einem Ableitungspfad von 84 Anführungszeichen adressiert Schrägstrich Null Schrägstrich Null hat einen Zweck zu finden und BIP A14. Vip 84 definiert, dass Adressen mit einem Zweck von 84 P2 WP k h-Adressen sein müssen, was für Pay to Witness Public-Key-Hash-Adressen steht . werden wir ausführlich über verschiedene Arten von Adressen sprechen kommenden Videos werden wir ausführlich über verschiedene Arten von Adressen sprechen. Kurz gesagt, P2, WP k, h, auch bekannt als Segue, native Adressen sind die gängigsten Adresstypen in den meisten aktualisierten modernen Wallets. Diese Adresse hat auch den Münztyp Null, was bedeutet, dass es sich um eine Bitcoin-Adresse handelt. Es hat auch ein Konto von Null, was bedeutet, dass es Teil des Kontos des ersten Benutzers ist. Es hat sich geändert. Der Index ist auf Null gesetzt, was bedeutet, dass es sich nicht um eine Änderungsadresse handelt. Schließlich ist sein Adressindex Null, was bedeutet, dass es der erste Benutzer ist, der eine Adresse erhält. Das nächste Beispiel hat einen Ableitungspfad ähnlich dem vorherigen Beispiel, außer dass der Adressindex eins ist. Es ist also die zweite native Bitcoin-Segue-Empfangsadresse des Kontos des ersten Benutzers, was dieselbe Begründung anwendet. Das dritte Beispiel ist die erste native Bitcoin-Segue-Änderungsadresse des Kontos des ersten Benutzers. Der Index eins in Depth Four gibt an, dass es sich um eine Änderungsadresse handelt. Das letzte Beispiel ähnelt dem ersten, außer dass sein Zweck darin besteht, 49 ohne Anführungszeichen zu verwenden. Vip 49 definiert, dass Adressen mit diesem Zweck P2 WP k-th sein müssen , verschachtelt in P2-SSH-Adressen. Wenn das kompliziert klingt, mach dir keine Sorgen, wir werden in den kommenden Videos Details darüber erfahren. Lassen Sie uns nun einen Überblick über die Funktionen von HD Wallet geben. Mit HD-Wallets können wir problemlos eine nahezu unendliche Anzahl von Adressen aus einem einzigen Startwert generieren eine nahezu unendliche Anzahl von . Das ist großartig, da wir die Wiederverwendung von Adressen und den Verlust der Privatsphäre vermeiden können . HD-Wallets ermöglichen auch die Struktur mehrerer Konten, bei der der erweiterte private Schlüssel der Eltern Zugriff auf die Schlüsselgelder ihrer Kinder hat, die Kinder jedoch das Geld der Eltern überweisen können. Dieses Schema kann nützlich sein wenn Unternehmensinhaber Zugriff auf die Schlüssel von Kindern aus den Abteilungen ihres Unternehmens haben . Eine weitere nützliche Funktion , die HD-Wallets ermöglichen, ist die Erstellung von Only-Watch-Wallets deren Adressen generiert und deren Gelder nur mit erweiterten öffentlichen Schlüsseln überprüft werden können , bei denen jedoch kein Geld verschoben werden da keine Transaktionen signiert werden können. Eine weitere HD Wallet-Funktion ist die Möglichkeit andere Kryptowährungsadressen aus demselben mnemonischen Startwert zu generieren . Eine Liste verschiedener Indizes für Münztypen ist auf Blatt 44 beschrieben, einem BIP-ähnlichen Angebotssystem von Satoshi Labs, dem Unternehmen, das für den Traversen oder die Brieftasche verantwortlich ist. Ein weiteres Merkmal von HD-Wallets ist, dass ihre Adressen und privaten Schlüssel mit ihren Samen und Ableitungspfaden rekonstruiert werden können . Auf diese Weise können Sie einen mnemonischen Startwert und eine Passphrase in eine kompatible Brieftasche importieren einen mnemonischen Startwert und eine Passphrase in , um all Ihre Adressen und privaten Schlüssel abzurufen . Die Sicherheitsabschottung ist ein weiteres nettes Merkmal von HD-Wallets. Wenn versehentlich ein erweiterter privater Schlüssel durchsickert, würde dies nur die Gelder betreffen, die in Adressen gesperrt sind, die von dem durchgesickerten Schlüssel abstammen. Gelder, die in den Schlüsseln eines Elternteils oder eines Geschwisters gespeichert sind, wären sicher. Schließlich ermöglichen HD-Wallets die Generierung und Organisation verschiedener Arten von Bitcoin-Adressen. Lassen Sie uns nun sehen, warum gehärtete Schlüssel erforderlich sind. Während der Entwicklung von HD Wallet wurde festgestellt, dass, wenn ein erweiterter öffentlicher Schlüssel und ein nicht von Hodgkin untergeordneter privater Schlüssel aus der nächsten Ebene durchsickern, dies einem Leak gleichkommt offensichtlicher erweiterter privater Schlüssel. Dies könnte zu Geldverlusten für jede Adresse führen die vom durchgesickerten erweiterten öffentlichen Schlüssel abstammt. Daher wurde eine Ableitung von Begnadigungen eingeführt, um zu verhindern , dass dieser Exploit auf Konten und in niedrigeren Tiefen stattfindet. Lassen Sie uns abschließend besprechen, wie wir das Adressableitungsschema in unserer Brieftasche implementieren werden . Wird den Ableitungspfad verwenden 84 Anführungszeichen Schrägstrich Null Schrägstrich Null Schrägstrich Null , um unsere erste Empfangsadresse zu generieren. Nach dem Empfang von Bitcoins wird die nächste Empfangsadresse geändert, indem der Adressindex um eins erhöht wird. Die nächsten Empfangsadressen werden also Adressindizes von 123 usw. haben . Dies verhindert, dass wir dieselbe Adresse verwenden , um Bitcoins mehr als einmal zu erhalten. Wir verwenden den Ableitungspfad 84 Anführungszeichen, Schrägstrich, Schrägstrich, einen Schrägstrich Null um unsere erste Änderungsadresse zu generieren. Nach dem Senden von Bitcoins und dem Empfang einer Änderung wird die nächste Änderungsadresse geändert, indem der Adressindex um eins erhöht wird. Das Gleiche tun wir für den Empfang von Adressen. Sie fragen sich vielleicht, warum es aus zwei Hauptgründen wichtig ist, die Wiederverwendung von Adressen zu vermeiden . Erstens erhöhen wir dadurch unsere Privatsphäre. Wenn ein Dritter auf diese Weise herausfindet , dass eine Adresse uns gehört, diese Informationen nicht auf andere von uns verwendete Adressen übertragen. Der andere Grund ist die Sicherheit. Wenn aus irgendeinem Grund der private Schlüssel für eine Adresse durchsickert, wirkt sich das nur auf diese Adresse aus. Das Sprichwort, das besagt, lege nicht alle Eier in einen Korb, gilt hier. Allerdings implementieren wir das Ableitungsschema, indem wir zunächst den erweiterten öffentlichen Schlüssel mit einem Pfad generieren , der 84 Anführungszeichen entspricht, Schrägstrich Null Schrägstrich Null für den Empfang von Adressen. Und der erweiterte öffentliche Schlüssel mit einem Pfad, der 84 Anführungszeichen entspricht Schrägstrich, Null, Schrägstrich eins, um Adressen zu ändern. Dann leiten wir erweiterte öffentliche Schlüssel und Adressen ihrer Kinder ab. Auf diese Weise werden alle Adressen generiert, die wir benötigen, ohne private Schlüssel dem Speicher zugänglich zu machen. Unsere wichtigste Sicherheitsrichtlinie besteht also darin, zu vermeiden , dass Samen und private Schlüssel so weit wie möglich dem Speicher zugänglich gemacht werden. Unsere privaten Schlüssel werden nur abgeleitet , wenn Transaktionen mit denselben Ableitungspads signiert werden, die zur Erstellung der Adressen verwendet werden , für die solche Transaktionen Bitcoins ausgegeben werden. 17. 15 Erstellen unseres ersten wallet 7 skillshare 2: In diesem Video erstellen wir die erweiterten öffentlichen Schlüssel, die Wallet benötigt, um Adressen zu erstellen. Wie wir im neuesten Video gesehen haben, werden unsere Wallets zunächst über zwei erweiterte Schlüssel verfügen der erweiterte Schlüssel für segmentierte Empfangsadressen und der erweiterte Schlüssel für Segue-Änderungsadressen. Lassen Sie uns zunächst einige Probleme mit unseren GUI-Tests beheben. Wenn Sie jetzt versuchen, den Test zum Erstellen einer Brieftasche auszuführen , werden Sie sehen , dass er funktioniert. Dies ist teilweise auf eine vorzeitige Instanziierung unserer neuen Receive Tab Controller-Klasse zurückzuführen eine vorzeitige Instanziierung unserer . Um das zu beheben, erstellen Sie ein neues Paket namens Config innerhalb des BYOD W-Testpakets. Erstellen Sie dann eine neue Klasse namens test lazy, in der eine IP-Konfiguration enthalten ist. Diese Klasse implementiert der Bean Factory-Postprozessor implementiert diese erforderliche Methode mit diesem Code. Dieser Code sorgt dafür, dass jede Klasse während der Tests träge initialisiert wird. Es gibt noch einen Code, den wir in unserem Create Wallet-Test hinzufügen müssen , damit er funktioniert. Wir fügen dem FXML-Loader in der Startmethode dieselbe Builder-Factory hinzu, die wir in unserer GUI Started Listener-Klasse festgelegt haben . Lassen Sie uns nun unsere GUI-Tests ausführen. Großartig. Jetzt funktionieren die Tests. Wir sehen, dass nur sie absagen sollten, Tests bestanden haben und die anderen müssen wir noch bestehen lassen. Lassen Sie uns nun die erweiterten öffentlichen Schlüssel zu unserer Brieftasche hinzufügen . Als Erstes passen wir unseren Create Wallet-Service an, damit unseren Create Wallet-Service ein gültiger mnemonischer Startwert an diese Variable übergeben wird. Sie finden es auf der Seite Projekt und Ressourcen. Dann überprüfen wir, ob das erstellte Wallet über erweiterte öffentliche Schlüssel verfügt. Stellt fest, ob es zwei erweiterte öffentliche Schlüssel hat, da jedes Wallet einen erweiterten öffentlichen Schlüssel für den Empfang von Adressen und einen erweiterten öffentlichen Schlüssel für Änderungsadressen haben wird erweiterten öffentlichen Schlüssel für den Empfang Adressen und einen erweiterten . Jetzt fügen wir dem Wallet-Datensatz eine Liste erweiterter öffentlicher Schlüssel hinzu. Lassen Sie uns unsere erweiterte Pub-Schlüsselklasse erstellen. Es wird einen Schlüssel und einen Typ haben. Fügen wir sie einem Konstruktor hinzu. Beide Immobilien werden besser sein. Jetzt erstellen wir eine Adresskonfigurationsklasse. Lassen Sie uns zunächst ein neues Konfigurationspaket innerhalb des API-Pakets erstellen . Dann erstellen wir darin die Adresskonfigurationsklasse. Fügen Sie die Konfigurationsanmerkung hinzu. Diese Anmerkung ist erforderlich damit Spring Boot alle in dieser Klasse definierten Objekte beim Start der Anwendung initialisieren alle in dieser Klasse definierten Objekte kann. Jetzt erstellen wir eine Domainklasse namens Address Config. Eigentlich wird es ein Rekord sein. Es wird einen Adresstyp und den Ableitungspfad haben. Erstellen Sie dann eine Aufzählung mit dem Namen Adresstyp im selben Paket. Es wird zwei Typen geben Segment und Segue mit wechselndem Unterstrich. Nun zurück zur Adresskonfigurationsklasse. Wir erstellen einen Strahl für unsere Segmentadresse. In Spring Boot ist eine Bean nur ein Objekt , das in andere Projektklassen injiziert werden kann. Instanziiert diese Bean mit diesen Parametern. Und fügen Sie dieser Methode die Bean-Annotation hinzu. Wenn Sie die Segmentzeichenfolge als Parameter übergeben, wird diese Methode dupliziert Parameter übergeben, wird diese Methode dupliziert und an unsere Adressenänderungskonfiguration angepasst Ändern Sie den Bean-Annotationsparameter in Segue Change. Der Methodenname lautet Segue Change Config. Der Adresstyp, der gesetzt wird, würde sich ändern. Und der Ableitungspfad wird einen Änderungsindex von eins haben. Jetzt verwenden wir diese Konfigurationen in unserem Create Wallet-Service. Lassen Sie uns also eine Liste von Adresskonfigurationen in diese Klasse einfügen . Dadurch erkennt Spring Boot automatisch, dass es zwei Beans mit dem Adresskonfigtyp gibt , und fügt beide in diese Liste ein. In der Create-Methode wird nun eine mnemonische Startvariable erstellt. Zuerst ändern wir den Methodenparameter mnemonic seed in mnemonic seeds Zeichenfolge instanziiert dann ein mnemonisches Seed-Objekt und übergibt den mnemonischen Startstring als Parameter. Dann erstellen wir einen Hauptschlüssel, bei dem es sich um eine Art erweiterter privater Schlüssel handelt. Dazu rufen wir die mnemonic Seed-Methode auf, um den Masterkey zu erhalten und das Passwort und diese Konstante als Parameter zu übergeben . Aber zuerst müssen wir unsere Bitcoin-Java-Version in der POM-Datei auf 0.3, 0.0 aktualisieren unsere Bitcoin-Java-Version in der POM-Datei auf 0.3, . Lass es uns machen. Jetzt. Klicken Sie auf Load Maven changes back to the create method. Es ermöglicht uns jetzt, die Haupt-Netzpräfixkonstante zu importieren, übergibt ihr privates Präfix als Parameter. Lassen Sie uns nun diesen Code hinzufügen, dann erkläre ich, was er als Nächstes tut. Dieser Code beginnt mit der Konvertierung der Adresskonfigurationsliste in einen Stream. In Java 8 oder höher werden Streams verwendet, um funktionale Operationen auf eine Datensammlung anzuwenden . In diesem Fall wird jede Adresskonfiguration aus der Liste an diese Lambda-Funktion übergeben, die den erweiterten Pub-Key-Dienst als Nächstes erstellt, verwendet , um ein erweitertes Pub-Key-Objekt zurückzugeben. Jeder zurückgegebene erweiterte Pub-Schlüssel wird in einer Liste gesammelt , die in der Variablen Extended Pub Keys gespeichert wird der Variablen Extended Pub Keys Anschließend wird die erweiterte Pub-Schlüsselliste an die zurückgegebene Brieftasche übergeben . Lassen Sie uns nun den erweiterten Pub-Key-Dienst in diese Klasse einfügen . Wir müssen es erstellen. Jetzt können wir es dem Konstruktor hinzufügen. Jetzt wird seine Erstellungsmethode erstellt. Es wird ein erweiterter Pub-Schlüssel zurückgegeben. Dem TDD folgen. Es ist Zeit, einen Test für diese Methode zu erstellen. Lass es uns machen. Wird es im Test-API-Paket erstellen. Es muss die Spezifikationsklasse erweitern. Lassen Sie uns hier den erweiterten Pub-Key-Dienst instanziieren. Wir müssen diesen Code auch zur Setup-Methode hinzufügen . Und wir erstellen einen Test namens should create extended key. Wenn ein mnemonischer Startwert und ein daraus abgeleiteter Hauptschlüssel gegeben werden. Wenn wir die Methode create vom erweiterten Pub-Key-Dienst aus aufrufen . Dann erwarten wir, dass der erstellte erweiterte Pub-Schlüssel dem erwarteten erweiterten Pub-Schlüssel entspricht. Okay, also wie werden wir diese Variablen in Grau erstellen? Wir werden sie mit der Where-Klausel wie dieser weitergeben. Sie fragen sich vielleicht, woher ich diese Werte habe? Ich habe sie auf der EN Coleman io Slash Pip Threonin-Website bekommen. Diese Website ist sehr nützlich, um viele Arten von erweiterten Schlüsseln und Adressen zu generieren . Ich kopiere diesen mnemonischen Seed und füge ihn in das Feld BIP 39 auf der Website ein, um zu demonstrieren, wie es funktioniert. Unmittelbar nachdem wir den mnemonischen Startwert eingefügt hatten, berechnete das Tool den Root-Seed-Hauptschlüssel und erweiterten Schlüssel, um das abgeleitete BIP AT für erweiterte Schlüssel anzuzeigen , um das abgeleitete BIP AT für erweiterte Schlüssel Klicken Sie auf diesen Tab. Wir sehen auf der Website, dass der erwartete Pub-Schlüssel und der Test diesem Wert entsprechen. Durch die Anwendung der CKD-Funktion auf diesen erweiterten öffentlichen Schlüssel mit unterschiedlichen Zahlen als Indizes erhalten Sie später erweiterte öffentliche Schlüssel, deren extrahierte öffentliche Schlüssel zur Generierung verwendet werden Empfangen von Adressen über dieselbe Website ich für weitere Testfälle erstellt habe. Ich füge sie hier ein und passe die Formatierung an. den letzten beiden Testfällen werden erweiterte Pub-Schlüssel generiert , die zur Generierung von Änderungsadressen verwendet werden . Sie können sie aus den Ressourcen dieses Videos kopieren oder mithilfe der Ian Coleman-Website Ihre eigenen Testfälle erstellen . Unter Verwendung der Where-Klausel wird derselbe Test für jede von uns erstellte Parametrisierung ausgeführt . Lass uns den Test machen. Der Test ist erwartungsgemäß fehlgeschlagen. Lassen Sie uns nun die Methode implementieren. Zuerst. Wir werden hier eine Map erstellen , die Typen nicht an erweiterte Pub-Schlüssel-Präfixe adressiert . Beide Adresstypen werden demselben Hauptnetzsegmentpräfix zugeordnet. Weise ist es einfach, diese Funktionalität zu erweitern , falls wir später weitere adressierte Typen hinzufügen müssen . Jetzt wird in der Create-Methode ein neuer erweiterter Pub-Schlüssel zurückgegeben. Übergabe dieser Parameter wird die CKD-Methode vom Masterschlüssel zurückgegeben, die einen Ableitungspfad annimmt. Falsch, da es sich nicht um einen erweiterten privaten Schlüssel und um das Präfix des Adresstyps handelt. Dann serialisieren wir das Ergebnis. Und das zweite erweiterte Pub-Schlüsselargument wird der Adresstyp und die Zeichenkettenform sein. Vergessen wir nicht, die Service-Annotation hier hinzuzufügen. Lassen Sie uns nun den erweiterten Pub Key Service Test erneut ausführen. Toll, sie haben alle bestanden. Lassen Sie uns nun unsere Create Wallet Service Tests durchführen. Aber lassen Sie uns zunächst einige Änderungen an diesem Test vornehmen. Wir müssen den Sicherheitsanbieter hinzufügen, erforderlich ist, damit die Bitcoin-Java-Kryptografiefunktionen funktionieren. Wir müssen auch die richtigen Argumente für den Service angeben. Lassen Sie uns die Adresskonfigurationen und den erweiterten Pub-Key-Dienst erstellen . Lass es uns jetzt ausführen. Toll, die Tests sind bestanden. Das bedeutet, dass unser Wallet mit einer Liste erweiterter öffentlicher Schlüssel der Größe zwei erstellt wurde . Ups, der Änderungsindex hier ist einer. Dies hat keinen Einfluss auf diesen Test, da wir nur behaupten, dass die Brieftasche die Pub-Schlüssel erweitern muss. Aber lassen Sie uns der Richtigkeit halber zu eins ändern. 18. 16 Erstellen unseres ersten wallet 8 skillshare 2: In diesem Video erstellen wir für jeden erweiterten Pub-Schlüssel, den das Wallet erstellt, ein Kleid . Dazu wird jeder erweiterte Pub-Schlüssel an die generierte Dress-Methode übergeben, die jetzt erstellt wird. Diese Methode legt eine Liste von Adressen für den erweiterten Pub-Schlüsseldatensatz fest. Lassen Sie uns dieses Zentrum erstellen. Diese Adressliste wird von einem neuen Dienst für den sequentiellen Adressgenerator erstellt einem neuen Dienst für den sequentiellen Adressgenerator , der sie erstellt. Es wird eine Generate-Methode verwendet, die den erweiterten Pub-Schlüsselschlüssel und den erweiterten Pub-Schlüsseltyp verwendet. Der Dienst für den sequentiellen Adressgenerator wird diesen Namen haben, da er Dresses mit einem steigenden Adressableitungsindex generiert . Lassen Sie uns den sequentiellen Adressgenerator in diese Klasse einfügen und ihn erstellen. Lassen Sie uns nun die Generierungsmethode erstellen , die eine Liste von Adressen zurückgibt. Lassen Sie uns den Adressdatensatz erstellen. Dieser Datensatz wird ein Adressfeld und ein Indexfeld haben . Lassen Sie uns die Methode zum Festlegen von Adressen über den erweiterten Pub-Schlüssel anpassen . Es nimmt eine Adressenliste und legt das Feld für erweiterte Pub-Schlüsseladressen fest. Lassen Sie uns einen Test für die Klasse des sequentiellen Adressgenerators erstellen . Im Moment gibt die Methode Null zurück. Die Testklasse wird die Spezifikationsklasse erweitern. Wir erstellen einen Test namens sollte 20 Adressen generieren und verwenden den sequentiellen Adressgenerator im Windblock. Also lassen Sie uns es als Feld zu dieser Klasse hinzufügen. Wenn die Generate-Methode mit diesen Parametern aufgerufen wird , handelt es sich um einen erweiterten öffentlichen Schlüssel im Segmenttyp. Dann erwarten wir, dass die Liste der Retouren-Kleider eine Größe von 20 hat. Sie können den erweiterten öffentlichen Schlüssel dieses Tests aus den Ressourcen dieser Lektion kopieren . Lassen Sie uns den sequentiellen Adressgenerator in der Setup-Methode instanziieren und den Test ausführen. Es ist wie erwartet gescheitert. Lassen Sie uns nun implementieren, dass der Dienst einen erweiterten Pub-Schlüssel deklariert. Dann wird innerhalb eines Try-Catch-Blocks der empfangene Schlüsselparameter serialisiert. Die serialisierte ANS-Methode transformiert den erweiterten Pub-Schlüsselschlüssel im erweiterten Pub-Key-Objekt von Bitcoin. Java wickelt dann die IOException in eine Runtime-Exception im Catch-Block um. Jetzt verwenden wir die Range-Methode aus der Lungs Stream-Klasse, um eine Schleife von Null zu einer anfänglichen Variablen für die Anzahl der generierten Adressen zu erhalten , die später festgelegt wird. Wir werden diese Variable in diese Klasse einfügen. Im Konstruktor wird eine Kriterien-Annotation für diese Variable gesetzt , die denselben Variablennamen als Parameter annimmt, ihren Typ in Hinweis ändert, jedem Index und jedem Aufruf zuordnet die Methode zum Generieren von Adressen. Also rufen wir für jeden Index die Generate-Address-Methode übergeben die Rückgabe der Factory-Get-Methode des Adressgenerators, den erweiterten Pub-Schlüssel und den Index als Parameter. Schließlich werden wir das Ergebnis in eine Liste umwandeln. Lassen Sie uns die Generate Addressed Methode erstellen. Es werden ein Adressgenerator und erweiterter Pub-Schlüssel und ein Index benötigt. Der Adressgenerator wird von einer Adressgenerator-Factory übergeben , die in diese Klasse injiziert und jetzt erstellt wird. Lassen Sie uns den Typparameter in den Adresstyp ändern. Jetzt erstellen wir die Factory-Get-Methode des Adressgenerators . Es wird eine Adressgenerator-Schnittstelle zurückgegeben , die jetzt vom sequentiellen Adressgenerator zurück zur Methode zum Generieren von Adressen erstellt jetzt vom sequentiellen Adressgenerator zurück zur Methode zum Generieren wird. Wir leiten zunächst mithilfe der CKD-Methode einen erweiterten untergeordneten Schlüssel aus dem erweiterten Pub-Schlüssel ab. Diese Methode wendet die Funktion zur Ableitung von Kinderschlüsseln wir vor zwei Videos erfahren haben. Es wird ein Index benötigt, der den Ableitungsindex des Kindes definiert. Jetzt wird ein neuer Adressdatensatz zurückgegeben. Das Ergebnis der Generate-Methode wird vom Adressgenerator übernommen. Diese Methode verwendet den erweiterten untergeordneten Schlüssel und leitet daraus eine Adresse ab. Der zweite Adressparameter wird der Index sein. Jetzt fügen wir die Generate-Methode zur Adressgenerator-Schnittstelle hinzu. Jetzt implementieren wir die Methode get aus der Adressgenerator-Factory. Es gibt das Ergebnis von getMethod aus einer Adressgenerator-Map zurück . Diese Variable wird ein Feld in dieser Klasse sein und in diesem Klassenkonstruktor initialisiert. Es wird eine Map von Zeichenketten als Schlüsseln und Adressgeneratoren als Werten sein. Im Konstruktor wird ein Dienst zum Generieren von Segmentadressen übergeben , der erstellt wird. Dann ordnen wir jeden Adresstyp dem Segmentadressgenerator zu. In der Adressgenerator-Karte. Der Segmentadressgenerator implementiert die Adressgenerator-Schnittstelle. Lassen Sie uns die erforderliche Schnittstellenmethode erstellen. Bevor wir es implementieren, erstellen wir seinen Test. Es wird die Spezifikationsklasse erweitern. Instanziiert hier den Segmentadressgenerator. Bei der Setup-Methode fügen Sie den Sicherheitsanbieter hinzu, genau wie unsere anderen Tests, die ihn benötigen. Dann erstellen wir den Segmentadresstest, der einen Segmentadresstest generieren sollte . In dem angegebenen Block wird ein erweiterter Pub-Schlüssel unter Verwendung der erweiterten Pub-Schlüsselklasse bei serialisierter Methode erstellt . Die serialisierte Methode verwendet eine erweiterte Pub-Schlüsselzeichenfolge, die den Where-Block übergibt. Dann erstellen wir eine erweiterte Kinderbetreuung, die die CKD-Methode für die erweiterte Pub-Schlüsselvariable aufruft . An diese Methode wird ein Indexparameter übergeben, der den Webblock durchläuft. Wenn die Generierungsmethode für den Segmentadressgenerator mit dem erweiterten untergeordneten Schlüssel aufgerufen wird. Dann erwarten wir, dass die Absenderadresse der erwarteten Adresse entspricht. Lassen Sie uns nun den Where-Block verwenden, um die Variablen in Grau zu initialisieren Dazu werden Testdaten verwendet, die sie von der E- und Coleman-Website übernommen haben . Sie können diese Parameter aus den Ressourcen dieser Lektion kopieren . Lass uns den Test machen. Es ist wie erwartet gescheitert. Im nächsten Video erfahren wir mehr über die Adressen von sig what. Dann werden wir in dem Video nach dem nächsten den Segmentadressgenerator und den sequentiellen Adressgenerator implementieren den sequentiellen Adressgenerator und ihre Tests bestehen lassen. 19. Segwit und Einführung in Bitcoin verstehen: In dieser Präsentation erfahren wir mehr über Bitcoin-Segmentadressen Dies ist der Standardadresstyp , den unser Wallet bereitstellt. Also, was ist ein Bitcoin-Segue, welche Adresse? Segmentadressen werden auch als Segue-Native-Adressen , Back32-Adressen, Segmentversions-Null-Adressen oder P2 WP k-th-Adressen bezeichnet, wobei P2 WP k h für Pay to Witness Public-Key-Hash steht. Jeder dieser Begriffe wird verwendet , um sich auf dasselbe zu beziehen. Es war bis November 2021 die aktuellste Art von Bitcoin-Adresse . Nach November 2021, als das Taproot-Upgrade im Bitcoin-Netzwerk aktiviert wurde, ein neuerer Typ von Bitcoin-Adresse namens Taproot-Adresse, wurde ein neuerer Typ von Bitcoin-Adresse namens Taproot-Adresse, auch bekannt als Segue Version One Address, verfügbar. Konzentrieren wir uns zunächst auf die Segmentadresse meisten modernen Wallets unterstützen segmentierte Adressen , die 2017 nach dem Segregated Witness-Upgrade im Bitcoin-Netzwerk verfügbar waren die 2017 nach dem Segregated Witness-Upgrade im Bitcoin-Netzwerk . Dieses Upgrade ermöglichte optional kleinere Transaktionen, da der Teil dieser neueren Transaktionen, genannt Witness, separat gesendet wird und nicht in der Blockchain enthalten ist. Die Regeln zur Generierung Segmentadressen sind in VIP One-Seventh Three beschrieben und auch in Methoden der Bitcoin-Java-Bibliothek implementiert . Segmentadressen ermöglichen es Bitcoin-Absendern, die günstigsten Gebühren für gemeinsame Transaktionen zu zahlen. Der Grund dafür ist, dass Transaktionen, die Bitcoins an Segmentadressen senden, im Vergleich zu Transaktionen, die an andere Adresstypen gesendet werden, geringer sind . werden wir jedoch mehr Details zu Bitcoin-Transaktionen erfahren zukünftigen Videos werden wir jedoch mehr Details zu Bitcoin-Transaktionen erfahren. Da Segmentadressen von den meisten modernen Wallets gut unterstützt werden und wir mit ihnen günstigere Transaktionen versenden können, legen wir sie als Standardadresstyp unserer Brieftasche fest. Lassen Sie uns nun eine Folie aus der vorherigen Präsentation über erweiterte Tasten zusammenfassen . In diesem Video erfuhren wir, dass wir einen öffentlichen Schlüssel aus einem erweiterten privaten Schlüssel oder einem erweiterten öffentlichen Schlüssel erhalten können . Durch Hashing und Kodierung des öffentlichen Schlüssels könnten wir dann eine Adresse erhalten. Sehen wir uns nun mehr Details zu diesem Hashing- und Kodierungsprozess an. Ausgehend von einem öffentlichen Schlüssel wie zuvor erläutert erhalten wurde, erhalten wir durch Anwenden der SHA-256- und 160-kryptografischen Hashfunktionen auf den öffentlichen Schlüssel Hashfunktionen auf den öffentlichen Schlüssel einen Public-Key-Hash mit einer Größe von 20 Byte. Der SHA-256, kombiniert mit dem rechten 160, wird als Hash-160-Algorithmus bezeichnet. Schließlich generiert der Public-Key-Hash Kombination mit einem Präfix und einer numerischen Version in Kombination mit einem Präfix und einer numerischen Version eine Segmentadresse durch die Beck32-Kodierung. Back32-Codierung ist durch den als Beck 32-Dekodierung bezeichneten Prozess umkehrbar . Beim Erstellen von Transaktionen müssen wir 32 Adressen in Public-Key-Hashes zurückdekodieren 32 Adressen in Public-Key-Hashes bevor wir sie in die Transaktionsausgabe aufnehmen. Aus diesem Grund wird dieser Adresstyp auch Pay to Witness genannt . Der Public-Key-Hash wird dieses Thema noch einmal ausführlicher behandeln, wenn es um Transaktionen für Segmentadressen geht . Wenn Beck 32 Hashes mit öffentlichen Schlüsseln codiert, wird die Version auf Null gesetzt, wenn das Präfix auf BC unnamed net gesetzt ist. Apropos Hauptnetz, lassen Sie uns einen kurzen Überblick über die Bitcoin-Netzwerkumgebungen geben. Jede dieser Umgebungen ist ein separates Netzwerk mit unterschiedlichen Blockchains und Zwecken, aber ähnlichen Regeln. Das Bitcoin May Net wird als Haupt-Bitcoin-Netzwerk bezeichnet. Hier haben die Bitcoins einen Wert. Die Blockchain ist unveränderlich und die Mining-Schwierigkeit ist am höchsten. Die Testnetzumgebung ähnelt dem Hauptnetz, weist jedoch eine geringere Mining-Schwierigkeit Wo Bitcoins keinen Wert haben, wird sie verwendet, um Tests in einer Umgebung Knoten interagieren Aufrechterhaltung einer gemeinsamen Blockchain. Test Net hatte verschiedene Versionen, seit es mit verschiedenen Blockchains erstellt wurde. Schließlich ist die Reg-Testumgebung ein individuelles Netzwerk, das von jedem Bitcoin-Knotenbenutzer mit einer Blockchain betrieben werden kann von jedem Bitcoin-Knotenbenutzer mit einer Blockchain betrieben , die nicht mit anderen geteilt wird. Die Blöcke können vom Benutzer sofort, mühelos und frei generiert werden. Es wird verwendet, um schnellere und automatisiertere Tests in einer kontrollierten Umgebung durchzuführen. Adressen in jedem Netzwerk haben unterschiedliche Präfixe und sind nur in ihrer Umgebung gültig. Für Segmentadressen ist dieses C das Präfix, das für rote Kleider im Hauptnetz verwendet wird. Tb wird für Adressen im Testnetz verwendet. Und BCRP ist das Präfix für rote Kleider im Reg-Test verwendet wird. Wie bereits erwähnt, wird Version Null für Segmentadressen verwendet. Version eins wird für Taproot-Adressen verwendet. 20. 18 Erstellen unseres ersten wallet 9 skillshare 2: In diesem Video werden wir alle Tests durchführen, für die wir Pfade erstellt haben . Dazu wird zunächst die Methode zum Generieren von Segmentadressen implementiert. Um eine Segmentadresse zu generieren, wird ein erweiterter Schlüssel in einen öffentlichen Schlüssel umgewandelt. Lassen Sie uns diesen Parameternamen in einen erweiterten Schlüssel ändern. Dann wird der öffentliche Schlüssel in eine Segmentadresse umgewandelt mit dieser Methode in eine Segmentadresse umgewandelt, da sein Parameter ein Präfix übergibt. Lassen Sie uns diese Konstante vorerst weitergeben, wodurch die Adresse in der Bitcoin-Hauptumgebung gültig wird . Lassen Sie uns dieser Klasse auch die Service-Annotation hinzufügen. Lassen Sie uns nun den Segmentadressgeneratortest ausführen. Es ist fehlgeschlagen, weil wir die Bitcoin-Java-Version auf 0.4, 0.0 erhöhen müssen, die die richtige CKD-Methode enthält, damit dieser Vorgang funktioniert. Lass es uns machen. Klicken Sie auf „Maven-Änderungen laden“. Lassen Sie uns den Test noch einmal durchführen. Toll, alle Tests wurden bestanden. Lassen Sie uns nun den Test des sequentiellen Adressgenerators anpassen. Wir haben zwei neue Konstruktorparameter , die wir an den Service übergeben müssen. Lassen Sie uns zunächst die Adressgenerator-Fabrik instanziieren. Übergabe eines neuen Segs würde den Generator adressieren. Dann geben wir 20 als die anfängliche Anzahl der generierten Adressen weiter. Lassen Sie uns diesen Test nun erneut durchführen. Okay, wir haben vergessen, den Sicherheitsanbieter in der Setup-Methode hinzuzufügen . Lass es uns reparieren. Führe es erneut aus. Okay, der Test ist bestanden. Bei einigen Diensten fehlt die Service-Annotation. Lass uns das reparieren. Okay, jetzt fügen wir eine neue Bean hinzu, die die anfängliche Anzahl der generierten Adressen für jeden erweiterten Schlüssel sie willkürlich auf 20 setzt. Lassen Sie uns nun unsere Anwendung ausführen , um zu sehen, wie sie funktioniert. In der Konsole wurde ein Fehler angezeigt, der darauf hinweist, dass unserer Anwendung der Sicherheitsanbieter fehlt. Fügen wir es der Hauptmethode in der BYOD W-Anwendungsklasse hinzu. Lassen Sie uns unsere Anwendung erneut ausführen. Okay, der Fehler ist nicht aufgetreten, aber im Feld für die Empfangsadresse fehlt immer noch eine Adresse. Lass uns das ändern. Zuerst. Lassen Sie uns alle unsere Tests durchführen, um zu überprüfen welche anderen Tests behoben werden müssen. Die Tests für den Create Wallet Service sind defekt. Lass uns sie reparieren. Zuerst müssen wir ein gültiges Objekt mit sequentiellem Adressgenerator als dritten Parameter angeben. Lassen Sie uns es instanziieren, indem wir 20 als ersten Parameter und eine Adressgenerator-Fabrik als zweiten übergeben. Dann instanziieren wir die Fabrik genau wie im vorherigen Test. Jetzt wird sichergestellt, dass der Create Wallet Service ein Wallet mit zwei erweiterten Pub-Schlüsseln mit jeweils 20 Adressen erstellt . Bestätigt, dass das erste Feld mit erweiterten Pub-Schlüsseladressen eine Größe von 20 hat. Lassen Sie uns einen Getter für dieses Feld erstellen. Wird dasselbe für den zweiten erweiterten Pub-Schlüssel behaupten. Lassen Sie uns jetzt diesen Test durchführen. Toll, es ist bestanden. Lassen Sie uns nun den Test „Wallet erstellen“ bestehen lassen. Denken Sie daran, dass wir erwarten die Empfangsadresse TextField nach der Erstellung eines Wallets eine Adresse enthält. Gehen wir also zum Receiving Tab Controller. Fügt eine Methode namens initialize hinzu, die ausgeführt wird, nachdem die Anwendung diesen Controller initialisiert hat. Dann injizieren wir die aktuelle Brieftasche in diese Klasse. In der aktuellen Wallet-Klasse wird ein neues einfaches Zeichenketteneigenschaftsfeld namens Empfangsadresse enthalten ein neues einfaches Zeichenketteneigenschaftsfeld , das genau hier initialisiert wird und Setter und Getter dafür erstellt. Gehen wir nun zur Registerkarte Empfangen. Fxml fügt dem TextField eine Fx-ID hinzu. Diese Ethik-ID wird als Empfangsadresse bezeichnet und wir fügen sie auch dem Registerkarten-Controller für den Empfang hinzu. In der initialisierten Methode wird nun die aktuelle Wallet-Empfangsadresse an einen Listener gebunden , diese drei Parameter in einer Lambda-Funktion übernimmt. Im Lambda-Text wird das Feld für die Empfangsadresse auf den neuen Wert gesetzt , der eine Adresse sein wird. Im Update wird der aktuelle Wallet-Dienst nun die aktuelle Wallet-Empfangsadresse auf die erste Adresse des erweiterten Pub-Schlüssels der ersten Wallet setzen Wallet-Empfangsadresse auf die erste Adresse . Wenn nun die Empfangsadresse auf diese Weise geändert wird, wird dieser Listener ausgelöst, den wir hier im Receive Tab Controller eingestellt haben . Und hoffentlich wird die Adresse zum Feld für die Empfangsadresse hinzugefügt . Lassen Sie uns nun diese Tests durchführen, um zu sehen, ob sie funktionieren. Gruppen. Es ist gescheitert. Lass uns herausfinden warum. Okay, der Fehler ist aufgetreten, weil diese Methode initialisiert und nicht initialisiert werden muss. Lassen Sie uns das Problem beheben und die Anwendung ausführen. Großartig. Die Brieftasche hat unsere Erwartungen erfüllt und Feld für die Empfangsadresse ausgefüllt, nachdem wir eine Brieftasche erstellt haben. Wenn wir diese Adresse nun jemandem präsentieren, kann er Bitcoins an ihn senden. Lassen Sie uns nun alle Anwendungstests ausführen. Toll, sie haben alle bestanden. 21. 19 Erstellen unseres ersten wallet 10 skillshare 2: In diesem Video führen wir einen schnellen Refactoring im Segmentadressgenerator durch. Anstatt das Hauptnetzsegmentpräfix als Parameter für die Segmentadresse anhand der komprimierten Public-Key-Methode fest zu codieren als Parameter für die Segmentadresse anhand der komprimierten Public-Key-Methode können , wird ein Dienst erstellt , mit dem wir Adressen für erstellen die Testnetz- und Reg-Testumgebungen. Wir nennen diesen Service Address Prefix Factory. Es wird eine Get-Methode haben, bei der wir einen Adresstyp übergeben und ein Adresspräfix zurückgeben. Dieser zurückgegebene Wert wird als Parameter für die Segmentadresse aus der Methode mit komprimiertem öffentlichem Schlüssel verwendet . Jetzt fügen wir diesen Service in diese Klasse ein und erstellen ihn. Jetzt erstellen wir die Methode It's GET. Um diese Methode zu implementieren, wird eine Hilfszuordnung benötigt, die Adresstypen einer anderen Map zuordnet die Adresstypen einer anderen Map zuordnet und die drei Umgebungen ihren entsprechenden Adresspräfixen zuordnet . Lass es uns bauen und es wird klar, was ich gemeint habe. Lassen Sie uns nun diesen Parameternamen in den Adresstyp ändern. In der getMethod wird ein Adresspräfix zurückgegeben , indem der Adresstyp als ersten Schlüssel verwendet wird. Und eine Variable namens Bitcoin-Umgebung als zweiten Schlüssel der Map, die wir gerade erstellt haben. Die Bitcoin-Umgebungsvariable wird später in unserer Datei mit den Anwendungseigenschaften definiert und wir fügen sie in diese Klasse ein. Jetzt. Im Konstruktor fügen wir vor der Variablen eine Wertanmerkung hinzu, um ihren Wert aus der Eigenschaftendatei einzufügen. Lassen Sie uns nun das Zuordnungsfeld für den Adresstyp richtig eingeben. Lassen Sie uns nun die Konfiguration der Bitcoin-Umgebung zur Datei mit den Punkteigenschaften der Anwendung hinzufügen . Wir stellen es auf Reg-Test ein. Lassen Sie uns nun einige Testdateien reparieren, um die Änderungen zu bewältigen, die wir bisher vorgenommen haben. Beginnend mit dem Segmentadressgeneratortest wird dieser Teil gelöscht und der Segmentadressgenerator in der Setup-Methode instanziiert , der Adresspräfix-Factory als Parameter übergeben wird. Jetzt instanziieren wir die Adresspräfix-Factory und übergeben die Hauptnetzkonstante als Parameter. Lassen Sie uns jetzt diesen Test durchführen. Toll, es funktioniert weiter. Lassen Sie uns nun den Create Wallet Service Test korrigieren. Wir machen dasselbe wie beim letzten Test. Fügen Sie einfach das Adresspräfix Factory in den Segmentadressgenerator ein. Lass uns den Test machen. Toll, es ist vorbei. Lassen Sie uns nun den Test des sequentiellen Adressgenerators korrigieren. Wir machen dasselbe wie zuvor. Lassen Sie uns jetzt den Test durchführen. Toll, es hat zwei bestanden. Lassen Sie uns jetzt alle unsere Tests durchführen. Einige Tests sind fehlgeschlagen, weil in der Adress-Präfix-Factory eine Anmerkung fehlt. Lass es uns reparieren. Führen Sie die Tests erneut aus. Großartig. Alle Tests wurden bestanden. Lassen Sie uns nun diese kleine Umgestaltung vornehmen, bei der statische Importe für diese Konstanten hinzugefügt werden. Lassen Sie uns nun die Anwendung ausführen, um zu sehen, was wir bisher erreicht haben. Denken Sie daran, dass wir jetzt davon ausgehen , dass unser Wallet Reg-Test-kompatible Adressen generiert , da unsere Bitcoin-Umgebungseigenschaft auf Reg-Test eingestellt ist. Okay, wie erwartet generierte unser Wallet Adressen, die mit BCR t beginnen, da es das Präfix von Segmentadressen in der Reg-Testumgebung ist. Lassen Sie uns nun die Bitcoin-Umgebungseigenschaft zwei Hauptnetz ändern und die Anwendung erneut ausführen. Jetzt haben wir Adressen, die mit BC beginnen, was das Segmentadresspräfix für das Hauptnetz ist. Lassen Sie uns abschließend die Bitcoin-Umgebungseigenschaft ändern , um Net zu testen und dasselbe zu versuchen. Okay, jetzt können wir Adressen generieren, die mit TB beginnen . Dies ist das Präfix für netzkompatible Testadressen. Großartig, jetzt haben wir eine einfache Möglichkeit, die mit unserer Brieftasche kompatible Netzwerkumgebung zu ändern . 22. 20 Zubereiten von Knoten, um Bitcoins skillshare 2 zu empfangen: Wir haben jetzt eine Bitcoin-Wallet , die Adressen generieren mit verschiedenen Bitcoin-Netzwerkumgebungen kompatibel sind: Reg, Test, Test Net und Main Net. Es ist bereits möglich, diese Adressen zu verwenden , um Bitcoins zu empfangen. Dazu müssen Sie sie nur anderen Bitcoin-Besitzern zeigen, die ihre Wallets verwenden können, um Ihnen Bitcoins oder höchstwahrscheinlich Satoshi, bei denen es sich um Bitcoin-Bruchteile handelt, zu senden oder höchstwahrscheinlich Satoshi, bei denen es sich um Bitcoin-Bruchteile handelt, . Derzeit ist unser Wallet jedoch in der Lage, diese Zahlungen zu erkennen. an eine unserer Adressen passiert also nichts Nach einer Transaktion an eine unserer Adressen passiert also nichts in der Benutzeroberfläche unserer Wallets . Ab jetzt wollen wir das ändern. Wir werden mit der Entwicklung einer Funktion beginnen , die es uns ermöglicht, nach Transaktionen zu suchen, die in unserem Bitcoin-Kernknoten eingehen. Dann filtern wir die Transaktionen mit Ausgaben, die unseren aktuellen Wallet-Adressen entsprechen. Schließlich ändern wir unser Wallet, um Informationen über die Menge an Bitcoin anzuzeigen , die in unserer Wallet gespeichert ist. Stellen wir nun sicher, dass unser Bitcoin-Knoten korrekt konfiguriert und bereit ist , Transaktionsinformationen an unser Wallet zu senden und zu empfangen . Öffnen Sie dazu die Datei bitcoin.com. Der Speicherort dieser Datei hängt davon ab, welches Betriebssystem Sie verwenden. Da ich Windows Ten verwende, befindet sich meine bitcoin.com-Datei im Pfad auf dem Bildschirm. Öffnen Sie die Datei und stellen Sie sicher, dass sie so aussieht. Lassen Sie uns die Bedeutung jeder dieser Konfigurationen überprüfen. Der erste Parameter, reg test, ist auf eins gesetzt , damit unser Knoten in den Reg-Testumgebungen läuft. Da wir die Reg-Testumgebung verwenden werden um uns bei der Entwicklung unserer Anwendung zu helfen. Der zweite Parameter, data there, wird auf den Ordner gesetzt, dem der Knoten Blockchain- und Wallet-Informationen aufzeichnen soll . Ich habe meine auf den Doppelpunkt Backslash für Bitcoin-Daten gesetzt, aber Sie können jeden beliebigen Pfad wählen, den Sie bevorzugen. Der Serverparameter ist auf eins gesetzt, damit unser Knoten API-Aufrufe von unserer Anwendung empfangen kann. Die RPC-Benutzer- und RPC-Passwortparameter können beliebig eingestellt werden. Im Moment wähle ich BYUI W für beide. Wenn Sie unsere Anwendung jedoch wirklich verwenden, ist es sehr ratsam, sicherere Werte für diese Parameter zu wählen . Der TX-Index ist auf eins gesetzt. Dies ist notwendig, damit unser Knoten alle Transaktionsinformationen aus der Blockchain abrufen kann. Der Parameter für die Fallback-Gebühr kann auf 0,00 001 gesetzt werden. Dieser Wert wird für Transaktionsgebühren verwendet, die vom Knoten nicht angemessen berechnet werden konnten. Schließlich setzen wir die Eigenschaft z MQ pub Ratti x auf diesen Wert. Diese Eigenschaft legt die TCP-Adresse fest, an die die Transaktionsinformationen, die am Knoten ankommen, gesendet werden. unserer Anwendung hören wir uns dieselbe TCP-Adresse an und erfassen auf diese Weise neue Transaktionen, die an eine unserer Bitcoin-Adressen gesendet werden. Lassen Sie uns nun unseren Bitcoin-Knoten mit diesen Konfigurationen über das Terminal ausführen . Gehen Sie zu dem Ordner, in dem Ihre Bitcoin-Anwendung installiert ist. Das hängt davon ab , wo Sie es installiert haben und welches Betriebssystem Sie verwenden. Da ich Windows Ten verwende, habe ich bereits mein Terminal geöffnet und bin zu diesem Ordner auf dem Bildschirm gegangen. Starten Sie nun den Bitcoin-Knoten, indem Sie den Schrägstrich Bitcoin D eingeben und die Eingabetaste drücken. Jetzt läuft Ihr Bitcoin-Core-Knoten mit den Konfigurationen. Wir haben bereits gesagt, wir jetzt bereit für die nächsten Kurse sind. 23. 21 Node Teil 1 skillshare 2: In diesem Video erstellen wir einen HTTP-Client, einige Aufrufe an unseren Bitcoin-Kernknoten tätigt. Dieser Client wird später benötigt, wenn wir ihn zum Senden und Empfangen von Transaktionen verwenden werden . Zuerst importieren wir eine Abhängigkeit in die POM-Datei. dieser Abhängigkeit schließt das Spring Boot-Starter-Web, das für die HTTP-Client-Implementierung erforderlich ist, das für die HTTP-Client-Implementierung erforderlich ist, eine transitive Abhängigkeit aus dieser Bibliothek aus , indem es ein Ausschluss-Tag hinzufügt. Ausgenommen von der Abhängigkeit wird der Spring Boot-Starter Tomcat sein. Wir werden dies tun, um zu vermeiden, dass ein Webserver in unserer Anwendung gestartet wird. Klicken Sie nun auf die Schaltfläche Maven Changes laden. Lassen Sie uns nun eine Konfigurationsklasse für den Node-Client erstellen. Erstellen Sie eine Klasse namens Node client configuration innerhalb des API-Punkt-Konfigurationspakets unter einer Konfigurationsanmerkung dazu. Jetzt erstellen wir einige private Eigenschaften in dieser Klasse, denen alle eine Wertanmerkung vorangestellt ist. der ersten haben wir diese Wertanmerkung. Und es wird Node RPC URI heißen. Die nächste wird diese Wertanmerkung haben. Und es wird sein, dass der Node-RPC-Benutzername eine weitere Eigenschaft mit der folgenden Wertanmerkung mit dem Namen equal node RPC-Passwort haben wird der folgenden Wertanmerkung . All diese Eigenschaften werden aus Werten eingefügt, die später in der Datei mit den Punkteigenschaften der Anwendung hinzugefügt der Datei mit den Punkteigenschaften der Anwendung werden. Außerdem wird ein Balken mit der Rest-Template-Klasse erstellt . Template Builder wird als Parameter eine Pause benötigen. Wir verwenden diesen Builder, um Arrest-Template-Objekt mit einer Root-URI zurückzugeben , die der RPC-URI-Eigenschaft note entspricht. Es wird eine Standardauthentifizierung mit dem Note RPC-Benutzernamen und den Note-RPC-Passworteigenschaften haben. Dann rufen wir Build an und kehren zurück. Lassen Sie uns nun die Eigenschaften zuweisen , die in diese Klasse eingefügt werden. Gehen wir zur Datei mit den Punkteigenschaften der Anwendung. Lassen Sie uns der RPC-Punkt-URI-Eigenschaft Node dot die folgende Adresse zuweisen . Diese URI mit Port 18443 ist die Standard-URI für die Bitcoin Core Node RPC-API für die Reg-Testumgebung. Als Node-Dot-RPC-Punkt-Benutzernamen-Eigenschaft müssen Sie denselben Wert wählen, den Sie für die RPC-Benutzerkonfiguration in Ihrer bitcoin.com-Datei ausgewählt haben für die RPC-Benutzerkonfiguration in Ihrer bitcoin.com-Datei wie die Node-Dot-RPC-Punkt-Passwort-Eigenschaft wähle denselben Wert , den du für die RPC-Passwortkonfiguration auf deiner bitcoin.com festgelegt hast . Sie nun im Paket api dot services Erstellen Sie nun im Paket api dot services das Node-Paket, initiiert , erstellen Sie das Client-Paket. Lassen Sie uns nun die darin enthaltene Node-Client-Klasse erstellen. Lassen Sie uns die Service-Anmerkung hinzufügen. Lassen Sie uns nun die Rest-Template-Bean in diese Klasse einfügen. Wir fügen die folgende Methode hinzu, um Anfragen an die Bitcoin RPC API zu stellen. Für die Parameter wird eine String-Methode verwendet, eine parametrisierte Typreferenz vom Typ node client response, die als Nächstes eine String-URL und null oder mehr Objekte erstellt . Lassen Sie uns nun die Node Pliant-Antwort innerhalb des Punktknotens der Paketdomänen erstellen . Die Client-Methode Zurück zum Knoten instanziiert ein neues Node-Client-Anforderungsobjekt. Es verwendet die Argumente Methode und Parameter in seinem Konstruktor. Lassen Sie uns diese neue Klasse innerhalb der Domänen erstellen , dieses Node-Paket. Lassen Sie uns seinen Konstruktor erstellen. Jetzt packen wir die Anfrage in ein HTTP-Entity-Objekt ein. Dann geben wir das Ergebnis dieses Methodenaufrufs zurück , der schließlich eine Post-Anfrage an den Bitcoin Core Node stellt, die Node-Client-Antwortklasse anpassen sie in eine umwandeln Wenn Sie eine Ergebniseigenschaft aufzeichnen und ihr eine Ergebniseigenschaft hinzufügen, wird eine ähnliche Anpassung an die Node-Client-Anfrage vorgenommen, sie in einen Datensatz umgewandelt und diese Felder hinzugefügt. Wir haben vergessen, hier ein T zu platzieren. Jetzt werden wir sehen, wie Sie die Bitcoin Core Node API einen wichtigen Aufruf tätigen können. Gehen Sie auf dem Bildschirm zu dieser Website. Es ist ein Verweis auf den Create Wallet Bitcoin Core RPC-Aufruf. In der letzten Zeile sehen wir , dass dieser Aufruf einen Methodenschlüssel mit dem Wert create wallet in seinem Hauptteil benötigt . Jeder Bitcoin-API-Aufruf hat dieses Format, wobei der Methodenschlüssel den Namen der Methode enthält. Bitcoin-API-Aufrufe haben auch einen Parameterschlüssel, der verschiedene Datentypen enthält. In diesem Fall ist sein Wert ein Array mit nur einem Element. Der Wallet-Name, das Create-Wallet genannt wird erstellt ein Wallet im Bitcoin Core und lädt es. Viele API-Aufrufe, die wir später verwenden werden, sind erforderlich. Unser Bitcoin-Kernknoten hat jedoch eine geladene Brieftasche. Zurück zum Node-Client. Wir können jetzt verstehen, warum die Methode make request ein Anforderungsobjekt erstellt, das ein Zeichenkettenargument namens method und ein Argument vom Variablentyp namens params verwendet. Lassen Sie uns nun eine Klasse namens Node Create Wallet Client erstellen. Lassen Sie uns eine Service-Anmerkung hinzufügen. Injiziert den Node-Client hinein. Jetzt erstellen wir eine Methode namens create, die einen Zeichenkettenparameter benötigt. Rufen Sie nun die Create-Wallet-Methode der Bitcoin Core-API auf. Wir nennen sie die Make-Request-Methode des Node-Clients wie folgt, entsprechend der Referenz auf die Bitcoin Core-Website. Wir werden diese Methode jetzt dafür testen. Lassen Sie uns unseren Bitcoin Core Node im Terminal ausführen. Anstatt unsere traditionelle TDD-Methode zu verwenden, werden wir diese Methode anders testen. Zurück zum Node Create Wallet Client erstellt eine Methode, der eine Post-Construc-Annotation vorangestellt ist. Die Post-Konstrukt-Annotation ist nützlich, um Code auszuführen, wenn eine Spring-Anwendung gestartet wird. Es ist auch nützlich für Schnelltests und Spring-Anwendungen, fast so, als würde man eine statische Hauptmethode in einer Java-Klasse erstellen , bietet jedoch alle Vorteile der von der Anwendung verwalteten Beans. Innerhalb dieser Methode wird die Methode create aufgerufen und ein beliebiger Wallet-Name übergeben. Lassen Sie uns die Anwendung ausführen. Okay, wenn die Bitcoin Core Node-Protokolle im Terminal ansehen, sehen wir, dass unser Node eine Wallet mit dem Namen erstellt und geladen hat, den wir im Methodenaufruf angegeben haben. Damit wissen wir, dass unsere Methode funktioniert und können diese Post-Construct-Methode entfernen. Gehen wir nun erneut zur Bitcoin Core-Website und suchen Sie nach der List Wallet DIR-Methode. Diese Methode benötigt keine Parameter und gibt alle bisher erstellten Node-Wallets zurück. Es gibt eine JSON-Struktur mit einem Wallets-Feld zurück. Dieses Feld enthält eine Reihe von Objekten, denen jedes ein vorhandenes Wallet mit einem Namensfeld darstellt . Lassen Sie uns einen Client für diese Methode erstellen. Wir nennen es Node List, solange es Client ist. Lassen Sie uns erneut den Node-Client in diese Klasse einfügen. Dann erstellen wir die Methode List All, die eine Liste von Wallet-Namen zurückgibt. Innerhalb dieser Methode werden sie die Methode make request vom Node-Client aufrufen und die Liste wallet DIR als Methodennamen übergeben . Eine neue parametrisierte Typenreferenz und eine leere URL. Wir werden keine zusätzlichen Parameter übergeben. Das zurückgegebene Objekt wird ein Node-Wallets-Datensatz sein , der jetzt erstellt wird Wir erstellen ihn innerhalb des Punktknotenpakets der Domain. Dieser Datensatz wird nur ein Feld haben. Es wird eine Liste von Node-Wallets sein. Ihr Name wird Wallets sein. Lassen Sie uns den Node-Wallet-Datensatz im selben Paket erstellen. Das einzige Feld wird ein Zeichenkettenname sein. Denken Sie daran, dass wir diese Objekte auf der Grundlage dieser Referenz von der Bitcoin Core-Website modellieren . Wallets-Feld im Node-Wallets-Datensatz entspricht jedoch dem Namen dieses Felds in der JSON-Antwort des API-Aufrufs. Das Gleiche passiert mit dem Namensfeld des Node-Wallet-Eintrags. Das Wallets-Feld aus der Antwort enthält eine Liste von Objekten mit dem Namensfeld. Jedes dieser Objekte wird als NerdWallet-Einträge in der Anwendung gespeichert und zwar zurück in der Knotenliste, während sie Client ist. Aus der Liste gibt jede Methode eine Liste von Wallet-Namen zurück. Dazu holen wir uns die Wallets von den Node-Wallets. Dann rufen wir Stream ordnen dann zu und übergeben dann einen Verweis auf das Feld für den Namen des Node-Wallets. Dann konvertieren wir das Ergebnis in eine Liste und geben es zurück. Lassen Sie uns nun die Methode list all testen, indem wir eine Methode verwenden, die mit dem Post-Konstrukt annotiert ist, jedes Element ausgibt, das vom Methodenaufruf list all zurückgegeben wird . In dieser Zeile auf der Konsole sehen wir, dass die Anwendung den Namen der Node-Wallet protokolliert , die wir erstellt haben. Großartig. Jetzt implementieren wir einen weiteren Client, der die Node-API-Methode namens List Wallets aufruft. Der Unterschied zwischen dieser Methode und dem List Wallet DIR besteht darin, dass die Listen-Wallets nur die aktuell vom Knoten geladenen Wallets zurückgeben . Es gibt auch eine Liste von Wallet-Namen zurück , ohne sie in Objekte zu packen. Lassen Sie uns nun die Methode List Loaded erstellen. Es wird eine Liste mit Wallet-Namen zurückgegeben. Dazu müssen wir nur diesen Methodenaufruf zurückgeben. Lassen Sie uns es jetzt genauso testen, wie wir die Liste getestet haben. Ich rufe an. Wir sehen es von der Konsole aus, aber unsere Anwendung protokolliert zweimal den Wallet-Namen, den wir erstellt haben. Der erste war auf den Methodenaufruf list all zurückzuführen, und der zweite auf den Methodenaufruf von list loaded. nun wie folgt vor, um den Unterschied zwischen den beiden Methodenaufrufen zu sehen wir nun wie folgt vor, um den Unterschied zwischen den beiden Methodenaufrufen zu sehen. Beenden Sie die Bitcoin Core Node-Anwendung indem Sie am Terminal Strg plus C drücken. Starten Sie nun den Bitcoin Core Note erneut. Lassen Sie uns jetzt den gleichen Test machen. Fügen Sie jedoch zuerst diese Zeilen vor den Methodenaufrufen hinzu, um zwischen den einzelnen Methoden zu unterscheiden. In der Konsole sehen wir, dass nur der Methodenaufruf list all das erstellte Wallet zurückgegeben hat. Dies zeigt, dass wir nach dem Start der Bitcoin Core Node-Anwendung die Wallet laden müssen, die wir verwenden werden, damit wir andere API-Aufrufe durchführen können die ein Node-Wallet geladen werden muss. Aber wie das in der Praxis funktioniert, werden wir in den nächsten Videos sehen . 24. 22 Node Teil 2 skillshare 2: In diesem Video werden wir weiterhin weitere Methoden implementieren, mit denen wir von unserer Anwendung aus mit unserem Bitcoin-Knoten interagieren können. Die erste Methode ist eine Methode , die ein Node-Wallet lädt. Wenn du deinen Node ausführst, musst du ein Wallet laden, um viele andere Node-Methoden aufrufen zu können . Lassen Sie uns also den Node Load Wallet-Client erstellen. Wie immer bei einer Service-Anmerkung dazu. Jetzt injizieren wir den Node-Client hinein. Dann erstellen wir die Lademethode, die den Namen der Brieftasche als Parameter verwendet. Dann rufen wir sie einfach wie folgt vom Node-Client auf die Methode make request auf. Lassen Sie uns diese Methode nun mit einem Post-Konstrukt testen. Lassen Sie uns zunächst diese Post-Construct-Methode entfernen , die wir zuvor erstellt haben. Jetzt rufen wir die Lademethode übergeben den Namen der von uns erstellten Wallet. Bevor wir es ausführen, lassen Sie uns unseren Bitcoin-Knoten im Terminal ausführen. Okay, aus den Terminalprotokollen sehen wir, dass unser Knoten unsere Brieftasche korrekt geladen hat. Jetzt erstellen wir einen nützlichen Dienst, um ein Node-Wallet zu laden , falls es bereits existiert und nicht geladen ist. Wenn eine Wallet mit diesem Namen bereits existiert und bereits vom Knoten geladen wurde, wird die Methode nichts tun und wir kehren zurück. Wenn ein Wallet mit diesem Namen nicht existiert, erstellt es die Methode und der Knoten wird automatisch geladen, da er nach seiner Erstellung ein Wallet lädt. also im Paket Services Punkt Node einen Klassennamen erstellen, Lassen Sie uns also im Paket Services Punkt Node einen Klassennamen erstellen, Node Load oder einen Wallet-Dienst erstellen. Lassen Sie uns die folgenden Clients hineininjizieren. Der Knoten erstellt einen Wallet-Client, der Node lädt den Wallet-Client und die Node-Liste ist dabei sein Client. Lassen Sie uns nun eine Methode namens load oder create wallet erstellen. Es wird einen Namen als Parameter annehmen. Darin wird die Methode list all aus der Node List aufgerufen . Der Wallets-Client speichert das Ergebnis in einer Variablen namens all wallets. Dann rufen wir die Methode list loaded vom selben Client aus auf. Und wir speichern das Ergebnis in der Variablen Loaded Wallets. Jetzt fügen wir eine if-Anweisung die auf die folgende Bedingung überprüft. Wenn diese Bedingung als wahr ausgewertet wird, bedeutet dies, dass das Wallet mit diesem Namen bereits existiert und vom Knoten geladen wurde. Wenn das der Fall ist, müssen wir nichts tun und können zurückkehren. Jetzt fügen wir die folgende if-Anweisung hinzu. Wenn diese Anweisung den Wert true zurückgibt, bedeutet dies, dass bereits eine Wallet mit diesem Namen existiert, diese aber nicht vom Knoten geladen wurde. Wenn das der Fall ist, rufen wir die Load-Methode vom Node Load Wallet-Client aus auf, übergeben den Namen der Brieftasche und kehren zurück. Wenn die Codeausführung die vorherigen IF-Anweisungen als falsch bewertet, bedeutet dies schließlich die vorherigen IF-Anweisungen als falsch bewertet, , dass kein Wallet mit diesem Namen existiert. In diesem Fall erstellen wir einfach das Wallet, rufen die Methode create vom Node create Wallet-Client auf und übergeben den Namen des Wallets. Okay, die Methode ist beendet. Wir werden es in den nächsten Videos verwenden. Lassen Sie uns nun einen weiteren nützlichen Client erstellen. Es wird Node get new address client heißen. Wie der Name schon sagt, wird es verwendet, um eine neue Adresse aus unserem geladenen Node-Wallet zu generieren . Lassen Sie uns also den Node-Client hineininjizieren. Jetzt erstellen wir eine Methode mit dem Namen get new address. Es wird die Adresse in einer Zeichenfolge zurückgeben. Und es wird den Namen der Brieftasche als Parameter verwenden. Dann kehren wir zurück, um den Methodenaufruf vom Node-Client mit diesen Parametern anzufordern . Beachten Sie, dass wir den URL-Parameter auf die Zeichenfolge Wallet, Schrägstrich, den Namen der Brieftasche gesetzt haben. Auf diese Weise teilen wir unserem Node mit, dass wir eine Adresse von dieser speziellen Brieftasche benötigen. Lassen Sie uns diese Methode testen. Dazu erstellen wir die folgende Methode mit Post construct. Die annotierte Methode ruft die Methode get new address auf und übergibt den Namen einer Wallet, die wir zuvor geladen haben, als Parameter. Wenn wir diese Methode aufrufen, ohne diese Wallet First zu laden, funktioniert sie nicht und der Knoten gibt einen Fehler zurück. Wir speichern das Ergebnis des Methodenaufrufs in der Adressvariablen und drucken es aus. Lass es uns testen. Das Konsolenprotokoll zeigt, dass eine Bitcoin-Segment-Reg-Testadresse generiert und gedruckt wurde. Großartig. Notieren Sie sich Ihre generierte Adresse. Wir werden es verwenden, um die Methode zu testen, die wir als nächstes implementieren werden. Jetzt werden wir eine Methode erstellen, die verwendet wird, um einige Blöcke zu verwalten, die Bitcoins an eine Adresse erzeugen. Diese Methode funktioniert nur in der Reg-Testumgebung und wird für uns bei einigen Tests nützlich sein, bei denen eine anfängliche Anzahl von Münzen zum Spielen erforderlich ist. Lassen Sie uns eine Klasse namens no degenerate erstellen , um den Client zu adressieren. Wie üblich injizieren wir den Node-Client hinein. Dann erstellen wir eine Methode namens generate to address. Als Parameter werden ein Wallet-Name, eine Anzahl von Blöcken und eine Adresse benötigt. Dann rufen wir sie vom Node-Client aus mit den folgenden Parametern auf. Auch hier übergeben wir die Zeichenfolge Wallet Slash an die Namensvariable. Dann übergeben wir den Blockparameter, die Anzahl der Blöcke angibt , die Sie generieren möchten. Schließlich übergeben wir die Adressvariable, die Adresse, an die die generierten Bitcoins gesendet werden . Lassen Sie uns nun diese Methode testen. Zuerst. Lassen Sie uns den vorherigen Beitrag entfernen annotierte Methode konstruieren. Nun werden wir dafür sorgen, dass diese Post-Construct-Methode die Methode generate to address aufruft und dabei den Namen einer geladenen Brieftasche übergibt. Auch hier gilt: Wenn Sie den Namen einer Wallet übergeben , die nicht existiert oder nicht geladen ist, funktioniert die Methode. Wir erstellen 1.000 Blöcke und geben die zuvor generierte Adresse weiter. Lass es uns ausführen. Wenn wir unsere Knotenprotokolle überprüfen, sehen wir, dass einige Zeilen angezeigt darauf hinweisen, dass unsere aufgerufene Methode funktioniert hat. Der letzte Client, der für dieses Video erstellt wird , heißt Node get balanced client. Es wird verwendet, um das Guthaben unserer Geldbörsen zu überprüfen. Lassen Sie uns den Node-Client hineininjizieren. Dann erstellen wir die Get-Methode, die die Anzahl der Bitcoins zurückgibt , die unsere Brieftasche enthält. Es wird den Namen der Brieftasche als Argument verwenden. Dann geben wir diesen Methodenaufruf zurück. Wie die vorherigen Methoden. Diese Methode sendet dem Wallet einen Schrägstrich mit dem Wallet-Namen als URL-Parameter, um die Rendite des Guthabens dieser bestimmten Brieftasche zu definieren . Lassen Sie uns diese Methode mit einem Post-Konstrukt testen. Ruft die Methode get auf und übergibt den Namen einer zuvor geladenen Brieftasche. Auch diese Methode funktioniert nicht. Wenn das letzte Wallet nicht vom Knoten geladen wird, speichern wir das Ergebnis des Aufrufs in einer Variablen und drucken es aus. Lass es uns testen. Großartig. Aus den Protokollen sehen wir, dass wir jetzt Tausende von Bitcoins haben. Natürlich sind diese Bitcoins nur in unserer Reg-Testumgebung gültig. In den nächsten Videos werden wir sie zum Testen verwenden. 25. 23 Node 3 skillshare 2: In diesem Video erstellen wir einen Client, der es uns ermöglicht, Bitcoin von unserer Node-Wallet an jedes andere rote Kleid zu senden Bitcoin von unserer Node-Wallet , das wir wollen. Dann verwenden wir alle Clients, die wir bisher erstellt haben, um einen Test für den Empfang von Bitcoins an eine Adresse unserer Application Wallet zu erstellen einen Test für den Empfang von Bitcoins an . Nachdem wir also alle vorherigen Post-Construct-Methoden aus früheren Lektionen entfernt haben, erstellen wir eine Klasse namens nodes, die an den Address-Client gesendet wird. Lassen Sie uns nun den Node-Client hineininjizieren. Dann erstellen wir eine Methode namens send to address als Parameter oder Walletname und Adresse sowie einen Betrag. Dann rufen wir sie die Methode make request vom Node-Client auf und übergeben die folgenden Parameter. Auch hier übergeben wir Wallet Slash, die Namensvariable für die Brieftasche. Es wird die Brieftasche sein, von der die Bitcoins gesendet werden. Außerdem werden eine Adresse benötigt, an die die Bitcoins gesendet werden, und ein Betrag, Betrag ist , der in Bitcoins überwiesen wird. Lassen Sie uns diese Methode testen. Sie zunächst sicher, dass Ihr Knoten läuft. In meinem Fall muss ich damit beginnen. Stellen wir nun sicher, dass unser Node-Wallet mit Bitcoins finanziert ist, damit wir Bitcoins von dort aus senden können . Dazu wird die Get-Balanced-Methode aufgerufen, um dies zu überprüfen. Aber dieses Mal rufen wir es vom Terminal aus an. Jede API-Methode, die wir von unserer Anwendung aus aufrufen können von unserer Anwendung aus aufrufen können mit der Bitcoin CLI-Anwendung vom Terminal aus aufgerufen werden . Öffnen Sie ein anderes Terminalfenster und wechseln Sie zu demselben Ordner, in dem Ihr Knoten installiert ist. Geben Sie dann den folgenden Befehl ein, um eine zuvor erstellte Brieftasche zu laden , und drücken Sie die Eingabetaste. In meinem Fall muss ich nach dem Laden der Brieftasche den Namen der Testing-Brieftasche eingeben. Dies ist der Name der Brieftasche, die ich zwischen doppelten Anführungszeichen erstellt habe. Okay, jetzt, da unser Wallet geladen ist, können wir andere Befehle eingeben, die dies erfordern. Geben wir also diesen Befehl ein , um unser Wallet-Guthaben zu überprüfen. Nun, es ist ausgewogen, ist Null. Es sieht so aus, als ob jedes Mal, wenn wir die Notiz und die Reg-Testumgebung neu starten , unsere Gelder verschwinden. Kein Problem. Wir finanzieren unser Node Wallet. Jetzt mit der Befehlszeilenschnittstelle. Dazu bekommen wir zunächst eine neue Adresse von unserem Node, solange dieser so ist. Dann rufen wir den Befehl generate to address auf , um 1.000 Blöcke zu generieren , und senden die Blockprämien an die Adresse, die wir gerade generiert haben. Rufen wir nun den Befehl Get balanced erneut auf. Großartig. Wir sehen, dass unsere Brieftasche jetzt Tausende von Bitcoins enthält. Schon wieder. Nun zurück zum Node Send to Address Client. Lassen Sie uns eine Post-Construct-Methode erstellen , um die Methode „An Adresse senden“ zu testen. Ruft die Methode „An Adresse senden“ auf und übergibt den Namen der geladenen Brieftasche. Der zweite Parameter kann eine beliebige Reg-Testadresse sein. Wir verwenden die Bitcoin CLI , um eine neue Adresse zu generieren. Dann übergeben wir es als zweiten Parameter an die Methode Send to Address. Dann wählen wir einen als Betrag. Lass es uns ausführen. Okay, wenn wir die Get Balanced-Methode über die Bitcoin-CLI aufrufen, werden wir feststellen, dass sich unser Balanced kaum verändert hat. Es gibt einen kleinen Unterschied zwischen dem aktuellen Saldo und dem vorherigen Saldo. Dieser Unterschied ist auf die Transaktionsgebühr zurückzuführen, da wir einen Bitcoin von derselben Node-Wallet an eine Adresse übertragen haben, wenn wir die Methode get receive by address über die CLI aufrufen . Durch die Weitergabe der Adresse haben wir einen Bitcoin an die Zahl Null als zweiten Parameter geschickt , was angibt, dass wir den Saldo wollen, einschließlich unbestätigter Transaktionen, wir erhalten den Wert eins, welchen Betrag überweisen wir an diese Adresse. Okay, wir haben unser CLI vorerst beendet. Lassen Sie uns die Methode Post Construct entfernen. Jetzt wird im BYOD ein Punkt klebriges Paket den empfangenen Bitcoin-Test erstellen. Dieser Test wird viele Gemeinsamkeiten mit dem Create Wallet-Test haben. Also lassen wir es eine abstrakte Klasse namens GUI-Test erweitern , die wir erstellen werden. Diese Klasse wird alle Methoden haben, die allen GUI-Tests gemeinsam sind, die wir benötigen. Also lass es uns erstellen. Beim Create-Wallet-Test werden alle Eigenschaften und Methoden außer der letzten ausgeschnitten und in die GUI-Testklasse übertragen. Dann fügen wir die Spring Boot-Test-Annotation hinzu und sie erweitert die Anwendungsspezifikationsklasse. Wir werden dieselbe Anmerkung aus dem Create Wallet-Test entfernen und sie dazu bringen, die GUI-Testklasse zu erweitern. Lassen Sie uns alle ungenutzten Importe entfernen. Jetzt werden alle privaten Eigenschaften im GUI-Test geschützt und dieser Sicherheits-Punkt-Add-Provider-Aufruf in die Startmethode aufgenommen. Schließlich werden wir diese Klasse abstrakt machen. Lassen Sie uns nun den Create Wallet-Test testen, um festzustellen, ob bei einem Fehler alles wie zuvor funktioniert . Meine Intuition sagt, dass es sich um einen IntelliJ-Ideenfehler handelt. Um das Problem zu lösen, nennen wir sie Maven Clean Lifecycle Method. Lassen Sie uns auch das Projekt neu aufbauen und alle Anwendungstests ausführen. Alle Tests bestanden. Es war also nur ein IDE-Bug. Lassen Sie uns nun mit dem Aufbau unseres Bitcoin-Tests fortfahren unseres Bitcoin-Tests , der die folgenden Bohnen hineinbringt. Der Knoten sendet an den Adressclient, der Knoten lädt oder erstellt einen Wallet-Service. Der Knoten wird ausgeglichen, Client. Und der Knoten bekommt einen neuen Adressclient. *****. Es sieht so aus, als hätten wir vergessen, das Wort Client hinzuzufügen und der Knoten bekommt eine neue Adresse. Benennen wir es um. Lassen Sie uns nun eine Setup-Methode erstellen , die ausgeführt wird, bevor diese Klasse getestet wird. Darin wird die Methode load oder create wallet vom Node load- oder Create-Wallet-Dienst aufgerufen, da sein Parameter die Zeichenfolge übergibt, Wallet testet und in der Konstante speichert. Dann nennen wir bei Bedarf die Methode create balance, die als Nächstes erstellt wird. Bei dieser Methode überprüfen wir zunächst den Saldo der Test-Wallet mithilfe des Node Get Balanced Client. Wenn das Guthaben weniger als 100 Bitcoin beträgt, erhalten wir eine neue Adresse aus der Test-Wallet. Verwenden Sie den Node Generate , um den Client zu adressieren , den wir vergessen haben, in diese Klasse einzufügen, und wir werden es jetzt tun. Wir generieren 1.000 Blöcke und finanzieren so unseren Geldbeutel. Und wir machen diese Methode privat. Wenn diese Methode vor den Tests ausgeführt wird, garantieren wir, dass wir immer Bitcoins haben , die wir in unseren Tests verwenden können. Jetzt erstellen wir einen Test namens should receive Bitcoin. Zu diesem Zeitpunkt wird Block dem Windblock im Test „Brieftasche erstellen“ ähnlich sein . Wir rufen die folgenden Methoden auf, um eine neue Brieftasche zu erstellen. Wir klicken auf den Tab Empfangen. Dann suchen wir den Wert in der Empfangsadresseingabe nach, die zu diesem Zeitpunkt die erste Adresse unserer Brieftasche enthält. Und wir speichern es in der Adressvariablen. Jetzt rufen wir die Methode Send to Address von dem Knoten auf, der an den Adressclient gesendet wurde. Als Parameter werden der Name der Test-Wallet, die Adresse, die wir mit unserer Application Wallet generiert haben, und den Betrag eins übergeben die Adresse, die wir mit unserer Application Wallet generiert haben, . Nach Erhalt von Bitcoins erwarten wir, dass unser Application Wallet die Transaktion erkennt, aber dieser Vorgang wird nicht sofort erfolgen. Es wird einige Sekunden dauern, bis das passiert. Aus diesem Grund verwenden wir eine Methode namens wait-for von test fx. Da die Parameter zehn überschreiten , ist dies der Timeout-Wert für das Gewicht. Das Timeout ist in diesem Zusammenhang die maximale Zeit, die die Anwendung warten muss, bevor eine Timeout-Ausnahme ausgelöst wird . Der zweite Parameter gibt die Zeiteinheit des vorherigen Parameters an. Also wählen wir Sekunden. Der letzte Parameter wird eine Callback-Methode sein. Darin wird nach einer GUI-Komponente mit einer Adress-ID gesucht. Table, fragt es ab, hat eine TableView und speichert das Ergebnis in einer Variablen desselben Typs. Dann geben wir den Vergleich zwischen der TableView-Elementgröße und der Größe eins zurück . Diese Tabelle TableView mit Adress-ID wird eine Komponente sein, in der eine Tabelle gespeichert wird, die Zeilen enthält, jeweils mit einer Adresse unseres Wallets, die mit dem Guthaben belastet sind. Die Callback-Methode läuft in einer Schleife und stoppt nur, wenn der Vergleich den Wert true zurückgibt oder wenn der Timeout erreicht ist. Zusammenfassend lässt sich sagen, dass diese Gewichtung für den Methodenaufruf Folgendes bewirkt. Es wird überprüft, ob auf dem Bildschirm eine Tabelle mit einer Zeile gefüllt ist . Dies geschieht, wenn unser Wallet feststellt, dass eine seiner Adressen eine Transaktion erhalten hat , und es eine Tabellenzeile mit diesen Informationen gefüllt hat. Es wird 10 s warten , bis das passiert oder weniger. Wenn die Tabelle zuvor mit einer Zeile gefüllt wurde, kopieren wir die Nachschlagezeile für die Tabellenansicht und fügen sie hier ein. Dann überprüft Block erneut, ob die Größe des TableView-Elements eins entspricht. Lassen Sie uns diesen Timeout-Wert in einer Konstanten speichern. Lassen Sie uns jetzt den Test durchführen. Wie erwartet. Der Test ist fehlgeschlagen, weil die Adresstabelle nicht gefunden wurde. Im nächsten Video beginnen wir mit der Implementierung dieser Funktion in unserer Wallet. 26. 24 Empfangen von bitcoin 1 skillshare 2: In diesem Video erstellen wir eine Tabelle mit Informationen zu unseren Adressen. Diese Tabelle enthält jede finanzierte Adresse, ihren Betrag in Bitcoin und die Mindestanzahl von Bestätigungen, die Transaktionen an diese Adressen haben. Die Idee ist , diese Tabelle auszufüllen, unmittelbar nachdem unsere Wallets Transaktionen erkannt haben, die an unsere Adressen gesendet wurden. also im Hauptfenster Punkt FXML Wenn wir also im Hauptfenster Punkt FXML auf die Registerkarte Scene Builder klicken, sehen wir, dass dort eine Meldung zum Herunterladen von Java FX angezeigt wird, auch wenn wir es zuvor heruntergeladen haben. Dies liegt daran, dass diese IDE-Funktion externe Komponenten, wie z. B. den Receive-Tab-Controller, nicht gut verarbeitet . Um den Scene Builder verwenden zu können, wird also eine neue FXML-Datei namens Playground erstellt. In diese Datei fügen wir den gesamten Inhalt des Hauptfensters Punkt FXML ein. Anstatt jedoch externe Komponenten wie den Receive Tab Controller zu verwenden , werden sie in die Datei eingefügt. Sie also im Resources Dot FXML-Paket Erstellen Sie also im Resources Dot FXML-Paket die Playground Dot FXML-Datei. Löschen Sie den gesamten Inhalt. Kopieren Sie dann den gesamten Inhalt aus dem Hauptfenster Punkt FXML und fügen Sie ihn dort ein. Jetzt ersetzen wir den Inhalt aus dem Tag-Receive-Tab-Controller durch den Inhalt aus dem Tab Empfangen, Punkt FXML. Und wir werden das FX-Root-Tag mit dem Tag-Tag modifizieren. Und lassen Sie uns das Typattribut löschen. Lassen Sie uns das Insets-Tag importieren. Wenn wir jetzt auf den Scene Builder klicken, können wir ihn normal verwenden. Lassen Sie uns nun der VBox-Komponente einen neuen Tab-Bereich hinzufügen. Lassen Sie uns nun einen der erstellten Tabs löschen. Lassen Sie uns die verbleibenden Tab-zwei Adressen umbenennen. Geben wir ihm eine FX-ID der Registerkarte „Adressen“. Jetzt fügen wir auf der Registerkarte Inhalt eine Komponente für die Tabellenansicht hinzu. Leider erlaubt uns der Scene Builder aus fehlerhaften Gründen nicht , einer Registerkarte eine Tabellenansicht hinzuzufügen. Kein Problem. Lassen Sie uns es mit dem Texteditor hinzufügen. Lassen Sie uns hier auch eine Fx-Idee der Adresstabelle hinzufügen. Gehen wir zurück zum Scene Builder. Es fing wieder an zu funktionieren. Jetzt haben wir eine leere Tabelle auf der Registerkarte Adressen. Jetzt fügen wir der Tabelle drei Spalten hinzu. Wir benennen in der ersten Spalte zwei Adressen um, in der zweiten Spalte den Kontostand und in der dritten zwei Bestätigungen. Dann klicken wir auf die Tabelle und ändern diese Konfiguration auf eingeschränkte Größenänderung. Jetzt hat jede Spalte die gleiche Größe und sie nehmen den gesamten Tabellenbereich ein. Lassen Sie uns nun auf jede Tabellenspalte klicken und die Auswahl aufheben. Sie sind bearbeitbare und sortierbare Checkboxen. Jetzt wird für jede Tabellenspalte ihre maximale Breite auf 100 gesetzt. Dies ist nur ein notwendiger Trick , damit wir ihre Größe anpassen können. Lassen Sie uns nun ihre Größe mit der Maus wie folgt anpassen. Die Adressspalte muss größer sein, da Adressen mehr Platz beanspruchen Saldo- und Bestätigungsspalten können dieselbe Größe haben. Zurück zum Texteditor. Lassen Sie uns das Attribut pref height des Tab-Fensters auf 355 ändern . zum Scene Builder zurückkehren, können wir sehen, dass er besser aussieht. Lassen Sie uns auch die Platzhalternachricht ändern, die angezeigt wird, wenn die Tabelle leer ist. Dazu müssen wir nur ein leeres Label-Tag in dieses Platzhalter-Tag einfügen . Jetzt, da unsere Tabellenkomponente auf dem Spielplatz fertig ist, erstellen wir ein FXML dafür. Nennen wir es Adressentabelle. Lassen Sie uns den gesamten Boilerplate-Code löschen. Und lassen Sie uns den gesamten Inhalt zwischen dem TableView-Tag kopieren und dort einfügen. Anstatt das Table-View-Tag zu verwenden, verwenden wir nun das FX-Root-Tag, das Pflanzen der Tabellenansicht und das Type-Attribut verweist. Lassen Sie uns die verbleibenden Tags importieren. Und lassen Sie uns dieses XML - und S-Attribut hier hinzufügen. Nun zurück zum Spielplatz FXML. der Registerkarte „Adressen“ fehlt eine FX-ID. Lassen Sie uns etwas hinzufügen. Diese Idee wurde bereits versehentlich in der VBox-Komponente verwendet . Also lass es uns von dort entfernen. Lassen Sie uns nun diese vier Zeilen kopieren und in das Hauptfenster einfügen. Lassen Sie uns nun die abschließenden Tags und die von uns kopierten Tags hinzufügen. Jetzt löschen wir das Tabellen-View-Tag und fügen an seiner Stelle ein Content-Tag hinzu. Darin wird ein Controller-Tag für die Adresstabelle hinzugefügt. Lassen Sie uns nun diesen Controller erstellen. Lassen Sie uns eine Komponentenannotation hinzufügen. Es muss die Klasse Table View um die Adressklasse als Typparameter erweitern . Nun zurück zum Hauptfenster. Lassen Sie uns den kürzlich erstellten Controller importieren. im Adressentabellencontroller Lassen Sie uns im Adressentabellencontroller einen Konstruktor erstellen. Es wird ein FXML-Parameter mit einer Wertanmerkung benötigt. Die Wertanmerkung wird auf die Adresstabelle FXML verweisen. Der zweite Konstruktorparameter wird ein Anwendungskontextobjekt sein. Im Hauptteil des Konstruktors wird ein neues FXML-Loader-Objekt erstellt und es mit diesen Parametern initialisiert. Dann stellen wir seinen FXML-Controller darauf ein. Und wir werden den Weg dorthin festlegen. Dann rufen wir Load darauf auf. Und wir fügen dem Konstruktor eine Throws-Anweisung hinzu. Wir müssen noch etwas tun, damit es funktioniert. Fügen Sie in dieser if-Anweisung im GUI gestarteten Listener den folgenden Code hinzu. Dies ist erforderlich, damit Java FX das Adress-Controller-Tag korrekt erstellen kann. Lassen Sie uns nun unsere Anwendung ausführen , um zu sehen, wie sie funktioniert. Toll, in Ordnung, der Kleidertisch sieht gut aus. In den nächsten Videos werden wir dafür sorgen, dass es für unsere Geldbörsen funktioniert. 27. 25 Empfangen von bitcoin 2 skillshare 2: In diesem Video werden wir dafür sorgen, dass unsere Wallets mit unseren Bitcoin-Knoten interagieren , sodass wir Informationen über Transaktionen erhalten können , die an unsere Adressen gesendet werden. Denken Sie daran, dass wir bei der Erstellung einer Brieftasche die ersten 20 Adressen dafür generieren. Aber unser Bitcoin-Knoten weiß noch nichts über die generierten Adressen. Sind Bitcoin Node muss über unsere Adressen Bescheid wissen , um aktiv Informationen über ihre Transaktionen an unsere Anwendung senden zu können. Daher müssen wir unsere Wallet-Adressen in unseren Node importieren . Dafür erstellen wir einen neuen Node-Client, der dafür verantwortlich ist. Im Node Dot-Client-Paket wird also eine Klasse namens Node Multi Import Address Client erstellt. Wie andere Clients wird es eine Service-Annotation haben und wir fügen den Node-Client-Dienst hinzu. Bevor wir die Methode erstellen, schauen wir uns die Dokumentation der Bitcoin Core-Website die API die Import-Multi-Methode aus der Bitcoin-Knoten-API verwendet . Wir sehen hier, dass es ein Array von Objekten als Parameter verwendet. Jedes Objekt kann viele verschiedene Schlüssel haben, aber wir werden nur drei davon verwenden. Der Pub-Schlüssel des Skripts , der als Wert und Objekt mit einer Adresse verwendet werden kann , die der Knoten importiert, einen Zeitstempel, der das Datum darstellt, an dem die Adresse generiert wurde. Dieser Parameter ist wichtig , um zu bestimmen, wie weit in der Vergangenheit der Knoten in der Blockchain nach Transaktionen mit dieser Adresse gesucht in der Blockchain nach Transaktionen mit dieser Adresse Er setzt auch den Parameter watch only auf true da unser Knoten unsere Adressen nur zur Überwachung von Transaktionen in der Blockchain verwendet , aber keine Transaktionen mit diesen Adressen signieren kann . Nur unser Application Wallet wird ausgehende Transaktionen signieren können, aber das ist ein Thema für zukünftige Videos. Zurück zur IDE, lassen Sie uns eine Methode namens Importadressen erstellen. Als Parameter werden ein Wallet-Name, eine Adressenliste und ein Wallet-Erstellungsdatum verwendet. Jetzt erstellen wir ein Parameter-Objekt, das den Import-Multiparameter modelliert , den wir in der Bitcoin Core-Dokumentation gesehen haben . Dieses Objekt wird eine Liste eines neuen Objekts sein, das wir Namen node multi reimported dress params erstellen werden. Lass es uns jetzt erstellen. Es wird ein Datensatz sein und wir werden ihn im Domains-Punktknotenpaket erstellen. Es wird ein neuer Knoten mehrfach reimportiert, Respire Him Script Pub Key Objekt wird erstellt. Es wird auch ein Feld für lange Zeitstempel und ein Feld nur für boolesche Uhren haben. Lassen Sie uns diese Klasse als Datensatz erstellen. Es wird nur ein Adressfeld haben. Zurück zum Node Multi Import Address Client. Da die Methode zum Import von Adressen eine Adressenliste empfängt, müssen wir den folgenden Code verwenden, um sie in eine Liste von mehrfach reimportierten Knoten pro Ohm umzuwandeln . Dann verwenden wir die Methode make request vom Node-Client wie folgt. Lassen Sie uns diesen Code nun mit einer Post-Construct-Methode testen. Wir importieren Adressen in das Node-Wallet mit dem Namen Testing-Wallet-Namen. Und wir verwenden das aktuelle Datum als Erstellungsdatum der Brieftasche. Wie die Adressen. Wird diese drei Reg-Testadressen, die Sie in dieser Klasse finden, als Ressourcen verwenden. Bevor wir diesen Code ausführen, lassen Sie uns unseren Bitcoin Core Node ausführen und das Wallet mit dem gleichen Namen laden, den wir verwenden werden. Zum Laden wird die Bitcoin-CLI verwendet, genau wie in früheren Videos. Okay, wenn man sich die Bitcoin-Knotenprotokolle ansieht, scheint es, als ob es funktioniert hat. Die letzte Zeile des Protokolls zeigt, dass der erneute Scan abgeschlossen wurde. Der Rescan erfolgt standardmäßig nachdem wir Adressen in den Knoten importiert haben. Die Rescan-Suche nach Transaktionen in der Blockchain für die kürzlich importierten Adressen. In diesem Prozess sucht der Knoten nach Transaktionen und Blöcken, die sucht der Knoten nach Transaktionen und Blöcken bis zu 2 h vor dem Datum erstellt wurden das wir als Zeitstempelparameter übergeben haben. Lassen Sie uns die Methode Post Construct entfernen. nun im Paket gooey dot listeners Lassen Sie uns nun im Paket gooey dot listeners eine Klasse namens created wallet important listener erstellen . Es wird eine Komponentenannotation haben und die Application-Listener-Klasse mit dem Parameter des erstellten Wallet-Ereignisses implementieren . Lassen Sie uns seine Methode implementieren. Genau wie der erstellte Wallet-Listener wird diese Klassenmethode nach einer Wallet-Erstellung aufgerufen . Lassen Sie uns den Node Load einfügen oder einen Wallet-Service erstellen. In der anwendungsunabhängigen Ereignismethode wird nun die Methode load oder create wallet vom injizierten Dienst aufgerufen der Name der Event-Wallet als Parameter übergeben. Lassen Sie uns auch den Node Multi Import Address Client hineinstecken. Lassen Sie uns beide injizierten Dienste endgültig machen. Jetzt rufen wir die Methode zum Importieren von Adressen aus dem zuletzt eingefügten Dienst auf. Aber zuerst erstellen wir eine Variable für das Event Wallet und verwenden sie in dieser Methode. nun beim Aufruf der Importadressen Lassen Sie uns nun beim Aufruf der Importadressen den Wallet-Namen übergeben. Die Methode „Wallet get addresses“, der das in der Eigenschaft erstellte Wallet erstellt wird, das wir auch im Wallet-Datensatz erstellen. Lassen Sie uns die Eigenschaft createdAt date erstellen und sie mithilfe der IDE-Funktion zum Ändern der Signatur erstellen. Verwenden wir den Standardwert „Neues Datum“. Weise fügt die IDE diesen dritten Parameter automatisch bei jeder Instanziierung einer Brieftasche hinzu, die sie im Projekt findet. Klicken wir auf Refactor und importieren die Datumsklasse. Wenn wir zum Create Wallet-Dienst wechseln, sehen wir, dass er ein neues Datum als dritten Parameter bei der Wallet-Instanziierung hinzugefügt hat. Dadurch hat das Wallet das aktuelle Datum als Erstellungsdatum. Der Dialogcontroller „Wallet erstellen“ verwendet die erstellte Brieftasche beim Methodenaufruf für öffentliche Ereignisse. Dadurch wird der Methodenaufruf für ein Anwendungsereignis ausgelöst. Lassen Sie uns nun die Methode get addresses im Wallet-Datensatz erstellen . Es gibt eine Liste von Adressen zurück , indem es die Adressen aus seinen erweiterten Pub-Schlüsseln übernimmt, wie folgt. Durch Aufrufen der FlatMap-Methode im Stream erweiterter Pub-Schlüssel und Rückgabe des Streams mit erweiterten Pub-Schlüsseladressen wird bei diesem Aufruf ein Stream aller Adressobjekte aus dem Wallet abgerufen. Dann rufen wir die Map-Methode auf, um den Stream von Adressobjekten in einen Stream von Adresszeichenfolgen zu konvertieren den Stream von Adressobjekten . Schließlich rufen wir die Methode mit zwei Listen für das Ergebnis auf und geben eine Liste aller Wallet-Adressen im Zeichenkettenformat zurück. Okay, jetzt, nachdem wir unser Wallet erstellt haben, erwarten wir, dass unsere Anwendung lädt , eine Wallet mit demselben Namen in unserem Knoten erstellt wurde. Danach importiert unsere Anwendung alle generierten Adressen in unseren Knoten. Lassen Sie uns unsere Anwendung ausführen, um sie zu testen. Lass uns eine neue Brieftasche erstellen. Ich habe auf die Schaltfläche Okay geklickt, aber es scheint, dass nichts passiert ist. Lassen Sie uns die Knotenprotokolle überprüfen. Okay, nach einiger Zeit heißt es, der Rescan sei abgeschlossen und die Wallet habe ihre Erstellung abgeschlossen. Im nächsten Video machen wir diesen Prozess asynchron, indem die Aufrufe an den Knoten in einem anderen Thread ausführen. Auf diese Weise bleibt der Klebrige nicht hängen und die Erstellung der Brieftasche wird reibungsloser. Cia. 28. 26 Empfangen von bitcoin 3 skillshare 2: Im letzten Video haben wir unseren Bitcoin-Knoten dazu gebracht, unsere Application Wallet und wichtige Adressen zu erstellen und zu laden. Dieser Vorgang dauerte jedoch einige Sekunden und blockierte die grafische Benutzeroberfläche. In diesem Video beheben wir das, indem wir die Kommunikation mit dem Knoten asynchron in einem anderen Thread innerhalb des BYU OWL-Pakets laufen lassen . Lassen Sie uns ein neues Paket namens Config erstellen. In diesem Paket erstellen wir eine Klasse namens async config. Diese Klasse enthält alle Konfigurationen sich auf die Ausführung von asynchronem Code im Projekt beziehen. Lassen Sie uns eine Konfigurationsanmerkung hinzufügen. Und eine aktivierte asynchrone Anmerkung zu. Diese Anmerkung ist wichtig, um asynchrone Funktionen im Projekt zu aktivieren. Lassen Sie uns nun eine Methode erstellen, die mit der Bean-Annotation annotiert ist. Es wird ein ExecutorService zurückgegeben. Nennen wir es Default Executor Service. Es gibt einen neuen Single-Thread-Executor aus der Executors-Klasse zurück . Diese Bean stellt einen Thread wann immer wir darin Code ausführen möchten. Es wird ein einziger Thread sein, was bedeutet, dass, wenn zwei oder mehr Codeabschnitte versuchen, in diesem Thread gleichzeitig zu laufen, müssen wir in einem Abschnitt warten, bis der andere fertig ist. Wir haben uns für einen einzigen Thread entschieden , da dies die Steuerung der Prozesse in unserer Anwendung erleichtert und es uns ermöglicht Rennbedingungen leichter zu vermeiden. Lassen Sie uns nun ein wenig Code-Refactoring im Gooey Dot Services-Paket durchführen. Lassen Sie uns eine Klasse namens Import Wallet Service erstellen und ihr die Service-Annotation hinzufügen. Lassen Sie uns eine Methode namens Import Wallet erstellen. Überträgt den Code vom erstellten Wallet-Import-Listener an den Import Wallet-Dienst. Lassen Sie uns auch die erforderlichen Dienste in diese Klasse einbauen. Und lassen Sie uns die Brieftasche als Parameter zur Import-Wallet-Methode hinzufügen . Im erstellten Wallet-Import-Listener. Lassen Sie uns diesen ganzen Code entfernen. Lassen Sie uns den Import Wallet-Service hineinstecken. nun in der anwendungsunabhängigen Ereignismethode Lassen Sie uns nun in der anwendungsunabhängigen Ereignismethode einfach die Import-Wallet-Methode des injizierten Dienstes aufrufen des injizierten Dienstes die Event-Wallet als Parameter übergeben. Die Import-Wallet-Methode enthält den Code, den wir asynchron ausführen möchten. Um es asynchron zu machen, müssen wir diese Methode nur mit der asynchronen Annotation annotieren diese Methode nur mit der asynchronen Annotation den Namen der Bean des von uns erstellten Executor-Dienstes übergeben . Wir müssen auch einen Wert von dieser Methode zurückgeben , der es uns ermöglicht, diesen asynchronen Aufruf anhand der Methodenfarbe zu verwalten . Der zurückgegebene Wert wird eine Zukunft sein. Der Parametertyp void ein neues asynchrones Ergebnisobjekt zurück Null an seinen Konstruktor übergibt. Lassen Sie uns nun testen, wie Sie eine Brieftasche erstellen. Aber lassen Sie uns zuerst unseren Bitcoin-Knoten ausführen. Falls es nicht schon läuft. Wir sehen, dass unser Wallet sofort erstellt wurde, aber wenn wir die Node-Logs überprüfen , werden die Wallet-Adressen immer noch geladen und importiert. Großartig. Der Knoten hat den Rescan abgeschlossen. Unsere Lade- und Importprozesse für Wallets sind also asynchron. Lassen Sie uns jetzt ein wenig Feinabstimmung vornehmen. Gehen wir zum erstellten Wallet-Import-Listener. In der Ereignismethode ohne Anwendung zeichnet die Methode die Rückgabe der Import-Wallet-Methode auf und speichert sie in der Ergebnisvariablen. Wir machen diese Variable zu einem privaten Feld dieser Klasse. Jetzt fügen wir die folgende if-Anweisung hinzu. Bevor Sie Import Wallet aufrufen. Wenn die Ergebnisvariable nicht Null ist, rufen wir die Methode cancel auf und übergeben true als Argument. Dies ist notwendig, denn wenn wir versuchen, ein weiteres Wallet zu erstellen , obwohl das Importieren noch nicht abgeschlossen ist, müssen wir den Importvorgang der ersten erstellten Wallet abbrechen . Lassen Sie uns eine weitere Feinabstimmung in der GUI-Anwendungsklasse vornehmen, um die Stop-Methode zu überschreiben. Darin wird der folgende Code hinzugefügt. Dieser Code stellt sicher, dass der von unserem Standard-ExecutorService erstellte Thread geschlossen wird, nachdem wir unsere Anwendung geschlossen haben. Jetzt gibt es ein weiteres Problem mit unserer Anwendung. Wenn wir ein Wallet erstellen, ohne dass unser Bitcoin-Knoten läuft, die Aufrufe zum Erstellen oder Laden einer Brieftasche und Wichtigkeitsadressen fehl. Sehen wir uns an, wie das in der Praxis funktioniert, indem wir unseren Bitcoin-Knoten schließen und unsere Anwendung ausführen. Nach dem Erstellen eines Wallets scheint unsere Anwendung normal zu laufen, aber das liegt daran, dass die Ausnahmen und andere Threads nicht gemeldet werden. Unser Wallet hätte nicht mit unserem Node kommunizieren können, während unser Node ausgeschaltet war. Als es versuchte, dies zu tun, wurde vom Thread eine Ausnahme ausgelöst und ein Thread wurde beendet. Lass uns das reparieren. Wir möchten, dass unsere Anwendung bei der Erstellung einer Brieftasche auf unbestimmte Zeit versucht, mit unserer Notiz zu kommunizieren. Wenn es aus irgendeinem Grund nach dem ersten Versuch nicht möglich ist, tun Sie es. Wir verwenden eine Spring Boot-Annotation namens retrial. Durch diese Anmerkung wird die annotierte Methode erneut ausgeführt, falls sie eine Ausnahme auslöst. Um es zu verwenden, müssen wir unserer POM-Datei die folgenden Abhängigkeiten hinzufügen . Die erste ist die Wiederholung des Frühlings, die zweite die Frühlingsaspekte. nun in der Import-Wallet-Methode hinzu, wir nun in der Import-Wallet-Methode hinzu, dass die Anmerkung zum erneuten Versuch auch einige Parameter übergibt. Der erste ist der Ausnahmeausdruck , der so gesetzt wird, dass der Wallet-Dienstpunkt beim Öffnen und Schließen der Klammer erneut versuchen sollte. Dadurch wird die aufgerufene Anwendung vor jeder Wiederholung zu einer Methode, die wiederholt werden sollte , und es nur dann erneut versuchen wenn dieser Methodenaufruf den Wert true zurückgibt. Wir werden auch den Parameter max attempts hinzufügen und ihn auf die Ganzzahlkonstante mit maximalem Wert setzen. Durch diese Einstellung kann diese Methode auf unbestimmte Zeit wiederholt werden. Lassen Sie uns abschließend den Backoff-Parameter hinzufügen ihn auf die Backoff-Annotation setzen den Delay-Parameter 1.000 übergeben. Dadurch hat die Anwendung 1.000 Millisekunden oder 1 s gewartet , bevor sie die Methode bei jedem Versuch ausführt. Lassen Sie uns nun diese Methode erstellen, die den Vorgang wiederholen sollte. Sein Rückgabetyp wird ein boolescher Wert sein. Die Methode gibt die Negation des Ergebnisses dieses unterbrochenen Methodenaufrufs aus dem aktuellen Thread zurück . Dieser Aufruf gibt true zurück, wenn der aktuelle Thread nicht unterbrochen wird, andernfalls falsch. Wenn die Anwendung geschlossen wird oder zwischen jedem erneuten Versuch ein neues Wallet erstellt wird, wird dieser Thread daher zwischen jedem erneuten Versuch ein neues Wallet erstellt wird, unterbrochen und die Importwallet-Methode wird nicht mehr wiederholt. Eine weitere Sache, damit die Wiederholungsanmerkung funktioniert, müssen wir die aktivierte Wiederholungsanmerkung in der asynchronen Konfigurationsklasse hinzufügen . Lass es uns machen. Jetzt. Lassen Sie uns unsere Anwendung bei geschlossenem Knoten ausführen und einige Tests durchführen. Lassen Sie uns eine neue Brieftasche erstellen. Lassen Sie uns jetzt unseren Knoten starten. Aus den Knotenprotokollen sehen wir, dass das erstellte Wallet geladen und der Rescan abgeschlossen wurde. Jetzt. Lassen Sie uns nun eine weitere Brieftasche erstellen. Aus den Knotenprotokollen sehen wir, dass es ebenfalls erfolgreich erstellt, geladen und importiert wurde. Großartig. 29. 27 Empfangen von bitcoin 4 skillshare 2: In diesem Video werden wir unser Wallet weiterhin in unseren Node integrieren. Der nächste Schritt der Integration besteht darin Nachrichten abzuhören, die der Knoten sendet, wenn er eine Transaktion an eine importierte Adresse empfängt . Dazu erstellen wir eine Klasse namens node task, deren Methode in einer Endlosschleife in einem anderen Thread ausgeführt wird nach dem Start der Anwendung in einer Endlosschleife in einem anderen Thread ausgeführt wird. Diese Methode sucht kontinuierlich nach Transaktionen, die Knoten an eine der aktuell geladenen Adressen unserer Anwendungen empfängt . Wenn es einen findet, veranlasst es unsere Anwendung, ihn entsprechend zu behandeln. Lassen Sie uns also ein neues Paket namens node im BYOD W-Paket erstellen . Darin wird eine Klasse namens Gooey Started Node Listener erstellt . Lassen Sie uns eine Komponentenannotation hinzufügen. dieser Klasse handelt es sich um einen Listener, der durch das Ereignis gooey started ausgelöst wird, das beim Start der Anwendung veröffentlicht wird. Es wird also den Anwendungs-Listener mit diesem Ereignis als Typparameter implementieren den Anwendungs-Listener mit . Lassen Sie uns seine Methode implementieren. Fügen wir den neuen Node hinzu, den Task Service als privates Feld in dieser Klasse erstellen wird . Lassen Sie uns den neuen Service erstellen. Lassen Sie uns es nun in den GUI gestarteten Node-Listener einfügen. In der nicht anwendungsspezifischen Ereignismethode wird die Node Task Run-Methode aufgerufen. Lassen Sie uns diese Methode in der Knotenaufgabe erstellen. Lassen Sie uns die Service-Annotation zu dieser Klasse hinzufügen. Jetzt fügen wir der POM-Datei eine Abhängigkeit hinzu, die die Knotenaufgabe benötigt. Es wird die Hero-MQ-Bibliothek sein. Klicken wir auf die Schaltfläche „ Maven Changes laden“. Diese Bibliothek verwaltet die Kommunikation zwischen der Anwendung und Zero MQ. Zero MQ ist ein Nachrichtenbroker, Nachrichten vom Bitcoin-Knoten empfängt. Diese Nachrichten werden an eine lokale URL gesendet und von unserer Anwendung über Null MQ zurück zur Knotenaufgabe gesammelt . Lassen Sie uns die asynchrone Anmerkung zur Run-Methode hinzufügen. Lassen Sie uns den Note Executor-Dienst als Parameter übergeben. Dadurch wird diese Methode asynchron in einem anderen Thread ausgeführt , der vom Node Executor-Dienst verwaltet wird, den wir in der asynchronen Konfigurationsklasse erstellen Lassen Sie uns den Node Executor-Dienst erstellen. Wie der Standard-Executor-Dienst wird er von einem neuen Single-Thread-Executor verwaltet. Lassen Sie uns nun das Socket-Objekt von Null MQ in diese Klasse einfügen . Dieses Feld wird Abonnenten genannt, da es ein Abonnement für den Zero MQ Message Broker abwickelt. Bei der Run-Methode setzen wir das Empfangs-Timeout für den Abonnenten auf 1.000. Dies führt jedes Mal zu einer Verzögerung von einer Sekunde, wenn unsere Anwendung Null und Q abfragt , um nach Nachrichten zu suchen. Nennen wir diese Abonnenten-Abonnement-Methode, wobei die Bytes der Zeichenfolge Rod TX als Parameter übergeben werden. Dadurch hört unsere Anwendung nur Nachrichten ab, die sich auf Rob-Bitcoin-Transaktionen beziehen , deren Node-Sends auf Null gesetzt werden. Mq ruft auch die Connect-Methode des Abonnenten auf und übergibt ihr die variable z-MQ-URL. Lassen Sie uns diese Variable in diese Klasse injizieren. Wir fügen dem Konstruktorargument eine Wertanmerkung hinzu und übergeben diese Zeichenfolge als Parameter. Daher wird dieser Variablenwert über eine Anwendungseigenschaft namens z und q dot in diese Klasse injiziert eine Anwendungseigenschaft namens z , die URL wird jetzt gesetzt, der Wert dieser Variablen muss mit demselben Wert übereinstimmen wie Ich habe es in unserer bitcoin.com-Datei eingestellt. Lassen Sie uns also den Wert kopieren, der für die z MQ Pub Rock TX bitcoin.com-Konfiguration gesetzt wurde, und fügen Sie ihn hier ein. Zurück zur Node-Task-Run-Methode wird unsere Nonstop-Schleife erstellt. Lassen Sie uns eine While-Schleife erstellen. Es wird ausgeführt, solange der aktuelle Thread nicht unterbrochen wird. Innerhalb der Schleife rufen wir die Subscribers wreck the STR-Methode auf und speichern das Ergebnis in der Variablen topic. Das Wrack der STR-Methode fragt für jede Nachricht Null MQ ab und gibt eine Zeichenfolge zurück, falls sie eine findet. In unserem Fall enthält diese Zeichenfolge den Namen des Themas , der für Rohtransaktionen ra TX entspricht. Dann fügen wir eine if-Schleife hinzu, die die Themenvariable überprüft. Wenn der Inhalt anders ist als Ratti x, dann rufen wir Continue auf, damit der Loop wieder von Anfang an läuft. Wenn nicht, rufen wir die Abonnenten die Wreck-V-Methode auf und speichern den Inhalt in der Inhaltsvariablen. Das Wrack der Methode ähnelt dem Rec VNTR, gibt jedoch ein Byte-Array anstelle einer Zeichenfolge zurück. Zu diesem Zeitpunkt enthält dieses Byte-Array die Rohtransaktion oder den Node, die an Null MQ gesendet wurde. Jetzt konvertieren wir das Byte-Array im Bitcoin-Java-Transaktionsobjekt. Dazu verwenden wir den folgenden Code. Wir müssen dieser Methodensignatur eine throws IOException-Anweisung hinzufügen . In der GUI wurde der Node-Listener gestartet. Wir müssen den Run-Aufruf auch in einen Try-Catch-Block wie diesen einschließen . Zurück zur Run-Methode. Jetzt verwenden wir einen Service für Anwendungs-Event-Publisher , um eine Veranstaltung zu veröffentlichen. Lassen Sie uns diesen Service in diese Klasse einbauen. Zuerst. Wir leiten ein neues Ereignis, das eine Transaktion erhalten hat, an die Methode „Ereignis veröffentlichen“ weiter. Die Instanziierung des empfangenen Ereignisses wird dieses und das Transaktionsobjekt an die empfangene Transaktion übergeben , bevor die neue Ereignisklasse erstellt Fügen wir ein fehlendes Element hinzu, damit diese Methode funktioniert. Lassen Sie uns eine neue Klasse namens Node Configuration erstellen. Lassen Sie uns es in ein neues Node Dot-Konfigurationspaket verschieben. Lassen Sie uns eine Konfigurationsanmerkung hinzufügen. In dieser Klasse fügen wir einige Beans hinzu, damit das injizierte Socket-Objekt für Node-Tasks funktioniert. Die erste Bean wird das Z-Kontext-Wesen sein. Der zweite Strahl wird der Null-MQ-Sockel sein. Es wird Abonnent genannt. Und es wird in seiner Methode den oben erstellten Z-Kontext verwenden. Es gibt die Z-Kontexte zurück, um einen Socket-Methodenaufruf zu erstellen Socket-Methodenaufruf wobei die Socket-Typ-Unterkonstante als Parameter übergeben wird. Zurück zum Knoten: Die Aufgabe erstellt das Ereignis „Transaktion empfangen“ und erstellt es im Node Dot Events-Paket. Übergibt die Knotenaufgabe an den Superkonstruktor und wir fügen die Transaktion in ein privates Transaktionsfeld ein. Lassen Sie uns auch eine Getter-Methode für die Transaktion erstellen. Lassen Sie uns nun ein Listener-Paket im Node-Paket erstellen . Darin. Lassen Sie uns einen per Transaktion empfangenen Listener für dieses Ereignis erstellen. Lassen Sie uns eine Komponentenannotation hinzufügen. Dieser Listener ist dafür verantwortlich, Empfangstransaktionen zu filtern, indem feststellt, ob sie Adressen haben , die zu einer aktuell geladenen Wallet gehören. Es implementiert einen Anwendungs-Listener mit dem Ereignis „Transaction Received“ als Typparameter. Lassen Sie uns seine Methode implementieren. Bei dieser Methode rufen wir die Ereignistransaktion ab und speichern sie in der Transaktionsvariablen. Nun müssen wir zunächst die Ausgabeadressen der empfangenen Transaktion identifizieren . Dazu wird die Adressvariable erstellt, die eine Liste von Zeichenketten sein wird. Dann weisen wir ihm das Ergebnis des folgenden Ausdrucks zu. Ordnet die Transaktionsausgaben unter Verwendung einer Adressparser-Parse-Methode zu. Lassen Sie uns nun den Adressparser-Dienst einfügen und erstellen. Lassen Sie uns es im Node Dot Services-Paket erstellen. Lassen Sie uns die Service-Anmerkung hinzufügen. Lassen Sie uns nun die Parse-Methode erstellen. Es gibt eine Zeichenfolge zurück und eine Transaktionsausgabe als Parameter. Diese Methode ist dafür verantwortlich , die Adresse aus einer Transaktionsausgabe zurück an die empfangene Transaktion zu extrahieren einer Transaktionsausgabe zurück an die empfangene Transaktion zu . Der Listener konvertiert das Ergebnis in eine Liste. Dann werden zu Testzwecken alle analysierten Adressen gedruckt. Lassen Sie uns nun die Parse-Methode implementieren. Als erstes rufen wir den Pub-Schlüssel des Transaktionsskripts ab und weisen ihn dieser Variablen zu. Keine Sorge, wir erklären Ihnen, was ein Script-Pub-Schlüssel ist und weitere Transaktionsdetails. Im nächsten Video geben wir das Ergebnis der folgenden Switch-Anweisung zurück. Wenn der Typ des Skript-Pub-Schlüssels der Konstante P2 WP k, h entspricht , was dem Typ unserer aktuellen Wallet-Adressen entspricht. Dann geben wir den Skript-Pub-Schlüssel P2, WP k h Address Methodenaufruf zurück . Übergabe des Adresspräfix-Factory-Get-Methodenaufrufs als Parameter, an den die Segway-Konstante übergeben wird. Die Standardangabe für die Groß - und Kleinschreibung ist eine leere Zeichenfolge. Lassen Sie uns die Adresspräfix-Factory in diese Klasse einfügen. Lassen Sie uns nun einige Tests durchführen. Mein Bitcoin-Knoten läuft bereits. Stell sicher, dass deins es auch ist. Gehen wir zur Testklasse für empfangene Bitcoins und führen sie aus. Der Test ist fehlgeschlagen, da wir unseren GUI-Test noch nicht geändert haben, um den Adressentabellencontroller zu berücksichtigen . Denken Sie daran, dass unser GUI Start-Listener das Problem der Verwendung dieser If-Bedingung behandelt. Wir könnten dieselbe If-Bedingung in unserem festen Zustand verwenden, aber lassen Sie uns das auf eine übersichtlichere Weise tun. Gehen wir zum Ereignis „ GUI started“. Lassen Sie uns den GUI-Anwendungstyp in Objekt ändern. Ich werde einfach das Gooey Started Event in unserer GUI-Testklasse veröffentlichen , genauso wie wir es hier in der GUI-Anwendungsklasse gemacht haben. in der GUI-Testklasse Lassen Sie uns in der GUI-Testklasse den gesamten Code entfernen. Lassen Sie uns nun diese Zeile der GUI-Anwendung kopieren und hier einfügen. Lassen Sie uns all diese ungenutzten Importe und dieses ungenutzte private Feld entfernen . Lassen Sie uns nun den Bitcoin-Test erneut ausführen. Unser Test ist fehlgeschlagen, aber wir sehen hier in den Testprotokollen, die von der Anwendung gedruckt wurden, zwei Adressen. Dies geschah, weil wir die Adressen der Transaktion, die unser Test durchgeführt hat , auf eine unserer Wallet-Adressen gedruckt Transaktion, die unser Test durchgeführt hat haben. Eine dieser Adressen ist unsere, die andere ist eine Änderungsadresse des Absenders. Großartig. Wir sehen, dass das, was wir bisher getan haben, funktioniert hat. Lassen Sie uns ein wenig Refactoring in der GUI-Testklasse durchführen. Lassen Sie uns diese ungenutzten Importe entfernen. In der GUI-Anwendungsklasse. Fügen wir diese Codezeile ein, die dazu führt, dass unser Note Executor-Dienstthread nicht mehr ausgeführt wird, nachdem wir unsere Anwendung geschlossen haben. Im nächsten Video erfahren wir mehr über Bitcoin-Transaktionen, um uns auf das vorzubereiten, was als Nächstes kommt. 30. Bitcoin Transaktionen: Eingaben, Ausgänge, Skripte und das UTXO Set: In dieser Präsentation lernen wir einige Konzepte zu Bitcoin-Transaktionen kennen. Es wird nützlich sein , die Implementierung des Empfangs von Bitcoins in unserer Application Wallet besser zu verstehen die Implementierung des Empfangs von . Lassen Sie uns zusammenfassen, was wir bisher über Bitcoin-Transaktionen gelernt haben , und unser Verständnis von Bitcoin-Transaktionen schrittweise erweitern. Eine Bitcoin-Transaktion wird also häufig verwendet , um Bitcoins von Person A zu Person B zu übertragen. Eine Bitcoin-Transaktion kann aus vielen Eingaben und vielen Ausgaben bestehen . Eine Transaktionseingabe gibt den vorherigen Bitcoin-Besitzer oder den Absender der Transaktion an. Eine Transaktionsausgabe gibt den Empfänger der Münzen oder den Besitzer der Münzen an, nachdem die Transaktion veröffentlicht wurde. In diesem Bild haben wir eine einfache Transaktion mit einem Eingang und zwei Ausgängen. Es heißt, dass ein Bitcoin von John übertragen wurde, der die Eingabe dieser Transaktion unterschrieben hat. Ausgabe Null gibt an, dass 0,9 Bitcoins zur Heirat geschickt wurden. Ich gebe als Änderung an, dass 0,099 Bitcoins an John zurückgeschickt wurden. Bitcoin-Beträge können nicht in Eingaben aufgeteilt werden. Da John 0,9 Bitcoins schicken wollte, um zu heiraten, hatte er aber nur einen Bitcoin. Er musste eine Veränderung schaffen, die zu sich selbst zurückgeführt wurde. Der Betrag beträgt jedoch 0,099 Bitcoins, nicht 0,1 Bitcoins, wie Sie erwarten könnten. Die Differenz, die 0,001 Bitcoins beträgt, ist die Transaktionsgebühr, die erforderlich damit die Transaktion in die Blockchain aufgenommen wird. Aus diesem Bild ziehen wir also drei Lektionen. Die Summe der Bitcoins in den Eingaben darf nicht kleiner sein als die Summe der Bitcoins und Ausgaben. Der Bitcoin-Betrag in den Eingaben ist fest, er kann jedoch nach Belieben ausgewählt und ausgegeben werden, sofern er die vorherige Regel erfüllt. Schließlich ist die Transaktionsgebühr die Differenz zwischen der Summe der Bitcoin-Beträge in den Eingaben und der Summe der Bitcoin-Beträge und -Ausgaben. Erhöhung der Komplexität. Wir haben auch etwas über die Felder gelernt, die Teil einer Transaktionseingabe und einer Transaktionsausgabe sind . Und Eingabe bezieht sich immer auf die Ausgabe einer früheren Transaktion. Dazu werden die vorherige Transaktions-ID und der Ausgabeindex der vorherigen Transaktion verwendet die vorherige Transaktions-ID und . Es wäre überflüssig, wenn die Eingabe ein Betragsfeld hätte. Diese beiden Felder reichen aus, um jede Transaktionsausgabe in der Blockchain zu identifizieren . Äh, die Transaktionseingabe muss auch eine gültige Signatur enthalten, die mit demselben privaten Schlüssel erstellt wurde , der verwendet wurde, um die Adresse aus der Ausgabe abzuleiten , auf die sich die Eingabe bezieht. Beachten Sie, dass eine Transaktionseingabe kein Feld enthält, das den Bitcoin-Betrag angibt. liegt daran, dass sein Betrag automatisch dem Ausgabebetrag entspricht, auf den er sich bezieht . Eine Transaktionsausgabe besteht aus zwei Feldern. Eine ist die Adresse, die für den Empfang von Bitcoins verwendet wird. Und die Adresse ist eine codierte Zeichenfolge, die allein den Besitzer der Münzen nicht preisgibt. Deshalb betrachten wir Bitcoin als pseudonym. Das andere Feld ist die Menge, die durch die Adresse gesperrten Bitcoin-Betrag angibt. Lassen Sie uns nun die Komplexität noch einmal erhöhen erklären, was Transaktionseingänge und -ausgaben genau enthalten. Die Transaktionseingabe hat die folgenden Felder. Die vorherige Transaktions-ID , bei der es sich um eine eindeutige hexadezimale Zeichenfolge handelt, wird durch Hashing der vorherigen serialisierten Transaktion abgerufen . Der vorherige Transaktionsausgabeindex ist eine Ganzzahl. Da eine Transaktion viele Ausgaben haben kann, kann eine bestimmte Ausgabe anhand ihrer Transaktions-ID und ihres Ausgabeindex eindeutig identifiziert werden. Das ScriptSig- oder Witness-Feld. Die Eingabesignatur wird dem ScriptSig-Feld bei Nicht-Segway-Transaktionen hinzugefügt . Bei Segway-Transaktionen wird die Signatur zum Zeugenfeld hinzugefügt, was nicht zur Transaktionsgröße zählt. Die Transaktionsausgabe hat die folgenden Felder. Der Script-Pub-Schlüssel. Skript-Pub-Schlüssel enthält die dekodierte Adresse und das Mengenfeld , das den durch die Adresse gesperrten Bitcoin-Betrag bestimmt . Lassen Sie uns nun anhand eines Beispiels sehen, wie Sie eine Bitcoin-Transaktion erstellen . Unser Ziel in diesem Beispiel ist es, 1,5 Bitcoins an diese Adresse zu senden . Bevor wir beginnen, haben wir eine bestätigte Transaktion, was bedeutet, dass sie bereits in der Blockchain gespeichert ist. Es hat eine Ausgabe mit zwei Bitcoins, die ich ausgeben kann, da ich einen privaten Schlüssel habe , der zur Erstellung seiner Adresse verwendet wurde und der verwendet werden kann, um eine Transaktionseingabe dafür in einem neuen zu signieren Transaktion. Lassen Sie uns also eine neue Transaktion erstellen ihr eine Eingabe hinzufügen. Die Eingabe beziehen wir über das vorherige Transaktions-ID-Feld auf unsere Transaktion. Der Output-Index der vorherigen Transaktion ist Null, da er der Output-Index unserer Ausgabe ist. Das ScriptSig-Feld besteht aus einer Signatur, die mit demselben privaten Schlüssel erstellt wurde , der zur Erzeugung der Adresse unserer Ausgabe verwendet wurde. Und ein öffentlicher Schlüssel , der derselbe öffentliche Schlüssel ist mit unserem privaten Schlüssel abgeleitet wurde. Die Transaktion wird zwei Ausgänge haben. Die Ausgabe Null wird ein Skript-Pub-Schlüsselfeld enthalten , das unter anderem aus dem gehashten öffentlichen Schlüssel der Adresse besteht unter anderem aus . Wir wollen unsere Bitcoins schicken an. Dieser Hash wird erhalten, indem Beck 32 die Adresse dekodiert. Back 32 wird der Algorithmus verwendet, um den Hash eines öffentlichen Schlüssels zu codieren und eine Sekunde lang welche Adresse zu erzeugen? Basis 58 ist ein weiterer Algorithmus verwendet wird, um dasselbe für Adressen ohne Segmente zu tun. Da wir Bitcoins an eine Segmentadresse senden, müssen wir Beck 32 verwenden. Das Mengenfeld dieser Ausgabe entspricht 1,5. Dies ist der Bitcoin-Betrag, den wir senden möchten Für die Änderung ist eine zweite Ausgabe erforderlich. Sein Script-Pub-Schlüssel wird einen gehashten öffentlichen Schlüssel enthalten durch die Beck 32-Dekodierung erhalten haben , und eine Adresse, die uns gehört und von einem privaten Schlüssel abgeleitet ist, über den wir die Kontrolle haben. Die Menge wird 0,49 Bitcoins betragen, was zu 1,5 von Output Null addiert 1,99 entspricht. Wir haben also einen Unterschied von 0,01 zwischen der Summe der Bitcoin-Beträge in Ein- und Ausgaben. Dieser Unterschied besteht in der Transaktionsgebühr, die erforderlich damit die Transaktion von einem Minderjährigen in die Blockchain aufgenommen wird . Wir haben über ScriptSig und Script Pub Key gesprochen, aber noch nicht erklärt, was diese Dinge wirklich sind. Bitcoin hat eine intelligente Vertragssprache namens Script. Ein Smart Contract ist eine ausgefallene Methode, um auf ein Programm zu verweisen , das für eine Transaktion geschrieben und vom Bitcoin-Netzwerk ausgeführt wird. Die Schlüsselfelder ScriptSig und Script Pub werden mit Skriptsprachencode erstellt. Diese Sprache wird interpretiert, indem der ScriptSIG einer Eingabe und der Script-Pub-Schlüssel einer Ausgabe kombiniert der ScriptSIG einer Eingabe und der Script-Pub-Schlüssel einer werden und überprüft wird, ob ScriptSig die vom Script-Pub-Schlüssel kodierten Bedingungen erfüllt. Sie können diesen Mechanismus wie einen Schlüssel- und Schließmechanismus betrachten , bei dem ScriptSig der Schlüssel zum Entsperren des Script-Pub-Schlüssels ist , das ist das Schloss. Wenn ein ScriptSig zum Entsperren eines Script-Pub-Schlüssels gültig ist, können Sie die damit verbundenen Ausgabegelder ausgeben. Ein ScriptSig hat diesen Namen , weil es normalerweise eine Signatur enthält , die eine bestimmte Script-Pub-Schlüsselbedingung erfüllt . Ebenso hat der Script-Pub-Schlüssel diesen Namen, weil er bei den ersten Bitcoin-Transaktionen einen öffentlichen Schlüssel enthielt. Theoretisch kann jedoch jeder beliebige Skriptcode in beide Felder aufgenommen werden. Die einzige Einschränkung für die Gültigkeit eines Skriptprogramms besteht darin, dass es am Ende seiner Ausführung den Wert true zurückgibt. Es gibt viele Arten von Skriptprogrammen, auch Skripttypen genannt. Einer davon ist der Pay-to-Public-Key-Hash der bei einfachen Transaktionen ohne Sequitur verwendet wird. Sehen wir uns an, wie es in diesem Beispiel ausgeführt Alle Bitcoin-Skripte werden ähnlich ausgeführt Was ändert sich zwischen ihnen oder dem ausgeführten Code? Beginnend mit unserer bestätigten Transaktion von der vorherigen Folie zeigen wir hier nur die Ausgabe Null mit dem Inhalt des Script-Pub-Schlüssels im grauen Feld. Bei Pay-to-Public-Key-Hash-Transaktionen besteht das Script-Pub-Schlüsselfeld aus Opcodes und dem Public-Key-Hash. Und Opcode ist ein Skriptsprachenbefehl. Sie werden zu Beginn mit den Buchstaben OP identifiziert. Unterstrich nach oben gleich, vergleicht z. B. zwei Elemente und gibt „true“ zurück, wenn sie gleich sind. allen Skripten mit Pub-Key und Pay-To-Public-Key-Hash-Skripten Pay-To-Public-Key-Hash-Skripten diese Codesequenz nur unterscheidet sich diese Codesequenz nur in ihren Pub-Key-Hashes. Jetzt haben wir unsere neue Transaktion, die mit der vorherigen Folie identisch ist. Dieses Mal zeigen wir hier nur seinen Input. Der ScriptSig-Inhalt befindet sich im grauen Feld. Zahlung für Hash-Skripte mit öffentlichen Schlüsseln. Das ScriptSig hat nur eine Signatur gefolgt von einem öffentlichen Schlüssel. Sehen wir uns nun an, wie beide Felder kombiniert und ausgeführt werden. Zunächst wird der ScriptSig-Inhalt der Eingabe mit dem Inhalt des Script-Pub-Schlüssels der Ausgabe verkettet Script-Pub-Schlüssels der , auf die die Eingabe in dieser Reihenfolge verweist. Dann wird jedes Element aus dem kombinierten Skript von links nach rechts in einen Ausführungsstapel verschoben. Wenn das Element ein Opcode ist, kann es auf andere Elemente im Stack einwirken, sie verarbeiten und dem Stack weitere Elemente hinzufügen. Schauen wir uns also an, wie dieses Skript ausgeführt wird. Die Signatur ist das erste Element von links nach rechts. Daher wird es zuerst in den Stapel geschoben. Das nächste Element ist der öffentliche Schlüssel, der ebenfalls in den Stack verschoben wird. Das nächste Element ist der nach oben unterstrichene Opcode. Nach oben, unterstrichen nach oben kodiert eine Anweisung zum Duplizieren des zuletzt zum Stapel hinzugefügten Elements und zum Hinzufügen der Kopie zum Stapel. Das nächste Element ist der Opcode op Underscore Hash 160. Es entfernt das letzte Element, das dem Stack hinzugefügt wurde, wendet die Hash-160-Funktion darauf an und fügt das gehashte Ergebnis wieder zum Stapel hinzu. Am Ende haben wir also den Public-Key-Hash an der Spitze des Ausführungsstapels. Das nächste Element, das dem Stack hinzugefügt wird , ist der Public-Key-Hash. Als nächstes haben wir den Opcode op Underscore Equal Verify. Dieser Opcode entfernt zwei Elemente vom oberen Rand des Ausführungsstapels und vergleicht sie, wenn sie gleich sind , damit das Skript die Ausführung fortsetzt. Wenn nicht, schlägt die Ausführung fehl und die Transaktion ist ungültig. Dieser Schritt ist wichtig, da er validiert, dass der öffentliche Schlüssel von ScriptSig dem öffentlichen Schlüssel entspricht, der verwendet wird, um die Adresse der Ausgabe zu generieren, für die es ausgegeben wird. Das letzte Element des Skripts ist der Opcode op Underscore Check Sig. Es entfernt zwei Elemente vom oberen Rand des Ausführungsstapels und überprüft, ob das erste Element eine gültige Signatur für das zweite Element für diese spezifische Transaktion ist , ob es eine gültige Signatur ist, ein boolescher Wert true wird zum Stack hinzugefügt. Wenn es ungültig als ein boolescher Wert ist, wird False zum Stack hinzugefügt. Schließlich, nachdem alle Skriptelemente zum Ausführungsstapel hinzugefügt wurden, würde die Transaktionseingabe als gültig angesehen , wenn das zuletzt hinzugefügte Element wahr ist. Andernfalls ist die Transaktionseingabe ungültig. Dieser Vorgang muss für jede Transaktionseingabe wiederholt werden . Damit eine Transaktion als gültig betrachtet werden kann, müssen alle ihre Eingaben gültig sein. Es gibt viele Skripttypen. Das Pay-to-Public-Key-Skript war das erste Bitcoin-Skript, aber heute ist es veraltet und wird selten verwendet. Die ersten Bitcoin-Transaktionen enthalten den Skripttyp. Anstatt den Hash des öffentlichen Schlüssels zu verwenden, ist es der Skript-Pub-Schlüssel, verwenden Sie direkt den öffentlichen Schlüssel. Das Pay-to-Public-Key-Hash-Skript wurde auf der letzten Folie veranschaulicht. Es war der am häufigsten verwendete Skripttyp seit der zunehmenden Relevanz von Segway-Transaktionen in den letzten Jahren. Heute wird es immer noch häufig verwendet, daher ist es gut, darüber Bescheid zu wissen. Das Pay-to-Witness-Public-Key-Hash-Skript ist der derzeit am häufigsten verwendete Skripttyp bei Bitcoin-Transaktionen. Der Grund dafür ist, dass es von Vorteil ist , es zu verwenden, da Transaktionen damit geringer sind und daher eine geringere Transaktionsgebühr anfällt. Dieser Skripttyp hat einen kleineren Script-Pub-Schlüssel und sein ScriptSig-Inhalt wird in das Zeugenfeld verschoben, was nicht zur Transaktionsgröße beiträgt. Aus diesen Gründen werden wir diesen Skripttyp zuerst in unseren Wallets implementieren . Der Pay-to-Script-Hash ist ein weiteres Skript, Der Pay-to-Script-Hash ist ein weiteres Skript hauptsächlich für Transaktionen mit mehreren Signaturen verwendet wird. Transaktionen mit mehreren Signaturen Für Transaktionen mit mehreren Signaturen ist mehr als eine Signatur erforderlich , um eine Ausgabe auszugeben. Der Pay-to-Witness-Skript-Hash ist die Witness-Version des Pay-to-Script-Hash-Skripts. Ihre Signatur wird in das Zeugenfeld verschoben. Es hat also dieselben Vorteile wie das Pay-to-Witness-Public-Key-Hash-Skript . Der Pay-to-Witness-Public-Key-Hash, der in ein Pay-to-Script-Hash-Skript verpackt ist, wird auch als verschachteltes Segment oder Rap-Segment bezeichnet. Es wird auch häufig verwendet und seine Hauptfunktion besteht darin alte Wallets, die nicht mit nativen Segmenten kompatibel sind, mit Segway-Transaktionen kompatibel zu machen . Wir werden später im Kurs mehr über den Skripttyp erfahren . Schließlich ist ein weiterer Skripttyp das Pay-to-Tap-Root-Skript. Es ist der zuletzt erstellte Skripttyp, mehr Funktionen und Bitcoin-Transaktionen mehr Funktionen und Datenschutz bietet. Sehen wir uns nun eine Zusammenfassung der Erstellung von Transaktionseingaben und -ausgaben aus der Sicht eines Wallets an, beginnend mit einem mnemonischen Startwert und einer Passphrase. Durch einen kryptografischen Algorithmus kombinieren wir beide und erhalten einen Root Seed. Dann wurden durch eine Reihe von Transformationen Masterkeys und erweiterte Schlüssel hergestellt. Wir erhalten viele private Schlüssel. Hier zeigen wir nur einen dieser privaten Schlüssel. Dieselben Transformationen können auch öffentliche Schlüssel erzeugen. Ein öffentlicher Schlüssel kann auch aus einem bestimmten privaten Schlüssel erzeugt werden , den wir hier in unserem Beispiel zeigen. Aus einem öffentlichen Schlüssel erhalten wir eine Adresse, indem wir die Hash-Funktion 160 verwenden die Hash-Funktion 160 und das Ergebnis durch Beck-32-Kodierung bei Segmentadressen oder Base-58-Kodierung im Fall von von Adressen, die nicht segmentiert sind. Um Bitcoins zu erhalten, zeigst du jemandem deine Adresse , damit jemand Bitcoins an sie schicken kann. Wenn ein Absender Ihre Adresse in sein Wallet eingibt und ihm einen Bitcoin-Betrag sendet, dekodiert sein Wallet die Adresse wieder in einen Public-Key-Hash. Dann erstellt es eine Transaktion mit einer Ausgabe, die einen Script-Pub-Schlüssel enthält, der dieser Adresse entspricht. Der Script-Pub-Schlüsseltyp hängt vom Typ der Adresse ab. In diesem Fall hat das Wallet festgestellt, dass der Adresstyp mit einem Pay-to-Public-Key-Hash-Skript kompatibel ist . Nachdem der Empfänger Bitcoins an diese Adresse erhalten hat, kann er sie für eine neue Transaktion ausgeben. Der Inhalt der neuen Transaktionseingabefelder hängt vom Typ des Skript-Pub-Schlüssels ab, der ausgegeben wird. In diesem Fall erstellt das Wallet eine Transaktion mit einer Eingabe, die ein Script/SIG mit einer Signatur enthält ein Script/SIG mit einer Signatur die mit demselben privaten Schlüssel generiert wurde, von dem der öffentliche Schlüssel stammt die Adresse, die zuvor Bitcoins erhalten hat. Einzelheiten zur Unterzeichnung einer Transaktion werden wir in einem zukünftigen Video sehen. Der zuvor angegebene öffentliche Schlüssel wird nach der Signatur im ScriptSig-Feld hinzugefügt. Schließlich verweist die Eingabe auch auf die Ausgabe nicht ausgegebener Transaktionen unter Verwendung der vorherigen Transaktions-ID und der Indexfelder für die vorherige Transaktionsausgabe wie zuvor erläutert. Lassen Sie uns nun das wichtige Konzept des UTXO-Sets lernen. Denken Sie daran, dass UTXO die Ausgabe nicht ausgegebener Transaktionen bedeutet. Bitcoin hat das wichtige Merkmal , dass es keine doppelten Ausgaben zulässt. Mit anderen Worten, Sie können Bitcoins nur für nicht ausgegebene Transaktionsausgaben ausgeben . Das UTXO-Set ist das Set aller derzeit existierenden UTXOs. Dieses Set wird von Knoten in einer separaten Datenbank gespeichert , was schnellen Abruf durch Wallets ermöglicht. Das UTXO-Set wird bei jeder neuen Transaktion, bei der Ausgaben zum Set hinzugefügt oder entfernt werden, ständig aktualisiert jeder neuen Transaktion, bei der Ausgaben zum Set hinzugefügt . Utxos sind Ausgänge, noch nie in einer Eingabe verwiesen wurde. Daher enthält das UTXO-Set alle Münzen, die zum Ausgeben zur Verfügung stehen. Die Anzahl der Bitcoins in einer Adresse entspricht der Summe aller Bitcoins von allen UTXOs, deren Skript-Pub-Schlüssel auf die dekodierte Adresse verwiesen haben. Der Bitcoin Core Node bietet also eine API-Methode namens list unspent, die alle UTXOs zurückgibt, die auf die Adressen verweisen , die Sie ihm als Parameter übergeben haben. Mit der Methode list unspent können Sie auf einfache Weise den Saldo einer Adresse und der entdeckten Transaktionsinformationen wie die UTXO-Transaktions-ID und den Index sowie deren Pub-Schlüssel für das Skript. So können Sie Transaktionseingaben erstellen , um Ihre Bitcoins aus dem UTXO auszugeben. Nachdem Sie das UTXO ausgegeben haben, wird es aus dem UTXO-Set entfernt. Sehen wir uns nun ein Diagramm das erklärt, wie unsere Anwendung eingehende Transaktionen erkennt und uns darüber informiert, welche Bitcoins erhalten werden. Das wird die letzte Folie dieser Präsentation sein, die viele komplexe Informationen eingeführt hat. Mach dir keine Sorgen, wenn du zuerst nicht alles aufgenommen hast. Im Laufe des Kurses werden wir die erlernten Informationen wiederverwenden , um tiefer in sie einzutauchen, sodass wir viele Möglichkeiten haben, sie besser zu verstehen. Nun zurück zum Diagramm. Hier haben wir Rechtecke, die die Anwendung darstellen , der Bitcoin-Knoten und das Bitcoin-Netzwerk. Transaktionen werden von Knoten aus dem Bitcoin-Netzwerk erstellt und übertragen. Diese Transaktionen sind, wenn sie bestätigt werden, bereits in der Blockchain gespeichert. Wenn sie nicht bestätigt werden, bleiben sie im Tempel, einer Datenbank, die alle unbestätigten Transaktionen enthält. Jeder Knoten hat eine Kopie der mentalen Transaktionen, die schließlich von unseren Knoten erkannt werden , die unsere Anwendungs-Wallets und Adressen bereits importiert hatten . Durch Null-MQ-Benachrichtigungen werden die Transaktionen an unsere Anwendung gesendet. Wenn unsere Anwendung eine Brieftasche geladen hat, filtert sie alle empfangenen Transaktionen heraus , die keine ihrer Adressen enthalten. Dann sendet es eine Liste, die nicht ausgegeben wurde, an den Knoten und übergibt als Parameter alle Adressen aus den Empfangstransaktionen, die nach der Filterung übrig geblieben sind. Der Knoten gibt alle UTXOs zurück die sich auf diese Adressen beziehen. Unser Wallet analysiert dann diese UTXOs, um das Bitcoin-Guthaben für jede seiner Adressen zu berechnen. Dann zeigen wir die erhaltenen Informationen in der Adresstabelle an. 31. 29 Empfangen von bitcoin 5 skillshare 2: In diesem Video werden wir den Client List Unused implementieren, der es uns ermöglicht , Informationen über UTXOs zu sammeln , nachdem wir Transaktionen erhalten haben. also im Node Dot Client-Paket Lassen Sie uns also im Node Dot Client-Paket die Node List Unspent Client erstellen. Lassen Sie uns eine Service-Anmerkung hinzufügen. Lassen Sie uns auch den Node-Client hineininjizieren. Lassen Sie uns nun die Methode list unspent erstellen. Es wird eine Liste von UTXOs zurückgegeben. Dies ist ein Datensatz , den wir erstellen werden. Als Parameter werden eine Liste von Adressen und ein Wallet-Name benötigt. Lassen Sie uns den UTXO-Eintrag im BYOD w dot domains-Paket erstellen . Das UTXO wird die folgenden Felder enthalten. Die TX ID, eine Abkürzung für Transaction ID. Das Vout-Feld, das den Ausgabeindex, die Adresse, das Label darstellt , das wir jetzt nicht verwenden werden. Der Script-Pub-Schlüssel. Der Betrag, der den Bitcoin-Betrag darstellt, die Konformationen, die die Anzahl der Konformationen enthalten , die die UTxOS-Transaktion aufweist. Die Anzahl der Konformationen einer Transaktion ist die Anzahl der Blöcke, die der Blockchain hinzugefügt wurden, nachdem die Transaktion in einen Block eingefügt und dieser Block zur Blockchain hinzugefügt wurde. Diese Nummer beinhaltet den Block diese Transaktion enthält. Wenn eine Transaktion also zwei Bestätigungen hat, bedeutet dies, dass sie bereits in einem Block enthalten war. Dieser Block wurde der Blockchain hinzugefügt und danach wurde ein weiterer Block hinzugefügt. Lassen Sie uns zwei weitere Felder hinzufügen. Diese Felder werden vorerst nicht verwendet, können aber für andere Arten von Transaktionen nützlich sein , auf die wir später im Kurs eingehen werden. Sie sind das Erlösungsskript und das Zeugenskript. Nun zurück zur Knotenliste. Der unspent Client ruft die Node-Client-Make-Request-Methode auf und speichert das Ergebnis in der UTxOS-Array-Variable UTxOS-Array-Variable die die folgenden Parameter an die Methode übergibt. Die letzten drei Parameter werden Teil der Gedichtliste der Bitcoin-Knoten-API sein. Die erste ist die Mindestanzahl von Konformationen, die die Return-UTXos haben müssen. Die zweite ist das Maximum. Da wir wollen, dass alle UTXos Null als Minimum und den maximalen Ganzzahlwert als Maximum setzen . Der dritte Parameter ist die Liste der Adressen. Jetzt konvertieren wir das resultierende Array mit diesem Code in eine Liste und geben es zurück. Nun zurück zum empfangenen Transaktions-Listener. Lassen Sie uns diese Codezeile entfernen , da sie nur zum Testen gedacht war. Wir werden den Node List Unspent Client testen. Holen wir uns die UTXOs für diese Adressen. Lassen Sie uns zuerst den Client in diese Klasse einfügen Die Methode list unspent übergibt die Adressvariable. Das zweite Argument wird der Wallet-Name aus dem empfangenden Bitcoin-Test sein. Lassen Sie uns es kopieren und als zweiten Parameter verwenden. Fügen wir nun diese Zeile hinzu, um jedes auf dem Bildschirm erhaltene UTXO zu drucken . Lassen Sie uns nun unseren Bitcoin-Knoten ausführen falls er nicht bereits läuft. Gehen wir nun zum Bitcoin-Test und führen ihn aus. In den Testprotokollen sehen wir, dass ein UTXO mit all seinen Daten gedruckt wurde. Beachten Sie, dass die Adresse der Empfangsadresse unserer Brieftasche übereinstimmt. Spulen Sie das Video zurück, um es zu überprüfen. Der Betrag ist eins, was erwartet wird, da es denselben gesendeten Bitcoin-Betrag handelt und der Test, er hat keine Konformationen, da seit der Transaktion keine Blöcke an den Knoten erinnern. Lassen Sie uns nun diese Zeilen löschen , da sie nur zum Testen waren. Lassen Sie uns auch den injizierten Client aus dieser Klasse entfernen. Jetzt fügen wir diesem Stream einen Filter hinzu. Wir möchten nur Transaktionen aus der aktuell von der Anwendung geladenen Wallet verarbeiten . Dieser Filter wird dafür verantwortlich sein. Der Filter prüft, ob die Adresse nicht leer ist. Wenn die aktuelle Brieftasche diese Adresse enthält. Lassen Sie uns also die aktuelle Brieftasche in diese Klasse injizieren. Dann rufen wir die Methode get addresses as strings auf. Dann prüfen wir, ob es die Adresse enthält. Oh, ein Buchstabe S hat hier gefehlt. Lassen Sie uns nun die Methode „ Adressen als Zeichenketten abrufen“ erstellen. Es wird eine Liste von Zeichenketten zurückgegeben. Der zurückgegebene Wert ergibt sich aus dem Aufrufen der Methode get addresses as strings in dem Adressfeld, das wir erstellen werden. Lassen Sie uns dieses Feld erstellen. Es wird eine neue Adressklasse als Typ haben. Und wir werden es genau hier initialisieren. Lassen Sie uns es im Observables-Paket erstellen. Lassen Sie uns auch die Methode „ Get-Adressen als Zeichenketten“ erstellen. Zuerst fügen wir ein Feld für private Adressen hinzu. Es wird eine Map sein, in der der Schlüsseltyp ein Adresstyp und der Typ der Werte ein anderer Zuordnungstyp sein wird. Die zweite Map wird eine verknüpfte HashMap mit Zeichenketten als Schlüssel und Adresse als Typ ihrer Werte sein. Wir verwenden diese Datenstruktur , um die Adressen zu speichern. Der Grund für die Verwendung dieser Datenstruktur besteht darin, dass wir damit die Wallet-Adressen nach Adresstyp trennen und abfragen können. Die zweite Map ist eine verknüpfte HashMap, da dieser Kartentyp die Einfügereihenfolge beibehält. Schließlich ermöglicht uns die zweite Map, die Liste der Adressobjekte anhand ihrer Adresszeichenfolgensequenzen abzufragen die Liste der Adressobjekte anhand ihrer Adresszeichenfolgensequenzen . Jetzt gibt die Methode „Adressen als Strings abrufen “ den folgenden Code zurück. Die FlatMap-Funktion wird verwendet, um alle Adressen im zweiten Kartenschlüsselsatz abzurufen und einen Stream zurückzugeben, der sie alle enthält. Dann konvertieren wir die resultierende Zeichenfolge in eine Liste. Ok, jetzt können wir die Methode get addresses as strings verwenden , um alle Adressen abzurufen , die für das aktuelle Wallet erstellt wurden. Aber eine Sache fehlt. Wir müssen auch das Adressfeld aus der Adressklasse ausfüllen. Dazu fügen wir dem Update den folgenden Code hinzu. aktuelle Wallet-Service legt die aktuellen Wallet-Adressen fest und übergibt die erweiterten Pub-Schlüssel der Brieftasche als Parameter. Lassen Sie uns nun die aktuelle Wallet-Set-Adress-Methode erstellen. Es ruft die Methode set addresses des Adressfeldes auf und übergibt die erweiterten Schlüssel als Parameter. Dann erstellen wir diese Methode in der Adressklasse. Fügen wir den folgenden Code hinzu. Wir verwenden die Sammelfunktion, um eine Map aus den erweiterten Pub-Tasten abzurufen . Darin wird ein To-Map-Methodenaufruf hinzugefügt. Das erste Argument erstellt einen Adresstyp unter Verwendung des erweiterten Pub-Schlüsseltyps. Dieses Argument definiert den Schlüssel der resultierenden Map. Das zweite Argument definiert den Wert der Map und enthält den folgenden Code. Auch hier wird durch die Kombination der Funktionen Collect und To Map eine verknüpfte Hashmap erstellt. Bei den Schlüsseln handelt es sich um die erweiterten Pub-Schlüsseladressen , Zeichenkettenfolgen, und die Werte werden dort entsprechenden Adressobjekte sein. Schließlich ist der Filterteil dieses Streams abgeschlossen. Im nächsten Video werden wir das verwenden, was wir gebaut haben, um die Funktion C zum Empfangen von Bitcoins weiterzuentwickeln , ja. 32. 30 Empfangen von bitcoin 6 skillshare 2: In diesem Video werden wir die UTXOs von Transaktionen, die in unser Wallet eingehen, in Bearbeitung bringen. also in der Ereignismethode ohne Anwendung, im empfangenen Listener der Transaktion, wir also in der Ereignismethode ohne Anwendung, im empfangenen Listener der Transaktion, die folgende if-Anweisung hinzu. Wenn die Adressenliste nicht leer ist, rufen wir die Aktualisierungsmethode in dem UTxOS-Update-Dienst auf, den wir erstellen werden. Diese Methode verwendet die Adressen und den aktuellen Wallet-Namen als Parameter. Lassen Sie uns diesen Service in diese Klasse einbauen. Lassen Sie uns diesen Dienst nun im GUI Dot Services-Paket erstellen . Lassen Sie uns die Service-Anmerkung hinzufügen. Zurück zum empfangenen Transaktions-Listener. Lassen Sie uns das Injizieren des Dienstes beenden. Lassen Sie uns nun die Aktualisierungsmethode im UTxOS-Aktualisierungsdienst erstellen . Wir fügen dieser Methode eine asynchrone Anmerkung hinzu und führen sie im Standard-Executor-Servic-Thread aus. Der Grund für die Ausführung dieser Methode und eines weiteren Threads ist, dass sie die API-Methode list unspent node aufruft, was langsam sein kann. Also werden wir es asynchron ausführen, um zu vermeiden, dass die Benutzeroberfläche blockiert wird. In der Aktualisierungsmethode wird die Methode list unspent aus dem Node List Unspent Client aufgerufen. Lassen Sie uns den Client in diese Klasse injizieren. Wir übergeben die Adressen und den Wallet-Namen als Parameter an die Liste. Methode Unspent speichert das Ergebnis des Methodenaufrufs in der utxOS-Variablen. Jetzt fügen wir dieser Klasse einen neuen Update-Dienst für aktuelle Wallet-Adressen hinzu. Lassen Sie uns es im GUI Dots Services-Paket erstellen. Lassen Sie uns das Injizieren des Dienstes beenden. Dann rufen wir die Update-Methode übergeben ihr UTXos als Parameter. Lassen Sie uns diese Methode erstellen. Fügen wir die Dienstanmerkung hinzu. Jetzt fügen wir den folgenden Code hinzu, um eine Map zu erstellen, in der die Schlüssel Adressen und die Werte Listen von UTXOs sind , die diese Adressen enthalten. Dazu rufen wir die Collect-Methode im UTXO-Stream auf und geben den myMethod-Aufruf der Collectors-Gruppierung an sie weiter. Übergabe der UTXO-Adressmethode als Parameter. Wir speichern den zurückgegebenen Wert in der Gruppen-UTXOS-Variablen. Dann legt das UTXO-Schlüsselwertpaar für jede Gruppe UTXO-Schlüsselwertpaar den entsprechenden Adresssaldo fest. Es sind Bestätigungen und der Markt wird verwendet. Lassen Sie uns die Set-Balance-Methode implementieren. Gibt die Summe aller UTxOS-Beträge mit diesem Code zurück. Wenn Sie die Map to Double-Methode im UTXO-Listenstream verwenden, wird ein Stream mit allen UTXO-Mengen aus der UTXO-Liste abgerufen. Um ihre Summe zu erhalten, wird einfach die Summenmethode für das Ergebnis aufgerufen. Lassen Sie uns nun die aktuelle Brieftasche in diese Klasse injizieren. Dann rufen wir die Current Wallet Set Address Balanced Methode auf, bei der die Adresse und die Summe als Parameter übergeben werden . Lass es uns erstellen. wird die Methode address set address balanced aufgerufen dieselben Parameter übergeben. Dann erstellen wir diese Methode. Darin werden die Get-Adressen als Map-Methode aufgerufen, die erstellt wird. Lass es uns erstellen. Es wird eine Map zurückgegeben, in der die Schlüssel Adressen Zeichenketten sind und die Werte als Objekte adressiert werden. Wenn Sie den folgenden Code verwenden, wird eine Map zurückgegeben, die alle Adressen enthält. Wenn Sie die String-Methode für die Adresswerte aufrufen, erhalten Sie einen Stream, der alle Zuordnungen des privaten Adressfeldes enthält . Mit dieser FlatMap-Methode wird der Kartenstream dann in einen Stream von Karteneinträgen umgewandelt. Schließlich wird durch die Verwendung der Collect-Methode für den resultierenden Stream und der Zwei-Map-Methode mit diesen Parametern die gewünschte Map erhalten. Ergebnis des Aufrufs „ Adressen als Map“ wird die Methode get aufgerufen, um ein Adressobjekt anhand seiner Adresszeichenfolge abzurufen die Methode get aufgerufen, um ein Adressobjekt anhand seiner Adresszeichenfolge . Dann setzen wir den Adresssaldo auf die Summenvariable. Lassen Sie uns nun die Methode zum Festlegen des Saldos im Adressdatensatz erstellen . Hoppla, wir können keine Setter zu einem Datensatz hinzufügen, also müssen wir den Adressdatensatz in eine Klasse konvertieren. Lass uns das mit ein wenig Hilfe von unserer IDE machen. Lassen Sie uns diese Methoden entfernen , weil wir sie nicht benötigen. Lassen Sie uns jetzt das Balance Center erstellen. Und entferne das letzte Schlüsselwort hier. Im sequentiellen Adressgenerator. Fügen wir hier Null als dritten Parameter in der Adressinstanziierung hinzu. Lassen Sie uns auch den Namen der Getter ändern, sodass sie mit get beginnen. nun im Dienst „Aktuelle Wallet-Adressen aktualisieren Lassen Sie uns nun im Dienst „Aktuelle Wallet-Adressen aktualisieren“ die festgelegte Bestätigungsmethode erstellen. Bestätigung. In diesem Fall beziehen wir uns auf den Adresssaldo und er wird so definiert, dass er der Anzahl der Konformationen des UTXO mit weniger Konformationen für diese Adresse entspricht der Konformationen des UTXO . Nehmen wir zum Beispiel an, eine Adresse hat einen Saldo von zwei Bitcoins, wobei jeder Bitcoin aus einer anderen Transaktion stammt. Eine dieser Transaktionen hat zwei Bestätigungen, die andere hat nur eine. In diesem Fall gehen wir davon aus , dass der Adresssaldo eine Konformation hat. Um das zu erreichen, verwenden wir den folgenden Code. Wir erhalten einen Stream, der alle Bestätigungen der bestandenen UTxOS-Liste enthält . Um diesen Stream zu erhalten, rufen wir die Methode map too long im UTXO-Listenstream auf übergeben dabei die Referenz der UTXO-Bestätigungsmethode als Parameter. Sie dann die Min-Methode und die Good is Long-Methode verwenden , wird die Mindestanzahl von Bestätigungen im Stream zurückgegeben die Mindestanzahl von Bestätigungen im und in der Bestätigungsvariablen gespeichert. Dann übergeben wir die Bestätigungen und die Adressvariablen an den aktuellen Aufruf der Wallet-Set-Adressbestätigungsmethode. Lassen Sie uns diese Methode nun in der aktuellen Wallet-Klasse erstellen. Es ruft die Methode address set address confirmations auf und übergibt dieselben Parameter, die ich Methode address set address confirmations auf und übergibt dieselben Parameter, empfangen habe. Lassen Sie uns diese Methode in der Adressklasse erstellen. Wir verwenden die Methode get addresses as map, um die Adresse abzurufen und ihre Konformationen festzulegen. Lassen Sie uns nun die Methode set confirmations in der Adressklasse erstellen . Wir verwenden es, um das Bestätigungsfeld festzulegen, das wir erstellen werden. Lassen Sie uns dieses Feld erstellen und es dem Konstruktor hinzufügen. Dann fügen wir diesen Parameter zur Klasse des sequentiellen Adressgenerators in der Adressinstanziierung hinzu. Lassen Sie uns abschließend die Methode „Als verwendet markieren“ im Dienst „Aktuelle Wallet-Adressen aktualisieren“ erstellen . Eines der Ziele unseres Wallets und vieler anderer ist es, die Wiederverwendung von Adressen beim Empfang von Bitcoins zu vermeiden. Aus Datenschutzgründen. Dazu müssen wir zunächst Kleider vermarkten, für die Transaktionen getätigt wurden, wie gebraucht. Für diesen Einblick wird die Methode „Als verwendet markieren“ verwendet. Es wird das aktuelle Wallet-Marktkleid nennen. Bei Verwendung der Methode wird die Adresse als Parameter übergeben. Lass es uns erstellen. Darin wird die Methode mark is used aus der Adressklasse aufgerufen , die die Adresse an sie weitergibt. Dann erstellen wir diese Methode. Darin wird die Adresse abrufen als mathematische Methode verwendet , um die Adresse zu ermitteln, und der Markt wird verwendet. Lassen Sie uns abschließend die Methode mark is used in der Adressklasse erstellen . Hier wird einfach eingestellt, dass der verbrauchte Kraftstoff wahr ist. Lassen Sie uns dieses Feld in dieser Klasse erstellen. 33. 31 Empfangen von bitcoin 7 skillshare 2: In diesem Video verbinden wir endlich alles, was wir in den letzten Lektionen gemacht haben , um unsere Adressinformationen auf dem Bildschirm anzuzeigen . Im Observables-Paket wird also die Adresszeilenklasse erstellt. Wie der Name schon sagt, modelliert diese Klasse eine Zeile in der Adresstabelle. Lassen Sie uns die folgenden Felder in dieser Klasse erstellen, jeweils für eine Spalte in der Adresstabelle. Das erste Feld wird eine Zeichenketteneigenschaft mit dem Namen balance sein Sie instanziiert sie hier mit einer neuen einfachen Zeichenketteneigenschaft. Das nächste Feld ist eine lange Eigenschaft mit dem Namen Confirmations, und sie wird mit einer neuen einfachen langen Eigenschaft instanziiert . Das letzte Feld wird eine Zeichenketteneigenschaft mit dem Namen address sein. Es wird mit einer neuen einfachen Zeichenketteneigenschaft instanziiert. nun mit Hilfe der IDE Lassen Sie uns nun mit Hilfe der IDE Getter für jede Eigenschaft erstellen. Beachten Sie, dass die IDE beim Erstellen von Gettern für Java FX-Eigenschaftsfelder für Java FX-Eigenschaftsfelder zwei Getter erstellt, einen für die Eigenschaft und für den Inhalt der Eigenschaft. Lassen Sie uns nun den folgenden Konstruktor für diese Klasse erstellen . Okay, jetzt, da wir die Adresszeile modelliert haben, werden wir Code erstellen, um sie bei der Aktualisierung unserer Adressen aufzufüllen . Gehen wir dazu zum Dienst „ Aktuelle Wallet-Adressen aktualisieren“. In der Aktualisierungsmethode rufen wir, nachdem wir die Adresse als verwendet markiert haben, nachdem wir die Adresse als verwendet markiert haben, die Methode set address row auf der aktuellen Wallet übergeben die Adresse als Parameter. Lassen Sie uns dann die Methode zum Festlegen der Adresszeile erstellen. Um diese Methode zu implementieren, wird das Adresszeilenfeld zu dieser Klasse hinzugefügt . Lassen Sie uns die Klasse Adresszeilen im Observables-Paket erstellen . Lassen Sie uns es hier instanziieren. Jetzt rufen wir die Methode set address row für die Eigenschaft address rows auf die Eigenschaft address rows ihr ein Adressobjekt zu übergeben. Dieses Objekt wird aus dem Adressfeld mit der Methode get addressed abgerufen aus dem Adressfeld mit der , die wir erstellen, indem wir die Adresszeichenfolge an dieses Objekt übergeben. Um diese Methode zu erstellen, wählen Sie einfach diesen Codeausschnitt aus und extrahieren Sie mithilfe der ID eine Methode daraus. Lassen Sie uns alle Codevorkommen durch diese Methode ersetzen, und wir machen die generierte Methode öffentlich. Nun zurück zur aktuellen Wallet-Klasse. Lassen Sie uns die Methode set address row in der Klasse Address Rows erstellen . Dazu erstellen wir eine Adresszeilenvariable, die die Methode für die Adresszeilenklasse aufruft das Adressobjekt als Parameter übergeben. Lassen Sie uns die Formularmethode in der Adresszeilenklasse erstellen. Es gibt eine neue Adresszeile zurück und instanziiert sie mit diesen Parametern. Lassen Sie uns die Methode für gute Bestätigungen in der Adressklasse erstellen . Und jetzt können wir es hier verwenden. Beachten Sie, dass wir hier einfach ein Adresszeilenobjekt erstellen, indem die Adressfeldwerte in die Adresszeilenfeldwerte konvertieren . Zurück zur Klasse „Adresszeilen“. dieser Klasse erstellen wir das Feld „Adresse Road Set“. Es wird eine beobachtbare Menge mit der Adresszeile als Typparameter sein. Wird es hier mit einem neuen Observable-Set-Wrapper instanziieren und einen neuen verknüpften Hash-Satz an seinen Konstruktor übergeben. Dieses Objekt veröffentlicht für jede neu eingefügte oder entfernte Adresse ein Ereignis und ist erforderlich, um die Adresstabelle zu aktualisieren sobald das aktuelle Wallet neue Transaktionen erhält. Jetzt rufen wir die Methode address row set remove auf und übergeben die Adresszeile als Parameter. Dann rufen wir die Methode add auf und übergeben dieselbe Adresszeile als Parameter. Sie fragen sich vielleicht, warum wir dieselbe Adresszeile aus dem Set entfernen und hinzufügen. Nun, das ist ein bisschen wie ein Hack. Wenn wir nicht zuerst die Adresszeile entfernen und eine Adresszeile einfügen, die bereits im Set enthalten ist. Die beobachtbare Menge veröffentlicht kein Ereignis , das darauf hinweist, dass ihr eine Adresszeile hinzugefügt wurde. Es gibt noch etwas, was wir tun müssen, damit das funktioniert. Wenn wir eine Adresszeile mit der Methode remove aus dem Set entfernen, verwendet diese Methode die Methode equals aus der Adresszeile, um zu definieren , welche Adresszeile aus dem Satz entfernt wird . Wir gehen davon aus, dass die beiden I-Dress-Reihen gleich sind, wenn sie dieselbe Adresse haben. Daher müssen wir die equals-Methode in der Adresszeilenklasse implementieren . Lass es uns machen. fügen wir die Equals- und Mithilfe dieser IDE-Funktion fügen wir die Equals- und Hashcode-Methoden hinzu. Stellen Sie sicher, dass dieses Kontrollkästchen aktiviert ist , um Methoden mit Gettern zu generieren. Jetzt entscheiden wir uns dafür, nur das Adressfeld zu verwenden , um die Equals Methode zu generieren. Und dasselbe Feld, um die HashCode-Methode zu generieren und das Adressfeld hier auszuwählen , um es als nicht Null zu definieren. Okay, die IDE hat die Equals - und Hashcode-Methoden generiert. Gehen wir nun zur Adresstabelle. Fxml fügt jedem Tabellenspalten-Tag FX-IDs hinzu. Die Adressen. Der Table Controller benötigt diese FX-IDs, um diese Spalten später zu binden und zu bearbeiten. Zuerst die Spaltenadresse, dann der Spaltensaldo und schließlich die Spaltenkonformationen. Gehen wir nun zur Adressentabelle, der Controller fügt die folgenden Felder hinzu, jeweils einem Tag mit einer Ethik-ID in der Adresstabelle, FXML, entsprechen . Die Namen dieser Felder müssen den FX-IDs der Tags entsprechen . Sie sind dazu verpflichtet. Zuerst die Adresstabelle, dann die Spaltenadresse, der Spaltensaldo und die Spaltenbestätigungen. Jetzt fügen wir die initialisierte Methode zu dieser Klasse hinzu. Denken Sie daran, dass initialisierte Methoden in Java FX-Controllern aufgerufen werden, wenn das Framework diese Controller initialisiert. Bei dieser Methode fügen wir Code hinzu, der die Adresstabelle und ihre Spalten mit unseren Observables für Adressrollen bindet der die Adresstabelle und . Dazu rufen wir die Methode set items in der Adresstabelle auf , da ihr Argument eine neue gefilterte Liste übergibt. Dies ist notwendig , da wir nur Adressen mit einem ausgeglichenen Wert größer als Null in der Adresstabelle anzeigen möchten nur Adressen mit einem ausgeglichenen . Als erster gefilterter Listenparameter werden die aktuellen beobachtbaren Adresszeilen der Brieftasche übergeben. Lassen Sie uns also die aktuelle Brieftasche in diese Klasse injizieren. Dann rufen wir darauf die Methode get observable address rows auf. Lassen Sie uns diese Methode erstellen. Es gibt eine beobachtbare Liste mit der Adresszeile als Typparameter zurück . Dann geben wir den Methodenaufruf für gute Observable Address Rows im Feld Adresszeilen zurück . Lassen Sie uns diese Methode in der Klasse Address Rows erstellen. Darin wird das Adresszeilenlistenfeld zurückgegeben , das wir erstellen werden. Lass es uns erstellen. Dieses Feld wird hier mit einem neuen Observable List Wrapper instanziiert einem neuen Observable List Wrapper eine verknüpfte Liste als Parameter übergibt. Jetzt müssen wir dafür sorgen, dass die Observable-Liste auf das Einfügen und Entfernen von Adresszeilen im Adresszeilensatz reagiert das Einfügen und Entfernen von . Das machen wir im Konstruktor der Klasse. Zuerst erstellen wir eine Set-Change-Listener-Variable. Wir stellen es als diese Lambda-Funktion ein. Der Änderungsparameter steht hier für Einfügen oder Entfernen einer Adresszeile in den Satz. Wenn es sich bei der Änderung um eine Entfernung handelte, entfernen wir das entfernte Element aus der Adresszeilenliste. Wenn die Änderung eine Einfügung war. Dann fügen wir das hinzugefügte Element zur Adressrollenliste hinzu. Schließlich fügen wir diesen Listener mit dieser Methode zum Adresszeilensatz hinzu. Nun zurück zum Adressentabellencontroller. Der zweite Parameter der gefilterten Liste wird als Filterbedingung für die Anzeige von Zeilen verwendet. Es wird eine Lambda-Funktion mit einem Adress-Rho-Parameter sein. Der Funktionstext ist dieser Code, der überprüft, ob der Saldo der Adresszeile größer als Null ist. Auf diese Weise erreichen wir unser Ziel, nur Adressen anzuzeigen, deren Saldo größer als Null ist. Jetzt müssen wir für jedes Spaltenfeld einen Zellenwert festlegen, der verwendet wird, um jede Zelle der Adresstabelle aufzufüllen. Dafür verwenden wir den folgenden Code. Die Eigenschaft Value Factory wird verwendet, um jede Adresse echte Eigenschaft abzurufen und ihren Wert an die entsprechende Zelle zu binden . Es weiß, welche Adresseigenschaft wir an die Spalte binden möchten, indem es den Namen, den wir als Parameter übergeben, mit dem Namen der Eigenschaft abgleicht. Es gibt noch eine Sache, die wir tun müssen, damit unsere Funktion zum Empfangen von Bitcoins ordnungsgemäß funktioniert. Gehen wir zur aktuellen Wallet-Klasse in der Methode set addresses, die aufgerufen wird, wenn ein neues Wallet erstellt wird. Wir müssen diesen Code einbeziehen, um sicherzustellen, dass die Adresse von einer zuvor Die erstellte Brieftasche wird gelöscht. Wir nennen die Methode „Adresszeilen löschen“, die erstellt. Um das zu tun, lassen Sie uns es erstellen. Hier. Wir rufen einfach die Clear-Methode für den Adresszeilensatz und die Adresszeilenliste auf. Lassen Sie uns nun unser Feature testen. Stellen Sie sicher, dass Ihr Bitcoin-Kernknoten läuft. Gehen wir zum Bitcoin-Test und führen ihn aus. Toll, es hat funktioniert. Beachten Sie, dass die erste Zeile der Adresstabelle erwartungsgemäß mit einem Saldo von einem Bitcoin gefüllt wurde . Gute Arbeit. In den nächsten Videos werden wir weitere Testfälle hinzufügen, um sicherzustellen, dass unsere Funktion zum Empfangen von Bitcoins in verschiedenen Szenarien ordnungsgemäß funktioniert. 34. 32 Empfangen von bitcoin 8 skillshare 2: In diesem Video fügen wir weitere Testfälle hinzu, um sicherzustellen, dass unsere Funktion zum Empfangen von Bitcoins in verschiedenen Szenarien ordnungsgemäß funktioniert . Im ersten zusätzlichen Szenario testen wir, ob dieselbe Adresse Bitcoins aus zwei Transaktionen empfangen kann , jeweils ein Bitcoin. Wir überprüfen, ob der Adresssaldo auf zwei Bitcoins aktualisiert wird. Kopieren wir also den Inhalt dieser Methode und fügen ihn unten ein. Lassen Sie uns den Testnamen so ändern, dass er Bitcoins in zwei Transaktionen an dieselbe Adresse erhalten soll . Wählen wir nun diesen Code aus und extrahieren mit Hilfe der ID eine Methode daraus, geben wir ihr einen Namen, senden Bitcoin und wiegen sie. Wir rufen diese Methode zweimal auf, da wir zwei Transaktionen an diese Adresse senden möchten . Lassen Sie uns die Methode zum Senden von Bitcoin in Gewichtung ändern , einschließlich des folgenden Codes. Wir prüfen, ob die Adresse in der ersten Zeile der Tabelle einen Saldo aufweist , der dem Parameter für den erwarteten Gesamtbetrag entspricht. Lassen Sie uns diesen Parameter zur Methodensignatur hinzufügen. Es wird einen Standardwert von 1,0 haben. bei diesem Methodenaufruf Fügen wir bei diesem Methodenaufruf 2,0 als zweiten Parameter hinzu, da wir erwarten, dass der Adresssaldo gleich zwei sein wird. Fügen wir dem Wallet-Namen zwei hinzu. Es gibt ein Problem mit unserer Testumgebung. Im Reg-Test ist es nur möglich, 15.000 Blöcke mit Blockbelohnungen zu minen . Daher ist es bei dieser Methode zu viel, 1.000 Blöcke zu minen wenn die Methode generate to address aufgerufen wird. Rufen wir es nur an, wenn das Test-Wallet-Guthaben weniger als 50 beträgt und nur 150 Blöcke für jeden Anruf generiert werden. Auf diese Weise vermeiden wir, dass wir unsere Reg-Testumgebung zu oft zurücksetzen müssen . Lassen Sie uns diesen Code auch durch die Methode „Bitcoin senden und warten“ ersetzen . Lassen Sie uns nun unsere Tests etwas widerstandsfähiger gegenüber den Rennbedingungen machen . Mir ist aufgefallen, dass diese Tests manchmal Bitcoins an unsere Application Wallets senden Bitcoins an unsere Application Wallets bevor sie vollständig geladen waren. Daher wurden diese Transaktionen von der Anwendung nicht erfasst und die Tests schlagen aus diesem Grund fehl. Nachdem wir also eine Brieftasche erstellt und bevor wir Bitcoins an sie senden, rufen wir die Schlafmethode mit diesen Parametern auf. Durch den Aufruf der Schlafmethode wartet die Anwendung 10 Sekunden, bevor Bitcoins gesendet wird wartet die Anwendung 10 Sekunden, bevor , genug Zeit bis das neue Wallet vollständig geladen ist. Abhängig von Ihrem Computer müssen Sie möglicherweise die Timeout-Konstante erhöhen. Bevor ich die Tests ausführe, setze ich jetzt meine Reg-Testumgebung zurück. Ich muss das tun, weil es bereits 15.000 Blöcke generiert hat und die Blockgenerierung keine Bitcoins mehr produziert. Also gehe ich zu dem Ordner, in dem die Blockchain gespeichert ist , und entferne den darin enthaltenen Reg-Testordner. In Ihrem Fall können Sie herausfinden, in welchem Ordner es sich befindet, indem den Daten-DIR-Wert in Ihrer bitcoin.com-Datei überprüfen. Lassen Sie uns nun unseren Bitcoin-Knoten ausführen und unsere Bitcoin-Tests für den Empfang von Bitcoins ausführen. Toll, die Tests sind bestanden. Wenn wir Bitcoins in unserer Brieftasche erhalten, möchten wir, dass die nächste Empfangsadresse geändert wird. Auf diese Weise vermeiden wir die Wiederverwendung von Adressen. Es ist wichtig, nur eine Adresse für den Empfang von Transaktionen zu verwenden , damit Dritte leicht nachverfolgen können wie viele Bitcoins Sie haben und mit welchen Adressen Sie Transaktionen tätigen. Um dieses Szenario abzudecken, erstellen wir den folgenden Test. Kopieren Sie den letzten Test und fügen Sie ihn unten ein. Benennen wir es um, sodass Bitcoins in zwei Transaktionen mit zwei verschiedenen Adressen empfangen werden sollen . Lassen Sie uns den Namen der erstellten Brieftasche in meine Test-Wallet drei ändern . nun vor dem zweiten Aufruf der Methode „ Bitcoin senden und warten“ diesen Code hinzufügen, Lassen Sie uns nun vor dem zweiten Aufruf der Methode „ Bitcoin senden und warten“ diesen Code hinzufügen, um das Empfangsadressfeld erneut abzufragen und seinen Inhalt in der nächsten Adressvariablen zu speichern. Ändern Sie nun den ersten Parameter dieser Methode in die nächste Adressvariable. Und wir erwarten, dass der gesamte Bitcoin-Betrag für diese Adresse 1,0 betragen wird. Außerdem erwarten wir, dass die Größe der Tabellenelemente für jede Adresse 21 Zeilen beträgt. Lassen Sie uns diese Methode ändern, um die erwartete Tabellengröße als Parameter zu akzeptieren . Fügen wir diesen Parameter mit einem Standardwert von eins hinzu. Ersetzt diesen Wert hier, um zu warten , bis die Anzahl der Zeilen der Tabelle diesem Wert entspricht. Und wir ersetzen den Index der Tabellenpunktelemente die erwartete Gesamtgröße minus eins um zu warten, bis die letzte Zeile im Tabellensaldo dem erwarteten Gesamtbetrag für diese Zeile entspricht. Lassen Sie uns abschließend das dritte Argument dieses Methodenaufrufs auf zwei parametrisieren . Lassen Sie uns unsere Tests durchführen. Wie erwartet. Der dritte Test ist fehlgeschlagen, weil wir die Funktion zum Ändern der Empfangsadresse nach der Verwendung noch nicht implementiert die Funktion zum Ändern der haben. Lass es uns jetzt machen. Gehen wir also zum Dienst „ Aktuelle Wallet-Adressen aktualisieren “. Darin rufen wir für jeden Block die Methode der Update-Empfangsadresse auf, die wir erstellen werden. Es wird die Adresse als Parameter verwenden. Lass es uns erstellen. Als erstes rufen wir die Methode vom Typ get addressed auf der aktuellen Brieftasche auf. Wenn Sie die Adresse als Parameter übergeben, wird das Ergebnis des Methodenaufrufs in der Adresstypvariablen gespeichert . Es ist wichtig, den Adresstyp der ersetzten Adresse zu kennen , da er durch eine Adresse desselben Typs ersetzt werden muss . Lassen Sie uns diese Methode für die aktuelle Wallet-Klasse erstellen. Es wird einfach die Methode vom Typ Adressen get addressed aufrufen . Wir erstellen die Übergabe der Adresse als Parameter. Lass es uns erstellen. Jetzt. Wir rufen die Methode get addressed auf und geben ihren Adresstyp zurück. Lassen Sie uns die Methode „get address type“ in der Adressklasse erstellen . Darin wird das Feld für den Adresstyp zurückgegeben , das wir erstellen werden. Lassen Sie uns dieses Feld erstellen und es dem Konstruktor hinzufügen. Lassen Sie uns auch den sequentiellen Adressgenerator korrigieren , um das letzte Argument zur Adressinstanziierung hinzuzufügen. Wir werden diesen Adresstyp als Parameter zu dieser Methode hinzufügen . Und wir schließen den Adresstyp in diesen Methodenaufruf indem wir den Wert der Methode für die Adresstypklasse aufrufen. Zurück zum Dienst Aktuelle Wallet-Adressen aktualisieren berechnet den Wert des nächsten Adressindex, indem er die Methode Fine-Next Address Index für die aktuelle Brieftasche aufruft Methode Fine-Next Address Index für die aktuelle Brieftasche die Adresse übergibt type als Parameter speichert das Ergebnis des Methodenaufrufs in der nächsten Adressindexvariablen. Lassen Sie uns diese Methode erstellen. Hier. Wir rufen den Fine-Next Address Index im Adressfeld auf und übergeben dabei den Adresstyp als Parameter. Lassen Sie uns diese Methode in der Adressklasse mit dem folgenden Code erstellen . Sie erhalten die zuletzt verwendete Adresse, Sie erhalten die zuletzt verwendete Adresse sie in der Adressvariablen zu speichern. Ruft alle Dress-Objekte mit dem angegebenen Adresstyp ab und erhält einen Stream davon. Dann sortieren wir den erhaltenen Stream mithilfe der sortierten Methode mit den folgenden Parametern. Verwendet die Komparator-Punktvergleichsmethode, wobei die Methode address get indexed als ersten Parameter und der Komparator umgekehrter Ordnung als zweiten übergeben ersten Parameter und wird. Auf diese Weise erhalten wir einen Adressstream, der nach ihren Indizes umgekehrt sortiert ist. Jetzt filtern wir den Stream, um eine Zeichenfolge zu erhalten , die nur verwendete Adressen enthält. Lassen Sie uns dazu einen Getter für das verwendete Feld in der Adressklasse erstellen . Sie verwendeten Getter wird aufgerufen , weil die IDE auf diese Weise Boolean Getter zurück an die Adressenklasse benennt , um die Methode mit den verwendeten Adressen als Eingabeaufforderung an den Aufruf der Filtermethode zu übergeben . Jetzt rufen wir die Fine-First-Methode für das Ergebnis auf. Um die erste verwendete Adresse und den umgekehrten geordneten Stream zu erhalten, der dem zuletzt zur Adressierung verwendeten entspricht. Was ist, wenn keine verwendeten Adressen gefunden werden. In diesem Fall verwenden wir die Methode or else, um null zurückzugeben. Wir fügen die folgende if-Anweisung hinzu. Wenn die erhaltene Adresse Null ist, geben wir Null als nächsten Index zurück. Wenn nicht, geben wir den letzten Adressindex plus eins zurück. Zurück zum Dienst Aktuelle Wallet-Adressen aktualisieren ruft die nächste Adresse ab Dienst Aktuelle Wallet-Adressen aktualisieren ruft die nächste Adresse , indem er die Methode get address ID die aktuelle Brieftasche aufruft. Wir übergeben den nächsten Adressindex und den Adresstyp als Parameter. Lassen Sie uns diese Methode in der aktuellen Brieftasche erstellen. Wird zurückgegeben, erhalten sie einen Aufruf der Adress-ID-Methode das Adressfeld, wobei dieselben empfangenen Argumente als Parameter übergeben werden. Lassen Sie uns diese Methode in der Adressklasse erstellen. Ruft alle Dress-Objekte mit dem angegebenen Adresstyp ab. Dann konvertieren wir es in eine Liste. Dann erhalten wir die Adresse per Index. Dazu müssen wir den Adressindextyp in ein langes Objekt ändern , nicht nur in einen primitiven Typ. Und dann rufen wir den Wert int übergeben ihn als getMethod-Parameter. Jetzt geben wir die Adresszeichenfolge von der erhaltenen Adresse zurück . Zurück zum Dienst Aktuelle Wallet-Adressen aktualisieren wird einfach die aktuelle Wallet-Empfangsadresse als abgerufene nächste Adresse festgelegt . Lassen Sie uns noch etwas tun, bevor wir unseren Code testen. Denken Sie daran, dass das Codon, diese Klasse, in einem neuen Thread ausgeführt wird. In Java FX empfiehlt es sich, Code, der die Benutzeroberfläche ändert, nur im Hauptthread auszuführen . Rufen wir dazu die Methode platform dot run later auf und übergeben ihr eine Lambda-Funktion. Lassen Sie uns diese beiden Zeilen in den Hauptteil der Lambda-Funktion verschieben , da sie Änderungen verursachen, die sich auf die Benutzeroberfläche auswirken. Lassen Sie uns nun erneut unsere Bitcoin-Tests für den Empfang von Bitcoins durchführen. Großartig. Das Feld für die Empfangsadresse wurde aktualisiert, nachdem Geld eingegangen war und die Tests bestanden wurden. Im nächsten Video werden wir unsere Tests weiter verbessern und ein weiteres Testszenario hinzufügen. C, ja. 35. 33 Empfangen von bitcoin 9 skillshare 2: In diesem Video werden wir unsere Tests weiter verbessern und ein weiteres wichtiges Testszenario für die Funktion zum Empfangen von Bitcoins hinzufügen ein weiteres wichtiges Testszenario . Eine Sache fehlt in unseren Tests. Wir wissen noch nicht, ob die richtigen Adressen generiert werden und ob sie die Indexsequenz des Ableitungspfads respektieren . Um das zu überprüfen, erstellen wir die Methode Adresse ist gültig. Dann ist der Block des ersten Tests, die Adresse genannt wird, eine gültige Methode, die die Adresse, den mnemonischen Startwert und den erwarteten Adressindex , der in diesem Fall Null ist, als Parameter übergeben den mnemonischen Startwert und den erwarteten Adressindex , . Lassen Sie uns diese Methode erstellen. Es wird ein boolescher Wert zurückgegeben. Lassen Sie uns die richtigen Parameternamen festlegen. Hier. Wir erstellen ein neues mnemonisches Seed-Objekt und speichern es in der mnemonischen Startvariablen. Lassen Sie uns den Parameter mnemonic seed in die mnemonische Startzeichenfolge umbenennen . Jetzt instanziieren wir das mnemonische Seed-Objekt übergeben den mnemonischen Startstring als Konstruktorparameter. Lassen Sie uns nun den Hauptschlüssel mit dem folgenden Code erstellen. Ruft die Methode mit zwei Hauptschlüsseln das mnemonische Seed-Objekt auf übergibt dabei eine leere Zeichenfolge als ersten Parameter und das private Hauptpräfix Net als zweiten. Lassen Sie uns nun die erweiterte Pub-Schlüsselzeichenfolge mit dem folgenden Code erstellen . Wir nutzen den erweiterten Pub-Schlüsseldienst. Also lasst uns es in diese Klasse injizieren. Dann rufen wir die Methode create auf und übergeben den Hauptschlüssel als ersten Parameter. Der zweite Parameter wird eine Verkettung zwischen einem Teil des Ableitungspfads für Segmentadressen und dem Indexparameter sein. Lassen Sie uns den Indexparametertyp in die Integer-Klasse ändern , damit wir die toString-Methode dafür aufrufen können. Der dritte Parameter wird die Segway-Konstante des Adresstyps sein. Dann rufen wir die Methode get key für das Ergebnis auf. Jetzt rufen wir das erweiterte Pub-Key-Objekt aus der Bitcoin-Java-Bibliothek ab, indem den erweiterten Pub-Key bei der serialisierten Methode verwenden, die erweiterte Pub-Schlüsselzeichenfolge als Parameter übergeben wird die erwartete Adresse mithilfe des Segmentadressgenerators. Lass es uns in diese Klasse injizieren. Wir rufen dann die generate-Methode auf und übergeben den erweiterten Pub-Schlüssel als Parameter. Schließlich geben wir das Ergebnis des Vergleichs zurück, wenn die erwartete Adresse dem Adressparameter entspricht. Fügen wir nun den Methodenaufruf Adresse ist gültig hinzu, um die Adressen in den anderen Methoden dieser Klasse zu überprüfen. Bei dieser Methode fügen wir es zweimal hinzu. Beim zweiten Mal überprüfen wir mit Index eins, ob die nächste Adresse der erwarteten Adresse entspricht. Lassen Sie uns unsere Tests durchführen. Toll, die Tests sind bestanden. Jetzt wissen wir, dass die Adressen korrekt generiert werden. Lassen Sie uns nun einen weiteren Test erstellen. Der nächste Test wird versuchen, mehr Transaktionen als die Anzahl der generierten Adressen zu übertragen . Denken Sie daran, dass wir die anfängliche Anzahl der generierten Adressen auf 20 gesetzt haben . Wir müssen also überprüfen, was passiert, wenn alle ursprünglich generierten Adressen verwendet werden. Durchführung eines Tests mit 20 Transaktionen würde jedoch viel Zeit in Anspruch nehmen. Deshalb werden wir die anfängliche Anzahl der generierten Adressen in der Testumgebung später auf drei ändern generierten Adressen in der Testumgebung , um die Dinge zu beschleunigen. Lassen Sie uns diese Methode kopieren und unten einfügen. Ändern Sie seinen Namen , um Bitcoin in sieben Transaktionen an verschiedene Adressen zu erhalten Bitcoin in sieben Transaktionen an verschiedene Adressen zu , wobei drei Adressen in unserem Wallet generiert wurden, und sieben Transaktionen in diesem Test, würde unser Wallet benötigen um vier Adressen mehr als die ursprüngliche Zahl zu generieren, damit dieser Test bestanden wird. Lassen Sie uns den Namen der erstellten Brieftasche in meine Test-Wallet ändern. Zunächst erstellen wir eine Eigenschaftendatei für die Testumgebung, um die anfängliche Anzahl der generierten Adressen für unsere Tests zu ändern . Lassen Sie uns also einen Ressourcenpfad innerhalb des Testpakets erstellen. Wählen Sie unten die Option Ressourcen aus. Darin wird eine Datei namens Application Test Dot Properties erstellt . Wir kopieren den Inhalt unserer Datei mit den Punkteigenschaften unserer Anwendung und fügen ihn hier ein. Lassen Sie uns nun die Eigenschaft „Anzahl der generierten Adressen“ auf drei setzen. Gehen wir nun zur Adresskonfigurationsklasse. Die anfängliche Anzahl der generierten Adressen, die Methode derzeit zurückgibt, 20 fügt diesen Wert aus der Eigenschaftendatei unter Verwendung dieser Wertanmerkung und dieses private Feld in diese Klasse der Eigenschaftendatei unter Verwendung dieser Wertanmerkung und dieses ein. Jetzt wird bei dieser Methode nur das erstellte Feld zurückgegeben. Jetzt können Sie Eigenschaften aus den Testpunkteigenschaftsdateien der Anwendung in unseren Tests verwenden. Gehen wir zur GUI-Testklasse. Fügen Sie diese Anmerkung hinzu. Okay, jetzt erhält jede Testdatei, die den GUI-Test erweitert , ihre Eigenschaften aus der Datei mit den Punkteigenschaften des Anwendungstests. Nun zurück zu unserem letzten Test. Lassen Sie uns den Namen dieser Variablen in die erste Adresse ändern. Der Name dieser Variablen an die zweite Adresse. Lassen Sie uns nun diese Zeilen kopieren und vier weitere Transaktionen generieren , um mehr neu generierte Adressen zu bilden , wobei wir ihren Code entsprechend ändern. Ändern wir die erwartete Tabellenzeilengröße auf sieben. Lassen Sie uns diese Zeilen auch kopieren, um alle im Test generierten Adressen zu validieren. Lassen Sie uns die Methodenparameter nach Bedarf ändern. Lassen Sie uns jetzt unsere Tests durchführen. Wie erwartet. Der letzte Test ist nach der dritten Transaktion fehlgeschlagen, da das Wallet die vierte Adresse nicht finden konnte , da es nur die ersten drei Adressen generiert hat. Im nächsten Video werden wir das beheben. Bevor wir das Video beenden, fügen wir der Punkteigenschaftsdatei der Anwendung die Eigenschaft „Anzahl der generierten Adressen “ hinzu. Stellen wir es auf 20 ein , damit das Wallet in der Nicht-Test-Umgebung wie zuvor funktioniert. 36. 34 Empfangen von bitcoin 10 skillshare 2: In diesem Video werden wir unseren zuletzt erstellten Test bestehen lassen. Gehen wir dazu zum Dienst „ Aktuelle Wallet-Adressen aktualisieren“. Fügen wir bei dieser Methode die folgende if-Anweisung hinzu. Nach der Berechnung des nächsten Adressindex. In der if-Anweisung rufen wir die Methode them must import addresses übergeben den nächsten Adressindex und den Adresstyp. Lassen Sie uns diese Methode erstellen. Importiert Adressen nur, wenn der nächste Adressindex der Gesamtzahl der Adressen in der aktuellen Brieftasche mit einem bestimmten Adresstyp entspricht der Gesamtzahl der Adressen in der . Wenn das der Fall ist, bedeutet das, dass uns die Adressen ausgegangen sind und wir daher nicht die nächste Adresse für unser Wallet eingeben können, ohne weitere Adressen zu erstellen. Innerhalb dieser Methode wird das Ergebnis der Überprüfung zurückgegeben , ob der nächste Adressindex dem aktuellen Wallet entspricht . Der Methodenaufruf get addresses count übergibt den Adresstyp an diese Methode. Und lassen Sie uns diese Methode erstellen. Diese Methode gibt eine Ganzzahl zurück und gibt die Adressen, den Methodenaufruf get adresses count zurück , wobei der Adresstyp als Parameter übergeben wird. Lassen Sie uns diese Methode erstellen. Hier holen wir einfach alle Adressen mit dem angegebenen Adresstyp in eine Liste und geben die Listengröße zurück an den Dienst Aktuelle Wallet-Adressen aktualisieren. Im if-Block werden zuerst die erweiterten Pub-Schlüssel der aktuellen Wallets abgerufen und in einer Variablen gespeichert. Lassen Sie uns diese Methode erstellen. Hier. Wir geben das Feld für erweiterte Pub-Schlüssel zurück. Lass es uns erstellen. Lassen Sie uns auch einen Setter für dieses Feld hinzufügen. Wir nennen das Set oder die Update-Methode für den aktuellen Wallet-Service. Übergabe der erweiterten Pub-Schlüssel an die Brieftasche. Nun zurück zum Dienst Aktuelle Wallet-Adressen aktualisieren. Wir rufen die Methode zum Hinzufügen von Adressen ADD-Adressdienst auf. Übergabe der zuvor erhaltenen erweiterten Pub-Schlüssel als ersten Parameter und des nächsten Adressindex als zweiten Parameter. Lassen Sie uns diesen Service in diese Klasse einbauen. Lassen Sie uns diesen Dienst und das API-Dienstpaket erstellen. Lassen Sie uns die Service-Anmerkung hinzufügen. Lassen Sie uns nun die Injizierung dieses Dienstes in diese Klasse beenden. Und lassen Sie uns diese Methode im Anzeigenadressendienst erstellen. Lassen Sie uns diesen Parameternamen in From Index ändern. Was wir jetzt planen, ist, Adressen für die erweiterten Pub-Schlüssel zu generieren , die als Parameter übergeben wurden. Die Anzahl der generierten Adressen entspricht der ursprünglichen Anzahl der eingefügten generierten Adressen. Und der erste generierte Ableitungsindex der Adresse wird durch die feste Indexvariable bestimmt, nehmen wir z. B. an, die anfängliche Anzahl der generierten Adressen ist gleich 20 und die Absender-Indexvariable ist gleich 20. In diesem Fall generiert diese Methode Kleider mit einem Ableitungsindex von 20 bis 39. Dazu für jeden erweiterten Pub-Schlüssel. Wir rufen die Methode zum Hinzufügen von Adressen auf und übergeben dabei den Schlüssel und den From-Indexparameter. Lassen Sie uns diesen S-Buchstaben entfernen. Lassen Sie uns nun diese Methode zum privaten Hinzufügen von Adressen erstellen. Es ruft die Methode zum Hinzufügen von Adressen auf dem erweiterten Pub-Schlüssel als Parameter auf. Wir werden den sequentiellen Adressgenerator verwenden. Also lasst uns es in diese Klasse injizieren. Wir rufen die Generate-Methode auf dem sequentiellen Adressgenerator übergeben dabei den erweiterten Pub-Schlüsselschlüssel, den erweiterten Pub-Schlüsseltyp und die Index-Variable from als Parameter. Gehen wir zur Implementierung der Generate-Methode über. Ändert es, um Adressen mit Ableitungsindizes unter Verwendung des From-Indexparameters zu generieren . Fügen wir also From Index als dritten Parameter hinzu. Hier im Bereich fügt der Methodenaufruf die From-Indexvariable als ersten Parameter hinzu. Und die Summe des From-Indexparameters und der anfänglichen Anzahl der generierten Adressen als Sekunde. Nun zurück zum ADD-Adressdienst. Lassen Sie uns die Methode „ Anzeigenadressen“ für die erweiterte Pub-Schlüsselklasse erstellen . Lassen Sie uns diesen Parameternamen korrigieren. Hier. Wir rufen die Methode address add all auf und übergeben den Adressenparameter an sie. Es gibt ein Problem mit diesem Code. Das Adressfeld ist vom Typ Liste, der unveränderlich ist. Das heißt, wenn wir versuchen, Elemente über die Methode „Alles hinzufügen“ hinzuzufügen, wird ein Fehler ausgegeben. Lassen Sie uns es also auf den Typ ArrayList ändern , der veränderbar ist. Lassen Sie uns es auch hier endgültig und instanziieren. Lassen Sie uns auch den Adress-Getter und die Adressmethode ändern , um eine ArrayList abzurufen und festzulegen. Lassen Sie uns auch die Methode set addresses entfernen , da wir sie nicht mehr verwenden werden. Zurück zum Dienst „ Adressen hinzufügen“. Lassen Sie uns das Ergebnis des Generate-Methodenaufrufs in eine neue ArrayList packen , da die Methode ad addresses jetzt nur eine ArrayList akzeptiert. Lassen Sie uns nun Faktoren ausführen, die den Wallet-Service erstellen. Da wir Änderungen vorgenommen haben, die sich ausgewirkt haben. Lassen Sie uns zunächst den Dienst für den sequentiellen Adressgenerator aus dieser Klasse entfernen . Lassen Sie uns auch diese Methode entfernen. Lassen Sie uns diese Codezeile entfernen. Wir verwenden den Add Address Service, um Adressen zu den erweiterten Pub-Schlüsseln hinzuzufügen . Also lasst uns es in diese Klasse injizieren. Und lassen Sie uns die Methode add addresses dafür aufrufen und dabei die erweiterten Pub-Schlüssel und Null als Parameter übergeben. Lass uns damit fertig sein, es in diese Klasse zu injizieren. Nun zurück zum Dienst Aktuelle Wallet-Adressen aktualisieren. Wir rufen die Methode set addresses auf der aktuellen Wallet auf und übergeben die erweiterten Pub-Schlüssel als Parameter. Lassen Sie uns den Clear-Methodenaufruf für Adresszeilen in den Methoden set addresses entfernen, da wir nach dem Festlegen dieser Adressen keine Adresstabellenzeilen entfernen möchten . Lassen Sie uns stattdessen eine Methode namens Clear Address Rows erstellen , die das tut. In der Aktualisierungsmethode des Dienstes „Aktuelle Brieftasche aktualisieren“ rufen wir dann diese Methode auf, um die Adresszeilen erst zu löschen , nachdem ein neues Wallet hinzugefügt wurde. Zurück zum Dienst Aktuelle Wallet-Adressen aktualisieren ruft alle neu generierten Adressen in der aktuellen Brieftasche ab Dienst Aktuelle Wallet-Adressen aktualisieren ruft alle neu generierten Adressen in und speichert sie in dieser Variablen. Um die Adressen abzurufen, wird die Methode get addresses as strings in der aktuellen Wallet aufgerufen. Übergibt den nächsten Adressindex als ersten Parameter. Und die Summe aus dem nächsten Adressindex und der anfänglichen Anzahl der generierten Adressen als zweiter Parameter. Lassen Sie uns dieses Feld in diese Klasse einfügen. Fügen wir die Kriterien-Annotation um die in der Adresskonfigurationsklasse definierte Bean zu verwenden der Adresskonfigurationsklasse definierte Bean zu den gewünschten Wert in diesen Parameter einzufügen. Lassen Sie uns nun diese Methode erstellen. Lassen Sie uns diese Parameternamen in From Index Two Index ändern . Diese Methode gibt die Adressen zurück und ruft Adressen als Zeichenketten ab Methodenaufruf übergibt dieselben Parameter, die empfangen wurden. Lassen Sie uns diese Methode in der Adressklasse erstellen. Diese Methode gibt alle ihre Adressen mit Indizes zwischen den Parametern aus Index zwei (Index 2) zurück , jedoch ohne die Leiter. Dazu wird der folgende Code zurückgegeben. Wir verwenden die FlatMap-Methode, um alle Adressen in einen Stream von Adressobjekten umzuwandeln . Dann filtern wir den Stream so, dass nur Adressen zurückgegeben werden, deren Index größer oder gleich der festen Indexvariablen und kleiner als die beiden Indexvariablen ist größer oder gleich der festen Indexvariablen . Dann rufen wir eine Map für das Ergebnis auf , um einen Stream von Adresszeichenfolgen zurückzugeben. Schließlich konvertieren wir das Ergebnis eine Liste und geben es zurück. Zurück zum Dienst Aktuelle Wallet-Adressen aktualisieren verwendet die Node-Multiimport-Adressclients, um die neu generierten Adressen in unseren Bitcoin-Knoten zu importieren . Denken Sie daran, dass dies erforderlich ist, da der Knoten über unsere Adressen Bescheid wissen muss , damit er entsprechende Transaktionen an unser Application Wallet senden kann . Also lasst uns es in diese Klasse injizieren. Jetzt rufen wir die Methode für Eingabeadressen auf übergeben den aktuellen Wallet-Namen, die Adresszeichenfolgen und ein neues Datum als Parameter. Großartig, unsere Funktion zur Adressrotation sollte jetzt funktionieren, auch nachdem alle ursprünglich generierten Adressen verwendet wurden. Aber lassen Sie uns hier ein anderes Problem behandeln. Wir legen die nächste Adresse als Empfangsadresse in unserer Brieftasche fest. Auch wenn der adressierte Typ eine Änderungsadresse ist. Lass uns das reparieren. Da wir nur Adressen mit dem Segway-Typ wollen, nicht der Segway-Änderungstyp als Empfangsadressen in unserer Brieftasche angegeben. Also fügen wir diese If-Aussage hinzu. Wenn der Adresstyp der Hauptadresskonstante entspricht , wird er auf Weiter gesetzt. Jetzt. Dann legen wir die nächste Adresse als nächste Empfangsadresse in der aktuellen Brieftasche fest. Eine weitere Sache: Lassen Sie uns diesen plattformübergreifenden Aufruf entfernen , der die Methode run later aufruft und nur den Code , der die Benutzeroberfläche wirklich verändert. Verwenden wir es also, um nur den aktuellen Wallet-Set-Adress-Roll-Call zu umwickeln . Lassen Sie uns es auch verwenden, um den aktuellen Aufruf der Wallet-Set-Empfangsadressenmethode zu verpacken . Auf diese Weise vermeiden wir, dass die Benutzeroberfläche blockiert wird, während mit unserem Bitcoin-Knoten im Methodenaufruf „ Importadressen“ kommunizieren . Gehen wir nun zum Adressentabellencontroller. Mir ist aufgefallen, dass TableView manchmal nicht aktualisiert wird , um den tatsächlichen Status seiner Zeilen widerzuspiegeln. Um das zu beheben, fügen wir dieser Methode diesen Code hinzu. Fügt den aktuellen beobachtbaren Wallet-Adresszeilen einen Listener hinzu. Im Hauptteil dieses Lambdas ruft einfach die Refresh-Methode für die Adresstabelle auf. Auf diese Weise haben wir bei jeder Aktualisierung unserer Wallet-Adressen garantiert, dass die Tabellenansicht, wir aktualisieren sie und die aktuellen Informationen unserer Wallet-Adressen auf dem Bildschirm anzeigen die aktuellen Informationen unserer . Gehen wir nun zum Test des sequentiellen Adressgenerators und fügen Null als dritten Parameter der Generierungsmethode hinzu, damit dieser Test weiterhin funktioniert. Lassen Sie uns auch den Create Wallet Service Test korrigieren. in der Setup-Methode Lassen Sie uns in der Setup-Methode den ADD-Adressdienst instanziieren dabei den sequentiellen Adressgenerator als Parameter übergeben. Und lassen Sie uns den dritten Parameter des Create Wallet-Dienstes durch den ADD-Adressdienst ersetzen . nun, im letzten Bitcoin-Test, Lassen Sie uns nun, im letzten Bitcoin-Test, eine kleine Änderung vornehmen. Nach dem Senden von Bitcoin an die dritte Adresse. Fügen wir als Argumente einen Aufruf der Schlafmethode hinzu, der Timeout und Sekunden übergibt . Lassen Sie uns den gleichen Anruf auch hinzufügen, nachdem Bitcoins an die sechste Adresse gesendet haben. Der Grund für diese Aufrufe ist, dass wir, bevor Bitcoins an die vierte und siebte Adresse senden, wir Bitcoins an die vierte und siebte Adresse senden, sie generieren und in unsere Knoten importieren müssen , bevor wir Transaktionen an sie akzeptieren. Und der Importvorgang dauert einige Zeit. Lassen Sie uns endlich alle unsere Anwendungstests durchführen. Toll, alle Tests wurden bestanden. Endlich haben wir die Grundlagen der Bitcoin-Empfangsfunktion unseres Wallets abgeschlossen . Jetzt beginnen wir damit, die Beobachtung neuer Blöcke zu implementieren , die der Blockchain hinzugefügt werden , damit wir die Anzahl der Konformationen aktualisieren können , bei denen Adressen C haben, ja. 37. 35 Blockteil 1 skillshare 2 empfangen: In diesem Video werden wir Tests durchführen, um sicherzustellen, dass beim Mining eines Blocks in der Blockchain unser Wallet aktualisierte Transaktionen mit zunehmenden Konformationen erhält . Lassen Sie uns also die Hilfsmethoden in der Bitcoin-Testklasse für den Empfang in den GUI-Test verschieben in der Bitcoin-Testklasse für den Empfang , damit wir diese Methoden in anderen Klassen verwenden können , die sie erweitern. Lassen Sie uns nun all diese Eigenschaften auch aus dem gleichen Grund in die GUI-Klasse verschieben . Lassen Sie uns nun diese beiden Zeilen ausschneiden und in das Load Wallet einfügen und der GUI-Testklasse eine ausgeglichene Methode hinzufügen . In der Setup-Methode in der empfangenen Testklasse rufen wir diese Methode einfach auf. Lassen Sie uns all diese ungenutzten Importe in dieser Klasse löschen. in der GUI-Testklasse Lassen Sie uns in der GUI-Testklasse diese Methoden und Eigenschaften schützen. nun im GUI-Testpaket Lassen Sie uns nun im GUI-Testpaket die Testklasse für den Empfangsblock erstellen. Es wird die GUI-Testklasse erweitern. Lassen Sie uns die Setup-Methode und den Bitcoin-Test für den Empfang kopieren und hier einfügen. Lassen Sie uns auch den ersten Test im Bitcoin-Bitcoin-Test kopieren und in die Testklasse für Empfangsblöcke einfügen. Es wird als Blueprint für den nächsten Test verwendet , den wir erstellen werden. Lassen Sie uns den Namen der erstellten Brieftasche in meine Test-Wallet 5 ändern . Lassen Sie uns den Namen des Reagenzglases ändern, das Bitcoin erhalten soll , und Hashtag-Bestätigungen hinzufügen, Bestätigungen, um das Kleid zu erhalten. Die Hashtag-Konformationen werden durch die von uns erstellte Testvariable für Bestätigungen interpoliert . Nach dem Senden von Bitcoins wird nun die Methode Mine Blocks aufgerufen die Bestätigungsvariable als Parameter übergeben. Lassen Sie uns diese Methode erstellen. Es wird eine Ganzzahl als Parameter verwenden. Bei dieser Methode verwenden wir den Node Generate , um den Client an Minenblöcke zu adressieren. Also lasst uns etwas Code hineinfügen. in der GUI-Testklasse Kopieren Sie in der GUI-Testklasse diese Codezeile und fügen Sie sie hier ein. Ändern Sie den Namen der Adressvariablen in Notizadresse. Machen Sie dasselbe mit dieser anderen Zeile. Ändern Sie den zweiten Parameter der Generierungsmethode in Blöcke. Es verwendet also diese Variable, um die Anzahl der Blöcke zu definieren, die es abbauen wird , und diesen Parameter in eine Notizadresse ändern. Lassen Sie uns nun dieses Gewicht für einen Methodenaufruf kopieren und hier einfügen. Löschen Sie diese Codeteile. Diese Methode wartet, bis der Wert der Bestätigungszelle der ersten Adresstabellenzeile der Blockvariablen entspricht. Im Venn-Block wird geprüft, ob der Wert der Bestätigungszelle der ersten Tabellenzeile der Bestätigungsvariablen entspricht. Fügen wir eine Where-Klausel hinzu. Hier. Wir legen fest, dass die Bestätigung für einige Testwerte variabel ist. Wir fügen einen Platzhalter für die zweite Spalte in der WhereClause hinzu, da sie anscheinend nur funktioniert, wenn sie zwei oder mehr Spalten hat. Lassen Sie uns die Bestätigungswerte auf 12,3 setzen. Lassen Sie uns nun unseren Bitcoin-Knoten ausführen und lassen Sie uns unseren neuen Test durchführen. Toll, die Tests sind bestanden. Lassen Sie uns nun einen weiteren Test für das folgende Szenario durchführen. Wir möchten wissen, was passiert, wenn eine Adresse zwei Transaktionen empfängt. Und die zweite Transaktion hat weniger Konformationen als die erste. In diesem Fall erwarten wir, dass die Anzahl der Konformationen der Adresse der Anzahl der Konformationen der Transaktion mit weniger Konformationen zu dieser Adresse entspricht der Anzahl der Konformationen der . Lassen Sie uns also den ersten Test duplizieren. Lassen Sie uns den Namen so ändern, dass er Bitcoin erhalten sollte , und betrachten die Transaktion mit weniger Konformationen als Adressbestätigungen. Lassen Sie uns den Namen der erstellten Brieftasche in meine Test-Wallet 6 ändern . Lassen Sie uns nun diese Codezeilen duplizieren , um Bitcoins und Minenblöcke erneut zu senden. Im zweiten Minenblock-Aufruf füge Minus eins in seinem Parameter hinzu, um nach der zweiten Transaktion weniger Blöcke zu minen . Im Block erwarten wir Bestätigungen minus eins als Anzahl der Bestätigungen in der ersten Tabellenzeile. Lassen Sie uns diese Zeile löschen, da wir diesen Testfall nicht wollen, da er versuchen würde , beim zweiten Aufruf von Mine Blocks auf Null zu achten, was fehlschlagen würde. Lassen Sie uns unsere Tests noch einmal durchführen. Toll, die Tests sind bestanden. Wir kommen also zu dem Schluss, dass unser Wallet bereits bereit ist , die Anzahl der Konformationen unserer Adressen zu aktualisieren . Das liegt daran, dass der Knoten nach jedem Minenblock eine Nachricht über Null MQ an unsere Anwendung sendet , die die zuvor importierten Transaktionen enthält , jedoch mit einer aktualisierten Anzahl von Bestätigungen. 38. 36 Empfangen von Transaktionsteil 1 skillshare 2: In diesem Video beginnen wir mit Erstellung der Transaktionstabelle. Diese Tabelle ähnelt der Adresstabelle, aber statt Zeilen mit Informationen über Adressen enthält diese Tabelle Informationen über jede Transaktion, diese Tabelle Informationen über die unser Wallet sendet oder empfängt. Beginnen wir also mit der Erstellung eines GUI-Tests für diese Tabelle. im GUI-Paket Erstellen Sie im GUI-Paket eine Klasse namens Receiving Transaction Test. Kopieren Sie diese Methoden aus dem Empfangsblocktest und fügen Sie sie hier ein. Diese Klasse wird die GUI-Testklasse erweitern. Ändern Sie diesen Testnamen so, dass die Transaktion empfangen werden sollte. Lassen Sie uns diese Methode formatieren. Entferne den Where-Block, ändere den Namen „Create Wallet in „Mein Test“, solange es sieben ist. Löschen Sie diese Zeile. Nachdem wir nun die Methode sleep aufgerufen haben, lassen Sie uns den Test durchführen und auf eine Komponente mit einer Registerkarte mit der Ethik-ID von Transaktionen klicken . Lassen Sie uns nun der Methode „Bitcoin senden und warten“ einen weiteren optionalen Parameter hinzufügen . Dieser Parameter ist eine Zeichenfolge und wird als Suchkomponente bezeichnet. Ihr Standardwert ist die Tabelle mit Hashtag-Adressen. Lassen Sie uns diesen Parameter im Aufruf der Suchmethode für die Lookup-Komponentenvariable ersetzen . nun im Test Lassen Sie uns nun im Test diese Parameter zur Methode „Bitcoin senden und warten“ hinzufügen . Der vierte Parameter wird die Hashtag-Transaktionstabelle sein. Auf diese Weise wartet dieser Methodenaufruf nach dem Senden einer Transaktion darauf, wartet dieser Methodenaufruf dass die Transaktionstabelle mit einer Zeile gefüllt ist, die einen Saldo von 1,0 Bitcoin enthält . Lassen Sie uns nun auch den Parameter der Suchmethode in die Hashtag-Transaktionstabelle ändern . Lassen Sie uns im Block dann die Behauptung, dass die Tabellenzeilengröße gleich eins ist, vorerst einfach bei eins belassen . Lassen Sie uns nun unseren Tisch entwerfen. Lass uns auf den Spielplatz gehen Punkt FXML. Lassen Sie uns den gesamten Inhalt zwischen das Tab-Tag kopieren und unten einfügen. Ändern Sie nun die Texteigenschaft in Transaktionen und die Ethik-ID in die Registerkarte Transaktionen. Ändern Sie auch die Ethik-ID des Tabellen-View-Tags in die Transaktionstabelle. Lassen Sie uns nun das Textfeld der ersten Spalte in die Transaktions-ID ändern . Die Tabelle wird außerdem eine ausgeglichene Spalte und eine Bestätigungsspalte enthalten. Also werden wir diese Tags so beibehalten, wie sie sind. Lass uns das letzte Tag duplizieren und seinen Text auf das Datum ändern. Diese Spalte enthält das Erstellungsdatum dieser Transaktionen. Klicken wir nun auf den Scene Builder , um zu sehen, wie unser neuer Tab und unsere neue Tabelle aussehen. Okay, es sieht gut aus. Lassen Sie uns nun ein neues FXML für diese Komponente erstellen. Nennen wir es Transaktions-Unterstrichtabelle. Lassen Sie uns den Boilerplate-Code löschen. Lassen Sie uns diesen Inhalt aus dem Playground Dot FXML kopieren und hier einfügen. Lassen Sie uns diese Tags importieren. Ändern Sie dieses Tag in fx colon route. Löschen Sie diesen Inhalt als seinen Typ. Lassen Sie uns den Pfad für die Tabellenansichtskomponente festlegen und diese URL als XML-NS-Feld als Transaktionstabelle des Ethik-ID-Eigenschaftssatzes festlegen. Löschen Sie nun diese Tags, die wir nicht kopieren mussten. Lassen Sie uns nun diese Ethik-IDs zu diesen Spalten-Tags hinzufügen. Sie werden später nützlich sein, wenn wir den Transaktionstabellencontroller erstellen . nun im Hauptfenster Punkt FXML Lassen Sie uns nun im Hauptfenster Punkt FXML den Inhalt zwischen diesen Tags duplizieren. Lassen Sie uns den Tab-Text in Transaktionen und die FX-ID in den Tab Transaktionen ändern . Ändern Sie nun dieses Tag in Transactions Table Controller. Lassen Sie uns diesen Controller im GUI-Punkt-Controller-Paket erstellen . Lassen Sie uns den Punkt FXML in das Hauptfenster importieren. Lassen Sie uns nun die Komponentenannotation zum Transaktionstabellencontroller hinzufügen . Es erweitert die parametrisierte Klasse der Tabellenansicht parametrisierte die Transaktionszeilenklasse, die wir erstellen werden. Lassen Sie uns die Transaktionsklasse real im Observables-Paket erstellen . Gehen wir nun zum Receive Tab Controller und kopieren seinen Konstruktor und fügen ihn hier ein, um die entsprechenden Änderungen daran vorzunehmen. Lassen Sie uns die Wertanmerkung so ändern, dass sie auf die Transaktionen zeigt, die den Tabellenpunkt FXML unterstreichen. Lassen Sie uns auch die aktuelle Brieftasche in diese Klasse injizieren. Es wird später nützlich sein. Jetzt müssen wir den Transaktionstabellencontroller in die Liste der benutzerdefinierten Komponenten des GUI gestarteten Listeners aufnehmen den Transaktionstabellencontroller in die Liste der benutzerdefinierten Komponenten des GUI gestarteten Listeners Wir könnten einfach eine weitere Oder-Klausel in der if-Anweisung in der Initialisierung hinzufügen FXML-Methode. Aber lassen Sie uns diese Klasse umgestalten, indem wir Folgendes tun. Lassen Sie uns hier einen privaten statischen Satz von Klassenobjekten erstellen , die als benutzerdefinierte Komponenten bezeichnet werden. Lassen Sie uns es hier mit der set−Methodenklasse instanziieren. Lassen Sie uns diese Controller-Klassen in das Set aufnehmen. Jetzt wird in der if-Anweisung nur überprüft, ob das benutzerdefinierte Komponentenset den angegebenen Typ enthält. Gehen wir nun zum Empfangstransaktionstest über. Lassen Sie uns nun die Maven-Ziele für die Bereinigung und Kompilierung des Lebenszyklus ausführen . Manchmal ist dies erforderlich, um neue FXML-Dateien in das kompilierte Projekt aufzunehmen . Lassen Sie uns nun unseren Bitcoin-Core-Knoten ausführen falls er nicht bereits läuft. Lassen Sie uns abschließend den Test durchführen. Der Test ist fehlgeschlagen, weil keine Zeile mit den Transaktionsinformationen in der Transaktionstabelle gefunden mit den Transaktionsinformationen in der Transaktionstabelle in der Transaktionstabelle werde diese Funktion im nächsten Video weiter implementieren . Wir sehen uns. 39. 37 Empfangen von Transaktionsteil 2 skillshare 2: In diesem Video werden wir die Implementierung der Transaktionstabelle abschließen und diesen Test bestehen lassen. Gehen wir also zum Update UTXO Service. Wenn Sie sich erinnern, dass diese Aktualisierungsmethode aufgerufen wird nachdem wir eine Transaktion von unserem Knoten erhalten haben, überwacht die Node-Task-Klasse unseren Knoten auf Transaktionsnachrichten. Dann veröffentlicht unsere Anwendung ein Ereignis mit dem Empfang einer Transaktion , das von unserem Transaction Listener abgehört wird . Der Transaction Listener analysiert und filtert die Nachricht und ruft die Update-Methode des UTXO-Dienstes auf. also nach dem Abrufen von UTXos und der Aktualisierung der aktuellen Wallet-Adressen Lassen Sie uns also nach dem Abrufen von UTXos und der Aktualisierung der aktuellen Wallet-Adressen die aktuellen Wallet-Transaktionen mithilfe dieses Dienstes aktualisieren . Lass es uns in diese Klasse injizieren. Lassen Sie uns es im GUI Dot Services-Paket erstellen. Lassen Sie uns die Service-Anmerkung hinzufügen. Lassen Sie uns nun damit fertig sein, es in diese Klasse zu injizieren. Rufen wir nun die Aktualisierungsmethode für diesen Dienst auf und übergeben die utxOS-Variable als Parameter. Lassen Sie uns diese Methode erstellen. Diese Methode wird asynchron ausgeführt. Lassen Sie uns also die asynchrone Annotation hinzufügen, indem wir den Standard-Executor-Dienst als Parameter verwenden. Machen wir dasselbe mit der Aktualisierungsmethode im Dienst „Aktuelle Wallet-Adressen aktualisieren“. Lassen Sie uns nun die Aktualisierungsmethode implementieren, und der Aktualisierte Wallet-Transaktionsdienst konvertiert die Liste der UTXOs in eine Liste von Transaktionszeilen und speichert das Ergebnis in den Transaktionszeilen. Eine Variable, die den folgenden Code verwendet, filtert den Stream von UTXos, indem im Stream nur die UTXOs mit Adressen in der aktuellen Brieftasche beibehalten werden. Lassen Sie uns also die aktuelle Brieftasche in diese Klasse injizieren. Jetzt werden im Lambda-Body alle Adressen als Zeichenketten abgerufen und geprüft, ob sie die UTXO-Adresse enthalten. Jetzt rufen wir die Map-Methode für den resultierenden Stream auf und übergeben die Transaktionszeile von der Methode als Parameter. Lassen Sie uns diese Methode erstellen. Es wird eine statische Methode sein und ein Transaktionszeilenobjekt zurückgeben. Ähnlich der Adresszeilenklasse. Die Transaktionszeilenklasse steht für eine Zeile und die Transaktionstabelle. Fügen wir dieser Klasse also die folgenden Eigenschaften hinzu. Jede Eigenschaft steht für eine Spalte in der Transaktionstabelle. Lassen Sie uns das letzte Schlüsselwort aus jeder Eigenschaft löschen , da die IDE es ermöglicht, automatisch Setter für diese Eigenschaften zu erstellen , wenn sie endgültig sind. Verwenden Sie nun diese ID-Funktion fügen Sie Getter und Setter für jede Eigenschaft hinzu. Jetzt können wir diesen Eigenschaften das letzte Schlüsselwort wieder hinzufügen . Lassen Sie uns nun einen Konstruktor erstellen. Der Konstruktor nimmt jede Klasseneigenschaft als Parameter an. Und wir verwenden die Eigenschaftssetzer, um die Eigenschaften im Konstruktorkörper festzulegen. Jetzt können wir die Methode weiter implementieren. Es wird eine neue Transaktionszeile mit den folgenden Parametern zurückgegeben . Zurück zum Transaktionsservice „Aktuelle Brieftasche aktualisieren“. Jetzt konvertieren wir die resultierende Zeichenfolge in eine Liste. Jetzt fügen wir die erhaltene Transaktionsrose mit der Methode „Transaktionszeilen hinzufügen“ zur aktuellen Brieftasche hinzu. Lassen Sie uns diese Methode erstellen. Es wird das Feld Transaktionszeilen verwenden. Also lass es uns jetzt erstellen. Sein Typ wird die Transaktion Rose Class sein. Lassen Sie uns es im Observables-Paket erstellen. Zurück zur aktuellen Brieftasche. Machen wir es endgültig und instanziieren wir es hier. Lassen Sie uns auch das Adresszeilenfeld endgültig machen. in der ED-Transaktionszeilen-Methode Rufen wir in der ED-Transaktionszeilen-Methode die Methode zum Hinzufügen von Transaktionszeilen im Feld Transaktionszeilen auf. Übergabe der angegebenen Transaktionszeilen als Parameter. Lassen Sie uns diese Methode erstellen. Genau wie die Klasse Address Rows für die Verwaltung der Liste der Adresszeilen in der Adresstabelle verantwortlich ist die Verwaltung der Liste der Adresszeilen . Diese Klasse macht dasselbe mit den Transaktionszeilen und der Transaktionstabelle. Daher prüfen wir für jede Transaktionszeile, ob das Transaktions-Roadmap-Feld sie bereits enthält. Lassen Sie uns dieses Feld erstellen. Es wird eine beobachtbare Map sein, bei der der Schlüssel eine Zeichenfolge und der Wert eine Transaktionszeile ist. Lassen Sie uns es hier mit einem beobachtbaren Map-Wrapper instanziieren eine neue verknüpfte HashMap als Konstruktor übergeben. Wenn die Transaktions-Roadmap also die Transaktionszeilen-ID in ihren Schlüsseln enthält, setzen wir die Transaktionsrotation auf das Datum der Transaktion , das in der Transaktions-Roadmap angegeben ist, ausreichend die Transaktionszeilen-ID in ihren Schlüsseln enthält, setzen wir die Transaktionsrotation auf das Datum der Transaktion, das in der Transaktions-Roadmap angegeben ist, ausreichend ist. das, um das Erstellungsdatum der Transaktion beizubehalten. Danach entfernt die if-Anweisung die Transaktionszeile anhand ihrer ID aus der Map und die angegebene Transaktionszeile erneut in die Transaktions-Roadmap ein, wobei ihre ID als Schlüssel verwendet wird. Auch hier entfernen wir dieselbe Transaktionszeile und fügen sie hinzu , um die Observable Map zu zwingen , Änderungsereignisse zu veröffentlichen , die später abgehört werden. Lassen Sie uns nun das Feld für die Observable-Liste erstellen , das verwendet wird, um Änderungen in der Transaktions-Roadmap an den Tabellen-Controller zu binden . Lassen Sie uns es hier mit einem Observable List Wrapper instanziieren einem Observable List Wrapper , der mit einer neuen verknüpften Liste instanziiert wird. Lassen Sie uns nun die Zeilenliste der Methode get observable transaction erstellen . Es wird die Transaktionsrollenliste zurückgegeben. Jetzt wird die Transaktions-Roadmap an die Transaktionsrollenliste im Konstruktor gebunden , genau wie wir es für den Adresszeilensatz und die Adresszeilenliste in der Klasse Adresszeilen getan haben . Um die Sache zu beschleunigen, kopieren wir den Adresszeilenkonstruktor und fügen ihn hier ein. Lass uns seinen Namen korrigieren. Anstatt Methoden auf der Adress-Rollenliste aufzurufen, tun wir es jetzt in der Transaktionsrollenliste. Anstatt einen Set Change Listener zu verwenden, verwendet er einen Map Change-Listener mit einer Zeichenfolge und einer Transaktionszeile parametrisiert ist. Anstatt das hier entfernte get-Element zu verwenden, verwenden wir außerdem das entfernte getValue. Hier. Wir werden das nutzen, um einen Mehrwert zu erzielen. Und hier fügen wir der Transaktions-Roadmap einen Listener hinzu. Damit das funktioniert, müssen wir noch die equals-Methode in der Transaktionszeilenklasse implementieren . Dies liegt daran, dass wir anhand der Transaktionszeilenliste die Methode verwenden, um zu entscheiden, welche Transaktionszeile aus sich selbst entfernt werden soll. Lassen Sie uns es also mit dieser IDE-Funktion implementieren. Stellen Sie sicher, dass das Kontrollkästchen Getter verwenden in diesem Fenster aktiviert ist. Nur die ID-Eigenschaft wird verwendet , um Gleichheit in dieser Klasse zu definieren. Klicken Sie auch hier auf das ID-Kontrollkästchen , damit es nicht Null sein kann. Okay, die IDE hat diese Methoden wie erwartet generiert. Zurück zur Klasse Transaction Rows. Lassen Sie uns die Clear-Methode erstellen, die aufgerufen wird, wenn eine neue Brieftasche erstellt wird. Darin wird die Clear-Methode auf der Transaktions-Roadmap und auf der Transaktionsrollenliste aufgerufen. in der aktuellen Wallet-Klasse Lassen Sie uns in der aktuellen Wallet-Klasse die Methode Good Observable Transaction Rows erstellen. Es wird zurückgegeben, dass sie einen beobachtbaren Methodenaufruf für die Transaktionszeilenliste im Feld Transaktionszeilen erhalten Methodenaufruf für die Transaktionszeilenliste . Lassen Sie uns hier auch die Methode für klare Transaktionen erstellen. Es wird die Methode „Transaktionszeilen löschen“ nennen , die wir gerade erstellt haben. Gehen wir nun zum Update Current Wallet Service. Hier nennen wir die aktuelle Wallet-Clear-Transaktionsmethode . Auf diese Weise stellen wir sicher, dass wir die Transaktionszeilen löschen , nachdem wir ein Wallet erstellt haben. Gehen wir nun zum Transactions Table Controller. Fügen wir die folgenden Felder hinzu. Es wird später in der initialisierten Methode verwendet, um die Tabelle und ihre Spalten an die beobachtbaren Transaktionszeilen zu binden die Tabelle und ihre Spalten an die beobachtbaren Transaktionszeilen zu . Lassen Sie uns nun die initialisierte Methode erstellen. Hier setzen wir zunächst Elemente der Transaktionstabelle auf die aktuellen beobachtbaren Wallet-Transaktionszeilen. Jetzt fügen wir den aktuellen beobachtbaren Wallet-Transaktionszeilen einen Listener hinzu. Wir rufen die Transactions Table Refresh-Methode im Body auf, sodass jede Änderung, die im Observable vorgenommen wird, eine Neuzeichnung der Tabelle auslöst. Bindet außerdem jedes Spaltenfeld mithilfe der Funktion „ Zellenwert setzen“ an das Transaktionszeilenfeld , genau wie wir es im Adressentabellencontroller getan haben. Als Factory-Parameter für den Eigenschaftswert müssen wir dieselben Eigenschaftsnamen verwenden, die wir in der Transaktions-Realklasse verwendet haben , um die Bindung korrekt durchzuführen. Lassen Sie uns diese Zeile dreimal duplizieren und die Spalten ändern, die wir binden. Gehen wir nun zur Testklasse für empfangende Transaktionen. Stellen Sie sicher, dass Sie den Bitcoin Core Node ausführen, und führen Sie den Test durch. Boops, der Test ist fehlgeschlagen. Mal sehen warum. Es gibt ein Problem mit der Spalte Transaction Balanced im Transaktionstabellencontroller. Um das zu beheben, gehen wir zur Transaktions-Unterstrichtabelle Punkt FXML. Das Problem ist, dass wir den Saldo, die Bestätigungen und die FX-IDs für das Datum falsch benannt haben. Allen drei fehlt das Wort Transaktion nach der Spalte. Lassen Sie uns sie also reparieren und den Test erneut ausführen. Toll, der Test ist bestanden. Im nächsten Video fügen wir weitere Tests hinzu, um sicherzustellen, dass die Transaktionstabelle wie vorgesehen funktioniert. C, ja. 40. 38 Empfangen von Transaktionsteil 3 skillshare 2: In diesem Video fügen wir weitere Tests hinzu, um zu überprüfen, ob unsere Transaktionstabelle für andere Szenarien funktioniert. Gehen wir also zur Testklasse für Empfangsblöcke. Bei jeder Methode wird Code hinzugefügt, um zu testen, ob die Transaktionstabelle die erwarteten Informationen über die empfangenden Transaktionen enthält . Lassen Sie uns die Tabellenansicht in diesem Test umbenennen , um auf seine Tabellenansicht einzugehen und ihre Bedeutung zu verdeutlichen. Jetzt rufen wir die Click-on-Methode auf als Parameter übergeben wird, die Zeichenfolge Transactions. Lassen Sie uns nun die Zeile mit der Variablen für die Adressentabelle kopieren und unten einfügen. Lassen Sie uns diesen Variablennamen in die Transaktionstabellenansicht ändern . in der Suchmethode Lassen Sie uns in der Suchmethode diesen Parameter durch die Hashtag-Transaktionstabelle ersetzen . Lassen Sie uns nun diese beiden Zeilen kopieren und unten einfügen und ändern, um diese Methoden in der Transaktionstabellenansicht aufzurufen . Machen wir dasselbe mit der anderen Testmethode. In diesem Fall erwarten wir jedoch, dass die Transaktionstabelle zwei Zeilen enthält, eine für jede Transaktion. Und für die zweite Zeile erwarten wir, dass die Anzahl der Bestätigungen Variablen für die Gesamtzahl der Bestätigungen entspricht, wodurch der Gesamtwert der Bestätigungen gleich der Zahl ist von meinen bisherigen Blöcken entspricht diese Anzahl Bestätigungen plus Bestätigungen minus eins. Da wir davon ausgehen, dass die zweite Zeile Informationen über die erste Transaktion enthält, wird sie so oft bestätigt . Lassen Sie uns eine kleine Korrektur in der Minenblocks-Methode vornehmen. Manchmal löst diese Codezeile eine NullPointerException aus, weil TableView die Eigenschaft null items besitzt. Um dies zu vermeiden, verwenden wir den Null-Safe-Operator vor jeder Eigenschaft in der Tabellenansicht. Lassen Sie uns jetzt unsere Tests durchführen. zunächst sicher, dass Sie Ihren Bitcoin-Knoten ausführen. Lass uns die Tests durchführen. Die letzten beiden Tests sind fehlgeschlagen. Das ist passiert, weil die Transaktionen in der Tabelle, wir, ungeordnet, ihre Reihenfolge scheinbar zufällig ist. Manchmal können diese Tests bestanden , weil sie zufällig richtig angeordnet werden können. Also lass uns das beheben. Wir versuchen, die Transaktionen nach Datum zu sortieren wobei die neuesten Transaktionen in den ersten Zeilen stehen. Gehen wir also zur Transaktionszeilenklasse. In der Formular-Methode. Lassen Sie uns ändern, wie wir die Daten an die Transaktionszeileninstanziierung übergeben. Anstatt ein neues Datum zu verwenden, verwenden wir die Instant Now-Methode. Wir tun das, weil die Instant-Klasse genauer und einfacher zu sortieren ist . Gehen wir nun zum Transactions Table Controller. In der Transaktionstabelle legen Sie den Methodenaufruf für Elemente fest. Lassen Sie uns eine neue sortierte Liste als Parameter übergeben. Die aktuellen beobachtbaren Wallet-Transaktionszeilen sind der erste Parameter, der die sortierte Liste instanziiert. Der zweite Parameter wird der Comparator-Vergleichsmethodenaufruf sein. Diese Methode übergibt ein Lambda als ersten Parameter oder eine Transaktionszeile wird der Parameter im Lambda-Body sein. Rufen wir die Instant-Parse-Methode auf und übergeben die Transaktion rotate als Parameter. Die Parse-Methode generiert ein Instanzobjekt aus der Datumszeichenfolge. Der zweite Parameter der Vergleichsmethode wird der Comparator-Methodenaufruf in umgekehrter Reihenfolge sein. Auf diese Weise erwarten wir, dass die Transaktionstabelle nach dem Transaktionsdatum sortiert wird , wobei die letzten Transaktionen zuerst angezeigt werden. Lassen Sie uns jetzt unsere Tests erneut durchführen. Diesmal nur die, die gescheitert sind. Das tun wir, indem wir auf diese Schaltfläche klicken. Toll, die Tests sind bestanden. Lassen Sie uns nun Transaktionstabellentests zur empfangenen Bitcoin-Testklasse hinzufügen . Wir werden dasselbe tun wie in der Testklasse für Empfangsblöcke. Für jede Methode ändern wir den Namen der Tabellenansicht, lassen den Test auf den Transaktions-Tab klicken und Aussagen über den erwarteten Inhalt in der Transaktionstabelle treffen den erwarteten Inhalt in . Lass es uns machen. Okay, lassen Sie uns diese Tests durchführen. Toll, die Tests sind bestanden. Jetzt werden wir unser Wallet zum ersten Mal in der Testnetzumgebung ausführen . Die Testnetzumgebung ähnelt der des Hauptnetzes, aber ihre Münzen sind wertlos. Es ist viel einfacher, sich Gedanken zu machen und ihre Blockzeit ist kürzer. Dazu müssen wir unseren Bitcoin-Knoten in dieser Umgebung ausführen und versenken . Wie das geht, haben wir in der Anleitung zur Kurseinrichtung beschrieben. Lassen Sie uns also unsere Bitcoin.com modifizieren , um unseren Knoten in der Testnetzumgebung auszuführen. Ändern Sie einfach diesen Schlüssel von reg test zu test net. Lassen Sie uns aufhören, unseren Knoten im Reg-Test auszuführen. Und lassen Sie uns unsere Notiz erneut ausführen, um zu beginnen, unsere Notiz im Testnetz zu versenken. Meine Notiz ist fast untergegangen, also wird es ein paar Minuten dauern, bis ich fertig bin. Je nachdem, wann Sie es das letzte Mal ausgeführt haben, kann es jedoch länger dauern, bis wir die Synchronisierung abgeschlossen haben, da das Herunterladen der neuesten Blöcke einige Zeit in Anspruch nimmt. Wie auch immer, während es sinkt, lassen Sie uns unsere Projekte so modifizieren, dass wir unsere Anwendung erfolgreich im Testnetz ausführen können . im Ressourcenpfad Erstellen wir im Ressourcenpfad die Datei Application Test Net Dot Properties. Diese Datei enthält die Eigenschaften, die in unserem Projekt verwendet werden , wenn wir die Anwendung in der Testnetzumgebung ausführen . Lassen Sie uns den Inhalt aus der Datei mit den Punkteigenschaften der Anwendung kopieren und hier einfügen. Ändern Sie nun die Bitcoin-Umgebung, um Net zu testen. Und der No-Dot-RPC-Punkt-URI-Port 218332. Dies ist der Standardport unseres Knotens wenn er in der Testnetzumgebung ausgeführt wird. Lassen Sie uns nun eine kleine Verbesserung vornehmen. In unserer Brieftasche wäre es schön, die Transaktions-ID, die in der Transaktionstabelle angezeigt wird, kopieren zu können , indem Sie einfach mit der rechten Maustaste darauf klicken und auf Kopieren klicken. Lassen Sie uns diese Funktion implementieren. Gehen wir dazu zur Unterstrichtabelle für Transaktionen mit dem Punkt FXML. Jetzt fügen wir hier den folgenden Code hinzu. Lassen Sie uns zunächst diese Kontextmenü-Tags hinzufügen. Lassen Sie uns das Artikel-Tag hinzufügen. Dann markieren Sie die Menüelemente. Fügen Sie in dieser Tag-Texteigenschaft die Zeichenfolge copy und Hashtag-Transaktions-ID von Coffee hinzu, da sie sich in der Aktionseigenschaft befinden. Dadurch wird die Anwendung angewiesen, die Methode zum Kopieren der Transaktions-ID im Transaktionstabellencontroller aufzurufen Methode zum Kopieren der Transaktions-ID . Nachdem wir im Kontextmenü auf den Punkt Menü kopieren geklickt haben. Das Kontextmenü ist ein Menü, das erscheint, nachdem wir mit der rechten Maustaste auf etwas auf dem Bildschirm klicken. Gehen wir nun zum Transactions Table Controller. Lassen Sie uns hier die Methode zum Kopieren der Transaktions-ID erstellen. Zuerst erhalten wir die Transaktionszeile , auf die mit diesem Code mit der rechten Maustaste geklickt wurde. Jetzt rufen wir einfach die Kopiermethode auf. Wir erstellen, indem die Transaktionszeilen-ID als Parameter übergeben. Um diese Methode zu erstellen, wird zuerst ein Utils-Paket innerhalb des BYOD W-Pakets erstellt. Darin erstellen wir eine Klasse namens Copy. Lassen Sie uns nun die Kopiermethode hier erstellen. Als statische Methode. Instanziiert ein Inhaltsobjekt für die Zwischenablage speichert es in der Inhaltsvariablen. Dann rufen wir die Methode put string auf und übergeben den variablen Text als Parameter. Fügen wir diese Variable als Parameter für die Kopiermethode hinzu. Schließlich rufen wir die Methode get system clipboard und setzen ihren Inhalt auf den variablen Inhalt im Transaktionstabellencontroller. Lassen Sie uns diese Methode importieren. Eine Sache noch. Wenn der Bitcoin-Knoten in der Testnetzumgebung ausgeführt wird, empfängt unser Knoten möglicherweise verschiedene Arten von Transaktionen, die die Bitcoin-Java-Bibliothek noch nicht analysieren kann , und sie geben Fehler aus, wenn sie versuchen, dies zu tun . diese Transaktionen nicht analysieren, wirkt sich das zwar auf unsere Wallets aus, der Fehler wird gut gemeldet. Um dies zu vermeiden, wickeln Sie in der Node-Task-Klasse die Transaktionsmethode aus dem Bytestream in einen Try-Catch-Block ein. im Catch-Block Lassen Sie uns im Catch-Block einen Logger verwenden, um uns vor dem Fehler zu warnen. In der einen Methode übergibt der Aufruf eine Phrase , die den Fehler angibt, und am Ende ein Paar geschweifte Klammern. Diese geschweiften Klammern werden durch das zweite Argument interpoliert, das die hexadezimierte Inhaltsvariable ist. Der dritte Parameter wird das Ausnahmeobjekt sein. So können wir auf den gesamten Stack-Trace des Fehlers in den Protokollen zugreifen . Nach der Protokollierung wird der Fehler mithilfe des Schlüsselworts continue direkt zur nächsten Iteration der While-Schleife weitergeleitet. Lassen Sie uns das Logger-Feld erstellen. Es wird eine statische Eigenschaft sein. Lassen Sie uns es hier mit der Logger-Factory instanziieren. Lassen Sie uns den Import der Logger-Klasse korrigieren. Eigentlich müssen wir es aus dem 4D dot SELF for J-Paket importieren . Lassen Sie uns nun unsere Anwendung in der Testnetzumgebung ausführen . Lassen Sie uns zunächst überprüfen, ob unser Knoten der Testnetzumgebung verknüpft ist. Okay, es ist schon gesunken, weil sein Fortschritt gleich 1,00 ist. Gehen wir nun zur BYOD W-Anwendungsklasse. Klicken Sie mit der rechten Maustaste auf dieses Symbol und klicken Sie auf Run Configurations ändern. Klicken Sie nun auf Optionen ändern und stellen Sie sicher, dass die Ad-VM-Optionen ausgewählt sind. Setzen Sie es jetzt auf minus d Spring Point Profile dot active equal test net. Klicken Sie auf Okay und dann auf die Schaltfläche Ausführen. Lassen Sie uns nun eine Brieftasche erstellen. Beachten Sie, dass die Empfangsadresse mit TB beginnt, was darauf hinweist, dass es sich um eine Testnetzadresse handelt. Lassen Sie uns nun diese Adresse kopieren. Wird einen Test-Netfaucet verwenden , um Test-Netto-Bitcoins zu erhalten. Ein Bitcoin-Faucet ist eine Website oder API, die Bitcoins kostenlos anbietet. Sie waren in den ersten Jahren von Bitcoin sehr beliebt, als ein Bitcoin sehr billig war. Heutzutage gibt es schnelle Möglichkeiten, Test-Nettomünzen zu erhalten. Gehen wir auf die Website auf dem Bildschirm. Es ist ein Testnetzhahn. Lassen Sie uns die kopierte Adresse in dieses Feld einfügen. Wählen Sie einen Betrag und klicken Sie auf diese Schaltfläche , um uns Bitcoin zu senden. Lass uns ein bisschen warten. Okay, die Warnung besagt, dass sie ein paar Satoshi's in unsere Brieftasche schickt. Lass uns überprüfen, ob wir es erhalten haben. Großartig. Unser Wallet hat unsere Transaktion identifiziert und unsere Transaktion und Adresse haben bereits eine Bestätigung. Es gibt jedoch eine seltsame Sache. Die Waage ist in wissenschaftlicher Notation formatiert. Das beheben wir später. Lassen Sie uns zunächst unsere Transaktions-ID kopieren indem Sie mit der rechten Maustaste darauf klicken und dann auf Kopieren klicken. Wir überprüfen die Transaktion in einem Blockchain-Explorer eines Drittanbieters. Ein Blockchain-Explorer ist eine Website, die Informationen über Bitcoin-Adressen, -Blöcke und Transaktionen auf nette und organisierte Weise anzeigt . Wenn es um Ihre Privatsphäre geht, nach Ihren roten Kleidern und Transaktionen zu suchen ist es nicht ratsam, im Blockchain Explorer eines Drittanbieters , da dieser Sie mit Ihren Wallet-Daten verknüpfen kann. Aber da wir es nur zu Testzwecken verwenden , ist das okay. Gehen wir vor diesem Hintergrund zur Website auf dem Bildschirm, bei der es sich um einen Bitcoin-Testnet-Blockchain-Explorer handelt, fügen die kopierte Transaktions-ID das Suchfeld ein und klicken Sie auf die Schaltfläche Suchen. Hier erhalten wir einige Informationen über unsere Transaktion. Beachten Sie, dass es bereits zwei Bestätigungen gibt, aber unsere Brieftasche gibt an, dass es nur eine Konformation hat. Es stellt sich heraus, dass unser Bitcoin-Knoten in der Testnetzumgebung nur Transaktionsbenachrichtigungen über Null MQ sendet , wenn die Transaktionen gesendet werden und wenn sie eine Bestätigung erhalten. Danach benachrichtigt der Knoten unsere Anwendung nicht darüber, egal wie viele Bestätigungen noch erhalten werden. Wir müssen unsere Anwendung veranlassen, auf Blockbenachrichtigungen zu warten , damit wir dieses Problem beheben können. Wir werden im nächsten Video damit beginnen. Wir sehen uns. 41. 39 Empfangen von Blockteil 2 skillshare 2: In diesem Video werden wir unsere Anwendung veranlassen, Blocknachrichten vom Bitcoin-Knoten abzuhören. Auf diese Weise können wir unsere Transaktionsbestätigungen in der Testnetzumgebung korrekt aktualisieren . Außerdem wird die Formatierung der Adress- und Transaktionssalden geändert , da sie jetzt in den Tabellen nicht mehr gut angezeigt werden . Gehen wir also zur bitcoin.com-Datei. Lassen Sie uns diesen Schlüssel in Reg-Test ändern. Um mit der Suche nach Blocknachrichten zu beginnen, fügen wir hier die Hashblockeigenschaft Z MQ pub hinzu. Sein Wert wird dieselbe URL wie in der obigen Eigenschaft sein. Also lass es uns hier einfügen. Diese Konfiguration veranlasst die Knoten, den Hash-Block an unsere Anwendung zu senden , nachdem sie einen neuen Block erkannt hat, wodurch die Blockchain erweitert wird. Danach wird der Code erstellt eine Anfrage zur Liste der nicht ausgegebenen Daten an den Knoten gesendet , die alle aktuellen Wallet-Adressen enthält. Als Antwort erhalten Sie eine Liste aktualisierter UTXOs , die analysiert und zur Aktualisierung unserer roten Kleider und Transaktionstabellen verwendet werden. Speichern wir die bitcoin.com-Datei. Gehen wir nun zur Node-Task-Klasse. Lass uns diese Zeile duplizieren. Lassen Sie uns die Zeichenfolge in einen Hash-Block ändern. Auf diese Weise beginnen wir, Hash-Blocknachrichten vom Knoten zu empfangen . nun in dieser if-Anweisung wir nun in dieser if-Anweisung den folgenden Code hinzu. Wenn das Thema gleich Null ist oder die Liste mit diesen Themen das empfangene Thema nicht enthält. Dann fahren wir mit der nächsten Iteration der While-Schleife fort. Lassen Sie uns nun hier eine Switch-Anweisung hinzufügen. Falls die Topic-Variable gleich ra t x ist. Dann führen wir den Code aus, um die empfangene Transaktion zu analysieren und zu verarbeiten. Lassen Sie uns die Zeile , in der das Ereignis „Transaktion empfangen“ veröffentlicht wird, an diesen Ort verschieben . Auf diese Weise können wir diese redundante Continue-Anweisung entfernen diese redundante Continue-Anweisung falls die Topic-Variable dem Hash-Block entspricht. Anschließend verwenden wir den Herausgeber des Anwendungsereignisses , um ein neues blockiertes empfangenes Ereignis zu veröffentlichen. Lassen Sie uns dieses Ereignis im BYU w Dot No Doubt Event-Paket erstellen . Lassen Sie uns nun einen Listener für dieses Ereignis im BYOD w dot, dot listeners Paket erstellen . Lassen Sie uns eine Komponentenannotation hinzufügen. Lassen Sie uns dafür sorgen, dass es die Anwendungs-Listener-Schnittstelle implementiert , dass es die Anwendungs-Listener-Schnittstelle das blockempfangene Ereignis als Typparameter übergeben. Lassen Sie uns seine Methode implementieren. Zuerst. Mit dieser Methode rufen wir alle aktuellen Wallet-Adressen ab und speichern sie in der Adressvariablen. Lassen Sie uns die aktuelle Brieftasche in diese Klasse injizieren. Dann wird mit einer if-Anweisung überprüft, ob die Adressvariable leer ist. Ist dies nicht der Fall, verwenden wir den Dienst Update utxOS, um unsere Adressen und Transaktionen zu aktualisieren. Lass es uns in diese Klasse injizieren. Wir rufen die Update-Methode darauf auf übergeben die Adresse ist variabel und den aktuellen Wallet-Namen als Parameter. Gehen wir nun zur empfangenen Transaktion. Der Listener wird unseren Code optimieren. Denken Sie daran, dass der Knoten nach Erhalt einer Bestätigung in der Testnetzumgebung und aller Bestätigungen in der Reg-Testumgebung aller Bestätigungen in der Reg-Testumgebung eine Transaktionsnachricht über Null MQ an unsere Anwendung sendet . Da unser Block Received Listener ab sofort alle aktuellen Wallet-Adressen aktualisiert , wenn er Bestätigungen erhält, ist es nicht sinnvoll, die Adressen- und Transaktionstabelle in zu aktualisieren die Adressen- und Transaktionstabelle in Die Transaktion erhielt die Listener-Klasse, nachdem wir weitere wiederholte Transaktionsnachrichten erhalten haben . Daher werden wir diese Klasse so ändern, dass nur Transaktionen verarbeitet werden, wenn das aktuelle Wallet sie nicht enthält. Fügen wir also diese If-Aussage hinzu. Wenn die aktuellen Wallet-Transaktions-IDs die empfangene Transaktions-ID enthalten, kehren wir einfach zurück. Lassen Sie uns diese Methode erstellen. Es gibt eine Liste von Zeichenfolgen zurück und es werden die Transaktionszeilen zurückgegeben, Methode „Transaktions-IDs abrufen“. Lassen Sie uns diese Methode erstellen. Hier. Wir geben den folgenden Code aus einem Stream der Transaktionsrollenliste zurück . Wir rufen die Map-Methode auf und übergeben einen Verweis auf die getID-Methode der Transaktionszeile. Dann konvertieren wir das Ergebnis in eine Liste und geben es an den empfangenen Transaktions-Listener zurück. Wir müssen diesen Code in einen try-catch-Block packen, da die Transaktions-ID-Methode eine überprüfte Ausnahme im Catch-Block auslöst und einen Logger verwendet, um eine Warnmeldung zu drucken. Lassen Sie uns den Logger in diese Klasse einfügen, genau wie wir es in der Node-Task-Klasse getan haben. Fügen wir dem Catch-Block auch eine Return-Anweisung hinzu. Lassen Sie uns nun das Problem mit der ausgewogenen Formatierung der Adresszeile beheben . Anstatt die Double-Class-Zwei-String-Methode zu verwenden, verwenden wir das Bitcoin-Format oder die Formatmethode und übergeben den Adresssaldo als Parameter. Lassen Sie uns diese Klasse im Paket utils erstellen. Lassen Sie uns nun die Formatmethode erstellen. Hier instanziieren wir ein neues Symbolobjekt im Dezimalformat und übergeben die Locale-Route an seinen Konstruktor. Dann setzen wir den Punkt als Dezimaltrennzeichen und das Komma als Gruppentrennzeichen. Dann instanziieren wir ein neues Objekt im Dezimalformat da sein Konstruktorparameter dieses Muster übergibt. Und die Symbole sind variabel. Dann setzen wir das verwendete Format oder die verwendete Gruppierung auf falsch. Dann setzen wir die Mindestbruchziffern auf acht. Und es sind die maximalen Bruchstellen 282. Schließlich rufen wir die Formatmethode auf dem Formatierer auf, übergeben die empfangene Nummer als Parameter und geben sie zurück. Wenn Sie diese Methode verwenden, werden beliebig viele Durchgänge mit einer Dezimalstelle und ohne Gruppierungstrennzeichen formatiert . Diese Art der Formatierung ist nützlich, da ein Bitcoin maximal acht Bruchstellen haben kann. Diese Formatierung erleichtert auch die Visualisierung, wie viele Satoshi ein ausgewogenes Verhältnis enthält. Gehen wir nun zur Transaktionszeilenklasse. Lassen Sie uns hier den Bitcoin-Formatierer verwenden, um die UTXO-Bilanz in der Frame-Methode zu formatieren. Lassen Sie uns nun unsere Tests anpassen, um diese New Balance-Formatierung abzudecken. Gehen wir zur GUI-Testklasse in der Methode „Bitcoin in Gewicht senden“, ändern wir den zweiten Parametertyp auf double und passen den Standardwert entsprechend an. Fügen wir auch diesen optionalen Mengenparameter mit einem Standardwert von 1,0 hinzu. Lassen Sie uns nun diesen Parameter durch die Mengenvariable ersetzen . Und hier fassen wir die Variable für den erwarteten Gesamtbetrag in das Bitcoin-Format oder die Formatmethode ein. Gehen wir nun zum Bitcoin-Test über. Lassen Sie uns das ändern und die Methode Bitcoin and wait aufrufen, um 0,00 001 Bitcoin zu senden. So können wir die neue Formatierung testen, wenn unser Wallet Bitcoin-Bruchteile erhält. Lassen Sie uns nun jede Verwendung dieser Methode überprüfen und ihre Parametrisierung des Parameters für den erwarteten Gesamtbetrag ändern ihre Parametrisierung des Parameters für den erwarteten Gesamtbetrag sodass ein Double anstelle einer Zeichenfolge übergeben wird. Lassen Sie uns nun diese Nullprüfungen zu den Eigenschaften der Tabellenansicht in dieser Methode hinzufügen den Eigenschaften der Tabellenansicht in , um Nullzeiger-Ausnahmen zu vermeiden. Lassen Sie uns nun unseren Knoten ausführen und lassen Sie uns alle Projekttests ausführen. Toll, die Tests sind bestanden. Lassen Sie uns nun unsere Anwendung in der Testnetzumgebung ausführen . Um das zu tun, passen wir unsere bitcoin.com-Datei an. Lassen Sie uns nun unseren Knoten neu starten. Nach einigen Minuten ist meine Notiz vollständig gesunken. Lassen Sie uns nun unsere Anwendung in der Testnetzumgebung mit unserer zuvor modifizierten Ausführungskonfiguration ausführen. Lass uns eine neue Brieftasche erstellen. Lassen Sie uns nun unsere Adresse kopieren und einen Testnetzhahn verwenden , um Satoshis zu empfangen, genau wie wir es in einem vorherigen Video getan haben. Okay, unsere Wallets haben die Transaktion erfolgreich identifiziert und sie ist so ausgewogen, wie wir es erwartet hatten. Lass uns jetzt ein Sandwich essen und unsere Brieftasche für eine Weile laufen lassen. Nach einigen Minuten sind wir adressiert und Transaktion hat bereits vier Bestätigungen erhalten. Großartig. 42. 40 Gesamt Balance Teil 1 Skillshare 2: In diesem Video beginnen wir mit der Entwicklung der Totalbalance-Funktion. Im Grunde befindet sich ein Text über dem Tab Transaktionen und Adressen, der angibt, dass das Guthaben der aktuell geladenen Wallet den bestätigten Saldo, den unbestätigten Saldo und den Gesamtsaldo anzeigt das Guthaben der aktuell geladenen Wallet den bestätigten Saldo, . Der bestätigte Saldo zeigt die Summe aller bestätigten UTXos. Der unbestätigte Saldo ist die Summe aller unbestätigten UTXos. Der Gesamtsaldo ist die Summe aus unbestätigten und bestätigten Salden. Gehen wir also zum Playground dot FXML , um etwas zu skizzieren. Nach dem ersten Schließen des Tab-Fensters. Lassen Sie uns dieses Label-Tag hinzufügen. Lassen Sie uns nun dieses VBox Dot Randtag hinzufügen. Darin. Füge dieses Insets-Tag hinzu. Wir werden hier einige Randeigenschaften hinzufügen. Lassen Sie uns den unteren Rand auf 10,0, den linken Rand auf 10,0 und den oberen Rand auf Null setzen den linken Rand auf 10,0 . nun zu Testzwecken Lassen Sie uns nun zu Testzwecken die Texteigenschaft dieses Labels testweise auf Folgendes setzen. Mal sehen, wie es im Scene Builder aussieht. Okay, wir sehen, dass die ausgewogenen Texte hier zu finden sein werden. Lassen Sie uns diese Texteigenschaft entfernen. Lassen Sie uns eine neue FXML-Datei Namen Total Underscore Balance erstellen. Lassen Sie uns diese Kesselplatte entfernen. Lassen Sie uns nun den gesamten Inhalt und das Label-Tag kopieren , das wir gerade auf dem Spielplatz erstellt haben. Und füge es hier ein. Lassen Sie uns diese Importzeilen auch zwei kopieren und sie in den gesamten Unterstrich mit ausgeglichenen Punkten im FXML einfügen. Lassen Sie uns nun die Label-Tags durch das FX-Colon-Root-Tag ersetzen . Es wird eine FX-ID für den Gesamtsaldo und eine Art Java-FX-Punkt-Kontrollpunkt-Label haben. Lassen Sie uns auch diese XML- und S-Eigenschaft einbeziehen. nun im Hauptfenster Lassen Sie uns nun im Hauptfenster nach dem ersten schließenden Tab-Bereich das Tag des Totalbilanz-Controllers hinzufügen . Lassen Sie uns nun diesen Controller im Controller-Paket erstellen . Und lassen Sie uns es hier zurück in den Controller importieren. Lassen Sie uns die Labelklasse erweitern und die Komponentenannotation hinzufügen. Lassen Sie uns nun diesen Konstruktor kopieren und hier einfügen, um ihn entsprechend zu ändern. Der FXML-Ressourcenwert ist die Position des gesamten Unterstrichpunktes FXML. Lassen Sie uns auch die aktuelle Brieftasche in diese Klasse injizieren. Jetzt fügen wir im GUI gestarteten Listener die Total Balance Controller-Klasse zum benutzerdefinierten Komponentensatz hinzu. Im Totalbilanzregler. Fügen wir die initialisierte Methode hinzu. Wir verwenden die geerbte setText-Methode , um den Labeltext dynamisch festzulegen. Lassen Sie uns es vorerst zu Testzwecken testen. Lassen Sie uns nun den Gesamtbilanztest im GUI-Paket erstellen . Es wird die GUI-Testklasse erweitern. Lassen Sie uns diese beiden Methoden kopieren und in den neuen Test einfügen. Benennen wir diese Methode um, zwei sollten den Gesamtsaldo berechnen. Lassen Sie uns nun einige Anpassungen am Körper vornehmen. Der Name der erstellten Wallet wird mein Testvalide sein. Lassen Sie uns diese Zeile entfernen, da wir sie nicht benötigen. Lassen Sie uns auch diese Zeilen entfernen. Mit diesem Code wird der Text in der Gesamtbilanzbeschriftung abgerufen und in der Textvariablen für die Bezeichnung gespeichert. Dann überprüft Block, ob die Label-Textvariable der folgenden Phrase entspricht. Nach Erhalt der Transaktion erwarten wir, dass aus dem Inhalt des Labels hervorgeht, dass unser gesamter und unbestätigter Saldo ein Bitcoin beträgt. Wir gehen davon aus, dass der bestätigte Saldo Null sein wird, da unsere Transaktion während des Tests nicht in einem Block and Mind enthalten sein wird. Bevor wir unseren Node ausführen, stellen wir sicher, dass unsere Bitcoin Dot Conf-Umgebung auf Reg-Test eingestellt ist. Lassen Sie uns nun unseren Knoten ausführen. Und lassen Sie uns diesen Test durchführen. Es ist wie erwartet gescheitert, weil das Gesamtbilanzlabel den Stringtest enthält und nicht das, was wir wollten. Im nächsten Video werden wir diese Funktion implementieren und diesen Test bestehen lassen. Wir sehen uns. 43. 41 Gesamt Balance Teil 2 skillshare 2: In diesem Video werden wir die Implementierung der Funktion für den Gesamtausgleich abschließen . Gehen wir also zum Update des utxOS-Dienstes. Bei der Aktualisierungsmethode wird ein neuer Methodenaufruf hinzugefügt , um das Wallet-Guthaben zu aktualisieren. Dazu rufen wir die Aktualisierungsmethode auf dem Update auf, das der Dienst für den aktuellen Wallet-Kontostand erstellt. Lassen Sie uns diesen Service in diese Klasse einbauen. Lassen Sie uns diese Klasse im GUI Dot Services-Paket erstellen. Und lassen Sie uns die Injektion hier beenden. Lassen Sie uns nun die Aktualisierungsmethode erstellen. Hier berechnen wir zunächst den unbestätigten Saldo und speichern ihn in der Variablen „Unbestätigter Saldo“. Dafür müssen wir die aktuelle Brieftasche in diese Klasse injizieren . Dann erhalten wir die beobachtbaren Transaktionszeilen und konvertieren sie in einen Stream. Dann verwenden wir die Filtermethode für das Ergebnis, um die Transaktionszeilen mit anderen Bestätigungen als Null auszuschließen die Transaktionszeilen mit . Dann verwenden wir die Map-Methode, um den erhaltenen Stream in einen Stream von Transaktionszeilensalden umzuwandeln den erhaltenen Stream in einen Stream . Wir verwenden die Parse-Double-Methode, um jede ausgeglichene Zeichenfolge in eine Double-Zeichenfolge umzuwandeln. Jetzt verwenden wir die reduzierte Methode übergeben ihr die Methode der doppelten Summe, an einige von ihnen jedes erhaltene Guthaben im Stream. Schließlich verwenden wir die Methode or else und übergeben 0.0 an sie. Falls der erhaltene Stream leer ist, wird daher die unbestätigte ausgeglichene Variable auf Null gesetzt. Lassen Sie uns nun diesen Codeblock duplizieren. Ändern wir es, um den bestätigten Saldo zu berechnen , und speichern ihn in der bestätigten ausgeglichenen Variablen. Wir müssen nur das Gleichheitszeichen und die Filtermethode auf dieses Groß-als-Zeichen ändern . Mit dieser einfachen Änderung erhalten wir die Summe der Salden aller Transaktionen mit mindestens einer Bestätigung. Schließlich rufen wir die Methode „ Salden festlegen “ für die aktuelle Brieftasche auf übergeben dabei den unbestätigten Saldo und den bestätigten Saldo als Parameter. Da dieser Code die Benutzeroberfläche modifizieren wird, lassen Sie uns ihn in einen Methodenaufruf einbinden, der später ausgeführt wird. Und lassen Sie uns die Methode Set Balances in der aktuellen Wallet-Klasse erstellen . Fügen wir dazu das Feld Salden zu dieser Klasse hinzu. Der Typ wird die Saldenklasse sein, die wir erstellen werden. Lassen Sie uns es im Observables-Paket erstellen. Und lassen Sie uns es hier instanziieren. Hier nennen wir diese Methode zum Festlegen von Salden im Feld Salden, wobei die unbestätigten und unbestätigten Salden als Parameter übergeben werden. Lassen Sie uns diese Methode erstellen. Zuerst. Lassen Sie uns dieser Klasse einige private Felder hinzufügen. Wir fügen das unbestätigte ausgeglichene Feld vom Typ Zeichenketteneigenschaft hinzu. Lassen Sie uns es hier mit einer neuen einfachen Zeichenketteneigenschaft instanziieren . Lassen Sie uns diese Zeile zweimal duplizieren. Lassen Sie uns diese Feldnamen ändern, um den Saldo und den Gesamtsaldo zu bestätigen . Jetzt ruft die Methode set balances die Methode set für die injizierten Eigenschaften auf , um ihre Werte festzulegen. Verwendet das Bitcoin-Format oder die Formatierungsmethode , um die Salden in das gewünschte Format zu formatieren. Auf den Gesamtbetrag wird die Summe der unbestätigten und bestätigten Salden überwiesen . Lassen Sie uns nun Getter für diese Felder erstellen. Lassen Sie uns auch die klare Methode erstellen. Diese Methode setzt jeden Immobiliensaldo auf Null. Wir rufen diese Methode auf, nachdem wir ein Wallet erstellt haben , um die Werte der zuvor geladenen Brieftasche zu löschen. nun in der aktuellen Brieftasche Lassen Sie uns nun in der aktuellen Brieftasche die Methode für gute Salden erstellen. Es wird das Feld Salden zurückgegeben. Und lassen Sie uns die Clear-Balance-Methode erstellen. Es wird die Methode „ Salden löschen“ nennen. Im Update Current Wallet Service, aufgerufen wird , nachdem ein Wallet erstellt wurde, rufen wir hier die aktuelle Wallet-Methode zum Löschen von Salden auf. Gehen wir nun zum Total Balance Controller. Lassen Sie uns diese Zeile entfernen. Wir erhalten den unbestätigten Saldo aus dem aktuellen Wallet-Guthaben. Wir rufen die Ad-Listener-Methode darauf auf. Wir übergeben ein Lambda als Parameter, wobei wir im Hauptteil die Update-Textmethode aufrufen. Lassen Sie uns diese Methode erstellen. Ruft die darin enthaltene setText-Methode auf und wir übergeben einen Methodenaufruf im Zeichenkettenformat als Parameter. Der erste Parameter der Formatmethode wird diese Phrase sein. Jedes Prozentzeichen gefolgt vom Buchstaben S wird durch die folgenden Parameter dieses Methodenaufrufs interpoliert . Die nächsten Parameter sind der aktuelle Gesamtsaldo der Brieftasche. Die aktuelle Brieftasche bestätigte den Saldo. Und schließlich das aktuelle Guthaben der Brieftasche unbestätigt. nun in der initialisierten Methode Lassen Sie uns nun in der initialisierten Methode diese Zeile zweimal duplizieren. Wir fügen den Eigenschaften Confirmed Balanced und Total Balance denselben Listener Balanced hinzu. Lassen Sie uns diese Zeilen entsprechend modifizieren. Lassen Sie uns diese Zeichenfolge umgestalten, indem wir sie in eine Konstante in dieser Klasse aufnehmen. Nennen wir es ausgewogenen Text und machen es privat. Lassen Sie uns nun eine kleine Änderung am UTXOS-Update-Dienst vornehmen . Beachten Sie, dass wir bereits eine asynchrone Anmerkung zur Aktualisierungsmethode haben. Das Hinzufügen derselben Anmerkung in die Methode wird also aufgerufen und es ist überflüssig. Lassen Sie uns sie daher entfernen. Zuerst im Dienst „Aktuelle Wallet-Adressen aktualisieren“. Dann im aktualisierten Wallet-Transaktionsdienst. Eine weitere Sache, die mir aufgefallen ist, ist, dass wir den Methodenaufruf für Anzeigentransaktionszeilen und einen Methodenaufruf zum späteren Erlernen der Plattform einschließen müssen Methodenaufruf für Anzeigentransaktionszeilen und einen Methodenaufruf zum späteren Erlernen der Plattform , da er Elemente in der Benutzeroberfläche ändert. Gehen wir nun zum Gesamtbilanztest. wir sicher, dass unser Bitcoin-Knoten läuft. Und lassen Sie uns unsere Testgruppen leiten unsere Testgruppen . Der Test ist fehlgeschlagen. Mal sehen warum. Es stellt sich heraus, dass ich vergessen habe, die Servicesanmerkung zum Update Current Wallet Balance Service hinzuzufügen . Lass uns das reparieren. Und lassen Sie uns unseren Test noch einmal durchführen. Toll, der Test ist bestanden. Im nächsten Video fügen wir unseren anderen Tests ausgewogenere Tests hinzu, um sicherzustellen, dass sie wie gewünscht funktionieren. 44. 42 Gesamt Balance Teil 3 skillshare 2: In diesem Video werden wir weitere Tests durchführen, um sicherzustellen, dass die Balance-Funktion ordnungsgemäß funktioniert. Lassen Sie uns diese Zeile und den Gesamtbilanztest kopieren Zuerst fügen wir einige Testbestätigungen zum Saldo und zum Empfangsblocktest hinzu. Also lass uns die Zeile hier einfügen. Lassen Sie uns auch diese Zeile kopieren und in den damaligen Block dieses Tests einfügen. In diesem Test erwarten wir, dass der Gesamtsaldo einem Bitcoin entspricht. Lassen Sie uns diesen Satz entsprechend anpassen. Wir erwarten auch, dass der gesamte Saldo bestätigt wird. Machen wir dasselbe für diesen anderen Test. In diesem Fall erwarten wir, dass der Gesamtsaldo zwei Bitcoins entspricht, was ebenfalls bestätigt wurde. Lassen Sie uns nun überprüfen, ob unser Knoten läuft und führen Sie den Test aus. Die Tests wurden bestanden. Lassen Sie uns nun einige Balance-Assertions zur empfangenden Bitcoin-Testklasse hinzufügen . Bei diesen Tests werden nur unbestätigte Salden erwartet. Lassen Sie uns diese Tests durchführen. Toll, die Tests sind bestanden. 45. 43 Senden von bitcoin 1 skillshare 2: Okay, bisher können wir mit unserer Brieftasche Bitcoins mit generierten Adressen empfangen. Wir können auch den Saldo überprüfen, der an jeder Adresse eingegangen ist, und Informationen über unsere Transaktionen überprüfen . Jetzt beginnen wir damit, die Möglichkeit zu implementieren, diese Bitcoins auszugeben , indem wir Transaktionen an andere Adressen senden , die wir möchten. Beginnen wir also mit der Erstellung eines Tests namens Send Bitcoin Test im GUI-Testpaket. Es wird die GUI-Testklasse erweitern. Wir werden dieselbe Einrichtungsmethode hinzufügen. Wir haben zwei weitere Tests hinzugefügt, die Load Wallet aufgerufen und die Balanced-Methode hinzugefügt. Lassen Sie uns einen Test namens should send Bitcoin erstellen. Jetzt im Windblock, wird ein neues Wallet erstellt und ein Bitcoin an seine erste Adresse geschickt . Der folgende Code wird dem Code der anderen Tests sehr ähnlich sein. Nachdem wir einen Bitcoin an unsere Wallet-Adresse gesendet haben, klicken wir auf den Tab Senden. Dann klicken wir auf das Betragsfeld, um zu definieren, wie viel wir senden möchten. Lassen Sie uns 0,5 Bitcoin senden, was zu diesem Zeitpunkt die Hälfte unseres Guthabens entspricht. Jetzt klicken wir auf das Feld „ Adresse zum Senden“. In diesem Test werden Bitcoins an eine andere Adresse gesendet. Verwenden wir also den Node get new address client, um eine neue Node-Adresse zu erhalten. Dann schreiben wir die erhaltene Adresse die angeklickte Eingabe. Jetzt klicken wir auf die Schaltfläche Senden. Danach erwarten wir, dass ein Modal mit Informationen zur Transaktion und einer Okay -Schaltfläche zur Bestätigung und zum Senden der Transaktion öffnet zur Transaktion und einer Okay -Schaltfläche . Also nennen wir die Click-On-Methode passing okay als Parameter. Jetzt klicken wir auf den Tab Transaktionen. Und mit dem folgenden Code überprüfen wir, ob die Transaktionstabelle zwei Zeilen hat, eine für die empfangende Transaktion und eine für die Transaktion, die wir gerade gesendet haben. Gehen wir nun zum Playground dot FXML um unseren Tab Senden zu gestalten. Lassen Sie uns den Code für den Tab Empfangen duplizieren. Und lassen Sie uns den zu sendenden Text ändern. Lassen Sie uns diese Zeilen löschen, damit wir mit einem neuen Tab beginnen, an dem wir arbeiten müssen. Gehen wir nun zum Scene Builder. Klicken wir auf den Tab Senden. Klicken wir auf den Hauptteil der Registerkarte, um die darin enthaltene Rasterfeld-Komponente auszuwählen. Lassen Sie uns seine Pref-Höhe auf 130 und seine bevorzugte Breite auf 600 setzen . Lassen Sie uns nun dem Rasterbereich auf der Registerkarte Senden ein Label-Steuerelement hinzufügen . Stellen wir zehn an den oberen, rechten und linken Rand ein. Lassen Sie uns seinen Namen ändern , um dieses Ziel zu erreichen. Lassen Sie uns nun diesem Rasterbereich ein Textfeld hinzufügen. Lassen Sie uns den Spaltenindex des Rasterfensters in eins ändern. Es erlaubt uns nicht, das zu tun. Zuerst müssen wir dem Rasterbereich eine Spalte hinzufügen. wir mit der rechten Maustaste hier und fügen dem Rasterbereich zwei Zeilen und eine Spalte hinzu. Jetzt können wir den TextField-Spaltenindex in einen ändern. Stellen wir zehn an den oberen, rechten und linken Rand ein. Lassen Sie uns die bevorzugte Breite auf 350 ändern. Lassen Sie uns auch diese Collins-Pref-Breite auf 600 ändern. Lassen Sie uns dem Rasterbereich eine weitere Bezeichnung hinzufügen. Ändern wir den Zeilenindex auf eins und legen wir zehn an den oberen, rechten und linken Rand fest. Ändern wir auch den Text in den zu sendenden Betrag. Lassen Sie uns ein weiteres Textfeld zum Rasterbereich hinzufügen. Und lassen Sie uns seinen Zeilenindex auf eins und seinen Spaltenindex auf eins setzen . Lassen Sie uns die bevorzugte Höhe auf 26 setzen. Und es ist die bevorzugte Breite auf 100. Stellen wir zehn an den oberen, rechten und linken Rand ein. Jetzt packen wir das zuletzt eingefügte Textfeld in ein H-Feld ein. Fügen wir also dem Rasterfenster ein H-Feld hinzu. Und seine Zeilen- und Spaltenindizes sind eins. Lassen Sie uns dieses Textfeld in das Feld H verschieben. Stellen wir auch zehn bis acht Dollar oben, rechts und links ein. Lassen Sie uns nun der H-Box ein Etikett hinzufügen. Lassen Sie uns diese Margen auch auf zehn setzen und den Text in BTC ändern. Lassen Sie uns diese Margen tatsächlich wieder auf Null setzen. Wir setzen stattdessen fünf auf diese Polster. Lassen Sie uns nun dem Rasterbereich eine OK-Schaltfläche hinzufügen. Und lassen Sie uns den Zeilenindex auf zwei setzen. Lassen Sie uns diese Margen auch auf zehn setzen. Und lassen Sie uns den Text zum Senden festlegen. Lassen Sie uns nun den gesamten Inhalt der Registerkarte Senden kopieren , die wir im Playground Punkt FXML erstellt haben. Lassen Sie uns den Tabulatorpunkt FXML für den Unterstrich senden im FXML-Paket erstellen . Und lassen Sie uns den kopierten Inhalt in diese Datei einfügen. Lassen Sie uns das Tab-Tag in das Ethik-Doppelpunkt Root-Tag ändern. Stellen wir den Typ auf Java-Effekte, sichtbare Punkte, Punktsteuerung, Punkt-Tab ein. Lassen Sie uns nun alle verbleibenden Tags importieren. Hoppla, wir haben die Eigenschaft type fälschlicherweise auf label gesetzt . Lass es uns reparieren. Lassen Sie uns nun die FX-ID dieser Tags festlegen. Lassen Sie uns zunächst diese FX-ID so einstellen, dass sie Tab senden soll. Diese FX-ID an die Adresse, um diese FX-ID an den zu sendenden Betrag zu senden, diese FX-ID zum Senden. Gehen wir nun zum Hauptunterstrichfenster Punkt FXML. Lassen Sie uns diese Zeile duplizieren und dieses Tag ändern, um den Tab-Controller zu senden. Lassen Sie uns diesen Controller im Controller-Paket erstellen. Und lass es uns hier importieren. Es wird die Tab-Klasse erweitern und wir fügen ihr die Komponentenannotation hinzu. Lassen Sie uns den Receive-Tab-Konstruktor kopieren und ihn hier einfügen, um ihn entsprechend anzupassen. Lassen Sie uns die aktuelle Brieftasche in diese Klasse injizieren. Lassen Sie uns nun die Send Tab Controller-Klasse zu den benutzerdefinierten Komponenten im GUI gestarteten Listener hinzufügen . Und lassen Sie uns den Wert dieses Parameters ändern , um den Unterstrich-Tab-Punkt-FXML zu senden. wir nun sicher, dass unser Bitcoin-Knoten läuft. Und lassen Sie uns unseren Test zum Senden von Bitcoins durchführen. Wie erwartet ist der Test fehlgeschlagen. In den nächsten Videos werden wir diese Funktion weiter implementieren. C, ja. 46. 44 Bitcoin-Transaktionen Teil 2 skillshare 2: In diesem Video erfahren wir mehr über Bitcoin-Transaktionen. Insbesondere werden wir mehr über die Transaktionsgröße und die Transaktionsgebühren erfahren . Dieses Wissen wird später erforderlich sein , wenn wir mit dem Aufbau von Transaktionen beginnen , um Bitcoins von unseren Wallets an andere Adressen zu übertragen . Aus der vorherigen Präsentation haben wir gelernt, dass die Transaktionsgebühr Summe der Bitcoins in Eingaben abzüglich der Summe der Bitcoins und Outputs einer Transaktion entspricht. Denken Sie daran, dass die Transaktionsgebühr der Preis ist, den Sie für einen Minderjährigen zahlen, um Ihre Transaktion aus den in einem Block enthaltenen Gedanken auszuwählen und sie zu minen. Je höher die Transaktionsgebühr, desto schneller wird die Transaktion in einen Block aufgenommen. Mit einer geringen Transaktionsgebühr bleibt Ihre Transaktion länger im Kopf. Daher ist es wichtig, die richtige Gebühr zu wählen, um sicherzustellen, dass Ihre Transaktion in einer angemessenen Zeit bestätigt wird , ohne sie zu viel zu bezahlen. Die Transaktionsgebühr variiert mit der Zeit stark. Sein Wert folgt der Logik von Angebot und Nachfrage. Je höher die Anzahl der gesendeten Transaktionen ist, desto höher ist in der Regel die Transaktionsgebühr. Und je größer die Anzahl der Miner ist, desto geringer ist tendenziell die Transaktionsgebühr. Diese Grafik zeigt die durchschnittliche Transaktionsgebühr in Dollar in den letzten zwei Jahren. Beachten Sie, dass die Transaktionsgebühr in diesem Zeitraum zwischen einigen Dollar und mehr als 60 USD pro Transaktion lag. Wie berechnen wir also die Transaktionsgebühr? Angesichts der Tatsache, dass die Transaktionsblöcke nur begrenzten Speicherplatz, aber eine unbegrenzte Nachfrage haben , ist es sinnvoll, die Gebühren nach Transaktionsgröße zu berechnen. Es gibt verschiedene Möglichkeiten, den empfohlenen Transaktionsgebührensatz zu erhalten . Sie können z. B. Websites wie Bitcoin Fees, earned.com verwenden . Hier können wir sehen, wie viele Transaktionen in den letzten 24 Stunden pro Gebühr berechnet wurden . In der rechten Spalte sehen wir eine Schätzung, wie lange es dauern würde, eine Transaktion mit diesen Gebühren in Blöcken und Minuten zu bestätigen . Wenn Sie nach unten scrollen, wird ein empfohlener Gebührensatz angezeigt. Das garantiert fast, dass Ihre Transaktion im nächsten Block bestätigt wird. Men pull dot space ist eine weitere Website, die neben coolen Grafiken, die den durchschnittlichen Gebührensatz für jeden Block anzeigen, auch den empfohlenen Gebührensatz für Transaktionen mit die den durchschnittlichen Gebührensatz für jeden Block anzeigen, niedriger, mittlerer und hoher Priorität anzeigt . Je höher ihre Priorität ist, desto schneller wird die Transaktion voraussichtlich bestätigt. Wir können auch unsere Smart Fee-Methode Bitcoin Core Note RPC Estimate verwenden . Laut seiner Dokumentation als Parameter ein Bestätigungsziel verwendet. Dies ist die Anzahl der Blöcke, von denen wir erwarten, dass Transaktionen mit dem Rückgabegebührensatz bestätigt werden. Außerdem ist ein optionaler Parameter , um den Schätzmodus zu definieren kann nicht eingestellt, wirtschaftlich oder konservativ sein. Der Gebührensatz wird in Bitcoin pro Kilo virtuellem Byte oder KV-Byte zurückgegeben . Diese Beispiele zeigen , dass die empfohlenen Gebührensätze zwischen verschiedenen Tools stark variieren können. Der Einfachheit halber wird in unserer Brieftasche der RPC-Anruf von Bitcoin Core geschätzt verwendet , da wir dafür keine externen Tools mit einem Gebührensatz abfragen müssen . Daher können wir die Transaktionsgebühr berechnen, indem wir die Transaktionsgröße in v Byte mit dem Gebührensatz in Satoshi is privy bite multiplizieren Transaktionsgröße in v Byte mit dem Gebührensatz . Aber warte, was ist ein virtuelles Byte? Um die Transaktionsgebühren zu berechnen, müssen zunächst zwei wichtige Konzepte verstanden werden : virtuelle Größe und virtuelles Byte. virtuelle Größe oder V-Größe ist die Transaktionsgröße in virtuellen Bits oder V-Bytes. Es handelt sich um Konzepte, die erfunden wurden, um der geringeren Größe von Segway-Transaktionen Rechnung zu tragen. Die V-Größe wird abwärtskompatibel berechnet , sodass voreingestellt welche Transaktionsgrößen gleich sind welche Transaktions-V-Größen voreingestellt werden. Bei Segway-Transaktionen entspricht die Größe V der Teilgröße ohne Zeugen einer Transaktion zuzüglich ihrer Zeugengröße geteilt durch vier. Der Zeuge ist ein Feld, das nur bei Segway-Transaktionen präsent ist. Es enthält die Felder, in denen Transaktionen vor Segmenten im ScriptSig-Feld jeder Eingabe befanden . Diese unterschiedliche Art der Berechnung der Transaktionsgrößen führt kleineren Transaktions-V-Größen für Segway-Transaktionen im Vergleich zu älteren Transaktionen. Beispielsweise haben Segway-Transaktionen bei Transaktionen mit einem Eingang und einem Ausgang eine Größe von 110 V Byte, während ältere Transaktionen eine Größe von 192 V Byte haben. Bei Transaktionen mit einem Eingang und zwei Ausgängen Segway-Transaktionen eine Größe von 141 V Byte, während ältere Transaktionen 226 V Byte groß sind. Schließlich haben Segway-Transaktionen für Transaktionen mit zwei Eingängen in Ausgänge eine Größe von 209 V Byte, während ältere Transaktionen 374 Byte groß sind. Nehmen wir an, wir möchten die Gebühr für eine Segue-Transaktion mit einem Eingang und zwei Ausgängen mit einem Gebührensatz von 19 berechnen eine Segue-Transaktion mit einem Eingang . Satoshi ist Privy Byte. Dazu würden wir die Transaktionsgröße v, die 141 V-Byte beträgt, mit dem Gebührensatz multiplizieren 141 V-Byte beträgt, mit dem , der 19 Satoshi pro V-Byte entspricht. Das würde 2.679 Satoshi an Gebühren für diese Transaktion einbringen. Zusammenfassend lässt sich sagen, dass wir, um eine Transaktion zu erstellen, die folgenden Elemente erstellen müssten. Für eine Ausgabe benötigen wir eine Adresse und einen Betrag , den wir an diese Adresse senden können. Wenn eine Änderung erforderlich ist und die meisten Transaktionen dies tun, müssten wir eine zweite Ausgabe erstellen, die eine Änderungsadresse und einen Betrag enthält. Wir bräuchten auch eine variable Anzahl von Eingaben , deren Bitcoin-Betrag größer sein muss als der zu sendende Betrag zuzüglich der Transaktionsgebühr. Denken Sie daran, dass sich eine Eingabe auf eine nicht ausgegebene Ausgabe einer früheren Transaktion bezieht , die an eine Ihrer Adressen gesendet wurde. Eine Änderung ist erforderlich, wenn die Summe der eingegebenen Beträge größer ist als der zu sendende Betrag zuzüglich der Transaktionsgebühr. Wenn durch Zufall oder Absicht die Summe der eingegebenen Beträge dem zu sendenden Betrag zuzüglich der Transaktionsgebühr entspricht , wird für die Transaktion keine Änderung ausgegeben. Und der Absender profitiert davon, für eine Transaktion mit nur einem Ausgang weniger Transaktionsgebühr zu zahlen . Auch hier wird zur Berechnung der Transaktionsgebühr der Gebührensatz in Satoshi pro V-Byte benötigt. Wir erhalten diesen Wert, indem wir die geschätzte Smartphone-gRPC-API von Bitcoin Core verwenden und das Ergebnis in Satoshis pro V-Bit umrechnen . Außerdem benötigt Satoshi die Transaktionsgröße in V-Bytes. Im nächsten Video werden wir die Smart Fee, den Client und einen Service zur Berechnung der Transaktionsgröße implementieren . Später werden wir beide kombinieren, um die Transaktionsgebühren zu berechnen. Siehst du, ja. 47. 45 Senden von bitcoin 2 skillshare 2: In diesem Video erstellen wir einen Transaktionsgrößenrechner und erstellen einen Transaktionsgrößenrechner und erstellen den Node-Client für die geschätzte Smart-Feed-Bitcoin-Knoten-RPC-Methode . im Paket api dot services Lassen Sie uns im Paket api dot services die Klasse zur Berechnung der Transaktionsgröße erstellen. Diese Klasse wird für die Berechnung der Transaktionsgrößen entsprechend ihrer Art und Anzahl der Ein- und Ausgaben verantwortlich sein Transaktionsgrößen entsprechend . Diese Größen werden später verwendet, um den Gebührenbetrag zu berechnen , den wir in unsere Transaktionen einbeziehen müssen. Lassen Sie uns eine Dienstanmerkung hinzufügen. Zuerst definieren wir einige Konstanten in dieser Klasse. Diese Konstanten enthalten die Größen der einzelnen Teile einer Transaktion. Da wir derzeit nur mit Segway-Transaktionen arbeiten , beziehen sich diese Konstanten nur auf Teile von Segway-Transaktionen. Beginnen wir also damit, die Größe des Transaktionsaufwandes zu definieren . Der Overhead ist der Teil der Transaktion , dessen Größe sich nicht mit der Anzahl der Ein- oder Ausgänge ändert . Die erste Konstante wird Inversion genannt, was Teil des Overheads ist. Es kodiert, welche Version die Transaktion hat. Es hat eine Größe von vier Byte. Dann haben wir die Anzahl der Eingaben, die, wie der Name schon sagt, die Anzahl der Eingaben in der Transaktion angibt. Es hat eine variable Anzahl von Bytes, aber für bis zu 252 Eingaben beträgt seine Größe ein Byte. Dann haben wir das Feld für die Ausgabeanzahl, das dieselbe Größe und dieselben Regeln wie die Anzahl der Eingaben hat. Wie der Name schon sagt, gibt es die Anzahl der Ausgaben in der Transaktion an. Dann haben wir das N-Loszeitfeld, das vier Byte hat. Dieses Feld wird manchmal verwendet, um die Zeit zu kodieren , nach der die Transaktion ausgegeben werden kann. Dann haben wir den Segway-Marker und die Segway-Flagge, die nur für Segway-Transaktionen vorhanden sind. Es hat eine Größe von zwei Byte. Lassen Sie uns nun die Größen der Eingabefelder festlegen, beginnend mit dem Outpoint, 36 Byte groß ist. Der Punkt ist die Kombination aus der vorherigen Transaktions-ID und dem Ausgabeindex. Es gibt das für diese Eingabe verwendete UTXO an. Dann haben wir das ScriptSig-Längenfeld, das bis zu 252 Byte groß ist und ein Byte hat. Es gibt die ScriptSig-Größe für die Eingabe an. Dann haben wir das ScriptSig-Feld. Für Segway-Transaktionen. Seine Größe ist Null. Denken Sie daran, dass bei Segmenteingaben der ScriptSig-Inhalt in das Zeugenfeld verschoben wird. Lassen Sie uns nun das Feld für die Endsequenz hinzufügen. Es hat eine Größe von vier Byte und wird verwendet, um festzulegen, ob die Transaktion ersetzbar ist falls der Absender seine Gebühr ändern möchte. Als Nächstes fügen wir das Feld Zeugenzahl für bis zu 250 zu den Zeugenobjekten hinzu. Es hat eine Größe von einem Byte. Dann haben wir das Feld Witness Items, das eine Größe von 107 Byte für P2-, WP k-, h-Eingänge hat . Dieses Feld besteht aus der Signatur, die 71 oder 72 Byte groß sein kann, und der öffentliche Schlüssel , der 33 Byte groß ist, 72 Byte, wird als Größe für die Signaturen gewählt da wir es vorziehen, die Transaktionsgröße etwas zu überschätzen. Das berechnete F0 reicht also garantiert für die Transaktion aus. Die beiden verbleibenden Byte, die die Größe der Signatur und des öffentlichen Schlüssels kodieren . Erläutern Sie den konstanten Wert des Zeugenobjekts von 107. Lassen Sie uns nun die Konstanten mit den Ausgabegrößen festlegen. Der n-Wert ist die Menge an Bitcoin, die in dieser Ausgabe gesendet wird. Es hat eine Größe von acht Byte. Dann haben wir die Skript-Pub-Schlüssellänge, die ein Byte groß ist und bis zu 252 Byte an Skript-Pub-Schlüssellänge entspricht. Als nächstes haben wir den Script-Pub-Schlüssel , der eine Sekunde lang 22 Byte groß ist. Welche Adressen? Bevor wir nun mit der Implementierung der Transaktionsgrößenberechnung fortfahren , erstellen wir den Test zur Berechnung der Transaktionsgröße im API-Testpaket. Es wird die Spezifikationsklasse erweitern. Fügen wir dieser Klasse ein Feld zur Berechnung der Transaktionsgröße hinzu. Und lassen Sie uns eine Setup-Methode verwenden, um es zu instanziieren. Lassen Sie uns nun einen Testnamen erstellen, der die Transaktionsgröße für P2-, WP k-, h-Transaktionsausgaben und -eingaben berechnen soll die Transaktionsgröße für P2-, WP k-, h-Transaktionsausgaben und -eingaben berechnen . In einem Block rufen wir die Berechnungsmethode im Transaktionsgrößenberechnungsdienst auf im Transaktionsgrößenberechnungsdienst und speichern die Rendite in der Ergebnisvariablen. Als Parameter übergeben wir die Ein- und Ausgänge, die wir im Where-Block definieren. Im Block wird geprüft, ob das Ergebnis der erwarteten Größenvariablen entspricht. Im Wher-Block werden die folgenden Testfälle hinzugefügt. Für die Ein- und Ausgänge legen Variablen Listen mit einer variablen Anzahl von Adressen fest. Da uns die Art der Adressen vorerst egal ist, fügen wir einfach einen Buchstaben hinzu, der für jede Adresse steht. Die hier erwarteten Größenwerte wurden zuvor für jede Kombination von Ein- und Ausgaben berechnet jede Kombination von Ein- und Ausgaben und mit der Bitcoin Core CLI validiert. Lassen Sie uns nun die Berechnungsmethode in der Klasse Transaction Size Calculator erstellen . Es gibt eine große Ganzzahl zurück und erhält als Parameter eine Liste von Eingabeadressen und eine Liste von Ausgabeadressen. Lassen Sie uns nun zunächst die Größe der Gemeinkosten berechnen. Sie entspricht der Summe dieser Konstanten. Denken Sie daran, dass der Wert, den wir hier berechnen möchten , die V-Größe ist. Die Elemente von Segway-Transaktionen wie Segway, Markierung und Flagge müssen also wie Segway, Markierung und Flagge müssen also durch vier geteilt werden. Teilen wir diese Konstante also durch vier. Lassen Sie uns nun die Eingabegröße berechnen. Es wird die Summe dieser Konstanten sein. Lassen Sie uns nun die Größe aller Eingaben berechnen, indem die Eingabevariable mit der Anzahl der Eingabeadressen multiplizieren . Lassen Sie uns nun die Zeugengröße berechnen, indem wir die Konstanten Zeugenanzahl und Zeugeneinträge hinzufügen. Wie folgt, welche Elemente? Teilen wir ihre Summe durch vier. Die gesamte Zeugengröße entspricht der Zeugenvariablen multipliziert mit der Größe der Eingabeadressen. Lassen Sie uns nun die Ausgabegröße berechnen. Sie wird der Summe dieser Konstanten entsprechen. Die Variable „Alle Ausgänge“ entspricht der Ausgabegröße mal der Anzahl der Ausgänge. Schließlich entspricht das Ergebnis der Transaktionsgröße dem BigDecimal einiger der zuvor berechneten Werte. Lassen Sie uns auch die Skala des Ergebnisses auf Null setzen , während der Rundungsmodus halb geöffnet ist. Dadurch hat das Ergebnis null Nachkommastellen und wird auf die nächste Ganzzahl gerundet. Wenn der Dezimalwert des Ergebnisses fünf ist, wird er auf die obige Ganzzahl gerundet. Jetzt geben wir das in eine große Ganzzahl konvertierte Ergebnis zurück. Lassen Sie uns nun den Test zur Berechnung der Transaktionsgröße ausführen. Toll, der Test ist bestanden. Lassen Sie uns nun den Node Estimate Smart Fee-Client im Node Dot Client-Paket erstellen . Lassen Sie uns den Node-Client hineininjizieren. Und lassen Sie uns die intelligente Gebührenmethode für Schätzungen erstellen. Es gibt einen neuen Knoten zurück, den ein FI-Objekt erstellen wird, und als Parameter wird eine Ganzzahl verwendet. Kehren wir nun zum Aufruf der Anforderungsmethode auf dem Node-Client zurück. Der Name der Methode lautet Estimates Smart Fee. Sein zweiter Parameter wird ein neues parametrisiertes Typreferenzobjekt sein. Die dritte ist eine leere Zeichenfolge und ihr letzter Parameter, die Blockvariable. Lassen Sie uns nun den Node-V-Datensatz im Punktknotenpaket der Domäne erstellen . In den Feldern wird ein doppelter Gebührensatz und eine Fehlerliste angezeigt. nun im Paket api dot services Lassen Sie uns nun im Paket api dot services eine Schnittstelle namens Estimate Fee Service erstellen. Fügen wir die Schätzmethode hinzu. Es wird eine große Dezimalzahl zurückgegeben. Lassen Sie uns nun eine Implementierung dieser Schnittstelle erstellen. Namen vermerken, geschätzter Gebührenservice im selben Paket. Lassen Sie uns seine Methode implementieren. Diese Klasse wird später verwendet, um die Gebühr mithilfe des Smart Fee-Clients von Node Estimates zu schätzen . Wenn wir die Methode zur Gebührenschätzung ändern oder dazu später weitere Optionen hinzufügen möchten , erstellen wir einfach eine weitere Implementierung der Serviceschnittstelle für den Kostenvoranschlag. Zuerst rufen wir die Smartphone-Schätzmethode vom zuvor erstellten Client auf, der in der Variablen Node V gespeichert ist. Lassen Sie uns diesen Kunden in diese Klasse aufnehmen damit wir versuchen, einen Gebührensatz zu erhalten, der dafür sorgt, dass unsere Transaktion im nächsten Block bestätigt wird. Wenn der zurückgegebene Gebührensatz aus irgendeinem Grund gleich Null ist, geben wir den Fallback-Gebührensatz zurück. Lassen Sie uns diese Variable in diese Klasse injizieren. Fügt es aus den Eigenschaftendateien ein. Fügen wir also diese Wertanmerkung davor hinzu. Nach der if-Abrechnung wird der große Dezimalwert des Gebührensatzes zurückgegeben . Lassen Sie uns nun die Eigenschaft Bitcoin Dot Fallback Fee Rate zu allen Eigenschaftsdateien des Projekts hinzufügen Eigenschaft Bitcoin Dot Fallback Fee Rate zu . Machen wir es gleich 0,0 002. 48. Coin und Staub: In dieser Präsentation werden wir weiterhin wichtige Konzepte erläutern, um Bitcoin-Transaktionen zu verstehen und unsere Funktion für Sin-Transaktionen weiterzuentwickeln. Lassen Sie uns also über die Münzauswahl sprechen. Münzauswahl ist der Prozess der Auswahl von UTXOs für den Aufbau einer Transaktion. Die allgemeine Regel für diese Auswahl lautet, dass die Summe der Bitcoinbeträge von UTXos höher sein muss als die Sandmenge zuzüglich der Transaktionsgebühr zuzüglich der Änderung, falls erforderlich. Es gibt viele verschiedene Methoden zur Auswahl von Münzen. Jeder hat Vor- und Nachteile. Der Algorithmus, den wir für unser Wallet wählen , heißt Single Random Draw. Es ist wahrscheinlich der einfachste Algorithmus zur Münzauswahl und gut genug für unsere Zwecke. Dieser Algorithmus wurde erstmals in einer Masterarbeit mit dem Titel und Bewertung von Strategien zur Münzauswahl von Mark Earhart vorgestellt. Ich empfehle, diese These zu lesen, wenn Sie mehr über Strategien zur Münzauswahl erfahren möchten . Diese Methode zur Auswahl von Münzen wurde Bitcoin Core im September 2021 als Fallback-Strategie zur Auswahl von Münzen hinzugefügt . Es besteht darin, die Ausgaben oder UTXOs zu mischen und dann UTXos einzeln auszuwählen, bis die Summe der ausgewählten UTXos-Beträge größer oder gleich dem zu sendenden dann UTXos einzeln auszuwählen bis die Summe der ausgewählten UTXos-Beträge Betrag zuzüglich der Transaktionsgebühr zuzüglich der Transaktionsgebühr zuzüglich der bei Bedarf ändern. Wenn der Änderungsbetrag unter dem Staublimit liegt, wird die Änderungsausgabe aus der Transaktion entfernt und ihr Betrag wird zur Transaktionsgebühr hinzugefügt. Aber Moment mal, was ist Staub? Ein Staubausstoß ist ein Output , dessen Bitcoin-Betrag geringer ist als die Kosten für die Ausgabe. Das folgende Beispiel zeigt die Ausgabe von Staub unwirtschaftlich ist. Angenommen, Sie haben ein UTXO mit 50 Satoshis und möchten diese 50 Satoshis an einen Freund schicken . Beim Abschluss der Transaktion stellen Sie fest, dass die für den Versand erforderliche Transaktionsgebühr 100 Satoshi entspricht. Daher ist es für dich nicht sinnvoll , den UTXO mit 50 Satoshi's auszugeben , da du mehr Gebühren als den überwiesenen Betrag zahlst. Außerdem wird dein Freund auch nicht davon profitieren, ein UTXO mit 50 Satoshis zu erhalten ein UTXO mit 50 Satoshis da er das gleiche Problem haben würde , wie du es ausgibst. Dieses Beispiel zeigt , dass es sich nachteilig auf das Bitcoin-Netzwerk auswirkt, Staub zu erzeugen, da niemand im Netzwerk davon profitiert. Daher beziehen sich die meisten Bitcoin-Knoten nicht auf staubige Transaktionen. Dies trägt dazu bei, das Netzwerk vor Staubangriffen zu schützen. Bei Staubangriffen wird in böswilliger Absicht Staub an Wallet-Adressen gesendet , um deren Transaktionen zu verfolgen. Dieser Angriff wird in diesem Beispiel gezeigt. Angenommen, die Regierungsbehörde schickt Staub an die Adresse X, die einer Person gehört. Warum? Wenn E-Wallet naiv eine Transaktion aufbaut, bezieht es den Staubausstoß und fünf weitere als Eingaben mit ein. Jetzt weiß die Regierungsbehörde, warum fünf frühere Adressen und all ihre vorherigen Transaktionen. Außerdem kennt die Regierung jetzt die Änderungsadresse dieser Transaktion und schließt weitere Transaktionen mit ihr ab. Aber was sind die Kriterien, um einen Output als Staub zu betrachten? wird die Staubgrenze verwendet. Jede Ausgabe, deren Bitcoin-Menge unter der Staubgrenze liegt, wird als Staub betrachtet. Bitcoin Core verwendet die folgende Formel , um die Staubgrenze zu berechnen. Die Staubgrenze einer Transaktionsausgabe in Satoshi entspricht der Transaktionsausgabegröße zuzüglich der Eingabegröße, die erforderlich ist zuzüglich der Eingabegröße, die , um sie auszugeben, beide in V-Bytes multipliziert mit dem Branchenblatt in Satoshis pro KV Byte geteilt durch 1.000. Das Ergebnis stellt die Transaktionsausgangskosten dar, die ein Bitcoin-Output-Betrag einer Transaktion entsprechen oder übertreffen muss , um nicht als Staub angesehen zu werden. Die Staubrelay-Gebühr ist eine Konfigurationseigenschaft des Bitcoin-Knotens. Dies ist die Transaktionsgebühr, die bei der Berechnung des Staublimits verwendet wird . Die Standardgebühr für Staubrelais ist auf 3.000 Satoshi pro KV-Byte oder drei Satoshi pro V-Bit festgelegt. Dadurch beträgt die Standardstaubgrenze für Segue-Ausgänge 294. Satoshis. Die standardmäßige Staubgrenze für nicht festgelegte Ausgangswerte soll 546 Satoshi's entsprechen. Für weitere Informationen zur Berechnung des Staublimits dieser Link aus dem Bitcoin Core-Code einen Kommentar, in dem erklärt wird, wie das Staublimit berechnet wird. Lassen Sie uns nun die allgemeinen Schritte des Single-Random-Draw-Algorithmus zusammenfassen . Der erste Schritt besteht darin, alle Wallet-UTXOs in einer Liste zu mischen. Sie dann für jedes verfügbare UTXO aus der gemischten Liste Fügen Sie dann für jedes verfügbare UTXO aus der gemischten Liste dieses UTXO zu einer Liste der ausgewählten UTXOs hinzu. Berechnen Sie das angepasste Ziel, das der Sandmenge zuzüglich der Transaktionsgebühr zuzüglich der Änderung entspricht , falls erforderlich. Wenn der gesamte Bitcoin-Betrag in der ausgewählten UTXOS-Liste größer oder gleich dem angepassten Ziel ist . Stopp. Verwenden Sie abschließend die ausgewählten UTXOs als Eingaben für die gewünschte Transaktion. Einige Punkte, die bei diesem Algorithmus zu beachten sind, angepassten Ziele mit und ohne müssen aus Gründen der Genauigkeit die angepassten Ziele mit und ohne Änderungsausgabe berechnet werden , da die Transaktionsgebühren von Transaktion zu Transaktion unterschiedlich sind . Wenn bei 1.2 Ausgängen die generierte Änderung zwischen Null und dem Staublimit liegt , beenden wir die Iteration, da wir keine Änderung in die Transaktion einbeziehen und daher keine weiteren UTXOs benötigen. Dies ist notwendig , um beim Wechsel nicht versehentlich Staub zu erzeugen . Der Nachteil eines Single-Random-Draw-Algorithmus tritt in einigen pathologischen Fällen auf, z. B. wenn Sie ein einziges großes UTXO und viele kleine UTXOs haben . eine Transaktion mit vielen werden Anstatt das große UTXO zu verwenden , kann eine Transaktion mit vielen Eingaben und einer hohen Transaktionsgebühr erstellt , um zu vermeiden, dass viele Eingaben erforderlich sind. In diesem Fall wird ein anderer Ansatz empfohlen, ein anderer Ansatz empfohlen um eine Transaktion zu erstellen. Wählen Sie z. B. manuell die UTXOs , die Teil einiger bestimmter Transaktionen sein werden. Im nächsten Video implementieren wir einen Staubrechner und den Single-Random-Draw-Algorithmus C, ja. 49. 47 Senden von bitcoin 3 skillshare 2: In diesem Video beginnen wir mit der Implementierung eines Staubrechners und des Single-Random-Draw-Algorithmus. Aber lassen Sie uns zuerst den UTXO-Rekord umgestalten. Da wir viele Berechnungen mit dem UTXO-Mengenfeld durchführen werden. Und Berechnungen werden besser mit großen Dezimalzahlen durchgeführt Doppelzahlen, um den Betragstyp zwei große Dezimalzahlen zu ändern . Jetzt müssen wir alle Verwendungen des Betragsfeldes im Projekt umgestalten. Also lass es uns machen. Lassen Sie uns das Bitcoin-Format oder den Formatparameter in BigDecimal ändern und diesen Parameter entsprechend anpassen. Lassen Sie uns dasselbe mit allen Methoden tun, die die IDE im Projekt als Fehler gekennzeichnet hat. Hier fügen wir große Dezimalzahlen mit der Methode add hinzu. Und lassen Sie uns den großen dezimalen Nullwert anstelle des Null-Primitivs an diese Methodenaufrufe übergeben . Jetzt müssen wir den Typ dieses ausgeglichenen Feldes und all seine Verwendungsmöglichkeiten ändern . Lassen Sie uns diese Methode umgestalten, um die Summe mit großen Dezimalwerten zu berechnen. Lassen Sie uns diesen Code auch anpassen, um dasselbe zu tun, jedoch mit großen Dezimalwerten. Okay, das Refactoring ist abgeschlossen. Jetzt im API Dot Services-Paket. Lassen Sie uns die Dust Calculator-Klasse erstellen. Lassen Sie uns die Service-Anmerkung hinzufügen. Lassen Sie uns diese Staubmethode darin erstellen. Wie der Name schon sagt, es true zurück, wenn ein Betrag als staubfalsch angesehen wird. Andernfalls gibt es einen booleschen Wert zurück und nimmt eine große Ganzzahl als Parameter die den Betrag in Satoshis. Mit dieser Methode wird bewertet, ob der Betrag einer Produktion in Satoshi geringer ist als die Kosten für die Ausgabe . Die Kosten der Ausgaben entsprechen der V-Größe des Ausgangs zuzüglich der V-Größe des Eingangs, der erforderlich ist , um ihn auszugeben, wodurch in dieser konstanten Zeit die Staubrelais in Satoshi pro Kilo v Byte gespeichert werden Zeit die Staubrelais geteilt durch 1.000. Da wir vorerst nur mit Sigmoid-Ausgängen arbeiten werden, machen wir uns nur Gedanken über die Staubgrenze für Segue-Ausgänge. Lassen Sie uns also diese Konstante erstellen , die gleich 98 sein wird. Dieser Wert stammt direkt aus der Datei mit dem Punkt cpp der Bitcoin Core-Richtlinie die in der letzten Präsentation erwähnt wurde. Lassen Sie uns auch die Gebühr für das Staubrelais in diese Klasse einbeziehen. Es wird verfügbar sein und sein Wert wird aus der Eigenschaftendatei eingefügt. Lassen Sie uns die folgende Wertanmerkung davor hinzufügen. Lassen Sie uns nun diesen Wert zu allen Eigenschaftendateien hinzufügen. Setzen wir ihn auf 3.000, den gleichen Standardwert, der im Bitcoin Core Node verwendet wird. nun im Paket api dot services Lassen Sie uns nun im Paket api dot services die Schnittstelle zur Münzauswahl erstellen. Wird diese Schnittstelle so erstellen , dass sie mehr Flexibilität ermöglicht. Wenn wir später weitere Coin-Selector-Implementierungen erstellen wollen. Fügen wir die Auswahlmethode hinzu. Es wird eine Liste der ausgewählten UTXos zurückgegeben. Und dafür benötigen wir Parameter, eine Liste von UTXOs, eine große Ganzzahl für den zu sendenden Betrag, eine große Dezimalzahl für den Gebührensatz und eine zu sendende Adresse und eine Änderungsadresse. nun im selben Paket Lassen Sie uns nun im selben Paket den Single Random Draw Coin Selector erstellen , der diese Schnittstelle implementiert. Lassen Sie uns seine Methode implementieren und ihr eine Service-Annotation hinzufügen. Lassen Sie uns den Transaktionsgrößenrechner in diese Klasse einbauen. Und lassen Sie uns den Staubrechner hineinspritzen. Bevor wir mit der Implementierung der Auswahlmethode fortfahren, erstellen wir die Testklasse für die Auswahl einzelner zufälliger Ziehungen und Münzen. In der API-Testklasse. Es wird die Spezifikationsklasse erweitern. Lassen Sie uns die einzelne zufällige Ziehung in diese Klasse injizieren. Und lassen Sie uns die Setup-Methode verwenden, um es zu instanziieren. Lassen Sie uns den Transaktionsgrößenrechner und den Staubrechner mit einer Staubrelay-Gebühr von 3.000 als Parameter weitergeben. Lassen Sie uns nun einen Test erstellen, in dem Tidal erwarteten n Eingaben, Münzen für Transaktionen mit erwarteten und ausgegebenen Ausgaben auswählen sollte . Lassen Sie uns nun eine Hilfsklasse erstellen, die uns hilft, den Münzselektor für einzelne zufällige Ziehungen zu testen und zu implementieren. Nennen wir es Satoshi und es wurde im Paket utils erstellt. Lassen Sie uns nun die beiden Satoshi-Methoden erstellen. Es nimmt eine große Dezimalzahl als Parameter und gibt eine große Ganzzahl zurück. Diese Methode wandelt einen Betrag in Bitcoin in den gleichen Betrag in Satoshi um. Dazu geben wir einfach den Betrag in Bitcoin multipliziert mit 100 Millionen zurück und rechnen das Ergebnis in eine große Ganzzahl um. Lassen Sie uns auch eine Methode erstellen, um die umgekehrte Operation durchzuführen, nämlich die von Satoshi in Bitcoin umzuwandeln. Dafür geben wir einfach den Betrag zurück, verpackt in einer neuen großen Dezimalzahl, geteilt durch 100 Millionen. Bei der Divide-Methode wird acht als zweiten Parameter übergeben, damit das Ergebnis acht Dezimalstellen hat. Wir werden auch den unnötigen Rundungsmodus als dritten Parameter übergeben. Lassen Sie uns nun eine Methode erstellen, um einen Gebührensatz in Bitcoins pro KV-Fahrrad in den von Satoshi pro V-Byte umzurechnen . Es wird BTC pro KB nach Satoshi pro Byte heißen. Es gibt eine große Ganzzahl zurück und nimmt als Parameter eine große Dezimalzahl an. Zunächst werden wir den Gebührensatz mit 100 Millionen multiplizieren. Dann teilen wir das Ergebnis durch 1024 mit zwei Dezimalstellen und einem Bodenrundungsmodus. Dann konvertieren wir das Ergebnis in eine große Ganzzahl und speichern es in der richtigen Variablen. Wenn das Ergebnis kleiner als eins ist, machen wir es gleich eins. Schließlich geben wir den umgerechneten Kurs zurück. Im nächsten Video werden wir das Testen und Implementieren des Münzwählers C für eine zufällige Ziehung abschließen des Münzwählers C für eine zufällige Ziehung . Ja. 50. 48 Senden von bitcoin 4 Skillshare 2: In diesem Video beenden wir die Implementierung des Single-Random-Draw-Algorithmus. Beim Münzauswahltest für einzelne zufällige Ziehungen in einem bestimmten Block erstellen wir zunächst UTXOs mit dieser Methode und speichern das Ergebnis in der utxOS-Variablen. Dies sind die verfügbaren UTXOs, die als erster Parameter an die getestete Methode übergeben werden. Lassen Sie uns diese Methode erstellen. Als Parameter wird eine Liste großer Ganzzahlen verwendet, die den Betrag jedes UTXO definieren. Daher rufen wir für jedes Element in der Liste die Methode create UTXO auf, rufen wir für jedes Element in der Liste die Methode create UTXO um ein einzelnes UTXO zu erstellen. Lassen Sie uns diese Methode erstellen. Lassen Sie uns ein UTXO mit diesen Parametern instanziieren. Sie können diese Werte aus den Ressourcen dieser Lektion kopieren. Lassen Sie uns nun ein zusätzliches UTXO erstellen und es mit diesem Code zur Liste der UTXOs hinzufügen. Der Grund, der Liste ein zusätzliches UTXO hinzuzufügen , ist, dass wir zulassen möchten die Auswahlmethode es fälschlicherweise zur ausgewählten UTXOS-Liste hinzufügt . Wenn das der Fall ist, werden wir wissen, dass die getestete Methode nicht wie erwartet funktioniert. Lassen Sie uns diese beiden Adressen definieren. Eine ist die zu sendende Adresse und die andere die Änderungsadresse. Sie können sie von der Seite Projekt und Ressourcen kopieren. Lassen Sie uns den Gebührensatz auf 0,0002 setzen. Im Windblock rufen wir die Single Random Draw Select-Methode mit diesen Parametern auf. Im Block dann wird überprüft, ob die gewählte UTXOS-Größe der erwarteten Anzahl von Eingangsvariablen im Where-Block entspricht . Lassen Sie uns diese Testfälle hinzufügen. Sie finden sie auf der Seite Projekt und Ressourcen. Diese Testfälle betrafen Transaktionen mit 12,3 Eingängen und mit 1,2 Ausgängen. die Eingangsbeträge für Geschäfte mit Es wird erwartet , dass die Eingangsbeträge für Geschäfte mit einem Ausgang keine Veränderung oder eine Veränderung mit Staub erzeugen , deren Wert zur Gebühr hinzukommt. die Eingabebeträge für Transaktionen mit Es wird erwartet, dass die Eingabebeträge für Transaktionen mit zwei Ausgängen keine Änderungen generieren, die über eine zweite Ausgabe an den Absender zurückgegeben werden. Lass uns den Test machen. Es ist wie erwartet gescheitert. Lassen Sie uns nun die Methode „Single Random Draw Select“ implementieren . Zuerst filtern wir alle empfangenen UTXos, um eine Liste mit nur UTXOs zu erstellen eine Liste mit nur UTXOs , die eine oder mehrere Konformationen haben. Lassen Sie uns diese Methode erstellen. Um das zu tun. Wir rufen die Filtermethode im utxOS-Stream auf geben eine Liste mit nur bestätigten UTXOs zurück. Lassen Sie uns nun diese Variable erstellen, um den Gebührensatz in Satoshis pro V-Byte zu speichern. Dafür verwenden wir die Methode BTC per KB to Satoshi per Bike aus der Satoshi-Klasse. Speichern wir nun die gemischten UTXOs in dieser Variablen weisen ihr die Rückgabe dieses Methodenaufrufs zu. Lassen Sie uns diese Methode erstellen. Zuerst instanziieren wir eine neue ArrayList Inhalt der UTxOS-Liste enthält. Dann rufen wir die Collection-Shuffle-Methode übergeben die neue Liste als Parameter. Dann geben wir die Liste der gemischten Münzen zurück. Lassen Sie uns nun eine ArrayList instanziieren , die die ausgewählten UTXos speichert. Und lassen Sie uns diese Variable erstellen , um den gesamten Eingangssaldo zu speichern. Jetzt fügen wir für jeden UTXO aus der Liste der gemischten Münzen den UTXO zur ausgewählten UTXO-Liste hinzu. Und wir addieren den Betrag in Satoshi zur ausgeglichenen Gesamteingangsvariablen. Wenn der gesamte Eingangssaldo geringer ist als der Betrag steigend, setzen wir die Ausführung ab der nächsten Loop-Iteration fort. Nach der if-Anweisung wird, wenn der gesamte eingegebene Saldo den zu sendenden Betrag übersteigt wenn der gesamte eingegebene Saldo den zu sendenden Betrag übersteigt, eine ArrayList mit den Ausgabeadressen instanziiert eine ArrayList mit den Ausgabeadressen und die zu sendende Adresse zu dieser Liste hinzugefügt. Und wir erstellen mithilfe dieses Stream-Mappings eine Liste mit den Adressen der ausgewählten Eingänge. Lassen Sie uns nun die Gesamtgebühr in Satoshi berechnen und in dieser Variablen speichern. Nennen wir dazu die Gesamtgebührenmethode, den Gebührensatz in Satoshis pro V-Bit, die Eingabeadressen und die Ausgabeadressen als Parameter übergeben die Eingabeadressen und . Lassen Sie uns diese Methode erstellen. Darin wird der Methodenaufruf zur Berechnung der Transaktionsgröße zurückgegeben der Methodenaufruf zur Berechnung der Transaktionsgröße und die Eingabeadressen und Ausgabeadressen als Parameter übergeben . Dann multiplizieren wir das Ergebnis mit dem Gebührensatz in Satoshi pro V-Biss. Jetzt erstellen wir die angepasste Zielvariable, die der Summe aus dem zu sendenden Betrag und der Gesamtgebühr entspricht . Lassen Sie uns nun die Änderungsadresse zur Liste der Ausgabeadressen hinzufügen . Wir berechnen die Gesamtgebühr bei Änderung, rufen die Gesamtgebührenmethode auf und übergeben diese Parameter. Und wir berechnen das angepasste Ziel mit Änderung, das der Summe der Sandmenge und der Gesamtgebühr mit Änderung entspricht . Wenn nun das Ergebnis der Transaktionsmethode „Input Balanced Fulfilled“ mit diesen Parametern wahr ist, verlassen wir die Schleife mit dem Schlüsselwort break. Lassen Sie uns diese Methode erstellen. Es wird das Ergebnis der folgenden Anweisung zurückgegeben. Wenn der gesamte Inputsaldo gleich oder größer als das angepasste Ziel ist und die generierten Änderungen Staub sind, bedeutet dies, dass die ausgewählten UTXOs ausreichen, um diese Transaktion zu erfüllen. Eine weitere Bedingung, damit die ausgewählten UTXOs die Transaktion erfüllen können , ist, dass ihre Beträge dem angepassten Ziel entsprechen oder darüber liegen, sofern sich die Änderung ändert. Lassen Sie uns die Methode ändern, die Staubrechner gibt den Dust Methodenaufruf zurück und übergibt Dust Methodenaufruf zurück und übergibt die große ganzzahlige Differenz zwischen der gesamten Eingangsbilanz und dem angepassten Ziel als sein Parameter. Schließlich geben wir einfach die ausgewählten UTXOs aus dieser Methode zurück . Lassen Sie uns nun zum Münzauswahltest für einzelne zufällige Ziehungen gehen Münzauswahltest für einzelne zufällige Ziehungen und diesen Test durchführen. Grad. Die Tests wurden bestanden. 51. So werden Segwit erstellt und validiert: In dieser Präsentation erfahren Sie mehr darüber, wie Sie eine Transaktion erstellen. Nehmen wir an, wir haben die Münzauswahl bereits verwendet, um einige UTXOs auszuwählen, die als Input für eine Transaktion ausgegeben werden sollen. In unserer Brieftasche haben wir auch die Möglichkeit, die privaten Schlüssel abzuleiten , die für die Ausgabe dieser UTXOs erforderlich sind. Diese privaten Schlüssel werden benötigt, um die Transaktion später zu signieren. Wir haben bereits eine Adresse für den Versand einiger Bitcoins ausgewählt. Und wir haben die Änderungsadresse , an die die Änderung gesendet wird. Nachdem wir diese Dinge definiert haben, ist es an der Zeit, unsere Transaktion zu erstellen. Sehen wir uns die Felder an, die Teil einer Bitcoin-Transaktion sind . Zuerst das Versionsfeld. Es wird verwendet, um die Regeln zu definieren , denen die Transaktion folgt. Derzeit ist Version eins, die wir verwenden werden , für allgemeine Transaktionen vorgesehen. Version zwei ist für Transaktionen vorgesehen, die dem BIP 68 folgen, das Regeln implementiert, um eine Transaktion erst nach einer bestimmten Zeit zu validieren . Das Feld Lebensdauer wird für einen ähnlichen Zweck verwendet. Sein Wert kann für eine bestimmte Zeit stehen, zu der eine Transaktion zu einem Block hinzugefügt wird, oder Null, um diese Regel zu ignorieren Dann haben wir die Markierung und Markierung von seg . Es ist nur bei Segway-Transaktionen vorhanden. Wenn ihr Wert 0001 ist, wird diese Transaktion als angegeben markiert , was eingegeben Jede Transaktion hat eine oder mehrere Transaktionseingaben. Jede Transaktionseingabe hat eine Transaktions-ID, die eine frühere Transaktion definiert , aus der die aktuelle Eingabe Bitcoins ausgibt. Der Ausgabeindex gibt an , welche Ausgabe aus der vorherigen Transaktion stammt. Der aktuelle Input ist das Ausgeben von Bitcoins. Zusammen werden die Transaktions-ID und der Ausgabeindex als Outpoint bezeichnet. Sie können den Outpoint als Koordinate betrachten, um zu erkennen, auf welche UTXO und Eingabe sich beziehen. Als nächstes haben wir für jede Eingabe das ScriptSig-Feld. In Segmenteingaben. Dieses Feld ist leer und sein Inhalt wird in das Zeugenfeld verschoben. Bei Transaktionen ohne Segmente wird sein Inhalt benötigt, um die Ausgaben des UTXO freizusetzen. Die Eingabe bezieht sich auf. Das Feld n Sequenz definiert , wann die Eingabe gültig ist, um ausgegeben zu werden. Wenn dieser Feldwert dem maximalen Hexadezimalwert für seine Größe entspricht , wird dieses Feld ignoriert. Eine Transaktion hat auch einen oder mehrere Ausgänge. Jede Ausgabe enthält einen Script-Pub-Schlüssel mit Skriptcode, der die Regeln für die Verwendung dieser Ausgabe in einer zukünftigen Transaktion definiert . Jede Ausgabe enthält auch ein Betragsfeld, das die Anzahl der Satoshi definiert, die in dieser Ausgabe gesperrt sind. Schließlich enthalten Transaktionen auch ein Zeugenfeld. Für Transaktionen, die keine Segway-Transaktionen sind, ist dieses Feld leer. Bei Segway-Transaktionen enthält der Zeuge den gesamten Inhalt , der bei Transaktionen ohne Sequitur im ScriptSIG jeder Eingabe enthalten ist. Lassen Sie uns nun darüber sprechen, wie Transaktionseingaben und das Zeugenfeld für Segmenteingaben erstellt Transaktionseingaben und werden. Für jedes ausgewählte UTXO müssen wir einen Transaktionseingang erstellen. Das Transaktions-ID-Feld der Transaktionseingabe entspricht der UTXO-Transaktions-ID. Das Feld für den Ausgabeindex entspricht dem UTXO-Ausgabeindex, in der Bitcoin Core RPC-API-Dokumentation auch als Vout bezeichnet der in der Bitcoin Core RPC-API-Dokumentation auch als Vout bezeichnet wird. Das ScriptSig ist leer und die Endsequenz entspricht diesem Hexadezimalwert, dem maximalen Wert, der für dieses Feld zulässig ist. Außerdem müssen wir für jede Eingabe einen Zeugen erstellen. Das Zeugenfeld enthält eine Signatur, die mit dem privaten Schlüssel abgerufen wurde , der zur Ableitung der UTXO-Adresse verwendet wurde. Und ein öffentlicher Schlüssel, der mit dem vorherigen privaten Schlüssel abgeleitet wurde und der auch dieselbe erwähnte UTXO-Adresse generieren kann . Weitere Informationen zum Unterzeichnungsprozess werden wir in einer zukünftigen Präsentation sehen. Beachten Sie die Dummy-Signaturen und Bupkis, deren Werte eine Reihe von Nullen sein können, können als Platzhalter verwendet werden, um Transaktionen zu erstellen und zu signieren. Dieser Trick erleichtert die Berechnung der Transaktionsgröße gegenüber der Transaktionsgröße vor dem Signieren von Transaktionen. Lassen Sie uns nun darüber sprechen, wie Sie Segue What Outputs erstellen können. Zuerst. Nebenbei bemerkt, es ist möglich, eine Transaktion mit verschiedenen Arten von Ein- und Ausgaben zu erstellen , z. B. in derselben Transaktion können Sie in derselben Transaktion segmentierte und nicht segmentierte Ein- und Ausgaben haben. Zurück zum Hauptthema. Im Allgemeinen möchten wir eine Ausgabe für die Adresse erstellen , an die wir Bitcoins senden möchten, und eine Ausgabe für die Änderungsadresse. Wenn die Transaktion geändert werden muss. Jede Transaktionsausgabe hat ein Skript-Pub-Schlüsselfeld. Jeder Pub-Schlüssel für das Segmentskript, auch bekannt als Pay to Witness Pub Key Hash oder P2, WP k H, hat eine Witness-Version von Null. Die Witness-Version ist eine für Taproot-Skripte. Bedarf können neue Versionen für zukünftige Skripte hinzugefügt werden. Das zweite Script-Pub-Schlüsselelement für Sigmoid-Ausgaben ist ein Public-Key-Hash , der erhalten wird, indem Beck 32 die Adresse für diese Ausgabe dekodiert. Die Transaktionsausgabe hat auch ein Betragsfeld in Satoshi, das den Betrag darstellt, der an diese Ausgabeadresse gesendet wurde. Lassen Sie uns diese Präsentation beenden, indem wir über die Ausführung und Validierung von Segmentskripten sprechen . Wenn ein Knoten eine Transaktion empfängt, beginnt er, sie zu validieren. Für jede Eingabe in einer Transaktion kombiniert der Knoten den Witness aus einer Eingabe mit dem Script-Pub-Schlüssel des UTXO den der Outpoint und Net Input führt das kombinierte Skript aus und validiert es. . Mal sehen, wie das gemacht wird. Hier ist der Script-Pub-Schlüssel eines UTXO und das Witness-Feld, das dieses UTXO ausgeben möchte , beide generieren das folgende kombinierte Skript. Möglicherweise fragen Sie , woher die Opcodes aus dem kombinierten Skript stammen. Es stellt sich heraus, dass ein Knoten, wenn er die Nullversion auf dem Pub-Schlüssel des Segment-Skripts identifiziert , eine spezielle Regel auslöst, Teil des folgenden kombinierten Codes generiert. Als Nächstes wird das kombinierte Skript genau wie Nicht-Sequiturs-Skripte ausgeführt. Aus dem kombinierten Skript werden die Signatur und die öffentlichen Schlüssel zu einem Ausführungsstapel hinzugefügt. Dann dupliziert der OPT-up-Opcode den Pub-Schlüssel im Ausführungsstapel. Hash 160 Hashes, der letzte Pub-Schlüssel, der dem Stack hinzugefügt wurde. Dann wird aus dem kombinierten Skript der Pub-Key-Hash zum Stack hinzugefügt. Up equal verify Opcode entfernt die letzten beiden Elemente aus dem Ausführungsstapel und vergleicht sie. Wenn sie gleich sind, wird das Skript weiter ausgeführt. Schließlich überprüft der Object-Sig-Opcode, ob die Signatur für den im Stack verbleibenden Pub-Schlüssel gültig ist . Wenn es gültig ist, gibt es den Wert TRUE an den Ausführungsstapel zurück. Nachdem alle Skriptelemente zum Ausführungsstapel hinzugefügt wurden, wird die Transaktionseingabe als gültig angesehen , wenn das zuletzt hinzugefügte Element wahr ist. Dieser Vorgang muss für jede Transaktionseingabe wiederholt werden . Damit eine Transaktion als gültig betrachtet werden kann, müssen alle ihre Eingaben gültig sein. Nur zur visuellen Erinnerung: Lassen Sie uns überprüfen, woher jedes Element im Script-Pub-Schlüssel und im Witness während der Transaktionskonstruktion stammt. Der Pub-Schlüssel-Hash, der im Pub-Schlüssel des Skripts vorhanden ist, stammt von Anfang 30 , um die Adresse des ausgegebenen UTXO zu dekodieren. Die Signatur im Zeugen erfolgte durch die Anwendung des ECDSA-Algorithmus , der einen gültigen privaten Schlüssel benötigt. Der öffentliche Schlüssel und der Zeuge stammten aus dem öffentlichen Schlüssel, der aus dem genannten privaten Schlüssel abgeleitet wurde. Derselbe öffentliche Schlüssel wurde in der Vergangenheit verwendet um die Adresse des ausgegebenen UTXO zu generieren , indem nacheinander der Hash-160-Algorithmus und die Back32-Kodierung angewendet wurden. 52. 50 Senden von bitcoin 5 skillshare 2: In diesem Video erstellen wir einen Service zur Erstellung von Transaktionen. Dieser Service befasst sich zunächst nur mit Segmenteingaben und -ausgängen, aber später im Kurs werden wir ihn verbessern. also im Paket api dot services Lassen Sie uns also im Paket api dot services den Transaction Creators Service erstellen. Lassen Sie uns die Service-Anmerkung hinzufügen. Lassen Sie uns auch den Staubrechner hineinspritzen. nun im API-Testpaket Lassen Sie uns nun im API-Testpaket die Service-Testklasse Transaction Creators erstellen. Es wird die Spezifikationsklasse erweitern. Lassen Sie uns den Transaction Creators-Dienst hineinfügen und ihn in der Setup-Methode instanziieren. Muss es mit einem neuen Staubrechner instanziieren 3.000 als Gebührenparameter für Staubrelais ausgibt. Bevor wir diesen Test durchführen, lassen Sie uns mit dem Münzauswahltest für einzelne zufällige Ziehungen um ein wenig zu überarbeiten. Lassen Sie uns diese beiden Methoden aus dieser Klasse herausschneiden und sie in die neue utils Klasse einfügen , die wir im BYOD W-Testpaket erstellen werden . Lassen Sie uns diese beiden Methoden statisch machen. Lassen Sie uns nun die einzelne zufällige Arzneimittelmünze reparieren. Wählen Sie Ihren Test aus, um diese Methoden aus dieser Klasse zu verwenden. Gehen wir nun zum Test des Transaction Creators Service. Lassen Sie uns einen Test erstellen, der eine Transaktion mit dem Hashtag n Eingaben, Eingaben und dem Hashtag erwarteter n Ausgaben und Ausgaben erstellen sollte Transaktion mit dem Hashtag n Eingaben, Eingaben . In dem gegebenen Körper. Lassen Sie uns zunächst diese UTxOS-Variable erstellen und ihr den zurückgegebenen Methodenaufruf utils dot create utxOS zuweisen , wobei die Eingabebetragsvariable als Parameter übergeben wird. Lassen Sie uns nun diese Adresse erstellen, um eine Variable zu senden. Ihr Inhalt entspricht der Variablen mit dem gleichen Namen, der beim Münzauswahltest mit einer zufälligen Ziehung durchgeführt wurde. Lassen Sie uns auch die Variable Adresse ändern erstellen, die der Variablen mit dem gleichen Namen bei der zufälligen Ziehung einer Münze entspricht. Wählen Sie Ihren Test aus. Lassen Sie uns die Gebührensatzvariable erstellen, die 0.000 bis entspricht. Lassen Sie uns auch die Variable für die erwartete Gesamtgebühr definieren, die der erwarteten Größenvariablen multipliziert mit dem Gebührensatz in Satoshi pro V-Biss entspricht . Lassen Sie uns nun den variablen Gesamteingabebetrag erstellen. Sein Wert entspricht dem Ergebnis dieses Ausdrucks, der die Summe aller UTXO-Beträge in Satoshi zurückgibt . Der zu sendende variable Betrag entspricht 100 Millionen Satoshi's. Lassen Sie uns auch den erwarteten Änderungsbetrag berechnen. Es entspricht dem Eingangsbetrag abzüglich der Sandmenge abzüglich der erwarteten Gesamtgebühr. In einem Block rufen wir die Methode Transaction Creator die die folgenden Parameter an diese Methode übergibt. Das Ergebnis wird in der Transaktionsvariablen gespeichert. Im Block dann wird überprüft, ob die Größe der Transaktion v der erwarteten Größenvariablen entspricht. Aber lassen Sie uns zunächst die Bitcoin-Java-Version auf 0.4, 0.2 aktualisieren, um die Methode get v size verfügbar zu machen. Jetzt prüfen wir, ob die Anzahl der Transaktionsausgaben der erwarteten Variablen und der Ausgabevariablen entspricht . Wir prüfen auch, ob der erste Ausgabewert Variablen für den zu sendenden Betrag entspricht. Wenn nun die erwartete Anzahl von Ausgaben größer als eins ist, wird geprüft, ob der Änderungsbetrag dem zweiten Ausgabebetrag in der Transaktion entspricht . Im Wher-Block. Fügen wir die folgenden Testfälle hinzu. Sie können sie von der Seite Projekt und Ressourcen kopieren. Diese Testfälle decken Szenarien mit und ohne Änderungsausgaben sowie mit Eingangsbeträgen , die zu Änderungen führen oder nicht. Sie deckten auch Transaktionen mit 12,3 Eingaben ab. Lassen Sie uns nun die Methode zum Erstellen des Transaction Creators Service erstellen. Lassen Sie uns diese Parameter umbenennen. Bevor wir diese Methode implementieren, erstellen wir die Fee-Klasse im Paket utils. Hier erstellen wir eine Methode zur Berechnung der Transaktionsgebühr in Satoshi's, nennen wir sie die berechnete Gesamtgebühr. Es wird eine Transaktion in Höhe des Gebührensatzes in Bitcoin pro KV erhalten in Höhe des Gebührensatzes in Bitcoin pro . Bite erstellt den folgenden Code in einem Try Catch-Block. Zuerst werden wir den Gebührensatz von Bitcoins pro KV-Fahrrad auf Satoshi is Privy Byte umrechnen . Dann geben wir das Ergebnis zurück, indem die Transaktion v Größe mit dem Gebührensatz in Satoshis pro V-Bit multiplizieren , um eine IOException abzufangen , die mit der guten V-Größenmethode ausgelöst werden kann und schnell in einer neuen Runtime-Ausnahme. Zurück zum Transaction Creators Service. Bei dieser Methode werden zuerst die Transaktionseingaben mit dieser Methode erstellt , die empfangenen UTXOs als Parameter übergeben werden. Lassen Sie uns diese Methode erstellen. Wir geben das Ergebnis der folgenden UTXOS-Streamtransformation zurück der folgenden UTXOS-Streamtransformation wenn der Stream in eine neue Transaktionseingabe nicht eine neue Transaktionseingabe die empfangene UTXO-ID als ersten Parameter übergibt. Der große Integer-Wert des UTXO, der als zweiter Parameter angegeben wurde. Diese beiden Parameter definieren den Outpoint der Transaktionseingabe. Als Nächstes übergeben wir ein neues Skript, mit einer leeren Liste instanziiert wird. Dieser Parameter ist die Transaktionseingabe ScriptSig, die für Segmenteingaben leer ist. Als Nächstes übergeben wir eine große Ganzzahl, mit diesen Parametern instanziiert wird die Eingabe der Reihe nach definiert. Dieser Wert ist der Höchstwert, der für dieses Feld zulässig ist, sodass die Knoten ihn ignorieren. Nun wird für jede Transaktionseingabe im Stream die Peak-Methode verwendet, um den Zeugen festzulegen, instanziiert den Zeugen mit einer Liste, die Konstanten für eine Dummy-Signatur und einen Dummy-Pub-Schlüssel enthält . Lassen Sie uns nun diese Konstanten erstellen. Die Dummy-Signatur entspricht der 144-mal wiederholten hexadezimalen Zeichenfolge Null, deren Größe in Byte gleich 72 ist. Der Dummy-Pub-Schlüssel entspricht der hexadezimalen Zeichenfolge Null, die 66 mal wiederholt wird, deren Größe in Byte gleich 33 ist, setzt diese Dummy-Werte, da sie erforderlich sind, um das korrekt auszuführen Berechnung der Transaktionsgröße gegenüber der Größe, die in der Create-Methode wird. Der Signaturvorgang wird später separat durchgeführt , wenn die tatsächlichen Werte, wir ersetzen die Dummy-Werte. Schließlich konvertieren wir den Stream in eine ArrayList und geben ihn zurück. Jetzt erstellen wir die Transaktionsausgabe für die zu sendende Adresse mit der Buildup-PUT-Methode, die zu sendende Adresse und der zu sendende Betrag als Parameter übergeben werden. Lassen Sie uns diese Methode erstellen. Zuerst analysieren wir das Adresspräfix mit der Parse-Präfixmethode, die erstellt wird. Diese Methode überprüft, ob die Adresse mit einem der gültigen Segmentpräfixe beginnt, und gibt das Adresspräfix oder eine leere Zeichenfolge zurück , falls kein gültiges Präfix gefunden wurde. Jetzt erstellen wir ein Skriptobjekt mit der Skriptklasse P2, WP k h-Skriptmethode. Als Parameter wird das Ergebnis des Methodenaufrufs back 30 to decode übergeben, wobei das Präfix und die Adresse an diesen übergeben werden. Die Rückkehr der Back30-to-Decode-Methode ist ein Objekt-Array, wobei das zweite Element der Pub-Key-Hash ist, der an die P2 WP k h-Skriptmethode übergeben wird. Diese Methode gibt das Äquivalent des Skript-Pub-Schlüssels zurück , wobei der erste Parameter Null und der zweite Parameter der Pub-Schlüssel-Hash ist, wie wir in der letzten Präsentation erklärt haben. Schließlich geben wir eine neue Transaktionsausgabe zurück die mit dem Betrag und dem erstellten Skript instanziiert wurde. Jetzt erstellen wir eine ArrayList, um die Transaktionsausgaben zu speichern, instanziieren sie und fügen die Adresse zum Senden der Ausgabe hinzu, die wir gerade erstellt haben. Als Nächstes erstellen wir die Transaktion, die als Parameter übergeben wird, die große Ganzzahl, die die Transaktionsversion ist. Die Transaktionseingänge, die Transaktionsausgaben. Die große Ganzzahl Null ist die Sperrzeit, die ignoriert wird. Und der boolesche Wert true, um diese Transaktion als Segue-Transaktion zu definieren . Dieser Parameter sorgt dafür, dass die Transaktion die Segway-Markierung und -Flagge erhält. Lassen Sie uns nun die gesamte Transaktionsgebühr mit der berechneten Gesamtmethode F0 berechnen , die wir zuvor in der FI-Klasse erstellt haben . Wir geben die Transaktion und den Gebührensatz als Parameter weiter. Lassen Sie uns auch die Eingabezone dafür berechnen den UTXO-Stream einem Stream von UTXO-Mengen zuzuordnen. Dann verwenden wir die reduzierte Methode, um sie zusammenzufassen. Schließlich konvertieren wir das Ergebnis als Ptosis oder Null, wenn die UTXOs nicht existieren. Als Nächstes berechnen wir die Änderung, die der eingegebenen Summe abzüglich der Sandmenge abzüglich der Gesamtgebühr entspricht eingegebenen Summe abzüglich der Sandmenge . Als Nächstes fügen wir die folgende if-Anweisung hinzu. Mit dem Staubrechner wird überprüft, ob es sich bei der Änderung um Staub handelt. Wenn ja, geben wir die Transaktion so zurück, wie sie ist. Ist dies nicht der Fall, fügen wir der Transaktion eine weitere Ausgabe hinzu , indem wir die Build-Ausgabemethode verwenden, die Änderungsadresse und die große Ganzzahl als Parameter übergeben werden um nur eine an den Ausgabebetrag zu übergeben als Platzhalterwert, da wir die Transaktionsgebühr für die Transaktion, die jetzt zwei Ausgänge hat, neu berechnen jetzt zwei Ausgänge hat, müssen, was eine höhere Gebühr erfordert. Lassen Sie uns also die Gesamtgebühr neu berechnen indem wir die gesamte berechnete F0-Methode verwenden. Lassen Sie uns die Änderung erneut berechnen, die der eingegebenen Summe abzüglich des zu sendenden Betrags abzüglich der neu berechneten Gesamtgebühr entspricht . Lassen Sie uns nun die zuletzt hinzugefügte Transaktionsausgabe aus der Transaktions-Ausgabe-ArrayList entfernen . Lassen Sie uns noch einmal überprüfen, ob es sich bei der neu berechneten Änderung um Staub handelt. Wenn dies der Fall ist, wird die Transaktion unverändert zurückgegeben . Ist dies nicht der Fall, fügen wir der Transaktion mithilfe der Build-Ausgabemethode eine neue Ausgabe hinzu. Dieses Mal übergeben wir den tatsächlichen Änderungswert für die Transaktion mit zwei Ausgaben an diese Methode. Schließlich geben wir die Transaktion zurück. Gehen wir nun zum Transaction Creators Service Test und führen diesen Test durch. Toll, die Tests sind bestanden, seit wir zuvor den Münzauswahltest für einzelne zufällige Ziehungen geändert haben. Lassen Sie uns es auch erneut ausführen, um sicherzustellen, dass wir nichts kaputt gemacht haben. Sie sind großartig. Es funktioniert wie immer. 53. 51 Senden von bitcoin 6 skillshare 2: In diesem Video beginnen wir mit der Erstellung des Fensters, das sich öffnet, wenn wir auf die Schaltfläche Senden klicken. Dieses Fenster enthält Informationen über die Transaktion. Wir senden ein Passwortfeld und eine Schaltfläche „Okay“, um die Übertragung der Transaktion zu bestätigen. also im FXML-Paket Lassen Sie uns also im FXML-Paket die FXML-Datei für den Unterstrich senden von Unterstrichentransaktionen erstellen . Lassen Sie uns das generierte Boilerplate löschen. Lassen Sie uns nun ein Dialoge-Pain-Tag erstellen. Lassen Sie uns nun die Ansicht auf den Scene Builder ändern. Lassen Sie uns die Pref-Höhe für den Dialog auf 300 setzen. Und es ist die bevorzugte Breite auf 650. Und lassen Sie uns die Mindesthöhe als Mindesthöhe festlegen , um die Druckgröße zu verwenden. Lassen Sie uns nun dem Inhalt des Dialogs einen Rasterbereich hinzufügen. Lassen Sie uns diesem Rasterbereich vier weitere Zeilen hinzufügen. Lassen Sie uns nun der ersten Zeile eine Bezeichnung hinzufügen. Lassen Sie uns den Text ändern, um ein Transaktionsfragezeichen zu senden. Erhöhen wir die Schriftgröße auf 16 Pixel. Für die nächsten Zeilen besteht die Idee darin, Labels und Daten für die sendende Transaktion hinzuzufügen . Fügen wir der zweiten Zeile eine Bezeichnung hinzu und ändern den Text so, dass ein Doppelpunkt gesendet werden soll. In der zweiten Spalte derselben Zeile. Lassen Sie uns ein weiteres Label hinzufügen. Diesmal ist der Text leer und wir fügen eine Fx-ID hinzu, damit wir den Inhalt später dynamisch ändern können . Fügen wir in der dritten Zeile ein weiteres Label hinzu, diesmal mit dem Text „ Gesamtgebühren “ in der Zelle auf der rechten Seite. Lassen Sie uns ein leeres Etikett mit einer anderen FX-ID hinzufügen . In der Reihe unten. Lassen Sie uns ein weiteres Bezeichnungspaar für das Gesamtfeld hinzufügen. In der nächsten Reihe. Fügen wir diese Etiketten für den Gebührensatz hinzu. Lassen Sie uns nun dasselbe für die zu sendende Adresse tun. In der letzten Reihe. Lassen Sie uns eine Bezeichnung für das Wallet-Passwort hinzufügen. In der Zelle links. Lassen Sie uns ein Passwortfeld hinzufügen. Es wird eine FX-ID oder ein Wallet-Passwort haben. plötzlichen Beschriftungen fehlt am Ende ein Doppelpunkt. Lass uns sie reparieren. Jetzt. Gehen wir zum Dialogschmerz-Setup und fügen hier eine OK-Schaltfläche hinzu. Lassen Sie uns auch eine Schaltfläche zum Abbrechen hinzufügen. Der Text der Schaltfläche Abbrechen ist in meiner Muttersprache. Wenn das auch Ihr Fall ist, können Sie es wie folgt ändern. Gehen wir zur Editor-Ansicht. Lassen Sie uns zunächst der Schaltfläche Okay eine Fx-Idee von okay hinzufügen. Und lassen Sie uns dem Abbrechen-Button-Tag eine Fx-Idee von Cancel hinzufügen . Lassen Sie uns nun diese Eigenschaft entfernen. Lassen Sie uns die Button-Dateneigenschaft auf diesen Wert setzen und den Text auf Abbrechen setzen. Jetzt können wir im Scene Builder sehen, dass die Änderung wirksam wurde. Gehen wir nun zur Registerkarte Senden FXML. Setzen wir auf der Schaltfläche Senden die Aktionseigenschaft auf Hashtag send, sodass beim Klicken auf diese Schaltfläche die Sendemethode des Tab-Controllers „Senden “ aufgerufen wird. Lassen Sie uns diese Methode erstellen. Bevor wir es implementieren, erstellen wir einen Transaktions-DTL-Eintrag im Domain-Paket. Ttl steht für Data Transfer Object und ist ein gängiges Entwurfsmuster für Objekte deren Hauptzweck darin besteht, Daten zwischen Klassen und Methoden zu übertragen . Daher wird die Transaktion DTO verwendet um Transaktionsdaten zwischen unseren Diensten zu übertragen. Fügen wir die folgenden Felder hinzu. An dieser Stelle fragen Sie sich vielleicht, was der Unterschied zwischen der tatsächlichen Gesamtgebühr und der berechneten Gesamtgebühr ist. Darauf kommen wir gleich zurück. Gehen wir nun zum Tab-Controller „ Senden“. Fügen wir die folgenden Felder hinzu. Diese Felder werden an die entsprechenden Tags in der FXML-Datei der Registerkarte Senden gebunden . Lassen Sie uns nun die Sendemethode implementieren. Zuerst. Wir rechnen den zu sendenden Textbetrag in einen großen Dezimalbetrag um. Jetzt erstellen wir ein Transaktions-DTO-Objekt, das mithilfe des Create Transaction Service erstellt wird. Lassen Sie uns diesen Service in diese Klasse einbauen. Lassen Sie uns es im GUI Dots Services-Paket erstellen. Lassen Sie uns nun damit fertig sein, es in diese Klasse zu injizieren. Hier rufen wir die Methode create auf und übergeben die Adresse, an die der Text gesendet werden soll, und die Betragsvariable. Lassen Sie uns diese Methode erstellen. Jetzt verwenden wir diese Methode, um das Dialogfenster zu öffnen und die Transaktion DTO als Parameter zu übergeben. Lass es uns erstellen. Nach dem Öffnen des Dialogfensters rufen wir die Clear-Methode für die zu sendende Adresse und den zu sendenden Betrag auf die zu sendende Adresse und den zu sendenden Betrag Variablen, um den Inhalt dieser Eingaben zu löschen. Gehen wir nun zum Create Transaction Service. Lassen Sie uns die Service-Anmerkung hinzufügen. Wir werden die Create-Methode implementieren. Die Idee hier ist nun, viele der Dienste, die wir in den vergangenen Videos erstellt haben, zu verwenden , um eine Transaktion und einige zusätzliche Daten für das Transaktions-DTO zu erstellen . Dazu verwenden wir zunächst den Dienst „Gebührenschätzung“, um den Gebührensatz zu ermitteln und ihn in der Gebührensatz-Variablen zu speichern. Also lasst uns diesen Service in diese Klasse einbauen. Und nennen wir die Schätzmethode darauf. Jetzt rufen wir die aktuell geladenen Wallet-Adressen mithilfe des aktuellen Wallet-Objekts ab. Also lasst uns es in diese Klasse injizieren. Dann rufen wir die Methode get addresses as strings auf. Als nächstes bekommen wir all unsere Brieftaschen-Texos. Dafür verwenden wir den Node List Unspent Client. Also lasst uns es in diese Klasse injizieren. Wir rufen die Methode list unspent auf übergeben die Adressen und den aktuellen Wallet-Namen als Parameter. Jetzt verwenden wir die Münzauswahl, um die UTXOs auszuwählen , die als Eingaben für unsere Transaktion verwendet werden. Lassen Sie uns also den Münzselektor in diese Klasse injizieren. Jetzt rufen wir die Select-Methode darauf auf, übergeben die UTXos, den umgerechneten Betrag in Satoshi's, den Gebührensatz, die zu sendende Adresse und die aktuelle Wallet-Wechseladresse rufen den Current Wallet Get Change Address Methode, die erstellt. Lassen Sie uns diese Methode erstellen. Es wird einfach die Eigenschaft „Adresse ändern“ zurückgegeben. Lassen Sie uns diese Eigenschaft als Zeichenfolge erstellen. Lass es uns hierher verschieben. Lassen Sie uns auch einen Setter dafür erstellen. Wir werden es später benutzen. Lassen Sie uns nun den Transaction Creators Service verwenden , um eine Transaktion zu erstellen. Also lasst uns diesen Service in diese Klasse einbauen. Rufen wir dafür die Methode create auf und übergeben ihr die folgenden Parameter. Jetzt, da wir unsere Transaktion haben, werden zusätzliche Daten erstellt , die in die Transaktion DTL aufgenommen werden sollen. Weiter. Lassen Sie uns zunächst die Methode für die tatsächliche Gesamtgebühr der FI-Klasse verwenden, um die tatsächliche Gesamtgebühr zu ermitteln. Die Transaktion und die ausgewählten UTXOs werden als Parameter übergeben . Lassen Sie uns diese Methode erstellen. Der Unterschied zwischen den berechneten Gesamtfüßen und der tatsächlichen Gesamtgebühr besteht darin, dass wir für letztere die Differenz zwischen den Inputs- und Output-Beträgen verwenden , um sie zu berechnen. Bei ersteren haben wir anhand der Transaktionsgröße und des Gebührensatzes geschätzt . Theoretisch wird erwartet, dass beide Werte gleich sind, aber verwenden wir, wenn möglich, standardmäßig die gesamten tatsächlichen Füße, um sicherzustellen, dass wir dem Benutzer die tatsächliche Transaktion zeigen dem Benutzer die tatsächliche Transaktion Gebühr und damit der Benutzer mögliche Buggy-Werte erkennen kann. Also hier berechnen wir die Eingabebeträge, einige davon in Bitcoin, mithilfe der folgenden Stream-Transformation. Wir ordnen den ausgewählten UTxOS-Stream zu, um einen Stream mit UTxOS-Mengen zu erzeugen. Verwenden Sie dann die reduzierte Methode , um alle Werte im Stream zu summieren. Und verwenden Sie die Methode or else, um Null zurückzugeben, wenn die Zeichenfolge leer ist. Lassen Sie uns nun die Ausgabe unter einigen von Satoshi berechnen , die dieselbe Transformation durchführen werden wir für die Eingaben durchgeführt haben, diesmal jedoch mit den Transaktionsausgaben. Jetzt geben wir die Eingabe zurück, die einige in BTC in die von Satoshi umgerechnet wurde, abzüglich der Ausgabe. Zurück zum Create Transaction Service. Lassen Sie uns nun die gesamte berechnete F0-Variable erstellen und ihr das Ergebnis des gesamten berechneten F0-Methodenaufrufs zuweisen . Dieses Mal geben wir die Transaktion und den Gebührensatz als Parameter weiter. Lassen Sie uns nun den Gesamtbetrag berechnen, der , wie der Name schon sagt, der Gesamtbetrag in Satoshi ist , den der Absender für diese Transaktion ausgegeben hat. Verwenden wir dazu die Methode für die Übertragung der Transaktion insgesamt, die tatsächliche Gesamtgebühr und die Adresse als Parameter. Lassen Sie uns diese Methode erstellen. Mit dieser if-Aussage. Lassen Sie uns überprüfen, ob die zu sendende Adresse zu unserer Brieftasche gehört. Wenn nicht, erstatten wir die gesamte tatsächliche Gebühr zuzüglich des Ausgangsbetrags der ersten Transaktion. Wenn unser Wallet es enthält, bedeutet das, dass wir Bitcoins an uns selbst und somit nur die Transaktionsgebühr ausgeben. Schließlich geben wir ein neues Transaktions-DTO-Objekt zurück mit diesen Parametern instanziiert wurde, werden die Dialogfensterfunktion im nächsten Video weiter implementieren . Wir sehen uns. 54. 52 Senden von bitcoin 7 skillshare 2: In diesem Video beenden wir die Implementierung des Transaktionsdialogfensters. Gehen wir also zum Tab-Controller „ Senden“. in der Methode des offenen Dialogs Lassen Sie uns in der Methode des offenen Dialogs ein neues Dialogobjekt wie dieses instanziieren. Rufen wir dann die Unit Owner-Methode dafür auf übergeben das Fensterobjekt als Parameter, wie folgt. Lassen Sie uns den Titel des Dialogs festlegen, um die Transaktion zu senden. Mit dem folgenden Code definieren wir nun, dass das Dialogfenster geschlossen wird, wenn wir im Dialogfenster auf die Schaltfläche Schließen klicken geschlossen wird, wenn wir im Dialogfenster auf die Schaltfläche . Als Nächstes erstellen wir ein FXML-Loader-Objekt in einem try-Catch-Block. Um es zu instanziieren, muss die Dialog-FXML-Ressource in diese Klasse eingefügt werden. Lass es uns machen. Fügen wir diesem Feld eine Wertanmerkung hinzu, die den Pfad des Sin-Transaktionsdialogs FXML angibt. Hier rufen wir die Methode get URL dazu auf. Dann verwenden wir Null in diesen Parametern. Und den Kontext erhalten Sie hier die Referenz zur Beam-Methode. Lassen Sie uns zunächst das Kontextobjekt eines Feldes in dieser Klasse erstellen und es hier zuweisen. Jetzt setzen wir den Inhalt des Dialogs auf das Ergebnis des Aufrufs der Lademethode FXML Loader. Mit dem folgenden Code wird nun der Syn-Transaktionsdialog-Controller vom FXML-Loader abgerufen. Lassen Sie uns diesen Controller in der Controller-Klasse erstellen. Schließlich übergeben wir das Transaktions-DTO-Objekt mithilfe der set-Transaktionsmethode an den sin-Transaktionsdialog-Controller . Lassen Sie uns diese Methode erstellen. Hier fangen wir eine IOException ab, die der FXML-Loader auslösen kann und sie in eine neue Runtime-Exception umwandeln. Dann zeigen wir den Dialog mit dieser Methode. Bevor wir nun den zweiten Transaction Dialogue Controller implementieren , gehen wir zum Update Current Wallet Service über. Wenn wir die aktuelle Brieftasche aktualisieren, müssen wir ihre Änderungsadresse angeben, die beim Senden einer Transaktion verwendet wird. Also lass es uns machen. Dazu holen wir uns den zweiten erweiterten öffentlichen Schlüssel aus der erstellten Wallet. Denken Sie daran, dass dieser erweiterte Schlüssel zur Generierung von Änderungsadressen abgeleitet wurde . Dann erhalten wir seine erste Adresse und legen sie als aktuelle Wallet-Änderungsadresse fest. Gehen wir nun zum zweiten Transaction Dialogue Controller. Lassen Sie uns die Komponentenannotation darauf festlegen. Gehen wir nun zum zweiten Transaktionsdialog FXML über. Lassen Sie uns die Dialogue Pain FX-ID festlegen. Und lassen Sie uns hier die FX-Controller-Eigenschaft auf den kürzlich erstellten Controller-Pfad setzen . Jetzt setzen wir jedes Tag mit einer Ethik-ID in dieser Datei, diese Felder im zweiten Transaktionsdialog-Controller mithilfe dieser coolen IDE-Funktion. Lassen Sie uns nun festlegen, dass jedes Feld hier privat ist. Lassen Sie uns die FXML-Annotation über allen hinzufügen. Bevor wir die Methode Set Transaction implementieren, erstellen wir die Transaktionsdialogdomäne im Domain-Paket . Ich werde diesen Rekord bald brauchen. Es modelliert die Felder, die im Transaktionsdialog angezeigt werden . Lassen Sie uns also diese Felder erstellen. Lassen Sie uns das auch aus der Methode erstellen . Es wird ein neuer Transaktionsdialog aus einem Transaktions-DTO erstellt . Wir verwenden das Bitcoin-Format oder die Bitcoin-Formatierungsmethode, um den Betrag korrekt zu analysieren und die tatsächliche Gesamtgebühr zu senden . Der gesamte ausgegebene wird auch dem Gebührensatz und der Adresse der Transaktion übergeben DTO zur Instanziierung des Transaktionsdialogs. Zurück zum zweiten Transaktionsdialog-Controller. in der Set-Transaktionsmethode Lassen Sie uns in der Set-Transaktionsmethode das Feld Transaktion D TO auf den DTO für empfangene Transaktion setzen . Lassen Sie uns dieses Feld in dieser Klasse erstellen. Lassen Sie uns nun das Transaktionsdialogobjekt mit seiner From-Methode erstellen Transaktionsdialogobjekt mit seiner From-Methode , die den Transaktions-DTO als Parameter übergibt. Dann legen wir den Betrag fest, der Text an den Transaktionsdialog gesendet werden soll. Der zu sendende Betrag wird im Feld Gesamtgebühren auf den Transaktionsdialog, Gesamtgebühr, gesetzt . Der gesamte Feldtext des Transaktionsdialogs summiert den Gebührensatzfeldtext für den Transaktionsdialog. Gebührensatz verkettet mit der Zeichenfolge BTC Slash KV. Beißen. Lassen Sie uns die Adresse festlegen , um Feldtexte an die zu sendende Transaktionsdialogadresse zu senden. Lassen Sie uns nun die initialisierte Methode in dieser Klasse erstellen. Hier wird die Abbrechen-Schaltfläche an eine Aktion gebunden , die das Dialogfenster schließt. Rufen wir dazu im Dialogfenster die Methode Lookup Button auf und übergeben ihr das Abbrechen-Feld. Dann rufen wir diese Methode auf, um der Abbrechen-Schaltfläche einen Ereignishandler hinzuzufügen . Der Handler erhält ein Aktionsereignis und ein Ereignis als Parameter. Und der Handler-Body verwendet diese Anweisung, um das Dialogfenster zu schließen. Gehen wir nun zum Test zum Senden von Bitcoins über. In diesem Test fehlt etwas. Nachdem wir die Methode Send Bitcoin and Wait aufgerufen haben, müssen wir den Knoten anweisen, einen Block zu minen, damit unser UTXO bestätigt wird und zur Erstellung einer Transaktion verwendet werden kann. Um das zu handhaben, rufen wir die Methode generate to address auf dem Node generate auf, um den Client zu adressieren, der diese Parameter an ihn übergibt die Methode generate to address auf dem Node generate auf, um den Client zu adressieren . Und lassen Sie uns diese Codezeile hierher verschieben. Lassen Sie uns nun unseren Knoten ausführen. Und lassen Sie uns diesen Test durchführen. Wie erwartet ist der Test fehlgeschlagen, aber der Transaktionsdialog wurde geöffnet und mit Transaktionsdaten gefüllt. Lassen Sie uns diesen Test nun verbessern. Prüft, ob die Werte im Transaktionsdialog korrekt sind. Aber lassen Sie uns diesen Test zunächst widerstandsfähiger machen. Nachdem Sie auf die Schaltfläche Senden geklickt wird ein Code hinzugefügt, um sicherzustellen, dass wir warten bis der Transaktionsdialog angezeigt bevor wir im Dialogfenster handeln. Lassen Sie uns also das Gewicht für die Dialogmethode festlegen. Hier nennen wir das Gewicht als Methode. Das Übergeben dieser Parameter an Warte-Timeout-Sekunden im Lambda-Text führt zu Problemen beim Dialog und kehrt erst zurück, wenn er nicht Null ist. Lassen Sie uns nun den Wert für jedes Label im Transaktionsdialog abrufen und in den folgenden Variablen speichern. Fügen wir hier den Transaktionszeilentyp hinzu. Und lassen Sie uns den Namen der Tabellenansicht in die Transaktionstabelle ändern . Fügen wir im Block dann die folgenden Assertionen hinzu, um zu überprüfen, ob die Bezeichnungen im Transaktionsdialog korrekt sind. nun im Where-Block einen Testfall hinzufügen, Lassen Sie uns nun im Where-Block einen Testfall hinzufügen, um die Variablen zu füllen , auf die wir gerade im Thann-Block verwiesen haben. Hier fehlt ein Gleichheitszeichen. Lass es uns reparieren. Lassen Sie uns einen weiteren Testfall hinzufügen. Lassen Sie uns nun diese Zeilen entfernen. Passt den Code an, um frühere Transaktionen gemäß der vorherigen UTXos-Nummernvariablen zu erstellen . Also wird für jedes in dieser Variablen definierte UTXO nach der Empfangsadresse gesucht. Dann rufen wir die Methode send Bitcoin and wait mit diesen Parametern auf. Lassen Sie uns nun den Parameter im richtigen Methodenaufruf durch die Variable Betrag, der gesendet werden soll, ersetzen . Jetzt müssen wir sicherstellen, dass der Gebührensatz 0,002 beträgt , damit der Test funktioniert. Dazu fügen wir den Dienst für die Node Estimate Fee in diese Klasse ein und fügen ihr die Mock-Bean-Annotation hinzu. dann in der Setup-Methode wir dann in der Setup-Methode den folgenden Code hinzu. Es stellt sicher, dass, wenn die Schätzmethode des Dienstes aufgerufen wird, der von uns gewünschte Gebührensatz zurückgegeben wird. In diesem Perimeter dieser Suchmethode fehlt der Buchstabe S am Ende. Es sind die Gesamtgebühren. Lassen Sie uns jetzt den Test durchführen. Es ist fehlgeschlagen, aber beachten Sie aus dem falschen Grund, dass der zu sendende Betrag für das Etikett leer ist. liegt daran, dass es im Send Tab Controller ein anderes Label mit derselben FX-ID gibt. Es gibt auch ein Feld für die zu sendende Adresse mit derselben FX-ID. Gehen wir zum zweiten Transaktionsdialog-Controller , um das zu beheben. Lassen Sie uns dieses Feld so umbenennen, dass ein Dialog gesendet werden soll. Und lassen Sie uns das Feld Adresse, um das Feld zu senden, in die Adresse umbenennen , um den Dialog zu senden. Gehen wir zum Dialog „ Transaktion senden“ FXML, um die FX-IDs der Labels zu ändern. Okay, das müssen wir nicht, denn die IDE hat diesen Job für uns erledigt. Zurück zum Bitcoin-Test senden. Lassen Sie uns diese Parameter aktualisieren , um nach den richtigen Labels zu suchen. Lassen Sie uns jetzt unseren Test durchführen. Okay, die Tests sind fehlgeschlagen, aber nur, weil die Transaktionstabelle nicht die erwartete Anzahl von Transaktionen enthält. Das bedeutet, dass die Bezeichnungen des Transaktionsdialogs korrekt sind. Großartig. 55. So funktionieren Transaktionssignaturen: In dieser Präsentation zeigen wir, wie Transaktionssignaturen funktionieren. Lassen Sie uns zunächst die Felder einer Transaktionseingabe überprüfen. Transaktionseingaben haben ein Transaktions-ID-Feld, dessen Inhalt angibt, aus welcher Transaktion das diese Eingabe ausgegebene UTXO stammt. Das Feld für den Ausgabeindex gibt an, welchen UTXO der vorherigen Transaktion die Eingabe ausgibt. Zusammen ergeben beide Felder einen Outpoint , der eindeutig angibt, welches UTXO die Eingabe ausgibt. Das ScriptSig-Feld ist leer für Segue-Transaktionseingaben. Es enthält ein Entsperrskript für Transaktionseingaben ohne Segue. Das Entsperren von Skripten ist eine Signatur und ein öffentlicher Schlüssel für gängige Transaktionen. Schließlich enthält die Transaktionseingabe das Endsequenzfeld. Das Feld für die Endsequenz definiert , wann die Eingabe gültig ist, um ausgegeben zu werden. Dieses Feld wird ignoriert, wenn sein Wert dem maximalen Hexadezimalwert für seine Größe entspricht . Eingaben für Segue-Transaktionen wird der Inhalt, der für Transaktionen ohne Segway-Status im ScriptSig enthalten ist, in das Zeugenfeld verschoben. Die Signatur in diesem Feld ist eine ECDSA-Signatur die unter Verwendung des privaten Schlüssels abgerufen wurde, der zur Ableitung der Adresse des UTXO verwendet wird . Der Input ist Geld. Das andere Feld im Zeugen ist der öffentliche Schlüssel, dem privaten Schlüssel abgeleitet ist, auf den wir gerade Bezug genommen haben. Aber warte, was ist eine ECDSA-Signatur? Ecdsa steht für Elliptic Curve Digital Signature Algorithm. Es ist ein Signaturalgorithmus, der einen privaten Schlüssel und eine Nachricht kombiniert , um eine Signatur zu erzeugen. Und die ECDSA-Signatur hat eine Eigenschaft , mit der überprüft werden kann, ob sie gültig ist, das heißt, zu überprüfen, ob eine bestimmte Signatur durch einen bestimmten privaten Schlüssel und eine Nachricht mithilfe des öffentlichen Schlüssels erzeugt wurde und eine Nachricht mithilfe . abgeleitet von diesem privaten Schlüssel, der Nachricht und der Signatur. Auf diese Weise können wir überprüfen, ob eine Signatur gültig ist , ohne den privaten Schlüssel preiszugeben mit dem sie generiert wurde. Sie können das ECDSA verwenden, um jede Nachricht zu signieren, die Sie möchten. Im Fall einer Transaktionssignatur handelt es sich bei der signierten Nachricht um eine modifizierte Version der serialisierten Transaktion. Schauen wir uns also an, wie Bitcoin-Transaktionen signiert werden. Um eine Transaktion zu signieren, müssen Sie jede Transaktionseingabe separat signieren. Für jede Transaktionseingabe mit einer verrückten Transaktion beginnt. Dies ist eine Transaktion, deren Eingaben ein leeres Skript, CIGS und Zeugen enthalten. Sie erstellen einen Signatur-Hash , der der Hash einer modifizierten Version der serialisierten Transaktion ist. Dazu verwenden Sie einen Signatur-Hash-Algorithmus , den wir auf der nächsten Folie erläutern werden. Der Signatur-Hash ist die Nachricht, die mit einem privaten Schlüssel signiert werden soll mit einem privaten Schlüssel signiert für diese Eingabe gültig ist, und der Signatur-Hash verwendet den ECDSA, um die Signatur zu generieren. Denken Sie daran, dass der gültige private Schlüssel für eine Eingabe derselbe private Schlüssel ist , der verwendet wird, um die Adresse aus dem UTXO zu generieren , das die Eingabe ausgibt. Wenn es sich bei der Eingabe um eine Segmenteingabe handelt, fügen Sie dem Zeugen die Signatur und den öffentlichen Schlüssel hinzu, der vom verwiesenen privaten Schlüssel abgeleitet wurde. Andernfalls fügen Sie diese Elemente dem Eingabefeld ScriptSig hinzu. Wenn Knoten eine Transaktion erhalten, überprüfen sie, ob die Transaktionssignaturen gültig sind. Dazu verwenden sie der vorherigen Folie genannten Algorithmus zur Signaturüberprüfung . Das tun sie während der Skriptausführung wie in der letzten Präsentation erklärt. Sehen wir uns nun an, wie der Signatur-Hash generiert wird. Es gibt verschiedene Signatur-Hash-Algorithmen für Segue-, Non-Segment- und Tap-Root-Transaktionseingaben. Die drei Algorithmen modifizieren die Transaktion jedoch auf irgendeine Weise und erzeugen einen Hash ist die Nachricht , die signiert wird. Sehen wir uns den Signatur-Hash-Algorithmus für Segmenteingaben an. Um einen Signatur-Hash für eine bestimmte Transaktionseingabe zu erstellen, beginnen Sie mit einer leeren Zeichenfolge, fügen Sie dann die Transaktionsversion zur Zeichenfolge und verketten Sie alle Outpoints aus den Transaktionseingaben. Hashen Sie die Ergebnisse mit dem Hash-256-Algorithmus , hängen Sie den resultierenden Hash an die Zeichenfolge an und verketten Sie dann alle Eingaben und Sequenzen. Hash 256 das Ergebnis und füge den Hash an die Zeichenfolge an. Fügen Sie nun den Outpoint der Eingabe, die signiert wird, zur Zeichenfolge hinzu. Fügt der Zeichenfolge den Script-Pub-Schlüssel der UTXOs hinzu, die für die Signierung der Eingabe ausgegeben wurden. Addiert den Betrag der UTXOs die durch die signierte Eingabe ausgegeben wurden, zur Zeichenfolge. Fügen Sie die Endsequenz der signierten Eingabe zur Zeichenfolge hinzu und verketten Sie alle Transaktionsausgaben. Hash 256, das Ergebnis, füge den resultierenden Hash an die Zeichenfolge an und füge der Zeichenfolge die Transaktionssperrzeit hinzu. Fügen Sie der Zeichenfolge den Hashtyp hinzu, bei dem es sich um Sig Hash all für allgemeine Transaktionen handelt. Es gibt andere Hash-Typen, aber sie werden selten verwendet. Sie definieren die Ein- und Ausgänge. Die signierte Eingabe kann innerhalb einer Transaktion enthalten sein. Signe Hash. Alles bedeutet, dass die erzeugte Signatur nur in einer Transaktion mit allen Ein- und Ausgaben der angegebenen Transaktion gültig ist einer Transaktion mit allen Ein- . Schließlich Hash 256, die erhaltene Zeichenfolge. Das Ergebnis ist der Signatur-Hash für die signierte Eingabe. Für jede signierte Transaktionseingabe muss ein Signatur-Hash abgerufen werden. Der Prozess wird von Knoten repliziert , wenn sie die Transaktionssignaturen überprüfen. 56. Wie unsere Geldbörse und Knoten mit gesendeten Transaktionen umgehen: In dieser Präsentation wird erklärt, was passiert , wenn wir eine Transaktion an einen Bitcoin-Knoten senden. Dann werden wir sehen, wie unser Wallet derzeit mit empfangenen Transaktionen umgeht und wie wir es ändern wollen, um die Transaktionsadressen und das gesamte Wallet-Guthaben nach dem Senden einer Transaktion korrekt zu berechnen Transaktionsadressen und das . Schauen wir uns also an, wie ein Bitcoin-Knoten mit Transaktionen umgeht, die von unserer Brieftasche gesendet werden. Unser Wallet sendet Transaktionen über die Note-RPC-Methode namens Send Raw-Transaktion an unseren Knoten. Unsere Anwendung sendet die Signentransaktion in einem Hexadezimalformat an unseren Knoten. Nach Erhalt der Transaktion validiert der Knoten sie. Wenn die Validierung bestanden ist, überträgt der Knoten die Transaktion an andere Knoten im Bitcoin-Netzwerk. Die anderen Knoten tun dasselbe, bis alle Knoten im Netzwerk die Transaktion bestätigt haben. Die Transaktion bleibt eine Weile im Kopf und wartet darauf, dass ein Minderjähriger sie in einen Block aufnimmt und den Block damit gemint. Schließlich überträgt ein Minderjähriger den Mindblock mit der Transaktion an andere Knoten im Netzwerk. Da die Knoten mit der Transaktion den Mindblock erhalten, wird die Transaktion von der mentalen Transaktion ausgeschlossen und als bestätigt betrachtet. Jeder Block, der nach dem Block mit der Transaktion hinzugefügt wird, fügt der Transaktion eine Bestätigung hinzu. Es wird empfohlen, auf sechs Konformationen zu warten bis eine Transaktion als irreversibel angesehen wird. Sehen wir uns nun ein naives Modell an, wie unser Wallet mit Sendetransaktionen umgehen kann. Nachdem unser Wallet eine Transaktion an unseren Node gesendet hat, sendet der Node dieselbe Transaktion über Null MQ zurück, dieselbe Transaktion an unsere Anwendung. Unser Node-Task-Service erkennt die Transaktion und sendet sie an unseren Transaction Received Listener. Da die meisten Transaktionen eine Änderungsausgabe haben, der Empfänger der Transaktion in der Regel überprüft der Empfänger der Transaktion in der Regel, dass die Änderungsadresse aus unserem Wallet stammt. Und wir werden den Update utxOS-Dienst verwenden um unsere Wallet-Adressen, Transaktionen und Salden zu aktualisieren , verlassen uns jedoch nur auf den empfangenen Transaktions-Listener , wie er derzeit ist , um unsere Die Brieftasche wird einige Probleme aufwerfen. Erstens werden bei der Saldenberechnung des aktualisierten UTxOS-Dienstes die Eingangssalden nicht berücksichtigt. Wir müssen also die Art und Weise ändern, wie unser Wallet ein Kleid und den Transaktionssaldo berechnet , um die eingegebenen Beträge von den Änderungsbeträgen zu diskontieren. Aber wir werden uns mit diesem Modell mit einem größeren Problem auseinandersetzen müssen. Was ist mit Transaktionen ohne Veränderung? In diesem Fall betrachtet der empfangene Transaktions-Listener die Empfangstransaktion nicht als unsere, da nur die Ausgabeadressen überprüft werden und die Duftausgabe nicht aus unserem Wallet stammt. Daher würde unsere Anwendung nicht aktualisiert werden. Es ist für diese Fälle ausgewogen und wird die folgende Strategie verfolgen, um diese Probleme zu lösen , wenn wir unser Wallet nach dem Senden von Transaktionen aktualisieren . Nach dem Senden der Transaktion an unseren Knoten wird ein Ereignis veröffentlicht, das von einer Transaktion gesendet wird , die von einem transaktionsgesendeten Listener erfasst wird. Dann verwendet der Transaction Send Listener den Dienst Update utxOS, um das Wallet mit der Transaktion zu aktualisieren , um das Problem zu beheben , dass Transaktionen nicht ohne Änderung aktualisiert werden, sowohl die Transaktion Listener und der Block-Empfangs-Listener verwendet einen Node List Transactions Client, um im Knoten nach allen Transaktionen zu suchen , die sich auf unser Wallet beziehen Dieser Client sendet eine Liste von Transaktionen RPC rufen Sie unseren Node an , der alle relevanten Transaktionen an den Kunden zurückgibt . Mithilfe der Retourentransaktionen aktualisiert der UTxOS-Dienst dann aktualisiert der UTxOS-Dienst dann alle Transaktionen in unserer Brieftasche und deren Guthaben korrekt. 57. 55 Senden von bitcoin 8 skillshare 2: In diesem Video werden wir einige Kurse und Dienste erstellen , mit denen wir Transaktionen signieren und senden können. Lassen Sie uns zunächst eine Klasse namens Transactions Signer Service im Paket api dot services erstellen . Lassen Sie uns die Service-Anmerkung hier hinzufügen. Lassen Sie uns nun die Sign-Methode hier erstellen. Es benötigt ein Transaktionsobjekt mit mnemonischem Startwert, ein Passwort und eine Liste von UTXO-DTLs, die eine Klasse erstellen wird. Lassen Sie uns es also im Domain-Paket erstellen. Jetzt verwenden wir die Stream-Range-Methode, um jeden UTXO-DTO in Schleifen zu durchlaufen. Für jedes UTXO-DTO rufen wir die Zeichenmethode auf und übergeben den Parameter a , der der Index der zu signierenden Eingabe ist , den UTXO DTO, der mit dem i-Parameter die Transaktion erhält , der mnemonic Seed und das Wallet-Passwort. Lassen Sie uns diese Methode erstellen. Lassen Sie uns diesen Parameternamen in eine mnemonische Startzeichenfolge ändern , um eine Transaktionseingabe zu signieren. Zuerst müssen wir den gültigen privaten Schlüssel ableiten, um den UTXO freizuschalten, den die Eingabe ausgibt. Wenn Sie sich genauer daran erinnern möchten , wie das gemacht wurde, schauen Sie sich die Präsentation der HD-Wallets und Bitcoin-Adressen noch einmal an. Also zuerst instanziieren wir hier ein mnemonisches Seed-Objekt, indem wir den mnemonischen Startstring und die Instanziierung übergeben. Jetzt leiten wir einen Masterschlüssel mit der Methode mnemonic seed to master key ab, da seine Parameter das Passwort übergeben. Und dieses Präfix. Für unseren Anwendungsfall ist es in Ordnung, das private Hauptpräfix Net zu übergeben , auch wenn wir es in einer anderen Umgebung verwenden, da es sich nur auf die Masterschlüssel-Serialisierung und nicht auf den Ableitungsprozess auswirkt . Bei der Ableitung des Masterschlüssels leitet das zu Master-Key-Verfahren zunächst den Root-Seed ab , der in der zuvor genannten Präsentation erwähnt wird . Jetzt leiten wir den erweiterten privaten Schlüssel mithilfe der Master-Key-CKD-Methode ab, da sein erster Parameter den UTXO-DTO-Ableitungspfad übergibt . Lassen Sie uns zunächst dieses Feld im UTXO DTO erstellen. Und lassen Sie uns die Gelegenheit nutzen, um das Mengenfeld hinzuzufügen , das als Nächstes benötigt wird. Der nächste Parameter ist true, was bedeutet, dass wir einen erweiterten privaten Schlüssel, einen erweiterten öffentlichen Schlüssel, ableiten möchten einen erweiterten privaten Schlüssel, einen erweiterten öffentlichen Schlüssel, ableiten . Der letzte Parameter ist das private Hauptpräfix von Net. Auch hier ist es kein Problem, das Hauptnetzpräfix zu verwenden. Beachten Sie, dass die Art und Weise, wie wir den erweiterten privaten Schlüssel hier abgeleitet haben, der Art und Weise ähnelt wie wir den erweiterten öffentlichen Schlüssel und den erweiterten öffentlichen Schlüsseldienst ableiten . Wir verwenden denselben Ableitungspfad, mit dem wir den erweiterten öffentlichen Schlüssel erstellt haben , um die UTXO-Adresse für unser Wallet abzuleiten . Jetzt erhalten wir den gewünschten privaten Schlüssel, indem wir ihn einfach mit der Methode mit zwei privaten Schlüsseln aus dem erweiterten privaten Schlüssel extrahieren . Diese Methode ist in der nächsten Bitcoin-Java-Version verfügbar . Gehen wir also zur POM-Datei, um sie zu aktualisieren. Jetzt können wir in einem try-catch-Block endlich die Methode sign aus der Transaktions-ECDSA-Signer-Klasse von Bitcoin Java verwenden . Bei dieser Methode werden die Transaktion, der private Schlüssel, der Eingabeindex und der UTXO-DTO-Betrag in den von Satoshi umgewandelt. Und der boolesche Wert true , der angibt, dass diese Eingabe segmentiert ist. Dieselbe Methode erhält einen Signatur-Hash mit dem privaten Schlüssel. Wir verwenden den ECDSA, um eine Signatur für diese Eingabe zu erhalten. Dann fügt es die Signatur und den öffentlichen Schlüssel, der vom letzten privaten Schlüssel abgeleitet in den Transaktionszeugnis ein. Der UTXO-Betrag wird für den Signatur-Hash benötigt, und der letzte True-Parameter wird benötigt die korrekte Signatur-Hash-Generierung zu generieren und die Signatur und den öffentlichen Schlüssel korrekt zum Zeugen hinzuzufügen statt im ScriptSig, was bei Eingaben ohne Segmente der Fall ist. Schließlich fangen wir eine mögliche IOException ab, die die Methode sign auslösen kann, und wickeln sie in eine neue Runtime-Exception um. Lassen Sie uns nun den Node Send Raw Transaction Client im Node Dot Client-Paket erstellen . Dieser Service wird erforderlich sein, um unsere Transaktionen an unseren Bitcoin-Knoten zu senden . Lassen Sie uns die Service-Anmerkung hinzufügen. Lassen Sie uns den Node-Client in diese Klasse injizieren. Und lassen Sie uns die Sendemethode erstellen. Es akzeptiert eine hexadezimale Transaktionszeichenfolge als Parameter. Hier rufen wir die Node-Client-Make-Request-Methode auf. Wir verwenden es, um die RPC-Methode „ Bitcoin-Knoten senden“ für die Transaktion aufzurufen . Lassen Sie uns wie gewohnt ein neues parametrisiertes Typreferenzobjekt übergeben . Hier. Die URL ist leer und wir übergeben den Transaktions-Hex-Parameter als letzten Parameter. nun im GUI Dots Services-Paket Lassen Sie uns nun im GUI Dots Services-Paket den zweiten Transaktionsdienst erstellen. Dieser Service ist für die Unterzeichnung und den Versand der kreativen Transaktion verantwortlich . Nachdem wir im Transaktionsdialog auf die Schaltfläche Senden geklickt haben, fügen wir die Service-Annotation zu dieser Klasse hinzu. Und lassen Sie uns die Methode zum Signieren und Senden erstellen. Es wird eine Zukunft vom Typ Void zurückgeben. Und es werden die Transaktion DTO und das Wallet-Passwort als Parameter verwendet. Nun erstellen wir zunächst eine Liste von UTXos, cTOs, indem wir die ausgewählten UTXos aus der Transaktion DTO konvertieren . Wir rufen die Methodenmap für den ausgewählten UTXOS-Stream auf und verwenden den UTXO DTO Builder, um das UTXO d t goes aus jedem UTXO-Objekt zu erstellen . Lassen Sie uns also den UTXO DTO Builder in diese Klasse injizieren. Lassen Sie uns es im GUI Dot Services-Paket erstellen. Lassen Sie uns nun diese Build-Methode erstellen. Es wird ein UTXO-DTO zurück an den Center-Transaktionsdienst zurückgeben. Hier wird die Listenmethode zurückgegeben den resultierenden Stream aufgerufen wurde. Lassen Sie uns hier umgestalten, um die Methodenreferenz anstelle eines Lambdas zu verwenden . Lassen Sie uns nun diese Methode implementieren. Zuerst. Lassen Sie uns die Service-Annotation zu dieser Klasse hinzufügen. Hier erhalten wir das aktuelle Wallet-Adressobjekt das der empfangenen UTXO-Adresse entspricht. Lassen Sie uns also zuerst die aktuelle Brieftasche in diese Klasse injizieren. Jetzt rufen wir die Methode get address auf übergeben die UTXO-Adresse als Parameter. Lassen Sie uns diese Methode erstellen. Es wird ein Adressobjekt zurückgegeben. Hier wird das Ergebnis des Aufrufs der Methode get address im Adressfeld zurückgegeben , wobei die empfangene Adresse als Parameter übergeben wird. Schließlich rufen wir den aktuellen Wallet-Adressindex ab und speichern ihn in der Adressindexvariablen. Jetzt rufen wir dieselbe Adresse aus der aktuellen Brieftasche ab und rufen ihren Adresstyp ab, indem ihn in der Adresstypvariablen speichern. Jetzt erhalten wir den UTXO-Ableitungspfad, indem wir die Build-Ableitungspfad-Methode mit dem Adresstyp und dem Adressindex aufrufen die Build-Ableitungspfad-Methode mit . Lassen Sie uns diese Methode erstellen. Hier. Wir verwenden das Adresskonfigurationsobjekt, um einen Teil des Ableitungspfads abzurufen. Also lasst uns es in diese Klasse injizieren. Eigentlich wird es eine Liste von Adresskonfigurationen sein. Lass es uns reparieren. Nun verwenden wir aus dem Stream der Adresskonfigurationen die Filtermethode, um die für den Adresstyp gültige Adresskonfiguration auszuwählen . Dann verwenden wir die Find First-Methode und erhalten die gewünschte Adresskonfiguration. Schließlich rufen wir den Ableitungspfad aus der Adresskonfig ab und verketten ihn mit der folgenden Zeichenfolge. Wir fügen einen Schrägstrich und dann den Adressindex hinzu. Hier wird ein neues UTXO-DTO zurückgegeben das den Ableitungspfad und den UTXO-Betrag übergibt. Zurück zum Sendetransaktionsservice. Hier benötigen wir den Transaction Signer Service. Also lasst uns es in diese Klasse injizieren. Jetzt rufen wir dieselbe Methode auf, da ihre Parameter die Transaktion DTO-Transaktion, den aktuellen Wallet-Seed, übergeben . Lassen Sie uns also die aktuelle Brieftasche in diese Klasse injizieren. Lassen Sie uns diese Methode in der aktuellen Brieftasche erstellen. Es wird eine Zeichenfolge zurückgegeben. Hier wird das mnemonische Saatfeld zurückgegeben. Lassen Sie uns dieses Feld erstellen. Und lassen Sie uns einen Setter für dieses Feld hinzufügen. Der dritte Parameter dieser Methode ist das Wallet-Passwort. Der nächste Parameter ist der UTXO ctOS. In einem Try-Catch-Block wird nun der Node Send Raw Transaction Client verwendet , um eine signierte Transaktion an unseren Knoten zu senden . Also lasst uns es in diese Klasse injizieren. Wir rufen dafür die Methode send auf übergeben die serialisierte DTL-Transaktion der Transaktion mithilfe der serialisierten Methode, wird eine IOException abgefangen und in eine neue Runtime-Ausnahme umgewandelt. Jetzt verwenden wir die Anwendung Event Publisher. Also lasst uns es in diese Klasse injizieren. Wir verwenden es, um ein neues Transactions Send-Event zu veröffentlichen, indem wir dieses Ereignis und den Transaktions-DTO als Parameter übergeben. Lassen Sie uns also das Ereignis „Transaktion gesendet“ im GUI-Punkt-Ereignispaket erstellen . Lassen Sie uns den ersten Parameter der Konstruktorsignatur ändern , um ein Objekt zu akzeptieren. Und lassen Sie uns dieses Objekt an den Superkonstruktor übergeben. Und lassen Sie uns das Transaktions-DTO-Feld auf das DTO für empfangene Transaktionen setzen . Lassen Sie uns dieses Feld zu dieser Klasse hinzufügen. Und lassen Sie uns einen Getter dafür erstellen. Wir werden dieses Event später nutzen. Zurück zur Methode Sign and Send gibt hier ein neues asynchrones Ergebnis zurück, wobei Null als Parameter übergeben wird. Fügen wir dieser Methode die asynchrone Anmerkung hinzu übergeben den Standard-Executor-Dienst als Parameter. Denken Sie daran, dass wir das tun, um diese Methode asynchron auszuführen ist unsere Richtlinie bei der Kommunikation mit unserem Knoten. Okay, wir haben das mnemonische Startfeld in der aktuellen Wallet-Klasse erstellt , aber jetzt müssen wir es festlegen, nachdem wir ein neues Wallet erstellt haben. Gehen wir also zum Wallet-Datensatz und fügen das mnemonische Startfeld hinzu. Gehen wir nun zum Create Wallet Service und fügen hier den mnemonischen Seed-String als letzten Parameter bei der Wallet-Instanziierung hinzu. nun im Update Current Wallet Service Lassen Sie uns nun im Update Current Wallet Service den aktuellen Wallet-Seed auf den Wallet-Mnemonic Seed setzen . Gehen wir nun zum zweiten Transaction Dialogue Controller. in der initialisierten Methode Rufen wir in der initialisierten Methode die Lookup Button-Methode auf das Dialogproblem zu lösen, indem wir die Schaltfläche Okay an sie weitergeben. Lassen Sie uns nun dieser Schaltfläche einen Ereignishandler hinzufügen. Der erste Parameter ist ein Aktionsereignis, das den Klick auf die Schaltfläche Okay als Aktion definiert. Der zweite Parameter ist eine Lambda-Methode, die ein Ereignisobjekt verwendet und die Transaktionsmethode Sign and Send aufruft . Lassen Sie uns diese Methode erstellen. Hier. Wir benötigen den zweiten Transaktionsservice. Also lasst uns es in diese Klasse injizieren. Jetzt rufen wir darauf die Methode Sign and Send auf und übergeben dabei den Transaktions-DTO und den Wallet-Passworttext als Parameter. Schließlich schließen wir das Dialogfenster mit der Methode „Ausblenden“ im Dialogfenster. Lassen Sie uns unseren Node ausführen. Und lassen Sie uns endlich testen, was wir getan haben , indem wir den Send Bitcoin-Test durchführen. Toll, die Tests sind bestanden. Die Wallet hat unsere Transaktion erkannt und zur Transaktionstabelle hinzugefügt. Aber warte, da ist etwas Seltsames. Ich spule das Video zurück und pausiere es in der Adresstabellenansicht , um etwas zu überprüfen. Dies ist die Adresstabelle, nachdem unser Wallet unsere Transaktion gesendet hat. Beachten Sie, dass das Wallet erkannt hat, dass eine unserer Änderungsadressen in der zweiten Zeile Bitcoins erhalten hat. Gut. Da die Adresse in der ersten Zeile jedoch ihren UTXO in der Eingabe der Transaktion hat , die wir gerade gesendet haben, sollte ihr aktueller Saldo Null sein , da die Ausgabe ausgegeben wurde. Und da in unserer Adresstabelle nur Kleider mit einem Saldo größer als Null angezeigt werden, sollte diese Tabelle nur eine Zeile mit der Änderungsadresse anzeigen . Lassen Sie uns nun die Transaktionstabelle für denselben Testfall überprüfen . Hoppla, der Saldo der Transaktion, die wir gerade gesendet haben, ist falsch. Es sollte -0,5 Bitcoin abzüglich der Transaktionsgebühr entsprechen . Das Minuszeichen würde bedeuten, dass wir eine Transaktion von unserem Wallet aus gesendet haben. Der Text des Gesamtsaldos ist ebenfalls falsch. Sie sollte 0,5 abzüglich der Transaktionsgebühr entsprechen. Im folgenden Video werden wir diese Probleme beheben. 58. 56 Senden von bitcoin 9 skillshare 2: In diesem Video werden wir einige Probleme beheben, die wir im letzten Video hatten. Eines dieser Probleme besteht darin, dass in der Adresstabelle veraltete Salden für Adressen angezeigt werden , deren Ausgaben ausgegeben wurden. Da die verbrauchte Adresse nach ihrer Verwendung einen Saldo von Null hat, sollte sie nicht in der Adresstabelle erscheinen. Lassen Sie uns diesen Test anpassen, um zu überprüfen, ob die Adressentabelle nur eine Zeile hat und ob diese Zeile einen ausgeglichenen Wert hat , der der erwarteten Änderung von Mount entspricht. Hier erhalten wir die Adresstabelle mithilfe der Suchmethode. Und im Block dann wird geprüft ob die Adresstabelle eine Zeile hat. Lassen Sie uns auch überprüfen, ob der Saldo der ersten Zeile dieser Variablen entspricht, die wir im Web-Block definieren werden. Als Nächstes definieren wir den Änderungsbetrag in den Wear Black Cases. Ein weiteres Problem, das wir im letzten Video gesehen haben , ist, dass der Saldo der Transaktion in der Transaktionstabelle falsch ist. Das passiert, weil, wenn unsere Anwendung eine Transaktion von unserem Knoten empfängt, nur den Änderungssaldo als Transaktionssaldo berücksichtigt , um sicherzustellen, dass der Test diesen Fehler erkennt fügen wir die folgende Zeile hinzu und dann überprüft Block, ob die erste Zeile in der Transaktionstabelle einen Saldo enthält der minus der gesamten ausgegebenen Variablen entspricht. Der Saldo ist auch falsch, da er der Summe aller Transaktionssalden entspricht . Lassen Sie uns also dafür sorgen, dass unser Test dieses Problem erkennt. Hier. Wir überprüfen, ob der Text des Gesamtsaldos korrekt ist. Lassen Sie uns zunächst diese Variable definieren. Es entspricht dem Text auf der Gesamtbilanzbeschriftung des Fensters, nachdem wir eine Transaktion gesendet haben. Lassen Sie uns überprüfen, ob diese Variable dem folgenden Text entspricht. Und hier definieren wir die Fondsvariable , die im Endstream Lambda aktualisiert wird. Lassen Sie uns nun unseren Knoten ausführen. Und lassen Sie uns diesen Test durchführen. Okay, der Test ist fehlgeschlagen weil die Adresstabelle zwei Zeilen hat. Lassen Sie uns diese Probleme beheben. Lassen Sie uns dazu den Transactions Sent Listener erstellen. Aber lassen Sie uns zuerst etwas reparieren, das nichts damit zu tun hat. Der vom Block empfangene Listener befindet sich im Node Dot-Ereignispaket anstelle des Node-Punkt-Listener-Pakets. Lass uns das reparieren. Wenn das geklärt ist, erstellen wir einen Transaction Send Listener im Paket GUI dot listeners. Wie der Name schon sagt, verarbeitet dieser Listener das Ereignis „Transaktion gesendet“, das der Transaktionsdienst veröffentlicht, nachdem er eine Transaktion gesendet hat. Lassen Sie uns die Komponentenannotation hinzufügen. Es implementiert den Anwendungs-Listener mit dem Ereignistyp Transactions Sent. Lassen Sie uns seine Methode implementieren. Hier wird das Update des utxOS-Dienstes durchgeführt. Also lasst uns es in diese Klasse injizieren. Rufen wir nun die Aktualisierungsmethode auf, die die Ereignistransaktion DTO übergibt . Lassen Sie uns nun diese Methode erstellen. Hier erhalten wir eine Liste von UTXos aus der Transaktion DTO selected UTXos. Wir verwenden eine Map für den ausgewählten UTXOS-Stream und instanziieren für jeden empfangenen UTXO ein neues UTXO UTXO übergibt jedes empfangene UTXO-Feld in der UTXO-Instantiierung, mit Ausnahme des Betrags, Null, seit wir es gerade ausgegeben haben. Um nun unsere Wallet-Adressen zu aktualisieren, rufen wir die Service-Update-Methode zum Aktualisieren aktueller Wallet-Adressen übergeben die UTXOs an sie. Und um die Wallet-Transaktionen zu aktualisieren, rufen wir die Aktualisierungsmethode im Aktuellen Wallet-Transaktionsdienst auf im Aktuellen Wallet-Transaktionsdienst der das Ergebnis des Aufrufs der Transaktionszeile von der Methode an sie weiterleitet Transaktionszeile von der Methode an . mit der Transaktion DTO als Parameter. Lassen Sie uns abschließend die Aktualisierungsmethode Current Wallet Balanced Service Update aufrufen Aktualisierungsmethode Current Wallet Balanced Service Update , um das aktuelle Wallet-Guthaben zu aktualisieren. Lassen Sie uns diese From-Methode in der Transaktionszeilenklasse erstellen . Hier wird eine neue Transaktionszeile in einem Try-Catch-Block zurückgegeben . Wir instanziieren es mit der Transaktions-DTO-Transaktions-ID. Die formatierte Summe der ausgegebenen DTO-Transaktionen wurde mit der Negate-Methode negiert. Dadurch wird der Wert negativ, da wir ihn ausgeben. Es wird keine Bestätigungen geben. Und sein Datum wird das aktuelle Datum sein. Schließlich fangen wir eine IOException ab, die durch die Transaction-ID-Methode ausgelöst werden kann die Transaction-ID-Methode und zwar schnell in einer neuen Runtime-Exception. Zurück zum Update utxOS-Dienst. Lassen Sie uns nun die Aktualisierungsmethode erstellen , die eine Transaktionszeile im aktualisierten Wallet-Transaktionsdienst erhält . Der aktuelle Wallet-Transaktionsdienst verwendet die Methode Platform run later, da der folgende Code modifizieren Sie die Wallet-Oberfläche. Hier übergeben wir ein Lambda, das die Methode zum Hinzufügen von Transaktionszeilen auf der aktuellen Brieftasche aufruft der aktuellen Brieftasche die Transaktionstraße an diese Methode weiterleitet. Lassen Sie uns nun diese Methode erstellen. Lassen Sie uns diese Methode an einen Ort in der Nähe der Methode zum Hinzufügen von Transaktionszeilen verschieben . Hier rufen wir die Methode zum Hinzufügen von Transaktionszeilen im Feld Transaktionszeilen auf übergeben die Transaktionszeile als Parameter. Lassen Sie uns diese Methode in der Klasse Transaction Rows erstellen. Hier fügen wir die in die Transaktions-Roadmap geschriebene Transaktion ein, wobei die Transaktionszeilen-ID als Schlüssel verwendet wird. Okay, mit diesen Änderungen erwarten wir, dass zumindest die Adresstabelle aktualisiert wird. Lassen Sie uns den Test „Bitcoin senden“ erneut ausführen, um dies zu überprüfen. Okay, die jetzt angegebenen Adressen sind korrekt, aber der Test ist aufgrund der Transaktionstabelle fehlgeschlagen. Die Sendungstransaktionen haben immer noch ein veraltetes Guthaben. Das ist passiert, weil unser Sin Transaction Listener die Transaktion zwar unser Sin Transaction Listener korrekt aktualisiert, wenn unser Wallet dieselbe Transaktion von unserem Node empfängt , erkennt es, dass ein Update nur die Änderungsadresse UTXO. Die Gebühr und der Input, den wir ausgegeben haben, werden dadurch nicht abgezogen. Wir müssen die Art und Weise ändern, wie wir unsere aktuellen Wallet-Transaktionen aktualisieren , um das zu beheben. Im Update ruft die UTXOS-Dienstaktualisierungsmethode, die aufgerufen wird, nachdem unsere Anwendung eine Transaktion empfangen hat, die aufgerufen wird, nachdem unsere Anwendung eine Transaktion empfangen hat, die Methode RPC List of Transactions des Nodes auf. Mit dieser Methode werden alle unsere Wallet-Transaktionen zurückerstattet, auch diejenigen, die wir geschickt haben, um Transaktionen mit negativem Guthaben zurückzugeben Transaktionen mit negativem Guthaben wenn sie von unserer Wallet gesendet werden. Mit diesen Transaktionen können wir sie in unserer Anwendung korrekt aktualisieren. Lassen Sie uns also den Node List of Transactions Client verwenden , um alle Transaktionen unseres Wallets abzurufen und sie in der Variablen Node-Transaktionen zu speichern. Lassen Sie uns diesen Service in diese Klasse einbauen. Und lassen Sie uns es im API dot services dot no dot client package erstellen . Lass uns damit fertig sein, es in diese Klasse zu injizieren. Lassen Sie uns nun den Node-Transaktionseintrag erstellen, der die Methode Return of the list transactions modelliert , ihn im Domain - und Startknotenpaket erstellen. Hier nennen wir die Methode List Transactions und übergeben dabei den aktuellen Wallet-Namen. Lassen Sie uns diese Methode erstellen. Und lassen Sie uns hier die Service-Anmerkung hinzufügen. Lassen Sie uns den Node-Client in diese Klasse injizieren. Hier erhalten wir ein Array Typ Node-Transaktion, indem wir die Methode node client make request mit den folgenden Parametern aufrufen die Methode node client make request . Die List-Transaktionszeichenfolge, die der Name der Knoten-RPC-Methode ist, eine neue parametrisierte Typenreferenz. Die Wallet-URL ist mit dem Wallet-Namen verkettet. Und eine Sternchenfolge, die angibt, dass wir alle Transaktionen von dieser Brieftasche aus wollen. Der maximale Ganzzahlwert, was bedeutet, dass wir die maximale Anzahl von Transaktionen in der Antwort Null haben wollen , was der Methode mitteilt, dass wir keine Transaktionen überspringen möchten. Und das stimmt, was bedeutet , dass wir nur Transaktionen beobachten möchten , die in der Antwort enthalten sind. Beobachten Sie, dass nur Transaktionen Transaktionen sind. Der Knoten hat nicht den privaten Schlüssel, den er ausgeben kann. Diese Option ist sinnvoll , da unser Wallet keinen privaten Schlüssel an unseren Node weitergibt. Schließlich haben wir das in eine Liste konvertierte Transaktionsarray zurückgegeben . Lassen Sie uns nun den Node-Transaktionsdatensatz erstellen der nur die Felder hinzufügen wird, die verwendet werden. sind die T XID, die Bestätigungen, der Betrag, die Adresse, also die Adresse, an die der Absender Bitcoins senden will, nicht die Änderungsadresse. Und die Uhrzeit, die der Zeitstempel der Transaktionserstellung ist . Zurück zum Update utxOS-Dienst. Wir rufen die Transaktionsmethode „ Knoten aktualisieren Transaktionsdienst „Aktuelle Brieftasche aktualisieren“ auf. Da sein Parameter die Node-Transaktionen übergibt. Lassen Sie uns diese Methode erstellen. Hier erhalten wir eine Liste der Transaktionszeilen aus den Zeilen ohne Transaktionen. Wir rufen die Filtermethode im Node-Transaktionsstream auf . Da sein Parameter ein Lambda übergibt, das eine Node-Transaktion entgegennimmt und prüft, ob das aktuelle Wallet die Node-Transaktionsadresse enthält. Dann fügen wir einen Oder-Operator hinzu und prüfen, ob das aktuelle Wallet eine Transaktion ohne Transaktions-ID enthält . Dieser Filter führt zu einem Transaktionsstrom, der nur Transaktionen enthält, die zum Senden adressiert sind , zu unseren eigenen gehören, was auch empfangene Transaktionen abdeckt. Die Bedingung, dass der Oder-Operator den Transaktionsstream durchführt umfasst auch Transaktionen, über die unsere Anwendung bereits verfügt. Das bedeutet, dass Transaktionen, die zuvor vom Transaction Send Listener hinzugefügt wurden die zuvor vom Transaction Send Listener hinzugefügt , korrekt mit negativen Salden aktualisiert werden . Jetzt verwenden wir den resultierenden Stream nicht mit der Methode „ Transaktionszeile aus“. Lassen Sie uns diese Methode erstellen und hierher verschieben. Hier wird eine neue Transaktionszeile zurückgegeben mit der Knoten-Transaktions-ID instanziiert wurde. Der Betrag der formatierten Knotentransaktion, die Bestätigungen der Knotentransaktion und die in eine Zeichenfolge umgerechnete Knoten-Transaktionszeit. Jetzt konvertieren wir den Transaktionsstream in eine Liste. Schließlich verwenden wir die Platform Run Later Methode und verwenden ein Lambda, rufen wir Transaktionszeilen hinzufügen auf der aktuellen Wallet auf und übergeben die Transaktionszeilen an sie. Lassen Sie uns diese Methode entfernen, da wir sie nicht mehr benötigen. Lassen Sie uns diese Methode aus dem gleichen Grund auch in der Transaktionszeile entfernen . Eine weitere Sache hier in der Methode „Anzeigen-Transaktionszeilen “ in der Klasse Transaktionszeilen Wir müssen den Saldo der Transaktionszeilen aktualisieren bevor unsere Änderungen wirksam werden. Lassen Sie uns dazu den folgenden Code einschließen. Gehen wir nun zum Test zum Senden von Bitcoins über. Bevor wir es ausführen, fügen wir einen Sleep-Call hinzu, nachdem der Test im zweiten Transaktionsdialog auf die Schaltfläche OK geklickt hat. Damit vermeiden wir, dass der Test aufgrund der Rennbedingungen versagt. Lassen Sie uns jetzt unseren Test durchführen. Toll, die Tests sind bestanden. Lassen Sie uns alle Anwendungstests durchführen, um sicherzustellen, dass wir nichts in unseren Wallets kaputt gemacht haben. Ich werde das Video jetzt beschleunigen, da die Ausführung dieser Tests in der Realität einige Minuten dauern wird . Großartig. Alle Tests wurden bestanden. 59. 57 Senden von bitcoin 10 skillshare 2: In diesem Video fügen wir weitere Tests hinzu, um zu überprüfen, ob unser Wallet beim Senden von Transaktionen in verschiedenen Szenarien wie erwartet funktioniert . Mal sehen, ob unser Wallet zwei Transaktionen nacheinander senden kann . Lassen Sie uns dazu diesen Test in der Testklasse „ Bitcoin senden“ duplizieren . Ändern wir seinen Namen in. Es sollte mal Bitcoin schicken. Lassen Sie uns die Formatierung korrigieren. Lassen Sie uns mit zehn den Wallet-Namen in meinen Test ändern. Lassen Sie uns nun diesen Codeabschnitt in eine Methode extrahieren. Wir nennen es Send Bitcoin. Fügen wir den zu sendenden Betrag als zweiten Parameter hinzu. Nachdem Sie eine Transaktion erstellt haben, klicken Sie auf die Schaltfläche Okay, um sie zu senden. Dann verwenden wir diese Codezeile um aus unserem Knoten einen Block zu minen. Daher erwarten wir, dass unsere zweite Transaktion bestätigt wird, sodass wir die durch diese unsere zweite Transaktion bestätigt wird, Transaktion generierte Änderung UTXO als Eingabe für die nächste Transaktion verwenden können. Jetzt klicken wir auf den Tab Senden. Und wir rufen die Schlafmethode mit diesen Parametern auf, um auf die Bestätigung unserer Transaktion zu warten . Nach dem Senden der ersten Transaktion erwarten wir, dass unsere erste Änderungsadresse in der Adresstabelle angezeigt wird. Wir gehen davon aus, dass bei der zweiten Transaktion eine andere Änderungsadresse verwendet wird , da es aus Datenschutzgründen wichtig ist, Adressen beim Empfang von Bitcoins nicht wiederzuverwenden . Wir vergleichen also die Änderungsadresse bei beiden Transaktionen und prüfen, ob sie nicht identisch sind. Schauen wir uns dazu die Adresstabelle mit dieser Codezeile an. Lassen Sie uns der Richtigkeit halber den TableView-Typ in Adresszeile ändern . Lassen Sie uns die Deklaration hier entfernen und nutzen wir die Gelegenheit, dasselbe Problem in der vorherigen Testmethode zu beheben . Speichert die erste Änderungsadresse in dieser Variablen und ruft sie aus der Adresstabelle ab. Dann rufen wir die Methode „Bitcoin senden erneut auf, um die zweite Transaktion zu senden. Nach der zweiten Transaktion wird die Adresstabelle erneut nachgeschlagen. Hoffentlich enthält die erste Zeile der Tabelle die zweite Änderungsadresse. Lassen Sie uns es also erneut abfragen und die erste Zeilenadresse und die zweite Adressänderungsvariable speichern die erste Zeilenadresse und . Im Block dann wird die folgende Assertion hinzugefügt, um zu überprüfen, ob die erste Änderungsadresse nicht der zweiten entspricht. Hier erwarten wir, dass die Größe der Transaktionstabelle der vorherigen UTXOS-Zahl plus zwei entspricht. Und lassen Sie uns diesen Teil des Gesamtbilanztextes ändern. Wir gehen davon aus, dass der bestätigte Saldo den Mitteln abzüglich der Gesamtausgaben entspricht. Lassen Sie uns diesen Testfall entfernen, es wird nur einen Fall für diesen Test geben. Lassen Sie uns den Betrag ändern, um 0,25 zu senden. Lassen Sie uns die Gesamtausgaben entsprechend aktualisieren. Und lassen Sie uns die letzten vier Ziffern des Änderungsbetrags ändern. Dieser Änderungsbetrag ist die Summe der Änderungsbeträge der beiden Transaktionen. Lassen Sie uns nun unseren Knoten ausführen. Fügen wir dem ersten Test die Ignorieren-Anmerkung hinzu, da wir nur den letzten Test ausführen möchten. Und lass es uns ausführen. Der Test ist fehlgeschlagen, weil die erste Änderungsadresse der zweiten Änderungsadresse entspricht . Lass uns das reparieren. Gehen wir zum Dienst „ Aktuelle Wallet-Adressen aktualisieren “, der diese Codezeile an diesen Ort verschiebt. Hier fügen wir eine IF-Anweisung hinzu, um zu überprüfen, ob es sich der aktualisierten Adresse um eine Änderungsadresse handelt. Fügen wir diese Konstante zu dieser Klasse hinzu. Es wäre gleich, ob sich der Adresstyp seg ändern würde. Im Hauptteil der if-Anweisung wird die aktuelle Wallet-Änderungsadresse auf die nächste Adresse gesetzt . Fügen wir diesem Text der if-Anweisung auch eine Return-Anweisung hinzu. Lassen Sie uns den Test wiederholen. Toll, der Test ist bestanden. Jetzt werden wir damit beginnen, einige Fehlerbehandlungen für Situationen zu implementieren , in denen es nicht gut läuft, wenn wir versuchen , Transaktionen zu senden, z. B. was passieren sollte, wenn wir das falsche Wallet-Passwort verwenden , wenn versucht, eine Transaktion zu senden. Wenn unser Wallet eine Transaktion mit dem falschen Passwort sendet , führt dies dazu, dass die Transaktion mit ungültigen Signaturen erstellt wird . Wenn unser Knoten es empfängt, versucht er, diese Transaktion zu validieren. Da die Signaturen falsch sind, wird eine Fehlermeldung zurückgegeben und die Transaktion nicht an andere Knoten weitergeleitet. Derzeit verarbeitet unser Wallet den zurückgegebenen Fehler nicht und schlägt im Hintergrund fehl. Lassen Sie uns eine Lösung für diese Situation finden. Unser Node gibt nach Erhalt unserer Transaktion einen Fehler zurück nach Erhalt unserer Transaktion zeigt dem Benutzer eine Fehlermeldung an, dass das Wallet die Transaktion nicht senden konnte. Und y. Lassen Sie uns zunächst einen Test für dieses Szenario erstellen. In der Bitcoin-Testklasse senden. Lassen Sie uns die erste Methode duplizieren. Benennen wir es um, um Bitcoin nicht mit falschem Passwort zu senden. Und lassen Sie uns die Formatierung anpassen. Lassen Sie uns auch den Namen der Brieftasche in meine Test-Wallet 11 ändern. Hier klicken wir auf das Passwortfeld. Lassen Sie uns eine Variable für dieses Passwort definieren. Lass es uns auf mein Testpasswort setzen und es in das Passwortfeld schreiben. Nachdem wir Bitcoins erhalten haben, speichern wir den formatierten Saldo in der Variablen formatierte Fonds. Da wir beim Senden einer Transaktion nicht erfolgreich sein werden, erwarten wir, dass sich der endgültige Saldo unseres Wallets nicht ändert und weiterhin dieser Variablen entspricht. Lassen Sie uns nun diesen Codeabschnitt durch einen Aufruf der Methode Send Bitcoin ersetzen . Nachdem der Transaktionsdialog angezeigt wird, klicken wir auf das Wallet-Passwortfeld. Und wir schreiben das falsche Passwort. Nach dem Klicken auf die Schaltfläche Okay erwarten wir, dass eine Fehlermeldung erscheint. Lassen Sie uns diese Fehlermeldung definieren und in dieser Variablen speichern. Dann wird mit diesem Code versuchen, den Knoten mit dieser Nachricht in der Knotenabfragevariablen zu speichern . Die Fehlerwarnung enthält eine Schaltfläche „Okay“, die versucht zu klicken. Im Dann-Block wird überprüft, ob die Knotenabfragetexte der Fehlermeldung entsprechen. Prüft auch, ob die Adresse in der Adresstabelle einen Saldo aufweist, der der formatierten Fondsvariablen entspricht. Wir gehen davon aus, dass die Größe der Transaktionstabelle gleich eins ist, da wir die fehlgeschlagene Transaktion nicht in der Tabelle anzeigen. Lassen Sie uns hier auch den erwarteten Transaktionssaldo so ändern , dass er dem formatierten Guthaben entspricht. Wir gehen außerdem davon aus, dass der Gesamtsaldo und der bestätigte Saldo der formatierten Fondsvariablen entsprechen werden . Der erwartete unbestätigte Saldo muss gleich Null mit acht Nachkommastellen sein. Lassen Sie uns den zweiten Testfall im Where-Block entfernen. Lassen Sie uns nun die Fehlerwarnfunktion implementieren. Im zweiten Transaktionsdienst. Lassen Sie uns hier eine catch-Anweisung hinzufügen , um einen internen Serverfehler zu erkennen. Dies ist der Fehlertyp, den der Knoten zurückgibt, wenn beim Versuch, eine Transaktion an ihn zu senden, etwas schief geht . Jetzt verwenden wir den Logger, um diesen Fehler zu protokollieren. Fügen wir also den Logger als statisches Feld zu dieser Klasse hinzu. Instanziiert es mit der Logger Factory Get Logger-Methode und übergibt diese Klasse als Parameter. Dann rufen wir die Error-Methode auf übergeben den Fehler get response body als String-Methodenaufruf. Dann geben wir den Aufruf der Node-Error-Handler-Handler-Handle-Error-Error-Error-Methode zurück und übergeben den Fehler an ihn. Lassen Sie uns den Node-Error-Handler in diese Klasse einfügen. Lassen Sie uns diese Klasse im GUI Dots Services-Paket erstellen. Lass uns damit fertig sein, es in diese Klasse zu injizieren. Lassen Sie uns diese Methode darin erstellen. Es wird ein Fehler vom Typ Future zurückgegeben. Wenn wir zu dem Ort zurückkehren , der es aufrufen wird, sehen wir, dass die ID auf einen Typfehler hinweist. Um das zu beheben, ändern wir den Rückgabetyp der Zeichen- und Sendemethode auf Future of Type Error. Aber lassen Sie uns zuerst den Fehlereintrag im Punktknotenpaket der Domain erstellen . Lass uns diese Zeile kopieren und hier einfügen. Wir ändern es, um diese Fehlerklasse zu importieren , die wir gerade erstellt haben. Wenn wir das nicht tun, verwendet Java seine eingebaute Fehlerklasse. Lassen Sie uns nun diesen Typparameter in Fehler ändern. Lassen Sie uns die Importzeile auch an diese Klasse übergeben. Lassen Sie uns eine Service-Anmerkung hinzufügen. Bevor wir die Funktion nun weiter implementieren, lassen Sie uns den letzten Test ausführen, um das Format der Fehlermeldung zu überprüfen , die der Knoten in den Protokollen zurückgibt. Lassen Sie uns zunächst die Ignorieren-Anmerkung zu diesem Test hinzufügen. Also führen wir nur den letzten Test durch. Hier sehen wir, dass der Knoten zur JSON-Nachricht zurückgekehrt ist. Der wichtige Teil besagt, dass das Skript fehlgeschlagen ist und 0 p dem Überprüfungsvorgang entspricht. Das bedeutet, dass der Knoten aufgrund einer falschen Signatur ausgefallen ist, als das kombinierte Skript zur Validierung der Transaktion ausgeführt wurde. wir nun wissen, was der Node an die Anwendung zurückgibt , wenn das Wallet-Passwort falsch ist, diese Antwort wollen wir diese Antwort der falschen Passwort-Antwort zuordnen, die der Benutzer sehen soll. In der Node-Fehlerbehandlungsroutine. Fügen wir einen Try-Catch-Block hinzu der den empfangenen Fehler in ein Node-Error-Wrapper-Objekt konvertiert . Lassen Sie uns diesen Datensatz im Domains-Punktknotenpaket erstellen . Im Anschluss an die Antwort des Knotenfehlers der Spezifikation wird hier ein Fehlerfeld vom Typ Node Error hinzugefügt . Lassen Sie uns also den Node-Fehlerdatensatz im Punktknotenpaket der Domain erstellen . Es wird ein Codefeld und ein Nachrichtenfeld haben. Zurück zum Node-Error-Handler wird der Object Mapper benötigt. Also lasst uns es in diese Klasse injizieren. Jetzt rufen wir die Read-Value-Methode auf dem Object Mapper da ihre Parameter den Fehler get response body als String-Methodenaufruf übergeben . Und die Node Error Wrapper-Klasse. Dieser Code wandelt den empfangenen Fehler in ein Node-Error-Wrapper-Objekt um. Schließlich geben wir ein neues asynchrones Ergebnisobjekt zurück, das mit einem Fehlerobjekt instanziiert wurde. Um das Fehlerobjekt zu instanziieren, verwenden wir die Methode error from, die den Node-Error-Wrapper-Fehler als Parameter übergibt . Lassen Sie uns die Front-Methode erstellen. Es wird ein Fehlerobjekt zurückgegeben. Lassen Sie uns das Nachrichtenfeld zu diesem Datensatz hinzufügen. Die Front-Methode gibt ein neues Fehlerobjekt zurück , das mit einer Fehlermeldung instanziiert wurde. Um die Fehlermeldung zu erstellen, fügen wir das Feld für Fehlermeldungen in dieser Klasse hinzu. Dieses Feld ist dafür verantwortlich, die Knotenfehlermeldungen den Meldungen zuzuordnen die Knotenfehlermeldungen den Meldungen zuzuordnen , die wir anzeigen möchten. Es wird eine Map mit Zeichenkettenschlüsseln und Zeichenkettenwerten sein. Lassen Sie uns die Map of Method verwenden, um es zu erstellen. erste Schlüssel ist die vom Knoten zurückgegebene Fehlermeldung, die wir zuvor in den Anwendungsprotokollen gesehen haben. Der Wert wird die Fehlermeldung sein, die wir anzeigen möchten. Dazu verwenden wir das konstante falsche Passwort aus der Fehlermeldungsklasse, die wir erstellen werden. Lassen Sie uns diese Klasse also im Domains-Dot-Node-Paket erstellen . Und lassen Sie uns diese Konstante mit der Nachricht hinzufügen , die wir anzeigen möchten. Jetzt rufen wir die Get- oder Standardmethode im Feld für Fehlermeldungen in der Formularmethode auf Ihr erster Parameter ist die Fehlermeldung. Der zweite Parameter wird eine Standardnachricht sein, die wir in dieser Konstante definieren werden. Wenn der Knoten also eine Fehlermeldung zurückgibt , die wir noch nicht zugeordnet haben, die angezeigte Fehlermeldung ein aufgetretener Fehler. Zurück zur Node-Error-Handler. Fügen wir hier eine catch-Anweisung hinzu, um eine angrenzende Verarbeitungsausnahme abzufangen , die der Object Mapper auslösen kann. Dann packen wir es in eine Runtime-Exception und werfen es aus. Gehen wir nun zum zweiten Transaction Dialogue Controller. Hier erhalten wir das Ergebnis der Methode Sign and Send und speichern es in einer Variablen. Stellen Sie einfach sicher, dass Sie die richtige Fehlerklasse importieren. Jetzt benötigen wir den Warnfehlerdienst. Also lasst uns es in diese Klasse injizieren. Dieser Dienst ist dafür verantwortlich eine Warnung mit einer Fehlermeldung anzuzeigen. Lassen Sie uns es im GUI Dots Services-Paket erstellen. Und lass uns damit fertig sein, es in diese Klasse zu injizieren. Rufen wir nun die Methode handle error für den Warnfehler oder das Serviceobjekt auf Warnfehler oder das Serviceobjekt , das das Ergebnis an dieses Objekt übergibt. Lassen Sie uns diese Methode erstellen. Zuerst. Lassen Sie uns die Service-Annotation zu dieser Klasse hinzufügen. Hier deklarieren wir ein Fehlerobjekt. Dann wird in einem Try-Catch-Block die Fehlervariable auf den Ergebnis-Methodenaufruf dot get gesetzt . Dann fangen wir eine Ausnahme ab , die das Ergebnis auslösen kann , und wickeln sie in eine neue Runtime-Exception um. In dieser if-Anweisung wird nun überprüft, ob der Fehler nicht gleich Null ist. Ist dies nicht der Fall, rufen wir die Alert-Error-Methode übergeben die Fehlermeldung an sie. Lassen Sie uns diese Methode erstellen. Hier. Wir erstellen ein neues Alert-Objekt mit einem Warntypfehler. Dann setzen wir den Titel der Warnung auf Fehler. Und wir setzen den Alarm-Header-Text auf ein oder zwei Fehler. Lassen Sie uns den Inhalt der Warnung auf die Nachrichtenvariable setzen. Rufen wir abschließend die show-Methode für das Alert-Objekt auf. Lassen Sie uns den Test nun wiederholen. Toll, der Test ist bestanden. 60. 58 Senden von bitcoin 11 Skillshare 2: In diesem Video werden wir weiterhin weitere Validierungen und Benachrichtigungen hinzufügen , um den Benutzer über fehlgeschlagene Übertragungsversuche zu informieren . Zunächst erstellen wir einige Testfälle für diese Szenarien. Lassen Sie uns diesen Test duplizieren, um einen Test für das Szenario hinzuzufügen , in dem der Benutzer eine Transaktion mit mehr Bitcoins als seinem Guthaben senden möchte . Lassen Sie uns es umbenennen, um Bitcoin nicht ohne Guthaben zu senden Bitcoin nicht ohne Guthaben den Betrag plus v. übersteigt. Lassen Sie uns es neu formatieren. Und lass uns den Namen der Brieftasche in meinen Test ändern, während wir um 12 Uhr sind. Lassen Sie uns diese Zeilen löschen. Hier. Wir setzen eine Variable für den Inhalt, den der Benutzer für den Fehler sehen soll. Die Meldung lautet: Transaktion konnte nicht gesendet werden , zu wenig Guthaben. Mit diesem Code werde ich dann versuchen, das UI-Element mit dieser Nachricht in der Node-Abfragevariablen zu speichern . Und wir werden versuchen, im Warndialog auf die Schaltfläche Okay zu klicken . Im Block dann wird überprüft, ob der Knotenabfragetext der Nachricht entspricht, die wir zuvor definiert haben. Lassen Sie uns diese Variablen im Where-Block löschen , da wir sie nicht benötigen. Und lassen Sie uns hier die vorherige Betragsvariable mit dem folgenden Wert erstellen . Lassen Sie uns diese Zeile duplizieren, um einen zweiten Testfall zu erstellen. Dieser Betrag wird um einen Satoshi niedriger sein als der Betrag, der für den Versand von 0,5 Bitcoins erforderlich ist. Lassen Sie uns nun diese Zeile löschen. Lassen Sie uns diese Werte durch die vorherige Betragsvariable ersetzen . Jetzt erstellen wir ein ähnliches Testszenario, diesmal jedoch mit einer Wallet ohne Guthaben. Also lassen Sie uns diesen Test duplizieren. Lassen Sie uns seinen Namen ändern, sodass Bitcoin nicht ohne Geld gesendet werden sollte . Lassen Sie uns mit 13 den Wallet-Namen in meinen Test ändern. Lassen Sie uns diese Zeilen entfernen da wir kein Geld erhalten werden. Und lassen wir nur den zu sendenden Betrag variabel und den Wher-Block übrig. Lassen Sie uns nun die Funktion in der Serviceklasse „Transaktion erstellen“ implementieren . Lassen Sie uns die Transaktion DTO hier in einer Variablen speichern. Und lassen Sie uns diese Variable zurückgeben. Jetzt. Vor der Rückgabe ruft es die Methode „ Fonds validieren“ auf und übergibt dabei den Transaktions-DTO als Parameter. Lassen Sie uns diese Methode erstellen. Wird diese Methode verwenden , um zu überprüfen, ob die Summe der Transaktionseingabebeträge unter einigen höher ist als die Transaktionsausgabe. Lassen Sie uns diese Variable erstellen , um den Eingabebetrag zu speichern. Einige werden ihr das Ergebnis des Aufrufs der Transaktion DTO zuordnen , erhalten die eingegebenen Mengen der Methode. Lassen Sie uns diese Methode erstellen. Hier. Wir verwenden eine Map für den ausgewählten UTXOS-Stream, um einen Stream mit UTXO-Mengen zu erstellen. Dann verwenden wir die reduzierte Methode um jeden erhaltenen Betrag zu summieren. Schließlich verwenden wir die Methode or else, um die Summe oder Null zurückzugeben , falls keine UTXOs verfügbar sind. Lassen Sie uns nun hier die Get-Output-Mengen der Methode erstellen. Wir werden eine ähnliche Strategie für einige der Produktionsmengen anwenden . Aber anstatt die ausgewählten UTXOs zu verwenden, wird eine Map im Transaktionsausgabestrom verwendet. Die Kartenmethode gibt die in Bitcoin umgerechneten Ausgabebeträge zurück . Und wir werden die Reduce- und eine Rails-Methode genauso verwenden , wie wir es für die vorherige Methode getan haben. Zurück zur Methode „ Fonds validieren“. Hier erstellen wir die Ausgabevariable, um das Ergebnis des Aufrufs der get−Ausgabebeträge zu speichern. Eine Methode, die wir gerade entwickelt haben. Jetzt fügen wir eine if-Anweisung um zu überprüfen, ob die Eingabesumme kleiner ist als die Ausgabesumme plus die berechnete Summe F0. Wenn dies der Fall ist, geben wir eine neue Ausnahme zum Erstellen einer Transaktion mit der Meldung „Nicht genügend Guthaben“ aus. Lassen Sie uns diese Konstante in der Klasse „Fehlermeldungen“ erstellen. Lassen Sie uns beide Konstanten endgültig machen. Und lassen Sie uns die Klasse Create Transaction Exception im Paket GUI Dot Exceptions erstellen. Es erweitert die Runtime-Exception und leitet seine Nachricht an den Superkonstruktor weiter. Lassen Sie uns die Gelegenheit nutzen , um hier eine weitere Validierung hinzuzufügen. Was ist, wenn wir versuchen, eine Transaktion ohne geladenes Wallet zu versenden ? Um diesen Fall zu lösen, verwenden wir diese if-Anweisung, um zu überprüfen, ob das aktuelle Wallet Adressen hat. Ist dies nicht der Fall, lösen wir eine Ausnahme zum Erstellen einer Transaktion mit der Meldung „Wallet nicht geladen“ aus. Lassen Sie uns diese Konstante erstellen , um diese Nachricht zu speichern. Gehen wir nun zum Tab-Controller „ Senden“. Lassen Sie uns die DTL-Erstellung der Transaktion in einen Try-Catch-Block packen . Die Methode des offenen Dialogs ruft an. Hier, wir werden es uns holen. Transaktionsausnahme erstellen. Wir verwenden den Warnfehler oder den Service und den Catch Body. Also lasst uns es in diese Klasse injizieren. Dann rufen wir die Alert-Error-Methode auf und übergeben die Ausnahmemeldung als Parameter. Lassen Sie uns diese Methode veröffentlichen. Gehen wir zum Bitcoin-Test senden. Fügen wir dem Test, den wir im letzten Video durchgeführt haben, die Anmerkung Ignorieren hinzu. Lassen Sie uns unseren Node ausführen. Bevor wir den Test ausführen, passen wir einige Details an. Fügen wir am Ende der Fehlermeldungen einen Punkt hinzu. Bei der Methode „Bitcoin senden“. Lassen Sie uns diesen Parameter hinzufügen. Es ist standardmäßig auf true gesetzt und ruft die Wafer-Dialogmethode nur auf, wenn sie wahr ist. Jetzt setzen wir es auf false und diese Aufrufe, weil der Transaktionsdialog in diesen Tests nicht angezeigt wird. Lassen Sie uns abschließend die Tests durchführen. Benotet die Tests sind bestanden. Lassen Sie uns alle ignorierten Anmerkungen aus dieser Klasse entfernen. Jetzt fügen wir diesem Paket eine Reihe neuer Tests in einer neuen Klasse namens Send Bitcoin additional test hinzu. Aber keine Sorge, dieses Mal kopieren wir einfach den Inhalt dieser Klasse von der Seite Projekt und Ressourcen. Alle diese Tests müssen bestanden werden. Hoffentlich müssen wir dafür nichts an unserem Code ändern. Sie werden jedoch dazu beitragen, dass unser Wallet Transaktionen korrekt sendet und mögliche Codebrüche erkennen die in Zukunft auftreten werden. Lassen Sie uns sie alle neu formatieren. Im ersten Test überprüfen wir, ob eine Wallet mit einem Passwort Transaktionen korrekt versendet. Der nächste Test generiert Transaktionen, ohne dass Änderungen erforderlich sind, und überprüft ob ihre Parameter korrekt sind. diesem Test wird versucht, eine Transaktion an eine Adresse unseres eigenen Wallets zu senden und zu überprüfen, ob die Wallet ihre Beträge und Salden korrekt berechnet. Schließlich wird der letzte Test viele verschiedene Testfälle mit unterschiedlicher Anzahl früherer UTXos und Mengen enthalten. Damit diese Tests funktionieren, verschieben wir die Methode Weight for Dialogue im Send Bitcoin-Test in die GUI-Testklasse. Machen wir es geschützt. Lassen Sie uns diese Importe im Send Bitcoin-Test entfernen. Eine weitere Sache bei der Methode Send Bitcoin im Send Bitcoin-Test hier das Super-Keyword hinzu, Fügen wir im Send Bitcoin-Test hier das Super-Keyword hinzu, um sicherzustellen, dass wir die richtige Gewichtung für die Dialogmethode aufrufen, nicht den Parameter mit demselben Name. Wir werden in dieser Klasse einen weiteren Test machen. Dieses Mal überprüfen wir, was passiert, wenn wir versuchen, eine Transaktion mit einer Staubmenge zu versenden. Also lassen Sie uns diesen Test duplizieren. Ändern wir seinen Namen so, dass er Bitcoin nicht verstauben sollte. Lassen Sie uns die Formatierung korrigieren. Lassen Sie uns mit 18 den Namen der Brieftasche in meinen Test ändern. Lassen Sie uns nun diesen Code kopieren und zu unserer Methode hinzufügen, um unser Wallet aufzuladen. Ändern wir die Fehlermeldung in Der zu sendende Transaktionsbetrag konnte nicht gesendet werden, ist Staub. Lassen Sie uns den Where-Block ändern ihm die folgenden Variablen hinzufügen. Wir wählen einen Betrag aus, der 293 Satoshi entspricht. Wir wissen , dass unser Knoten nicht annehmen kann , da er als Staub betrachtet wird . Für den vorherigen Betrag wählen Sie 0,1 Bitcoin. Da wir darauf vertrauen, dass unsere Notiz diese Art von Fehler erkennt, warten wir, bis der Transaktionsdialog erscheint, nachdem wir auf die Schaltfläche Senden geklickt haben. Und lassen Sie uns den Klick auf den Methodenaufruf Okay hinzufügen , um die Transaktion des Dialogs zu bestätigen. Gehen wir nun zur Fehlerklasse. Fügen wir den folgenden Eintrag zu Fehlermeldungen hinzu. Die Map ordnet den von unserem Knoten empfangenen Staubmeldungsfehler der Meldung zu , die in der Staubkonstante in der Klasse „ Fehlermeldungen“ enthalten ist. Lassen Sie uns diese Konstante erstellen. Es wird der Nachricht entsprechen, die wir gerade im Test definiert haben. Lassen Sie uns die Ignorieren-Annotation zu den anderen Tests in dieser Klasse hinzufügen und unseren neuen Test ausführen. Toll, der Test ist bestanden. Lassen Sie uns alle Ignorieranmerkungen löschen, die wir zuvor hinzugefügt haben. An dieser Stelle empfehle ich , alle Anwendungstests durchzuführen. Ich habe es getan und sie haben alle bestanden. Ich werde es in diesem Video nicht zeigen , da es mehrere Minuten dauern würde. Ich überlasse das als Übung für den Schüler. 61. 59 Nested Segwit Teil 1 skillshare 2: In diesem Video beginnen wir damit, unsere Anwendung zu überarbeiten, um sie vorzubereiten und Unterstützung für mehr Adresstypen hinzuzufügen. Es wird ein relativ großer Refactor sein, aber wir werden später sehen, dass wir damit Unterstützung für andere Adresstypen hinzufügen können, wie zum Beispiel die verschachtelte Seg Would Address. Die Idee dieses Ref-Aktors besteht darin, alles, was für einen Adresstyp spezifisch ist, in einem Adresskonfigurationsobjekt zu zentralisieren . Auf diese Weise können wir unseren Wallets weitere adressierte Typen hinzufügen, indem Projekt neue Adresskonfigurationsobjekte hinzufügen. Nach diesem Refactoring fügen wir einen neuen Adresstyp namens Nested Segment hinzu, dessen Bedeutung wir in einigen Videos erläutern werden. Gehen wir also zum Adresskonfigurationsdatensatz , um einige Felder hinzuzufügen. Wir fügen das Adressgenerator-Feld hinzu. Wir verwenden es, um den Dienst zu definieren, der zum Generieren von Adressen für verschiedene Adresstypen verwendet wird . Eine Map mit einem Enum-Enum-Schlüssel für die Umgebung und einem Zeichenkettenwert. Wir verwenden dieses Feld, um die Adresspräfixe für jede Umgebung zu registrieren . Also lass uns das genug erstellen. Im Paket BYU w dot domains. Es wird die Main Net-, Test Net- und Reg-Testkonstanten haben. Fügen wir hier das erweiterte Ki-Präfixfeld hinzu. Wie der Name schon sagt, definiert es das Präfix des erweiterten Schlüssels, der die Adressen generiert. Das nächste Feld wird eine Prädikatzeichenfolge als Typparameter sein. Es erhält eine Lambda-Funktion mit einer Adresse als Parameter und einem Ausdruck, der true zurückgibt, wenn die Adresse dem Adresskonfigurationstyp entspricht, und false. Andernfalls fügen wir ein Feld für den Script-Pub-Schlüsseltyp hinzu, damit wir identifizieren können, welche Adresskonfiguration verwendet werden soll anhand des Script-Pub-Schlüsseltyps identifizieren können, welche Adresskonfiguration verwendet werden soll . Dann fügen wir es nach Funktion mit diesen Typparametern Verwenden Sie dieses Feld, um eine Funktion zu definieren , um eine Adresse aus einem bestimmten Skript, einem Pub-Schlüssel und einem Präfix zu analysieren . Lassen Sie uns nun den Adresskonfliktbean für die Segway-Änderungsadresse löschen . Bei diesem Refactoring wird nur eine Adresskonfig-Bean sowohl für die Segment - als auch für die Segmentänderungsadresse verwendet Adresskonfig-Bean sowohl für die Segment . Lassen Sie uns die Bean-Annotation ändern , um diese Änderung widerzuspiegeln. Lassen Sie uns nun diese Adresskonfigurationsinstanziierung so ändern jede Ressource einbezieht, die sich auf diesen Adresstyp bezieht. Dadurch wird das Ableitungspfadfeld in eine Map geändert, in der der Schlüssel ein Adresstyp ist und Der Wert wird der entsprechende Ableitungspfad sein. Hier fügen wir zwei Einträge hinzu, einen für den Segmentadresstyp und seinen anfänglichen Ableitungspfad und den anderen für die Segway-Änderung und ihren anfänglichen Ableitungspfad. Sobald es adressiert ist, fügt der Generator einen neuen Segmentadressgenerator hinzu. Für das Feld Adresspräfixe wird die folgende Map hinzugefügt , die einen Eintrag für jede Umgebung hinzufügt und es sind P2-, WP k h-Adresspräfixe. Das erweiterte Ki-Präfixfeld wird die wichtigste Net Segue-Präfixkonstante sein. Da der Address Matcher den Address Matcher verwenden wird , ist er gleich mit der Lambda-Funktion. Lassen Sie uns also diese Klasse und das utils-Paket erstellen. Und lassen Sie uns diese Funktion erstellen. Es wird eine Funktion sein , die eine Adresse annimmt und true zurückgibt, wenn die Adresse mit einem dieser drei Präfixe beginnt in Segmentadressen vorhanden sind. Das nächste Feld entspricht dem Skript P2 WP k h constant. Schließlich wird der Adressparser eine Referenz auf das Skript P2 WP k h address method sein. Gehen wir zurück zur Adresskonfiguration, um den Typ des Ableitungspfads zu ersetzen. Es wird eine Map mit Adresstypen als Schlüsseln und Zeichenketten als Werten sein. Lassen Sie uns nun die Address Config Finder-Klasse im API Dot Services-Paket erstellen , um diesen Service zu verwenden, um die richtige Adresse abzurufen. Kann gefälscht werden und andere Dienste werden wir als um die richtige Adresse abzurufen. Kann gefälscht nächstes überarbeiten. Fügen wir also die Dienstanmerkung hinzu. Und lassen Sie uns hier eine Liste von Adresskonfigurationen einfügen. Lassen Sie uns nun diese Methode erstellen, mit der wir eine Adresskonfiguration anhand der Adresse finden können. Sein Rückgabetyp wird optional vom Typ address config sein. Dann filtern wir einen Stream von Adresskonfigurationen und verwenden den Address Matcher der Konfiguration im Filter Lambda. Dann geben wir die optionale Adresskonfiguration zurück , die der empfangenen Adresse entspricht mit der ersten Methode. Lassen Sie uns nun eine weitere Methode erstellen, die eine optionale Adresskonfiguration vom Typ zurückgibt. Dieses Mal findet es eine Adresskonfiguration anhand seines Skripttyps. Es wird der vorherigen Methode ähneln, aber wir werden den Filter verwenden, um zu überprüfen, ob der Pub-Schlüssel des Skripts dem aus der Adresskonfiguration übereinstimmt. diesem Fall verwenden wir auch die definierte erste Methode. Jetzt erstellen wir eine Methode, um eine Adresskonfiguration nach Adresstyp zu finden . Auch hier verwenden wir einen Filter für einen Stream von Adresskonfigurationen. Dieses Mal enthält der Filter ein Lambda , das überprüft, ob der Adresstyp der Adresskonfiguration dem vorherigen Adresstyp entspricht oder ob er der entsprechenden Änderung entspricht Adresstyp. Dieses Mal geben wir die Adresse zurück, die ohne das optionale Objekt gefälscht werden kann , mithilfe der Orals-Throw-Methode. Diese Methode löst eine Ausnahme aus, wenn sie die entsprechende Adresskonfiguration nicht findet. Jetzt können wir mit dem Refactoring anderer Dienste beginnen um unsere neue Adresskonfig und den Adresskonfig-Finder zu verwenden. Lassen Sie uns mit dem Create Wallet Service beginnen. Lassen Sie uns diese beiden Zeilen löschen. Hier. Wir verwenden eine FlatMap in der Adresskonfigurationsliste. Dann übergeben wir eine Lambda-Methode als Parameter und geben im Lambda-Body zurück Die folgende Transformation erhält die Ableitungspfade der empfangenen Adresskonfiguration. Es fehlt ein letzter S-Buchstabe. Lassen Sie uns dieses Feld in Ableitungspfade umbenennen. Jetzt erhalten wir den Eintragssatz der Ableitungspfade. Dann rufen wir die Map-Methode im Stream von Ableitungspfadeinträgen auf , die für jeden Eintrag einen erweiterten Pub-Schlüssel zurückgeben, wobei die Methode create des erweiterten Pub-Schlüsseldienstes verwendet wird für jeden Eintrag einen erweiterten Pub-Schlüssel zurückgeben . Da seine Parameter den Hauptschlüssel übergeben. Der Eintragswert, der der Ableitungspfad sein wird , der Eingangsschlüssel , der der Adresstyp sein wird, und das erweiterte KI-Präfix Address Config. Schließlich konvertieren wir das Ergebnis in eine Liste. Gehen wir nun zum erweiterten Pub-Key-Service. Lassen Sie uns diese Zeilen löschen. Fügen wir dieser Methode einen vierten Parameter hinzu. Es wird ein erweitertes Ki-Präfix sein. Hier ersetzen wir dieses Argument durch das erweiterte Ki-Präfix , das öffentliche Präfix. Gehen wir nun zum Segmentadressgenerator. Hier fügen wir das Präfix als zweites Argument hinzu und verwenden es hier als Parameter. Lassen Sie uns nun die Adress-Präfix-Factory aus dieser Klasse entfernen . Und lassen Sie uns dieser Schnittstelle das zweite Argument hinzufügen , Methode zwei generieren. Gehen wir nun zum sequentiellen Adressgenerator. Im Generate-Methodenaufruf verwenden wir die Adress-Präfix-Factory. Also lasst uns es in diese Klasse injizieren. Rufen wir nun die Methode get auf übergeben den empfangenen Adresstyp als Parameter. Jetzt werden wir die Adressgenerator-Fabrik umgestalten. Lassen Sie uns all diese Zeilen löschen. Lassen Sie uns den Adresskonfig-Finder in diese Klasse einfügen. Hier rufen wir die Suche nach Adresstyp im Adresskonfigurationsfinder auf übergeben den Adresstyp als Parameter. Dann geben wir den Adressgenerator für die Konfiguration der Telefonadresse zurück . Lassen Sie uns nun die Adress-Präfix-Factory umgestalten. Lassen Sie uns all diese Zeilen entfernen. Dann fügen wir die Adresse can think Finder in diese Klasse ein. Auch hier finden wir mit dieser Methode die Adresskonfiguration nach adressiertem Typ. Dann erhalten wir die Adresspräfixe aus der gefundenen Adresskonfig. Schließlich geben wir das Adresspräfix zurück das der aktuellen Bitcoin-Umgebung entspricht , wie folgt. Lassen Sie uns die Tests für die Klassen korrigieren , die wir gerade überarbeitet haben, beginnend mit dem Test des sequentiellen Adressgenerators. Lassen Sie uns den Address Config Finder als Feld in dieser Klasse hinzufügen. Und lassen Sie uns es hier einem Modell dieser Klasse zuweisen. Lassen Sie uns nun eine neue Adresskonfiguration instanziieren und sie auf diese Variable setzen. Verwenden wir dann die eine Methode um ein zurückgegebenes Objekt zu definieren, wenn wir die Methode find by address type im Address Config Finder aufrufen . In diesem Fall wird die Segway-Konfiguration zurückgegeben. Lassen Sie uns diese Methode also in der Adresskonfigurationsklasse veröffentlichen. Lassen Sie uns nun diesen Factory-Parameter für das Adresspräfix in die Haupt-Netzzeichenfolge ändern . Und lassen Sie uns den Adresskonfigurationsfinder an die Instanziierung der Adressgenerator-Fabrik übergeben . Lassen Sie uns diesen Test durchführen. Hoppla, die Kompilierung ist aufgrund eines Fehlers im UTXO DTO Builder fehlgeschlagen . Lass es uns reparieren. Hier. Wir werden die Adresskonfiguration mit dem Adresskonfig-Finder abrufen. Also lasst uns es in diese Klasse injizieren. Lassen Sie uns die Adresskonfigurationsliste aus dieser Klasse löschen. Jetzt finden wir hier die Adresskonfiguration nach Adresstyp. Dann erhalten wir den Ableitungspfad unter Verwendung des empfangenen Adresstyps. Schließlich verketten wir den String-Schrägstrich und den Adressindex mit dem Ergebnis. Lassen Sie uns den Test noch einmal durchführen. Toll, der Test ist bestanden. Lassen Sie uns nun den Create Wallet Service Test korrigieren. Lassen Sie uns diese Zeilen löschen. Instanziiert die Adresskonfiguration hier. Dann erstellen wir hier die Adresskonfigurationsliste. Das Hinzufügen des Seg würde es konfigurieren. Lassen Sie uns all diese Zeilen entfernen. Jetzt instanziieren wir die notwendigen Objekte wie folgt. Lassen Sie uns diesen Test durchführen. Grad. Der Test ist bestanden. Lassen Sie uns nun den erweiterten Pub Key Service Test beheben. Wir fügen das Hauptpräfix Net Seg als letzten Parameter der Methode create hinzu. Und lassen Sie uns diesen Test durchführen. Toll, es ist vorbei. Lassen Sie uns abschließend den Segmentadressgeneratortest korrigieren. Wir werden die Adress-Präfix-Factory aus dieser Klasse entfernen. Und wir übergeben das Hauptnetzadresspräfix P2 WP k h als zweiten Parameter an diese Methode. Lassen Sie uns diesen Test durchführen. Grad. Der Test ist bestanden. Im folgenden Video werden wir unsere Anwendung weiter überarbeiten. 62. 60 Nested Segwit Teil 2 skillshare 2: In diesem Video werden wir unsere Anwendung weiter überarbeiten. Fangen wir also mit der Adressparser-Klasse an. Lassen Sie uns den Adresskonfig-Finder in diese Klasse einfügen. Lassen Sie uns diesen Code entfernen. Jetzt verwenden wir den Address Config Finder, um eine Adresskonfiguration nach dem Script-Pub-Schlüsseltyp zu finden, übergeben den Script-Pub-Schlüsseltyp an diese Methode. Dann ordnen wir das Ergebnis zu und wenden den Adresskonfig-Adressparser an, wobei wir den Skript-Pub-Schlüssel und das richtige Präfix als Parameter übergeben . Jetzt verwenden wir die URL-Methode, um eine leere Zeichenfolge zurückzugeben, falls eine Adresse nicht analysiert werden kann. Lassen Sie uns diese Transformation zurückgeben. Gehen wir nun zur aktuellen Wallet-Klasse. Lassen Sie uns die Empfangsadresse entfernen und die Adresse aus dieser Klasse ändern. Anstatt ein Feld für jede Empfangs- und Änderungsadresse zu verwenden , verwenden Sie ein Feld für Empfangsadressen, um die verschiedenen Adressen zu modellieren , die für den Empfang von Bitcoins in unserer Brieftasche verwendet werden . Lassen Sie uns also das Feld Empfangsadressen zu dieser Klasse hinzufügen. Es wird eine beobachtbare Map mit Adresstypen als Schlüsseln und Zeichenketten als Werten sein. Wird es hier mit einer beobachtbaren HashMap aus der FX-Sammlungsklasse instanziieren . Lassen Sie uns die Methoden löschen , die die entfernten Felder verwenden. Lassen Sie uns nun die Methode zum Festlegen von Empfangsadressen erstellen. Wir fügen für jeden erweiterten Pub-Schlüssel einen Eintrag in die Liste der Empfangsadressen ein. Der Schlüssel jedes Eintrags ist ein Adresstyp, der anhand des Werts der Methode abgerufen wird ein Adresstyp, der anhand des Werts der Methode abgerufen , die den erweiterten Pub-Schlüsseltyp als Parameter übergibt . Der Wert ist die erste Adresse des erweiterten Pub-Schlüssels. Lassen Sie uns nun die festgelegte Empfangsadressmethode erstellen. Wir verwenden diese Methode, um die aktuelle Empfangsadresse für einen bestimmten Adresstyp zu aktualisieren die aktuelle Empfangsadresse . Es akzeptiert einen Adressindex und einen Adresstyp als Parameter. Zuerst erhalten wir die nächste Adresse mit der Methode get address ID, die diese Parameter übergibt. Dann fügen wir die erhaltene Adresse in die Empfangsadressen ein, wobei der Adresstyp als Schlüssel verwendet wird. Lassen Sie uns die Methode Get Receiving Address erstellen. Es nimmt einen Adresstyp und gibt die aktuelle Empfangsadresse für diesen Typ zurück . Es wird sie von den Empfangsadressen abgerufen , wobei der Adresstyp als Schlüssel für den Abruf verwendet wird. Lassen Sie uns nun einen Getter für die Empfangsadressen erstellen. Benennen wir es um, um beobachtbare Empfangsadressen zu erhalten. Gehen wir nun zum Dienst „ Aktuelle Wallet-Adressen aktualisieren “. Lassen Sie uns all diese Zeilen in einem Plattformaufruf entfernen , der später ausgeführt wird. Fügen wir eine Lambda-Funktion hinzu, die die aktuelle Wallet-Set-Empfangsadresse verwendet die aktuelle Wallet-Set-Empfangsadresse , um die nächste Adresse festzulegen. Lassen Sie uns diese Felder entfernen, da wir sie nicht benötigen. Lassen Sie uns nun den aktuellen Wallet-Service aktualisieren. Lassen Sie uns diese beiden Zeilen entfernen. Dann fügen wir der Methode Set Receivers, die wir gerade in der aktuellen Wallet erstellt haben, einen Anruf Methode Set Receivers, die wir gerade in der aktuellen Wallet erstellt haben hinzu. Gehen wir nun zum Controller mit der Registerkarte „ Empfangen“. Lassen Sie uns diesen Code entfernen. Hier. Wir holen uns die beobachtbaren Empfangsadressen aus der aktuellen Brieftasche und fügen ihr einen Listener hinzu. Der Listener wird die folgende Lambda-Funktion sein. Mit dieser if-Anweisung wird überprüft, ob die geänderte Empfangsadresse eine zweite Adresse war, welche Adresse? Wenn ja, setzen wir den Text des Felds für die Empfangsadresse auf die neu hinzugefügte Adresse. Jetzt ändern wir die Art und Weise, wie die Änderungsadresse im Projekt verwendet wird. Lassen Sie uns also eine Klasse namens Change Address Type Finder erstellen . Diese Klasse ist dafür verantwortlich, den passenden Änderungsadresstyp für eine bestimmte Adressausgabe zu finden den passenden Änderungsadresstyp . Obwohl wir verschiedene Adresstypen als Ausgabe in einer Transaktion verwenden können , wird empfohlen, denselben Typ zu verwenden, um Dritten die Erkennung zu erschweren Dritten die Erkennung zu erschweren , welche Ausgabe als Änderung verwendet wurde. Dieser Service ermöglicht es uns , dieses Problem zu lösen. Lassen Sie uns die Service-Annotation zu dieser Klasse hinzufügen. Lassen Sie uns den Adresskonfig-Finder hineinstecken. Lassen Sie uns nun die Suchmethode erstellen. Diese Methode gibt einen Adresstyp zurück und verwendet eine Adresse als Parameter. Hier rufen wir die Methode „Nach Adresse suchen “ im Adresskonfigurationsfinder auf. Dann ordnen wir den erhaltenen Wert mit dem folgenden Code dem entsprechenden Änderungsadresstyp zu. Schließlich verwenden wir die Methode or else um den Adresstyp seg zurückzugeben, der den Adresstyp ändern würde. Wenn der Adresstyp nicht gefunden wurde. Wir verwenden für diesen Fall die Segway-Änderungsadresse. Obwohl wir unserer Anwendung erlauben, Transaktionen an die meisten Adresstypen zu senden , müssen wir diesen Fallback bereitstellen , da wir nicht alle Adresstypen als Empfänger implementieren alle Adresstypen als . Adressen in unserer Brieftasche. Gehen wir nun zum Create Transaction Service. Wir müssen umgestalten, wie die Änderungsadresse in dieser Klasse abgerufen wird. Fügen wir hier die Variable „ Adresse ändern“ hinzu. Sein Wert entspricht dem Ergebnis des Aufrufs der Feinänderungsadressmethode mit der Adresse als Parameter. Lassen Sie uns diese Methode erstellen. Lassen Sie uns zunächst diese guten Aufrufe der Methode „Adresse ändern“ durch die neue Adressänderungsvariable ersetzen . Hier erhalten wir den Adresstyp mithilfe des Adressänderungs-Finders . Also lasst uns es in diese Klasse injizieren. Jetzt rufen wir die Find-Methode im Finder zum Ändern des Adresstyps auf übergeben die Adresse als Parameter. Dann rufen wir die Methode get receiving address zurück die Methode get receiving address übergeben den erhaltenen Adresstyp als Parameter. Gehen wir nun zur Adresskonfigurationsklasse. Wir fügen Felder hinzu, die sich auf die Transaktionserstellung beziehen. Jetzt. Der erste wird der Transaction Input Builder mit dieser neuen Klasse als Typ sein. Lassen Sie uns diese Klasse im API-Dienstpaket erstellen. Es wird eine Schnittstelle sein. Die Methode heißt Build, eine Transaktionseingabe zurück und ein UTXO als Parameter. Zurück zur Adresskonfiguration. Wir fügen hier das Feld Eingabe plus Ausgabegröße hinzu. Wir werden es später in der Staubrecher-Klasse verwenden. Fügen wir hier auch das ScriptSig-Größenfeld hinzu. Es wird im Transaktionsgrößenrechner verwendet. Lassen Sie uns nun auch das Feld für den Transaktionsunterzeichner hinzufügen. Lassen Sie uns diese Klasse im Paket api dot services erstellen. Es wird eine Schnittstelle sein. Es wird eine Zeichenmethode haben, die die folgenden Parameter hat. Es wird auch eine IOException auslösen. nun in der Adresskonfigurationsklasse Lassen Sie uns nun in der Adresskonfigurationsklasse die neuen Felder in der Konfiguration der Segmentadresse definieren . Wir werden einen neuen Segment Input Builder als Transaction Input Builder hinzufügen . Lassen Sie uns diese Klasse im Paket api dot services erstellen. Es implementiert die Builder-Schnittstelle für Transaktionseingaben Builder-Schnittstelle für Transaktionseingaben und die Build-Methode. Um es zu implementieren, kopieren wir den folgenden Code in die Build-Eingabemethode der Transaction Creator-Klasse und fügen ihn hier ein. Lassen Sie uns diesen Parameter in eine neue ArrayList ändern. Wir speichern diese Transaktionseingabe in dieser Variablen. Dann rufen wir die Methode set witness auf und übergeben einen neuen Zeugen mit denselben Argumenten, die wir im Transaction Creators Service verwendet haben. Schließlich haben wir die Transaktionseingabe zurückgegeben. Lassen Sie uns diese Konstanten kopieren und in den Segue What Input Builder einfügen. Und lassen Sie uns hier die Service-Anmerkung hinzufügen. Zurück zur Adresskonfiguration. Wir fügen 98 als Eingabe- und Ausgabegröße, Null als ScriptSig-Größe und einen neuen Segway-Transaktionssignierer hinzu. Lassen Sie uns diese Klasse im Paket api dot services erstellen. Lassen Sie uns die Transaction Signer-Methode implementieren. Lassen Sie uns die Service-Anmerkung hier hinzufügen. Gehen wir zum Transaction Signer Service. Wir kopieren diese Zeile und fügen sie hier ein. Lassen Sie uns diesen Parameter durch die Indexvariable ersetzen. Und lassen Sie uns hier die Betragsvariable durch den UTXO-Betrag ersetzen . Unsere Adresskonfiguration ist endlich fertig. Gehen wir nun zum Transaktionsgrößenrechner. Verwenden wir den Befehl Cleanup Code IDE, um jedem Feld in dieser Klasse das letzte Schlüsselwort hinzuzufügen . Lassen Sie uns den Adresskonfig-Finder in diese Klasse einfügen. Lassen Sie uns diesen Code löschen. Lassen Sie uns die Variable „Alle Eingaben“ neu definieren den Strom der Eingabeadressen zuzuordnen einen Verweis an die Eingabegrößenmethode zu übergeben. Lassen Sie uns diese Methode erstellen. Es gibt ein Double zurück und nimmt eine Adresse als Parameter. Hier wird ein Code zurückgegeben, der dem vorherigen ähnelt und die Eingabegröße definiert. Der ScriptSig-Größenparameter wird jedoch , indem die richtige Adresskonfiguration gefunden wird. Die Verwendung des Adresskonfigurationsfinders löst eine Ausnahme aus, wenn wir die Adresskonfiguration nicht finden. Wenn wir es finden, nehmen wir die ScriptSig-Größe daraus. Dann fügen wir die Sequenz hinzu. Schließlich summieren wir die Ergebnisse der Eingabegröße mithilfe der Doppelsummenmethode. Wenn wir keine Eingabe finden, wird Null als Summe zurückgegeben. Lassen Sie uns nun diese Zeilen löschen. Wie die Eingabegröße. Wir rufen die Map-Methode im Stream der Ausgabeadressen auf und verwenden die Ausgabegrößenmethode, um jede Ausgabegröße zurückzugeben. Hier geben wir die Summe des n-Werts, der Skript-Pub-Schlüssellänge und das Ergebnis der Script-Pub-Schlüsselgrößenmethode zurück der Skript-Pub-Schlüssellänge und das Ergebnis der Script-Pub-Schlüsselgrößenmethode die die Adresse als Parameter übergibt. Mithilfe einer if-Anweisung wird mithilfe der Segway-Methode überprüft, ob es sich bei der Adresse um eine Segway-Adresse handelt. Ist dies der Fall, geben wir die Skript-Pub-Schlüsselkonstante zurück. Ist dies nicht der Fall, lösen wir die folgende Ausnahme aus. Denken Sie daran, dass wir die Adresskonfig nicht zur Berechnung der Ausgabegröße verwenden die Adresskonfig nicht zur Berechnung der Ausgabegröße da sich die Adresskonfiguration nur auf die Adressen bezieht , die wir in unseren Wallets akzeptieren können. Da wir planen, mehr Ausgabeadressen zu unterstützen, nehmen wir als Eingaben, müssen die Ausgabekonstruktion übernehmen, ohne die Adresskonfiguration zu verwenden. Schließlich verwenden wir die reduzierte Methode, um die Summe der Ausgangsgrößen zu berechnen. Und die Or-else-Methode, um Null ohne Ausgaben zurückzugeben , gibt es. Lassen Sie uns diese Konstante löschen. Jetzt. Gehen wir zum Staubrechner. Lassen Sie uns den Adresskonfig-Finder in diese Klasse einfügen. Fügen wir dieser Staubmethode die Adresse als zweiten Parameter hinzu. Lassen Sie uns diese Zeile entfernen, um die Eingabe- und Ausgabegrößenvariable zu erstellen. Wir verwenden den Adresskonfig-Finder, um die Adresskonfiguration anhand der Adresse zu finden. Wenn keine Adresskonfiguration gefunden wird. Wir werfen eine Ausnahme aus. Ist dies der Fall, erhalten wir die Eigenschaft Eingabe plus Ausgabegröße und speichern sie in einer Variablen. Schließlich geben wir anhand der Variablen, die wir gerade definiert haben, die Formel zurück, um zu berechnen, ob es sich bei einem Ausgang um Staub handelt. Lassen Sie uns diese Konstante aus dieser Klasse entfernen. Lassen Sie uns nun den Münzauswahlschalter für einzelne zufällige Ziehungen umgestalten , um diesen Methoden den Parameter Adresse ändern zu lassen. Und wir geben die Änderungsadresse an den Dust Method Call weiter. Lassen Sie uns den Service für Transaction Creators neu gestalten. Lassen Sie uns nun diese Konstanten löschen. Lassen Sie uns eine Liste von Script Pub Key Buildern in diese Klasse einfügen . Lassen Sie uns diese Klasse im API Dot Services-Pfad erstellen. Es wird eine Schnittstelle sein. Es wird eine Match-Methode haben , die einen booleschen Wert zurückgibt und als Parameter und Adresse verwendet. Und es wird eine Build-Methode haben, die ein Skript zurückgibt und eine Adresse als Parameter verwendet. Lassen Sie uns das Einfügen dieses Felds in diese Klasse beenden. Lassen Sie uns auch den Adresskonfig-Finder in diese Klasse einfügen . Lassen Sie uns die Änderungsadresse zu diesen Methodenaufrufen hinzufügen. Lassen Sie uns diesen Code aus dieser Methode entfernen, erstellen die Skriptvariable und weisen ihr das Ergebnis der folgenden Stream-Transformation zu. Filtert den Script Pub Key Builder-Stream , um den Stream zu finden, der der Adressvariablen entspricht. Wenn wir keine finden, werfen wir eine Ausnahme aus. Dann rufen wir die Build-Methode auf dem Script auf, das Pub Key Builder gefunden hat übergeben die Adresse als Parameter. Schließlich geben wir die Transaktionsausgabe zurück die den Betrag und die Skriptvariable enthält. Lassen Sie uns nun diese und die verwendete Methode aus dieser Klasse entfernen. in der Build-Eingabemethode Lassen Sie uns in der Build-Eingabemethode diesen Code entfernen. Jetzt rufen wir die Map-Methode im Stream von utxOS auf. Darin wird das folgende Lambda übergeben, sucht die Adresskonfiguration anhand der UTXO-Adresse. Wenn wir es nicht finden, werfen wir eine Ausnahme aus. Dann holen wir uns den Transaction Input Builder aus der Adresskonfig und nennen ihn die Methode spilled, wobei das UTXO an ihn übergeben. Schließlich verwenden wir die Methode collect, um den resultierenden Stream in eine ArrayList zu konvertieren. Lassen Sie uns die P2 WP k h Script Builder-Klasse im API Dot Services-Paket erstellen . Es wird die Script Pub Key Builder-Schnittstelle implementieren. Lassen Sie uns die Schnittstellenmethoden implementieren. Lassen Sie uns die Adresspräfix-Factory in diese Klasse einfügen. In der Match-Methode wird das Ergebnis des Aufrufs der Adresse Matcher is Segway-Testmethode zurückgegeben . In der Build-Methode setzen wir zuerst die Präfixvariable auf das Adresspräfix. Factory Get method call result übergibt die Segway-Konstante als Parameter. Dann geben wir das Ergebnis des P2 WP k h-Skriptmethodenaufrufs da der Parameter an diese Methode das Ergebnis des Aufrufs der Methode back 30 to decode in hex übergibt das Ergebnis des Aufrufs der Methode back . Gehen wir zunächst zur POM-Datei, um die Bitcoin-Java-Bibliothek auf die Version 0.4, 0.4 zu aktualisieren , die die beste 32-Methode enthält, die wir benötigen. Wir übergeben das Präfix und die Adresse an diese Methode. Lassen Sie uns nun zur Transaction Signer-Klasse wechseln um mehr Refactoring zu erhalten. Lassen Sie uns den Adresskonfig-Finder in diese Klasse einfügen. Lassen Sie uns diese Zeile löschen. Stattdessen wird dieselbe Methode aufgerufen, die diese Parameter an sie übergibt. Lassen Sie uns diese Methode erstellen um die Transaktionssigniervariable zu erstellen. Wir ordnen ihm das Ergebnis der folgenden Transformation zu. Wir verwenden den Adresskonfigurationsfinder , um eine Adresskonfiguration nach adressiertem Typ zu finden , übergibt den UTXO-DTO-Adresstyp an diese Methode. Aber zuerst fügen wir dem UTXO-DTO-Datensatz das Feld Adresstyp hinzu. Und lassen Sie uns den Adresstyp zur UTXO DTO-Instantiierung im UTXO DTO Builder hinzufügen . Zurück zum Transaction Signers Service ruft die Adresskonfig-Transaktionssigniererin aus der Telefonadressenkonfiguration ab. Rufen wir abschließend die Methode Transaction Signers Sign auf und übergeben diese Parameter an sie. Fügen wir dieser Methode eine Throws-Klausel hinzu, um anzugeben, dass diese Methode eine IOException auslösen kann. Das Refactoring ist abgeschlossen. Lassen Sie uns nun einige Tests korrigieren, beginnend mit dem Test zur Auswahl einzelner zufälliger Münzen. Lassen Sie uns die Adresskonfiguration zur Setup-Methode hinzufügen. Dann fügen wir die Listenvariable Adresskonfigurationen mit dem darin enthaltenen Segment Config hinzu. Lassen Sie uns nun einen neuen Adresskonfigurationsfinder instanziieren ihm die Adresskonfigurationen übergeben. Lassen Sie uns jetzt diesen Test durchführen. Toll, es ist vorbei. Lassen Sie uns nun den Test des Transaction Creators Service beheben. Wie der vorherige Test. Lassen Sie uns eine Adresskonfiguration instanziieren und eine Adresskonfigurationsvariable und eine Adresskonfigurationsfinder-Variable erstellen eine Adresskonfigurationsvariable und eine Adresskonfigurationsfinder-Variable . Lassen Sie uns auch ein Adresspräfix instanziieren, indem wir die Reg-Testzeichenfolge und den Adresskonfigurationsfinder an dieses übergeben . Lassen Sie uns nun die Variable script pub key builder erstellen , die ihr eine Liste mit einem neuen P2 WP k h Script Builder zuweist . Lassen Sie uns diesen Test durchführen. Toll, es ist vorbei. Lassen Sie uns nun den Test zur Berechnung der Transaktionsgröße korrigieren. wie bei den vorherigen Tests Lassen Sie uns wie bei den vorherigen Tests eine Adresskonfiguration instanziieren und eine Adresskonfigurationsvariable und eine Adresskonfigurationsfinder-Variable erstellen eine Adresskonfigurationsvariable und . Lassen Sie uns diese Falltests ändern. Wir fügen die Testfälle ein, die du auf der Seite Projekt und Ressourcen findest . Lassen Sie uns die Methode „ Endkopien“ importieren. Diese Testfälle sind identisch mit den vorherigen, aber diesmal haben sie echte Adressen, da sie jetzt für die Logik der Transaktionsgrößenrechner wichtig sind . Lassen Sie uns diesen Test durchführen. Toll, es ist vorbei. Gehen wir nun zur GUI-Testklasse. Fügen wir diesem Methodenaufruf die wichtigste Netzsegment-Präfixkonstante hinzu. Und lassen Sie uns diesem Methodenaufruf die Reg Test P2 WP k h Adresspräfixkonstante als Parameter hinzufügen k h Adresspräfixkonstante . Jetzt empfehle ich Ihnen, alle Anwendungstests durchzuführen. Sie müssen alle bestehen. 63. Nested Segwit Adressen: In dieser Präsentation werden wir über verschachtelte Segmentadressen sprechen . Also, was ist ein verschachtelter Übergang? Welche Adresse? Verschachtelte Segmentadressen werden auch als Rap-Segment P2, SSH-Dash p2, WPA und WPA2 bezeichnet. Und P2-SSH-Adressen. Letzterer Name beschreibt am besten, was sie sind und welche Adresse ein Pay-to-Witness-Pub-Schlüssel-Hash-Skript codiert . In einem Pay-to-Script-Hash-Skript. Die meisten modernen Wallets unterstützen diese Adressen. Ihr Hauptvorteil besteht darin, dass sie ältere Wallets, die normalerweise Pay-to-Script-Hash-Adressen unterstützen, aber keine nativen Segmentadressen unterstützen, ermöglichen die normalerweise Pay-to-Script-Hash-Adressen unterstützen, aber keine nativen Segmentadressen unterstützen Bitcoins an sie zu senden. Daher können Besitzer verschachtelter Segmentadressen von einigen Vorteilen von Segway-Transaktionen profitieren, z. B. von günstigeren Transaktionsgebühren und dem Erhalt von Geldern aus alten Wallets. Warum also die Notwendigkeit systemeigener Segue-Adressen? Du fragst vielleicht. Der Grund dafür ist, dass native Segue-Adressen Transaktionen noch kleiner machen als verschachtelte Segmentadressen. Verschachtelte Segmentadressen wurden 2017 verfügbar . Nach der Aktualisierung des Segments die Regeln zur Generierung wurden die Regeln zur Generierung verschachtelter Segmentadressen in BIP 141 definiert. Wir haben verschachtelte Segmentadressen als sekundäre Empfangsadressen unserer Brieftaschen ausgewählt als sekundäre Empfangsadressen unserer Brieftaschen , um den Empfang von Bitcoins aus alten Wallets zu ermöglichen . Um verschachtelte Segmentadressen zu verstehen, lassen Sie uns zunächst die P2-SSH-Adressen verstehen. P2 SSH ist eine Abkürzung für Pay-to-Script-Hash. P2-SSH-Adressen sind genau das. Sie kodieren einen Hash, der aus einem Bitcoin-Skript generiert wurde. Sehen wir uns den Prozess zum Generieren einer P2 SH-Kopfadresse an. Wir beginnen mit einem hexadezimalen serialisierten Redeem-Skript. I'll Redeem-Skript ist normalerweise ein Bitcoin-Skript mit mehreren Signaturen, aber es kann jedes andere Bitcoin-Skript sein. Wir verwenden den Hash-160-Algorithmus, um einen Skript-Hash aus dem serialisierten Redeem-Skript zu generieren. Dann kombinieren wir den Skript-Hash mit einem Präfix und wenden den Base-58-Kodierungsalgorithmus an, um durch Basis-58-Dekodierung eine P2-SH-Adresse zu erzeugen durch Basis-58-Dekodierung Wir können den Skript-Hash von einem P zurückerhalten . 2 SSH-Adresse, ein verschachtelter Abschnitt. Welche Adresse ist einfach ein 58-kodiertes P2-SSH-Basisskript was Redeem-Skript ist ein Segment-Skript. Lassen Sie uns nun lernen, wie man einen P2 SH-Skript-Pub-Schlüssel erstellt. Denken Sie daran, dass ein Script-Pub-Schlüssel Teil einer Transaktionsausgabe ist und die Art und Weise darstellt, wie die Empfangsadresse in einer Transaktion vorhanden ist. Beginnend mit einer P2-SSH-Adresse haben wir also zuerst die Basis 58 dekodiert, um einen Skript-Hash zu erhalten. Dann erstellen wir ein Skript, das aus einem OP-Hash 160-Opcode, dem Script-Hash und einem OP-Equal-Opcode besteht. Dies ist der P2 SH-Skript-Pub-Schlüssel. Um Geld an eine P2-SSH-Adresse zu senden, sollten Sie dieses Skript zusammen mit dem Betrag, den jede Wallet, aber Bitcoins an eine P2-SSH-Adresse senden kann, Bitcoins an eine verschachtelte Segue senden kann, in die Transaktionsausgabe eintragen zusammen mit dem Betrag, den jede Wallet, aber Bitcoins an eine P2-SSH-Adresse senden kann, Bitcoins an eine verschachtelte Segue senden kann, in die Transaktionsausgabe aber Bitcoins an eine P2-SSH-Adresse senden kann, Bitcoins an eine verschachtelte Segue senden kann, . Welche Adresse? Sehen wir uns nun an, wie man eine verschachtelte Segue-Transaktionseingabe erstellt, beginnend mit dem gültigen Pub-Schlüssel für eine UTXO-Adresse. Anschließend wenden wir den Hash-160-Algorithmus an, um einen Pub-Key-Hash zu erhalten. den Hash mit einem Nullpräfix kombinieren, erhalten wir ein Segmentskript. Dies ist das Einlöse-Skript, das später zur Transaktionseingabe hinzugefügt wird. Jetzt unterschreibe ich eine Transaktion. Dazu erzeugen wir zunächst einen Signatur-Hash aus einer Insider-Transaktion unter Verwendung desselben Signatur-Hash-Algorithmus, den wir zum Signieren einer Segue-Transaktion verwenden. Dann kombinieren wir den Signatur-Hash mit einem gültigen privaten Schlüssel, um die Signatur mithilfe des ECDSA zu generieren . Als Nächstes zeigen wir das Zeichen, die Transaktionseingabe, den Ausgabeindex der Transaktions-ID, und dann funktionieren Sequenzfelder genauso wie andere Transaktionstypen. Wir fügen das Redeem-Skript in das ScriptSig-Feld und wir fügen die Signatur und den Pub-Schlüssel zum Zeugenfeld hinzu. Beachten Sie, dass ScriptSig im Gegensatz zu nativen Eingaben von seg nicht leer ist. In diesem Fall. Das Zeugenfeld verschachtelter Segmenteingaben hat dieselben Elemente wie native Segmenteingaben. Sehen wir uns nun an, wie ein Skript für verschachtelte Segmente während der Transaktionsvalidierung durch die Knoten ausgeführt wird . Validierung verschachtelter Segmente erfordert die Validierung von zwei kombinierten Skripten. Gegeben wurde ein P2-SSH-Skript-Pub-Schlüssel von einigen UTXO und das entsprechende ScriptSig aus einer Transaktionseingabe. Beide Skripte werden kombiniert und bilden das erste kombinierte Skript. Das Redeem-Skript wird als einzelnes serialisiertes Element an das kombinierte Skript übergeben . Bei dieser ersten Validierung von links nach rechts wird jedes Element im kombinierten Skript bewertet, beginnend mit dem Redeem-Skript, das dem Ausführungsstapel hinzugefügt wird. Dann den OP-Hash 160, wende den Hash 160 und das Redeem-Skript an und wandle es in einen Skript-Hash um. Dann werden der Skript-Hash und das kombinierte Skript zum Ausführungsstapel hinzugefügt. Schließlich vergleicht der Opcode OP equal beide Script-Hashes und gibt true zurück, wenn sie gleich sind. Wenn sie nicht gleich sind, wird die Transaktion als ungültig angesehen. Als Nächstes wird ein zweites Skript gebildet, indem der Zeuge und das ScriptSIG kombiniert werden. Dieses Mal wird das Redeem-Skript in ScriptSig in seiner Gesamtheit ausgewertet , genauso wie es bei systemeigenen Scriptauswertungen von Segue der Fall ist . Und wie bei der systemeigenen Segue-Skriptauswertung löst die erste Nullstelle in ScriptSig eine spezielle Regel aus, die es in das Skript konvertiert , das im kombinierten Skript vorhanden ist. Von nun an wird das kombinierte Skript genauso ausgeführt wie das kombinierte Skript aus segmentnativen Transaktionen. Aus dem kombinierten Skript werden die Signatur- und Pub-Schlüssel zu einem Ausführungsstapel hinzugefügt. Dann dupliziert der OPT-up-Opcode den Pub-Schlüssel im Ausführungsstapel. Hash 160 Hashes, der letzte Pub-Schlüssel, der dem Stack hinzugefügt wurde. Dann wird aus dem kombinierten Skript der Pub-Key-Hash zum Stack hinzugefügt. Up equal verify Opcode entfernt die letzten beiden Elemente aus dem Ausführungsstapel und vergleicht sie. Wenn sie gleich sind, wird das Skript weiter ausgeführt. Schließlich überprüft der Object-Sig-Opcode, ob die Signatur für den im Stack verbleibenden Pub-Schlüssel gültig ist . Wenn es gültig ist, gibt es den Wert TRUE an den Ausführungsstapel zurück. Nachdem alle Skriptelemente zum Ausführungsstapel hinzugefügt wurden, wird die Transaktionseingabe als gültig angesehen . Wenn das zuletzt hinzugefügte Element wahr ist, muss dieser Vorgang für jedes Transaktionseingabe, alle Eingaben müssen gültig sein damit eine Transaktion als gültig angesehen wird. Nur zur visuellen Erinnerung: Lassen Sie uns überprüfen, woher einzelnen Elemente des Skript-Pub-Schlüssels, ScriptSig und Witness während der Transaktionskonstruktion stammen . Der im Script-Pub-Schlüssel vorhandene Script-Hash stammt von der Basis 58 dekodiert die Adresse des UTXO, das ausgegeben wird. Der Pub-Key-Hash und der ScriptSig stammen aus dem Hash 160s eines gültigen öffentlichen Schlüssels. Derselbe öffentliche Schlüssel ist im Zeugen vorhanden. Die Signatur des Zeugen wurde durch die Anwendung des ECDSA-Algorithmus erzielt , der einen gültigen privaten Schlüssel benötigt. Der öffentliche Schlüssel und der Zeuge stammten aus dem öffentlichen Schlüssel, der aus dem genannten privaten Schlüssel abgeleitet wurde. Sehen wir uns nun einige Parameter an, die für die Ableitung verschachtelter Segmentadressen wichtig sind. Im Bitcoin-Hauptnetz ist das Präfix C4, das zur Ableitung von P2-SSH-Adressen benötigt wird. Nach der Base-58-Kodierung beginnen Kleider mit diesem Präfix mit der Ziffer Drei im Bitcoin-Testnetz und dem Reg-Test. Das Präfix, das zur Ableitung von P2-SSH-Adressen benötigt wird, ist 05. Nach der Basis 58 beginnen die Kodierungsadressen mit diesem Präfix mit der Ziffer bis. Der Ableitungspfad, der zur Ableitung verschachtelter Segmentadressen verwendet wird , beginnt mit dem 49 gehärteten Pfad für Wallets, der den BIP 49-Richtlinien entspricht. 64. 62 Nested Segwit Teil 3 skillshare 2: In diesem Video implementieren wir die verschachtelte Seg-Adresse in unserer Brieftasche und fügen sie als weitere Option hinzu, um Bitcoins in unserer Brieftasche zu erhalten. Lassen Sie uns zunächst unsere Anwendung vorbereiten, um einige Tests zum neuen Adresstyp hinzuzufügen . Gehen wir also zum Node, holen wir uns einen neuen Adress-Client. Wir müssen dafür sorgen, dass unsere Anwendung unseren Knoten aufrufen kann , um P2-SSH-Adressen zu generieren. So können wir Tests erstellen, um Bitcoin an diese Adressen zu senden. Verwenden wir also die IDE-Option zum Ändern der Signatur , um dieser Methode einen neuen Parameter hinzuzufügen. Der neue Parameter ist eine Zeichenfolge, sein Name wird vom Typ adressiert und sein Standardwert ist die Zeichenfolge back 32. Fügen wir diesem Methodenaufruf eine leere Zeichenfolge hinzu. Dieser Parameter wird verwendet, wenn wir unserer neuen Adresse ein Label hinzufügen möchten Da wir es nicht benötigen, setzen wir es auf eine leere Zeichenfolge. Und lassen Sie uns den Adresstyp als letzten Parameter hinzufügen. Okay, jetzt können wir unseren Knoten bitten, P2-SH-Adressen zu erstellen , falls der IDE-Refactor funktioniert hat. Jetzt haben die aktuellen Aufrufe dieser Methode die Zeichenfolge zurück 32, da es sich um weniger Parameter handelt. Gehen wir nun zum Test zum Senden von Bitcoins über. Lassen Sie uns diese Methode in die GUI-Testklasse verschieben. Machen wir es geschützt. Anstatt hier das Super-Keyword zu verwenden, verwenden wir dieses. Gehen wir nun zur Testklasse für empfangene Bitcoins. Lassen Sie uns den gesamten Code in dieser Klasse kopieren. Im GUI-Testpaket. Lassen Sie uns eine neue Testklasse namens Receive Bitcoin Nested Segue Test erstellen. Und lassen Sie uns den Inhalt in diese Klasse einfügen. Lassen Sie uns einige Anpassungen an dieser Klasse vornehmen. Lassen Sie uns den Klassennamen ändern, um den Bitcoin Nested Segue Test zu erhalten. Lassen Sie uns nun die Namen der Testmethoden ändern. Fügen wir hier eine verschachtelte Segmentadresse hinzu. Machen wir dasselbe mit allen anderen Testmethoden und geben in ihren Namen an, welche Adressen Bitcoins in verschachtelter Reihenfolge erhalten werden ? Lassen Sie uns nun diesen ersten Test anpassen. Wir passen den Namen der Brieftasche an. Dann ändern wir den Suchparameter hier. Die Adressvariable wird also dem Wert des Feldes zugewiesen , in das das verschachtelte Segment adressiert. Anstatt die Methode Adresse ist gültig zu verwenden, verwenden wir hier die Methode „Verschachteltes Segment Adresse ist gültig“, die wir erstellen werden. Lassen Sie uns diese Code-Formatierung korrigieren. Lassen Sie uns nun die verschachtelte Methode „ Welche Adresse ist gültig“ in der GUI-Testklasse erstellen Methode „ Welche Adresse ist gültig“ in der GUI-Testklasse Wir verwenden die Methode address valid als Basis. Also lass es uns duplizieren. Lassen Sie uns seinen Namen korrigieren. Jetzt. Lassen Sie uns den Adresstyp hier auf die verschachtelte Segway-Konstante ändern . Und lassen Sie uns den Ableitungspfad hier ändern , sodass er mit 49 beginnt. Lassen Sie uns diese Konstante im Adresstyp enum erstellen. Lassen Sie uns hier auch den verschachtelten Übergang erstellen, um eine Konstante zu ändern. Lassen Sie uns hier das Präfix der generierten Adresse in das Testnetz P2 SH-Adresspräfix ändern der generierten Adresse in . Und anstatt den Segmentadressgenerator zu verwenden, wird der Generator für verschachtelte Segmentadressen verwendet. Lassen Sie uns dieses Feld zu dieser Klasse hinzufügen. Wir verwenden die automatische verdrahtete Annotation, um sie in diese Klasse einzufügen. Lassen Sie uns diese Klasse im API Dot Services-Paket erstellen. Werde es später implementieren. Zurück zur empfangenen Bitcoin-Testklasse Nested Segue. Nehmen wir die gleichen Anpassungen an den anderen Testmethoden vor. Gehen wir nun zur Adresskonfigurationsklasse. Lass uns diese Bean duplizieren sie als Basis zu verwenden, um die verschachtelte Segway-Konfiguration zu erstellen. Lassen Sie uns diese Parameter in verschachteltes Segment und verschachteltes Segue ändern. Lassen Sie uns diesen Methodennamen für zwei verschachtelte Segmentkonfigurationen ändern. Lassen Sie uns nun die Parameter der Adresskonfiguration ändern. Der erste Parameter wird der verschachtelte Adresstyp seg sein. Im zweiten Argument ändern wir die Kartenschlüssel verschachteltes Segment und verschachteltes Segment ändern sich. Und beide Ableitungspfade. Wir beginnen mit 49. Wir verwenden den Adressgenerator für verschachtelte Segmente als Adressgenerator. Lassen Sie uns dafür sorgen, dass es die Adressgenerator-Schnittstelle implementiert. Lassen Sie uns die Schnittstellenmethode hinzufügen. Lassen Sie uns nun jedes Umgebungsadress-Präfix festlegen. Die wichtigste Netzumgebung. Wir verwenden die Hauptnetz-P2-SSH-Adresspräfixkonstante. Die Test-Net- und Reg-Testumgebungen. Wir verwenden die P2-SH-Adresspräfixkonstante des Testnetzes. Lassen Sie uns das erweiterte Ki-Präfix in die Hauptkonstante des verschachtelten Segment-Präfixes ändern . Der Address Matcher wird das Prädikat als verschachteltes Segue-Prädikat sein. Lassen Sie uns dieses Feld im Address Matcher erstellen. Es wird dem obigen Segmentprädikat ähneln. Der Matcher gibt jedoch true zurück, wenn die Adresse stattdessen mit drei oder zwei beginnt. Lassen Sie uns es jetzt hier importieren. Verwenden wir hier die P2-SSH-Konstante. Verwenden wir die Skriptmethode für verschachtelte Segmentadressen als Skriptparser. Verwendet den Input-Builder für verschachtelte Segmente als Transaktionseingabegenerator. Lassen Sie uns diese Klasse im API Dot Services-Paket erstellen. Lassen Sie uns die Schnittstellenmethode hinzufügen. Als Eingabe- und Ausgabegröße. Wir legen 180 als ScriptSig-Größe 23 fest. Und als Transaktionsunterzeichner verwendet den verschachtelten Segway-Transaktionssignierer. Lassen Sie uns diese Klasse im API Dot Services-Paket erstellen. Und lassen Sie uns die Schnittstellenmethode hinzufügen. Unsere verschachtelte Segue-Konfiguration ist fertig. Jetzt müssen wir den Adressgenerator für verschachtelte Segmente, den Input Builder und den Transaktionssignierer implementieren den Adressgenerator für verschachtelte Segmente, . Beginnen wir mit dem Generator für verschachtelte Seg Would-Adressen. Lassen Sie uns zunächst einen Test für diesen Dienst im Testpaket api dot services hinzufügen . Es wird die Spezifikationsklasse erweitern. Fügen wir die folgende Setup-Methode hinzu. Fügen wir den Methodenaufruf des Security Ad Providers hinzu. Lassen Sie uns den Adressgenerator für verschachtelte Segmente als Feld in dieser Klasse hinzufügen . Und lassen Sie uns es hier instanziieren. Gehen wir nun zum Test des Segmentadressgenerators über. Lassen Sie uns diesen Test kopieren und hier einfügen. Wir werden es als Grundlage für unseren neuen Test verwenden. Anstatt den Segmentadressgenerator zu verwenden, verwende ich hier den verschachtelten Seg-Adressgenerator. Lassen Sie uns das Präfix für diese Konstante ändern. Lassen Sie uns diese Testfälle entfernen und diejenigen einfügen, die für verschachtelte Segmentadressen gültig sind. Sie sind auf der Seite Projekt und Ressourcen verfügbar. Zurück zum Adressgenerator für verschachtelte Segmente. Ich habe diese Klasse fälschlicherweise als tollen Kurs erstellt. Lassen Sie uns diese IDE-Funktion verwenden, um diese Klasse nach Java zu konvertieren. Lassen Sie uns diesen Code entfernen. Lassen Sie uns die Service-Annotation zu dieser Klasse hinzufügen. Hier konvertieren wir den erweiterten untergeordneten Schlüssel in einen öffentlichen Schlüssel. Dann geben wir die verschachtelte Segmentadresse aus dem komprimierten Public-Key-Methodenaufruf für das Objekt „Abrufen“ zurück komprimierten Public-Key-Methodenaufruf und übergeben die Präfixvariable an dieses Objekt. Lassen Sie uns diesen Parameter in Extended Key umbenennen. Lassen Sie uns jetzt diesen Test durchführen. Toll, es ist vorbei. Lassen Sie uns nun den verschachtelten Segue What Input Builder implementieren. Lassen Sie uns die Service-Annotation zu dieser Klasse hinzufügen. Lassen Sie uns die Build-Methode im Segment Input Builder kopieren und als Basis für unsere neue Build-Methode verwenden. Lassen Sie uns diese beiden Konstanten auch in die verschachtelte Segue Input Builder-Klasse einfügen . Fügen wir nun die verschachtelte Segway-Dummy-Konstante ScriptSig in das Skript ArrayList ein. Lassen Sie uns diese Konstante erstellen. Es entspricht der Zeichenfolge Null, die 44 mal wiederholt wird. Hier müssen wir diese Konstante tatsächlich in eine Methodenliste übergeben . Lassen Sie uns nun den verschachtelten Segway-Transaktionssignierer implementieren . Lassen Sie uns die Service-Anmerkung hier hinzufügen. Lassen Sie uns die Sign-Methode in den Segway-Transaktionssignierer kopieren und sie als Grundlage für unsere neue Sign-Methode verwenden. Hier verwenden wir statt der Transaktions-ECDSA-Signersigniermethode die Methode Sinus Nested Segue aus der P2 SH-Transaktion ECDSA Signer. Fügen wir das Redeem-Skript als viertes Argument in dieser Methode hinzu. Lassen Sie uns dieses letzte Argument entfernen. Lassen Sie uns die Skriptvariable Redeem erstellen. Diese Variable entspricht dem P2 WP k h-Skriptmethodenaufruf. Als Parameter wird der Hash 160 des entsprechenden komprimierten öffentlichen Schlüssels des empfangenen privaten Schlüssels übergeben entsprechenden komprimierten öffentlichen Schlüssels . Die Methode Sign Nested Segue kümmert sich darum, das Redeem-Skript zum Witness-Feld und den öffentlichen Schlüssel und die Signatur zum ScriptSig-Feld hinzuzufügen Witness-Feld und den öffentlichen Schlüssel . Okay, die verschachtelte Segue-Konfiguration ist endlich fertig. Lassen Sie uns nun das neue Feld für verschachtelte Segmente zur Registerkarte Empfangen FXML hinzufügen . Lassen Sie uns zunächst die Empfangsadresse und den Labeltext für die Segmentadresse ändern . Lassen Sie uns nun diesen ganzen Code duplizieren und diesen Labeltext in eine verschachtelte Seg-Wuld-Adresse ändern . Lassen Sie uns auch diese Ethik-ID ändern zwei verschachtelte Segue-Empfangsadressen. Lassen Sie uns dieses Feld in die zweite Zeile seines Containers verschieben. Fügen wir dazu das Zeilenindexattribut für den Rasterbereich zu diesem Feld hinzu und legen wir es auf eins fest. Machen wir dasselbe mit diesem Etikett. Gehen wir nun zum Controller mit der Registerkarte „ Empfangen“. Lassen Sie uns dies duplizieren, wenn der Block in dieser if-Anweisung überprüft, ob es sich bei der Änderung der Adresse um eine verschachtelte Segmentadresse handelt. Wenn ja, setzen wir den TextField-Inhalt der verschachtelten Segue-Empfangsadresse TextField-Inhalt der verschachtelten Segue-Empfangsadresse auf die Änderung der Adresse. Lassen Sie uns dieses Feld zu dieser Klasse hinzufügen. Und lassen Sie uns eine FXML-Annotation hinzufügen. Lassen Sie uns hier auch eine Rücksendeerklärung hinzufügen. Lassen Sie uns nun einige Tests durchführen. Lassen Sie uns unseren Bitcoin-Knoten ausführen. Und lassen Sie uns diesen Test durchführen. Toll, die Tests sind bestanden. Im nächsten Video werden wir das Hinzufügen der Unterstützung für verschachtelte Segmente für unser Wallet abschließen . Siehst du, ja. 65. 63 Nested Segwit Teil 4 skillshare 2: In diesem Video werden wir die Möglichkeit implementieren, Bitcoin an verschachtelte Segue-welche Adressen zu senden. Wir beginnen mit der Erstellung von Tests für diese Funktion. also im GUI-Testpaket Lassen Sie uns also im GUI-Testpaket die Testklasse Send Bitcoin Nested Segue erstellen. Es wird die GUI-Testklasse erweitern. Lassen Sie uns einige Tests aus dem Send Bitcoin Test kopieren. Sie werden als Grundlage für unsere neuen Tests dienen. Lass uns diesen Code kopieren und hier einfügen. Jetzt kopieren wir diesen ersten Test fügen ihn dann in unsere neue Klasse ein. Machen wir dasselbe mit diesem Test. Machen wir dasselbe mit dem Dämmerungstest. Lassen Sie uns nun die neuen Tests anpassen. Lassen Sie uns diesen Testnamen ändern, um Bitcoin mit verschachtelten Segmenteingaben und verschachtelten Segue-Outputs zu senden . Lassen Sie uns mit 23 den Wallet-Namen in meinen Test ändern. Und lassen Sie uns diese Suchmethode ändern und Parameter zwei verschachtelte Segment-Empfangsadresse aufrufen . Lassen Sie uns diesen Parameter in das P2-SSH-Bindestrichsegment ändern . Dieser Parameter veranlasst den Knoten, eine verschachtelte Segmentadresse für uns zurückzugeben eine verschachtelte Segmentadresse für , damit wir Bitcoin an ihn senden können. Lassen Sie uns nun die Testfälle anpassen. Ich habe zuvor die erwarteten Gesamtgebühren für diese Fälle berechnet . Sie unterscheiden sich von Transaktionsgebühren mit nativen Eingaben und Ausgaben , da sich ihre Transaktionsgrößen unterscheiden. Lassen Sie uns ähnliche Anpassungen für den nächsten Test vornehmen. Lassen Sie uns nun den P2 SH-Skript-Builder erstellen. Es wird die Script Pub Key Builder-Schnittstelle implementieren. Lassen Sie uns seine Methoden implementieren. In der Match-Methode werden diese verschachtelten Segue-Testmethodenaufrufe zurückgegeben , die die Adresse als Parameter übergeben. Wir geben den Aufruf der P2-SH-Skriptmethode in der Build-Methode zurück , da sein Parameter die dekodierte Basisadresse 58 wie folgt übergibt . Lassen Sie uns die Service-Annotation zu dieser Klasse hinzufügen. Gehen wir nun zum Test des Transaktionsgrößenrechners über. Lassen Sie uns diese Methode duplizieren. Wir werden es als Grundlage verwenden, um einen Test zu erstellen, um die Größenberechnung von Transaktionen anhand verschachtelter Segmenteingänge und -ausgaben zu überprüfen die Größenberechnung von Transaktionen . Lassen Sie uns also den Methodennamen ändern, um dies widerzuspiegeln. Lassen Sie uns diese Testfälle entfernen und die auf der Seite Projekt und Ressourcen verfügbaren Testfälle einfügen auf der Seite Projekt und Ressourcen verfügbaren Testfälle . nun in der Setup-Methode Fügen wir nun in der Setup-Methode die verschachtelte Seg-Konfiguration zur Adresskonfigurationsliste hinzu. Gehen wir nun zum Transaktionsgrößenrechner in der Script-Pub-Schlüsselgrößenmethode. Fügen wir die folgende if-Anweisung hinzu, um zu testen, ob es sich der empfangenen Adresse um ein verschachteltes Segue handelt. Welche Adresse? Wenn ja, wird die verschachtelte Segway-Konstante des Skript-Pub-Schlüssels zurückgegeben. Lassen Sie uns diese Konstante erstellen. Sein Wert wird 23 sein. Lassen Sie uns jetzt diesen Test durchführen. Toll, es ist vorbei. Lassen Sie uns jetzt unseren Knoten ausführen. Und lassen Sie uns den Send Bitcoin Nested Segue Test durchführen. Toll, die Tests sind bestanden. Lassen Sie uns nun ein wenig mit unserer Brieftasche in der Testnetzumgebung spielen . Um das zu tun, ändern wir diese Variable in der Datei bitcoin.com, um Net zu testen. Und lassen Sie uns unseren Knoten neu starten. Warten wir, bis es synchronisiert ist. Je nachdem, wie aktuell Ihre Notiz ist. Es kann Minuten bis Stunden dauern. Okay, ich habe die Summe der Stunden gewichtet. Und zum Schluss noch meine Notizensynchronisierung. Lassen Sie uns unsere Anwendung ausführen. Lass uns eine Brieftasche erstellen. Zuerst. Lassen Sie uns einige Bitcoins in unserer verschachtelten Segmentadresse erhalten . Verwenden wir dazu diesen Wasserhahn. Okay, die Transaktion ist in meiner Brieftasche erschienen. Warten wir ein wenig, bis es bestätigt ist. Okay. Jetzt hat die Transaktion eine Bestätigung. Lassen Sie uns nun etwas Geld an die Adresse des Wasserhahns schicken. Interessanterweise musste diese Transaktion nicht geändert werden und wir hatten am Ende kein Geld da wir unseren einzigen Beitrag ausgegeben haben. Lassen Sie uns die letzte Transaktion im Block-Explorer überprüfen. Warten wir ein wenig, bis es bestätigt ist. Ich habe einige Minuten gewartet und jetzt hat es drei Konformationen. Der Block Explorer zeigt dasselbe. Großartig. Alles funktioniert wie erwartet. Lass uns noch einen Test machen. Lassen Sie uns mehr Satoshis zuerst in unserer Segmentadresse erhalten , dann in unserer verschachtelten Seg-Adresse. Okay, jetzt, da beide Transaktionen bestätigt wurden, senden wir etwas Geld von dieser Seite aus an eine verschachtelte Segmentadresse. Jetzt hat die Transaktion eine Änderung generiert. Da wir es an eine verschachtelte Segmentadresse gesendet haben, wurde die generierte Änderung auch an ein verschachteltes Segue gesendet. Welche Adresse? Nach einer Weile wurde die Transaktion bestätigt. Großartig. 66. 64 Legacy Skillshare 2: In diesem Video werden wir in unserer Brieftasche die Möglichkeit implementieren, Bitcoins an P2 pKa H-Adressen zu senden, auch bekannt als Legacy-Adressen. P2, pk h war vor der zunehmenden Beliebtheit von Segmentadressen in den letzten Jahren der am häufigsten verwendete Kleidungsstil zunehmenden Beliebtheit von Segmentadressen in den letzten Jahren der . Heutzutage ist es immer noch sehr beliebt. Daher ist es wichtig, dass unser Wallet Bitcoins an diese Adressen senden kann. Lassen Sie uns damit beginnen, die Art und Weise zu überarbeiten, wie unser Wallet Script-Pub-Schlüssel erstellt, sodass es einfacher wird, Unterstützung für das Senden von Bitcoins an andere Adresstypen hinzuzufügen in Zukunft einfacher wird, Unterstützung für das Senden von Bitcoins an andere Adresstypen hinzuzufügen. Lassen Sie uns dazu den Skriptkonfigurationsdatensatz im Domain-Paket erstellen . Ähnlich wie die Adresskonfiguration enthält diese Klasse Parameter, die für die Erstellung von Transaktionen für bestimmte Skript-Pub-Schlüsseltypen wichtig sind. Fügen wir also die folgenden Felder hinzu. Der Script Pub Key Builder, die Script-Pub-Schlüsselgröße und das Address Matcher-Prädikat, das hilft, den Skriptkonfigurationstyp anhand der Adresse zu identifizieren . Lassen Sie uns nun die Skriptkonfigurationsklasse im API Dot Config-Paket erstellen . Auch hier ähnlich der Adresskonfigurationsklasse. Diese Klasse wird dafür verantwortlich sein, alle Skript-Pub-Schlüssel zu instanziieren und zu definieren unsere Wallet Bitcoin senden kann. Lassen Sie uns die Konfigurationsanmerkung hinzufügen. Lassen Sie uns nun die folgende Methode mit Bean-Anmerkungen erstellen. Es gibt eine Skriptkonfiguration zurück und definiert die P2 WP-Konfiguration. Sein Script Pub Key Builder wird der P2 WP k h Script Builder sein. Die Skriptgröße beträgt 22 und sein Adressenabgleich wird das Segment Lambda sein. Gehen wir zum P2 WP k h Script Builder. Um die Instanziierung zu vereinfachen, wird das Adresspräfix Factory aus dem Dienst entfernt . Erzeugt die Präfixvariable, indem das Präfix aus der Adressvariablen mithilfe der Parse-Präfixmethode analysiert wird. Lassen Sie uns diese Methode erstellen. Wir überprüfen zunächst, ob die Adresse mit der P2 WP k h-Adresspräfixkonstante des Testnetzes beginnt . Wenn ja, geben wir diese Konstante zurück. Dann machen wir dieselbe Aussage, verwenden jedoch stattdessen die Reg Test P2 WP k-th Adresspräfixkonstante. Schließlich geben wir die P2 WP k h-Adresspräfixkonstante des Hauptnetzes zurück , falls der Code bis zu diesem Punkt ausgeführt wird. Lassen Sie uns nun die Bean für die P2 SH-Skriptkonfiguration erstellen. Es wird den P2 SH-Skript-Builder verwenden. Seine Größe wird 23 sein und sein Adressenübereinstimmer wird das verschachtelte Segment Lambda sein. Lassen Sie uns nun die Skriptkonfiguration erstellen und ihre Klasse im Paket api dot services finden . Wie der Name schon sagt, ist dieser Dienst dafür verantwortlich, die passende Skriptkonfiguration für andere Dienste zu finden. Lassen Sie uns die Service-Anmerkung hinzufügen. Lassen Sie uns nun die Liste der Skriptkonfigurationen in diese Klasse einfügen . Spring Boot Magic fügt alle Script-Config-Beans in diese Liste ein, nachdem die Anwendung gestartet wurde. Lassen Sie uns nun die Methode „Nach Adressierung suchen“ erstellen. Es gibt eine Skriptkonfiguration zurück und nimmt eine Adresse als Parameter, die folgende Stream-Transformation zurück. Hier wird der Script can think stream mit dem Address Matcher jedes Skripts gefiltert Konfiguration. Wir werden die erste Methode verwenden, um die erste Skriptkonfiguration zu filtern. Wenn wir keine finden, verwende ich die Methode URLs throw, um eine Ausnahme auszulösen. Gehen wir nun zum Transaction Creators Service, der den Script Config Finder verwendet , um diese Klasse zu überarbeiten. Lassen Sie uns zunächst die Liste der Script Pub Key Builder aus dieser Klasse entfernen Script Pub Key Builder aus , da wir sie nicht verwenden werden. Und lassen Sie uns das Script can think Finder in diese Klasse einfügen . nun in der Build-Ausgabemethode Lassen Sie uns nun in der Build-Ausgabemethode diesen Code entfernen. Erzeugt diese Skriptvariable mit dem Script Config Finder, find by address. Dann rufen wir das Script Pub Key Builder Build-Methode für das Ergebnis auf. Lassen Sie uns nun den Transaktionsgrößenrechner überarbeiten. Lassen Sie uns den Script-Config-Finder in diese Klasse einfügen. Lassen Sie uns nun den Code in der Script-Pub-Schlüsselgrößenmethode entfernen . Stattdessen verwenden wir den Script Config Finder, um eine Skriptkonfiguration anhand der Adresse zu finden und ihre Skript-Pub-Schlüsselgröße zurückzugeben. Lassen Sie uns diese Importe und Konstanten entfernen , da wir sie nicht verwenden werden. Gehen wir nun zur Script Pub Key Builder-Oberfläche. Lassen Sie uns die Match-Methode daraus und aus all ihren Implementierungen entfernen , da wir sie nicht mehr verwenden werden. Das Refactoring ist abgeschlossen. Bevor wir nun die P2 pKa H Script Config hinzufügen , erstellen wir den Send Bitcoin Legacy Test im GUI-Testpaket. Es wird die GUI-Testklasse erweitern. Wir verwenden diese Klasse, um zu überprüfen, ob unser Wallet eine Transaktion korrekt an eine veraltete Adresse sendet. Lassen Sie uns den folgenden Code aus dem Send Bitcoin Test kopieren und hier einfügen. Wir werden es als Grundlage für unseren neuen Test verwenden. Ändern wir seinen Namen in Sollte Bitcoin mit Segmenteingaben senden, Legacy-Ausgabe und Seg würden sich ändern. Beachten Sie, dass wir zwar Geld an eine alte Adresse senden können , es aber nicht an eine alte Adresse, die zu unserer Brieftasche gehört, empfangen können . Daher werden native Segue-Adressen verwendet , um Änderungen an diesen Transaktionen zu empfangen. Und dieser Testname spiegelt das wider. Lassen Sie uns mit 26 den Wallet-Namen in meinen Test ändern. Lassen Sie uns diesen Parameter in Legacy ändern, damit wir eine Legacy-Adresse erstellen können , an die wir Bitcoins senden werden. Lassen Sie uns auch die Testfälle ändern, indem die folgenden zuvor berechneten Werte verwenden. Diese Werte unterscheiden sich von anderen Transaktionen, da P2-, pKa H-Skript-Pub-Schlüssel etwas größer sind als native Script-Pub-Schlüssel von Segue , was sich auf die Transaktionsgröße und den PHI auswirkt. Gehen wir nun zur Skriptkonfigurationsklasse. Fügen wir hier das öffentliche Schlüsselwort hinzu. Lassen Sie uns die P2 pKa H Config Bean erstellen da ihr Script Pub Key Builder einen neuen p2 pk H Script Builder festlegt , der später erstellt wird. Die Schlüsselgröße des Script-Pub-Schlüssels wird 25 sein und es ist behoben. Matcher werden diese alten Lambda sein, die wir später erstellen werden. Lassen Sie uns den P2 pKa H Script Builder im Paket api dot services erstellen . Lassen Sie uns die Schnittstellenmethode implementieren. In der Build-Methode wird das Skript P an P k h zurückgegeben , da sein Parameter die hexadekodierte Basisadresse 58 unter Verwendung der Basis-58-Dekodierungsmethode mit Prüfsummen-zu-Hex-Methode übergibt Basisadresse 58 unter Verwendung der . Gehen wir nun zur Klasse der Adressmetrik. Lassen Sie uns dieses Feld duplizieren. Wir werden es als Basis für diese alten Lambdas verwenden. Hier werden diese Parameter auf eins, M und N, geändert . Eins ist das Präfix von Legacy, das im Hauptnetz angezeigt wird. M und n sind die Präfixe die für die anderen Umgebungen gültig sind. Lassen Sie uns diese Legacy-Lambda hier importieren. Okay, jetzt kann unser Wallet Bitcoin an alte Adressen senden. Lassen Sie uns nun einige Tests anpassen. Gehen wir zum Test des Transaktionsgrößenrechners. in der Setup-Methode Lassen Sie uns in der Setup-Methode den Script-Konfigurationsfinder instanziieren. Wir werden ihm eine Liste von Skriptkonfigurationen übergeben. Übernimmt die Skriptkonfigurationen aus der Skriptkonfigurationsklasse. Lassen Sie uns es also hier instanziieren. Lassen Sie uns nun das Skript mit Abbildungen hier hinzufügen. Lassen Sie uns diesen Test nun duplizieren. Lassen Sie uns es umbenennen, um die Transaktionsgröße für P2 WP k-te Transaktionseingänge und p2 pk, die jede Transaktion ausgibt, zu berechnen P2 WP k-te Transaktionseingänge . Dieser Testname beschreibt gut, wie das Szenario getestet werden soll. Lassen Sie uns diese Testfälle entfernen. Ich werde diese Testfälle hier einfügen, die auf der Seite Projekt und Ressourcen verfügbar sind . Lassen Sie uns die Formatierung dieser Testfälle korrigieren. Lassen Sie uns diesen Test durchführen. Grad. Die Tests wurden bestanden. Lassen Sie uns nun den Test des Transaction Creators Service beheben. Lass uns diesen Code kopieren und hier einfügen. Lassen Sie uns die Adress-Präfix-Factory und die Script Pub Key Builder entfernen . Und lassen Sie uns die Service-Instanziierung hier korrigieren. Lassen Sie uns diesen Test durchführen. Toll, es ist vorbei. Lassen Sie uns nun das Problem beheben, dass der Münzauswahltest für einzelne zufällige Ziehungen diesen Code erneut benötigt. Also lass es uns kopieren und hier einfügen. Stellen Sie sicher, dass die Münzauswahl für einzelne zufällige Ziehungen korrekt instanziiert ist. In meinem Fall hat der Ausweis das schon gemacht. Lassen Sie uns diesen Test durchführen. Grad. Der Test ist bestanden. Lassen Sie uns nun unseren Knoten ausführen. zuvor sicher, dass in der Datei bitcoin.com die Reg-Testumgebung eingestellt ist. Lassen Sie uns nun den Send Bitcoin Legacy Test durchführen. Toll, der Test ist bestanden. 67. 65 Speichern von Wallet skillshare 2: In den vergangenen Videos haben wir eine voll funktionsfähige Anwendung implementiert , mit der Sie bereits Wallets erstellen und Bitcoins senden und empfangen können. Wenn wir die Anwendung schließen, verlieren wir jedoch alle Informationen über die Wallets, die wir in diesem Video erstellt haben . Im nächsten Video beginnen wir damit, die Möglichkeit zum Speichern und Laden von Wallets in unserer Anwendung zu implementieren . Um die Daten unserer Anwendung zu speichern, verwenden wir die H-SQL-Datenbank. Sql ist eine in Java implementierte SQL-Datenbank. Wir haben uns aus den folgenden Gründen für H SQL entschieden. Erstens ist es eine leichtgewichtige Datenbank. Zweitens ist es mit der Spring Boot Data JPA-Bibliothek kompatibel und einfach zu verwenden . Schließlich kann es einfach verschlüsselt werden , wie wir in diesem Video zeigen werden. Gehen wir zur Poem Dot-XML-Datei, um die Spring Boot Data JPA- und die H SQL DB-Abhängigkeiten hinzuzufügen . Klicken Sie auf diese Schaltfläche, um die neuen Abhängigkeiten zu laden. Gehen wir nun zur Datei mit den Punkteigenschaften der Anwendung. Wir werden einige Konfigurationen festlegen, die für die Datenbank erforderlich sind. Diese Konfiguration bestimmt, dass wir bei jeder Änderung, die wir in unseren Entitätsklassen vornehmen, unsere Datenbank entsprechend aktualisieren. In Spring Boot definierten Klassen mit Entitätsanmerkungen Tabellenstrukturen, wie wir bald sehen werden. Lassen Sie uns diese Zeile duplizieren, um sie als Basis für die anderen Konfigurationen zu verwenden . Wir müssen die Treiberklasse mit dem Namen config auf die folgende Klasse setzen . Der Benutzername und das Passwort. Du kannst uns einstellen, was du willst. Da ich es nur zum Testen verwende, setze ich diese Felder vorerst auf Y0 W. Denken Sie jedoch daran, diese Werte in sicherere Zeichenketten zu ändern , bevor Sie diese Brieftasche im Hauptnetz verwenden. Lassen Sie uns nun die URL der Datenbank definieren. Da wir eine dateibasierte Datenbank verwenden, müssen wir diese Konfiguration auf den JDBC-Doppelpunkt H setzen , den Pfad, in dem sich die Datenbankdateien befinden sollen. In meinem Fall beginnen wir den Pfad mit dem BYOD W-Ordner im Sitz dr. Wurzel. In diesem Ordner möchte ich spezifische Ordner für jede Bitcoin-Netzwerkumgebung erstellen . Dazu verweise ich auf die Bitcoin-Umgebungsvariable in dieser Anwendungsdatei mit Punkteigenschaften setze sie zwischen geschweifte Klammern und ein Zeichen wie dieses nach $1. Schließlich verwende ich den Datenunterordner in diesem Ordner und nenne die DB-Dateien als meine Datenbank. Und wir haben die Zeile mit einem Semikolon beendet. nun im BYOD W-Paket Lassen Sie uns nun im BYOD W-Paket das Datenbankpaket erstellen. Lassen Sie uns in diesem Paket das Entitätenpaket erstellen. Und lassen Sie uns die darin enthaltene Wallet-Entitätsklasse erstellen. In dieser Klasse modellieren wir Register in der Wallet-Datenbanktabelle. Fügen wir dazu die Entitätsannotation hinzu. Und die Tabellenannotation mit ihrem Namensparameter entspricht Wallet. Lassen Sie uns nun einige Felder zu dieser Klasse hinzufügen. Für jedes Feld in dieser Klasse modellieren wir eine Spalte aus der Wallet-Tabelle. Unser Ziel ist es, nur die notwendigen Felder zu speichern nach dem Laden dieselben Wallet-Daten zu erhalten. Lassen Sie uns also das ID-Feld hinzufügen. Fügt dieses Feld hinzu, um der bewährten Praxis zu folgen , einer relationalen Datenbanktabelle immer eine automatische Inkrement-ID hinzuzufügen einer relationalen Datenbanktabelle immer eine automatische Inkrement-ID . Um das zu tun, fügen wir diesem Feld zwei Anmerkungen hinzu. Die erste ist die ID-Annotation, die zweite ist die generierte Wertanmerkung mit dem folgenden Parameter. Fügen wir auch eine Spaltenannotation mit ID als Namensparameter hinzu. Die Spaltenannotation bestimmt den entsprechenden Namen der Spalte, die an dieses Feld in der Wallet-Tabelle gebunden ist. Schlangenformat Parameter für den Spaltennamen folgen wir dem bei dem alle Buchstaben oder Kleinbuchstaben und Unterstriche die Wörter trennen. Lassen Sie uns nun das Namensfeld erstellen. Lassen Sie uns auch die Spaltenannotation zu diesem Feld hinzufügen. neben dem Name-Parameter Fügen wir neben dem Name-Parameter auch den Parameter unique equals true und den Parameter NULLable gleich false hinzu. Diese Parameter fügen die eindeutigen und nicht nullbaren Einschränkungen in der Tabelle für diese Spalte hinzu. Daher gibt die Anwendung einen Fehler aus, wenn Sie versuchen, ein Register ohne Namen in der Wallet-Tabelle zu erstellen . Lassen Sie uns auch das mnemonische Startfeld mit der folgenden Anmerkung erstellen . Der Längenparameter begrenzt die maximale Länge dieses Felds auf 500 Zeichen. Lassen Sie uns dieser Anmerkung auch den Parameter nullable equal false hinzufügen . Fügen wir nun das Feld Anzahl der generierten Adressen mit der Spaltenannotation hinzu, die dem Snake-Case-Stil folgt. Das letzte Feld wird erstellt am. Fügen wir die Anmerkung zum erstellten Datum hinzu, um anzugeben, dass dieses Feld das aktuelle Datum verwendet , um seine Werte zu registrieren. Lassen Sie uns nun einige Konstruktoren erstellen. Zuerst ein leerer Konstruktor , der für Spring Boot erforderlich ist um diese Klasse korrekt zu instanziieren. Als Nächstes erstellen wir einen Konstruktor mit allen Feldern dieser Klasse außer der ID. Lassen Sie uns Getter für dieselben Felder erstellen. Unsere Wallet-Entität ist fertig. nun im Datenbankpaket Lassen Sie uns nun im Datenbankpaket das Repository-Paket erstellen. Und lassen Sie uns die darin enthaltene Wallet-Repository-Schnittstelle erstellen . Die Wallet-Repository-Schnittstelle ist für die Interaktion mit der Datenbank verantwortlich , indem Daten aus der Wallet-Tabelle abgerufen und Daten in der Wallet-Tabelle gespeichert werden. Um dies zu erreichen, wird die JPA-Repository-Schnittstelle erweitert die JPA-Repository-Schnittstelle dieser Erweiterung Typparameter hinzugefügt. Der erste Test ist die Entität , die wir dieses Repository verwalten werden. In diesem Fall wird es die Wallet-Entitätsklasse sein. Der zweite muss der ID-Typ der Entität sein. Daher wird es die lange Klasse sein. Mit dieser einfachen Oberfläche haben wir bereits Zugriff auf gängige Datenbankoperationen für die Wallet-Tabelle, z. B. das Einfügen von Registern und deren Auffinden anhand der ID. All dies wird Ihnen automatisch von der Spring Boot Data JPA-Bibliothek zur Verfügung gestellt . Lassen Sie uns nun das Servicepaket im Datenbankpaket erstellen . Lassen Sie uns darin die Serviceklasse Save Wallet erstellen. Diese Klasse ist dafür verantwortlich die Brieftasche nach ihrer Erstellung zu speichern. Lassen Sie uns die Service-Anmerkung hinzufügen. Lassen Sie uns das Wallet-Repository in diese Klasse einfügen. Lassen Sie uns dasselbe mit dem Feld für die anfängliche Anzahl der generierten Adressen machen . Lassen Sie uns nun die Save Wallet-Methode erstellen. Es wird ein Wallet-Objekt als Parameter verwenden. Zu implementieren. Es instanziiert zunächst ein neues Wallet-Entitätsobjekt mit den folgenden Parametern aus der Brieftasche. Dann rufen wir die Save-Methode des Wallet-Repositorys übergeben die Wallet-Entität als Parameter. *****. Ich habe hier die Reihenfolge der Parameter gemischt. Lass es uns reparieren. Und lassen Sie uns hier die Qualifier-Annotation für die korrekte Injektion dieses Feldes hinzufügen . Das ist es. Mit diesem einfachen Code ist es uns gelungen, die Wallet-Informationen einfach in der SQL-Datenbank zu speichern . Lassen Sie uns nun das Listener-Paket im Datenbankpaket erstellen . Und lassen Sie uns eine Klasse namens Save Wallet Listener erstellen. Darin. Diese Klasse dient als Listener für das erstellte Wallet-Ereignis. Nachdem die Anwendung eine Brieftasche erstellt hat, ist sie dafür verantwortlich, den Save Wallet-Dienst aufzurufen , um die Brieftasche zu speichern. Lassen Sie uns also die Komponentenannotation hinzufügen. Es implementiert den Anwendungs-Listener mit dem erstellten Wallet-Ereignis als Typparameter. Lassen Sie uns seine Methode implementieren. Hier rufen wir die Methode save wallet auf und übergeben das Event Wallet als Parameter. Lassen Sie uns diese Methode erstellen. Wir werden hier den Save Wallet-Service nutzen. Also lasst uns es in diese Klasse injizieren. Dann rufen wir hier die Save-Wallet-Methode auf und übergeben die Brieftasche als Parameter. Wenn nun alles korrekt funktioniert, speichert unsere Anwendung Wallets nach ihrer Erstellung in der Datenbank. Lassen Sie uns also unsere Anwendung ausführen, um zu testen dass diese Funktion zuerst in der Reg-Testumgebung getestet wird. Stellen Sie sicher, dass die VM-Option in der BYOD W-Anwendungsausführungskonfiguration leer ist. Für diesen speziellen Test müssen wir unseren Knoten nicht ausführen. Lass es uns ausführen. Lass uns eine Brieftasche erstellen. Okay, wenn alles richtig funktioniert hat, wurde die Brieftasche gespeichert. Lassen Sie uns unsere Anwendung schließen. Jetzt. Sehen wir uns an, ob die Datenbankdateien im angegebenen Ordner erstellt wurden . Großartig, die Anwendung hat den Reg-Testordner und die darin erwarteten DB-Dateien erstellt . Lass uns sie öffnen. Idb-Punkt-Logdatei. Hier können wir alle Datenbankoperationen unserer Anwendungen in SQL sehen , die im Klartext geschrieben sind. Wir können sehen, dass es einen Insert-Befehl hat , der Wallet-Daten enthält, einschließlich seines mnemonischen Startwerts. Gut. Dies ist jedoch nicht gespeichert, da jeder, der diese Datei erhält , all unsere Geldbörsen, mnemonische Samen, kennen kann. Wir werden das bald beheben, indem wir diese Dateien verschlüsseln. Sehen wir die gespeicherten Wallet-Daten in einem besser lesbaren Format an. Gehen wir dazu auf diese Website, um die H SQL DB herunterzuladen. Klicken Sie auf den Download-Link, um die neueste Version herunterzuladen. Extrahieren Sie den Inhalt nach dem Herunterladen in einen Ordner. Lassen Sie uns den Bin-Ordner öffnen im entpackten Ordner befindet. Lassen Sie uns nun den Run Manager Swing Dot dieser Datei ausführen. Gehen wir zu den Eigenschaften der Anwendungspunkte in unserer Anwendung, um die URL der Datenbank zu kopieren. Lassen Sie uns nun den Inhalt in dieses Feld einfügen. Und lassen Sie uns diese Variable durch den Reg-Test ersetzen. Fügen wir hier denselben Benutzernamen und dasselbe Passwort hinzu, die wir in unserer Datei mit den Punkteigenschaften der Anwendung definiert haben . Lass uns klicken. Okay, großartig. Wir haben es geschafft, eine Verbindung zu unserer Datenbank herzustellen. nun hier mit der rechten Maustaste auf den Ordner Public Dot Wallet und klicken Sie auf die SQL Select-Anweisung. Lassen Sie uns diesen Befehl ausführen, indem Sie auf diese Schaltfläche klicken. Großartig. Hier sind unsere Wallet-Daten in einem Tabellenformat. Wir können sehen, dass unsere Anwendung die Wallet-Daten erfolgreich gespeichert hat. Lassen Sie uns diese Anwendung schließen. Nun, wie ich bereits sagte, ist es wichtig, dass wir unsere Datenbankdateien verschlüsseln. Dazu fügen wir der Datenbank-URL in der Datei mit den Punkteigenschaften der Anwendung das folgende Suffix hinzu. Hier definieren wir einen Kryptoschlüssel und einen Verschlüsselungstyp. Der Crib-Typ ist AES, eine symmetrische Kryptografie die die Anwendung verwendet, um Daten zu verschlüsseln, bevor sie in der Datenbank gespeichert werden Daten zu verschlüsseln, bevor sie in der Datenbank gespeichert , und Daten beim Abrufen zu entschlüsseln. Der Kryptschlüssel wird der Schlüssel sein, der für beide Operationen erforderlich ist. Lassen Sie uns erneut den SQL DB-Manager verwenden , um einen gültigen Verschlüsselungsschlüssel zu generieren. Klicken Sie hier auf die Schaltfläche Okay. Lassen Sie uns den folgenden SQL-Befehl ausführen. Lassen Sie uns den generierten Schlüssel in einen Texteditor kopieren und ihn dann erneut in den Verschlüsselungsschlüsselwert in den Punkteigenschaften der Anwendung kopieren. Lassen Sie uns nun dieselbe Datenbankkonfiguration zu den anderen Eigenschaftendateien im Projekt hinzufügen . Lassen Sie uns den Ordner reg test entfernen, erstellen und verzerren die Datenbankdateien. Und lassen Sie uns unsere Anwendung erneut ausführen. Lass uns eine neue Brieftasche erstellen. Lassen Sie uns nun den Ordner reg-Test und die generierte My DB Dot Log-Datei öffnen. Sein Inhalt ist jetzt völlig unverständlich, das heißt, er wurde erfolgreich verschlüsselt. Lassen Sie uns die Datenbank-URL erneut kopieren, einschließlich des Verschlüsselungssuffixes, und öffnen Sie sie mit dem H SQL DB-Manager. Großartig, wir können die gespeicherten Wallet-Daten mithilfe der neuen URL in dieser Anwendung wieder sehen . 68. 66 Wallet Teil 1 skillshare 2 laden: In diesem Video beginnen wir mit der Implementierung der Möglichkeit, zuvor gespeicherte Wallets in unsere Anwendung zu laden. Lassen Sie uns zunächst einige notwendige Umgestaltungen vornehmen. Gehen wir zum Create Wallet Service. Wir möchten in der Lage sein, Wallets mit unterschiedlichen Daten und einer unterschiedlichen Anzahl generierter Adressen zu erstellen . Lassen Sie uns diese also als Parameter in dieser Methode hinzufügen. Lassen Sie uns nun diese Datumsinstanziierung durch die erzeugte at-Variable ersetzen . Und lassen Sie uns die Variable Anzahl der generierten Adressen als letzten Parameter dieser Methode hinzufügen . Gehen wir nun zum Create-Wallet-Dialog-Controller um diese Parameter zum Create-Methodenaufruf hinzuzufügen. Lassen Sie uns die anfängliche Anzahl der generierten Adressen in diese Klasse einfügen . Lassen Sie uns nun die Signatur der ADA-Adressmethode so ändern , dass sie den letzten Parameter enthält wir gerade zu diesem Aufruf hinzugefügt haben. Fügen wir im ADD-Adressdienst die Variable Anzahl der generierten Adressen zu diesem Methodenaufruf und dieser Signatur hinzu . Übergeben wir es auch als letzten Parameter der Methode zur Generierung von Adresssequentialgeneratoren. Lassen Sie uns die Signatur dieser Methode ändern , um diesen Parameter einzubeziehen. Lassen Sie uns nun das Feld für die anfängliche Anzahl der generierten Adressen aus dieser Klasse löschen . Und lassen Sie uns sie hier durch die Variable Anzahl der generierten Adressen ersetzen . Gehen wir nun zum Update Current Wallet-Adressen. Der Dienst legt das Feld für die anfängliche Anzahl der generierten Adressen als letzten Parameter dieses Methodenaufrufs fest. Lassen Sie uns nun die Load Wallet-Testklasse im GUI-Testpaket erstellen . Es wird die GUI-Testklasse erweitern. Gehen wir zum Bitcoin-Test, um diesen Codeteil zu kopieren, da wir ihn für unseren neuen Test benötigen. Und lass es uns hier einfügen. Gehen wir nun zur Testklasse für empfangende Bitcoins über. Lassen Sie uns diesen ersten Test kopieren und als Grundlage für unseren neuen Test verwenden. Benennen wir es um in should load wallet und receive Bitcoin. Lassen Sie uns diesen Test formatieren. Lassen Sie uns diesem Test einen bestimmten Block hinzufügen. Lassen Sie uns hier einen Wallet-Namen und Passwortvariablen definieren. Lassen Sie uns auch eine mnemonische Startvariable definieren. Wir verwenden die Methode mnemonic Seed Service Create, um es zu generieren. Lassen Sie uns den mnemonischen Seed-Service in die GUI-Testklasse einfügen . Rufen wir nun hier die Methode create wallet übergeben dabei den Wallet-Namen, das Passwort und den mnemonischen Startwert als Parameter. Lassen Sie uns diese Methode in der GUI-Testklasse erstellen. Hier erstellen wir ein Wallet mit dem Create Wallet Service. Also lasst uns es in diese Klasse injizieren. Rufen wir nun die Methode create auf übergeben ihr diese Parameter. Jetzt nutzen wir den Save Wallet-Service. Also lasst uns es in diese Klasse injizieren. Und nennen wir es die Save-Wallet-Methode, wobei die Brieftasche als Parameter übergeben wird. Lassen Sie uns zum Schluss die Brieftasche hier zurückgeben. Zurück zum Load Wallet-Test. Nachdem wir nun eine Wallet erstellt und gespeichert haben , versuchen wir, sie zu laden. Also lassen Sie uns diesen Code entfernen. Rufen wir die Load Wallet-Methode auf und übergeben den Wallet-Namen als Parameter. Lassen Sie uns diese Methode in der GUI-Testklasse erstellen. Außerdem wird ein optionaler Passwortparameter mit einer leeren Zeichenfolge als Standardwert verwendet. Zuerst versuchen wir, auf eine Komponente zu klicken , während die Texte geladen sind. dieser Komponente handelt es sich um die Schaltfläche für das Lademenü, die sich neben der Schaltfläche Neu im Menü oben im Hauptfenster befindet. Dann bewegen wir die Maus zu einer Komponente mit der Text-Wallet. Danach erwarten wir, dass ein Untermenü erscheint, das alle geladenen Wallet-Namen enthält. Dann klicken wir auf die Variable mit dem Text, der der mit der Brieftasche benannten Variablen entspricht. Als Nächstes erwarten wir, dass ein Dialogfenster mit einem Passworteingabefeld und einer Okay -Schaltfläche erscheint. Also klicken wir auf dieses Feld, das die Ethik-ID des Load Wallet-Passworts enthält. Jetzt geben wir das Passwort in dieses Feld ein. Dann klicken wir auf die Schaltfläche Okay. Rufen wir abschließend die Schlafmethode auf, um zu warten, bis die Brieftasche geladen ist. Okay, der Rest des Tests wird genau so sein, wie den Tests für den Empfang von Wallets , die wir als Grundlage für diesen Test verwendet haben , Bitcoin an die geladene Brieftasche senden und erwarten, dass die Adressen und Transaktionstabellen mit entsprechenden Werten gefüllt. Gehen wir nun zur Playground Dot FXML-Datei um das Lademenü zu entwerfen. Lassen Sie uns der Menüleiste ein Menüsteuerelement hinzufügen. Lassen Sie uns den Text ändern, um ihn zu laden. Lassen Sie uns nun dem Lademenü eine Menüsteuerung hinzufügen. Lassen Sie uns diesen Menüpunkt löschen , der automatisch hinzugefügt wurde. Lassen Sie uns diese Menütexte in Wallet ändern. Und lassen Sie uns diesen Menüpunkt löschen. nun in der Texteditor-Ansicht Lassen Sie uns nun in der Texteditor-Ansicht diesem Menü-Tag eine Fx-ID hinzufügen. Stellen wir es so ein, dass das Menü FXML geladen wird. Fügen wir es dem Hauptfenstercontroller hinzu. Fügt eine FXML-Anmerkung und ändert sie in ein privates Feld. Lassen Sie uns nun die Lademenüklasse zum Observables-Paket hinzufügen . Diese Klasse ist für die Verwaltung der Menüelemente verantwortlich für die Verwaltung der Menüelemente , die für jedes Wallet hinzugefügt werden wir in unserer Anwendung erstellen. Lassen Sie uns eine Komponentenannotation hinzufügen. Lassen Sie uns hier das Feld für Menüelemente erstellen. Es wird eine beobachtbare Menge von Wallet-Entitäten sein. Wir instanziieren es mit einem neuen Observable-Set-Wrapper übergeben ihm ein neues LinkedHashSet. Lassen Sie uns nun hier die Methode „Gute beobachtbare Menüelemente“ erstellen . Es werden die Menüelemente zurückgegeben. Lassen Sie uns nun den Listener für das Lademenü im Paket GUI Dot Listeners erstellen. Dieser Listener wird durch das Gooey Start-Ereignis ausgelöst , das nach dem Start der Anwendung veröffentlicht wird. Wir verwenden es, um alle in der Datenbank gespeicherten Wallets zu laden und sie dem Lademenü hinzuzufügen. Lassen Sie uns eine Komponentenannotation hinzufügen. Es implementiert die Application-Listener-Klasse mit dem Ereignis GUI started als Typparameter. Lassen Sie uns seine Methode implementieren. Wir verwenden hier das Wallet-Repository. Also lasst uns es in diese Klasse injizieren. Lassen Sie uns auch das Lademenü in diese Klasse einfügen. Dann rufen wir die letzte Methode auf, um alle Wallets aus der Datenbank zu laden. Für jedes Wallet wird die Methode Wallet hinzufügen aufgerufen. Lassen Sie uns diese Methode erstellen , die im Plattformaufruf run later verpackt ist. Rufen wir die Methode load menu add übergeben die Wallet-Entität als Parameter. Lassen Sie uns diese Methode und die Lademenüklasse erstellen. Hier werden einfach die Menüelemente add method aufgerufen und die Wallet-Entität als Parameter übergeben. Lassen Sie uns nun diese Zeile kopieren. Gehen wir zur Serviceklasse Save Wallet. Wir fügen es hier ein. Lassen Sie uns das Lademenü in diese Klasse einfügen. Mit diesem Code wird unser neu gespeichertes Wallet zum Lademenü hinzugefügt. Gehen wir jetzt zum Playground Punkt FXML. Lassen Sie uns diese Zeilen kopieren und in das Hauptfenster FXML einfügen. Gehen wir nun zum Hauptfenstercontroller. In der initialisierten Methode werden alle Änderungen im Lademenü, die beobachtbar sind, an das Lademenü gebunden . FXML-Komponente benötigt hier das Lademenü. Also lasst uns es in diese Klasse injizieren. Rufen wir nun die Methode get observable menu items auf. Und rufen wir die Ad-Listener-Methode für das Ergebnis als Parameter auf . Wir werden das folgende Lambda bestehen. Dem Lambda-Body wird das Element hinzugefügt und es in der Wallet-Variablen wie folgt gespeichert. Dann verwenden wir eine if-Anweisung, um zu überprüfen, ob das Menü die Brieftasche wie diese enthält. Lassen Sie uns diese Methode erstellen. Mithilfe der folgenden Streamtransformation wird überprüft, ob das Lademenü FXML ein Menüelement mit demselben Namen wie die Wallet-Entitätsvariable enthält ein Menüelement mit demselben Namen wie die . Wenn das Lademenü FXML das Wallet nicht enthält, wird es hier hinzugefügt. Instantiiert ein Menüeintragsobjekt übergibt als Parameter den Wallet-Namen. Dann fügen wir den Menüpunkt wie folgt zum Lademenü FXML hinzu. Lassen Sie uns nun zur GUI-Testklasse in der Startmethode gehen , bevor jeder Test die Datenbank bereinigt, sodass doppelte Namen von Wallets, Wood nicht beibehalten werden. Auf diese Weise vermeiden wir Testabstürze aufgrund der eindeutigen Namensbeschränkung in der Wallet-Tabelle. Wir benötigen das Wallet-Repository hier. Also lasst uns es in diese Klasse injizieren. Dann rufen wir darauf die Methode delete all auf. Lassen Sie uns nun unseren Knoten ausführen. Und lassen Sie uns den Load Wallet-Test durchführen. Okay, der Test lief bis zum erwarteten Teil und ist fehlgeschlagen. Wir konnten sehen, dass unser Lademenü erstellt und mit dem Namen der erstellten Brieftasche gefüllt wurde . Gut. Im nächsten Video werden wir diese Funktion weiter implementieren, C. Ja. 69. 67 Wallet teil 2 skillshare 2: In diesem Video werden wir die Load Wallet-Funktion weiterhin implementieren. Zu Beginn erstellen wir ein Dialogfenster, das erscheint, nachdem wir auf den Namen der Wallet, die wir laden möchten, und auf das Lademenü als Basis für die Erstellung geklickt Wallet, die wir laden möchten, und das Lademenü als Basis für die Erstellung Wir verwenden den Dialog Brieftasche erstellen. Gehen wir also zum Dialog Wallet erstellen FXML. Lass uns diesen ganzen Inhalt kopieren. Lassen Sie uns die FXML-Datei für den Load Wallet-Dialog im FXML-Paket erstellen . Und lass uns den kopierten Inhalt hier bezahlen. Lassen Sie uns den Text für die Kopfzeile des Dialogs in die folgende Phrase ändern . Lassen Sie uns das Attribut pref height auf 300 ändern. Lassen Sie uns auch diese Zeilen entfernen. Gehen wir zum Scene Builder , um zu sehen, wie es aussieht. Lassen Sie uns diesen Labeltext in ein Wallet-Passwort ändern. in der Texteditor-Ansicht diese FX-ID, Ändern wir in der Texteditor-Ansicht diese FX-ID, um das Wallet-Passwort zu laden. Und lassen Sie uns den FX-Controller des Dialogue Pain Tags ändern , um den Wallet-Dialogule-Controller zu laden. Lassen Sie uns diesen Controller erstellen. Lassen Sie uns die Komponentenannotation hinzufügen. Und lassen Sie uns all diese FXML-Felder zum Controller hinzufügen. Gehen wir nun hier zum Hauptfenster-Controller, bevor wir den Menüpunkt zum Lademenü FXML hinzufügen Wir rufen die Methode set on action übergeben ihr das folgende Lambda. Dadurch führt die Anwendung die Dialogmethode Open Load Wallet aus und übergibt die Brieftasche als Parameter, übergibt die Brieftasche als nachdem wir auf diesen Menüpunkt geklickt haben. Lassen Sie uns diese Methode erstellen. Lassen Sie uns den Inhalt der Open-Create-Wallet-Dialogmethode kopieren der Open-Create-Wallet-Dialogmethode und ihn als Grundlage für unsere neue Methode verwenden. Lassen Sie uns den Titel des Dialogs auf Load Wallet setzen. Lassen Sie uns den ersten Parameter der FXML-Loader-Instanziierung in das Dialogfeld „ Wallet laden“ ändern . Lassen Sie uns dieses Feld in diese Klasse einfügen. Lassen Sie uns diese Wertanmerkung hier hinzufügen und ihren Parameter in die Load Wallet-FXML-Datei ändern. Jetzt müssen wir die Brieftasche an den Load Wallet-Dialogcontroller übergeben . Um das zu tun, holen wir uns zuerst den Controller vom FXML-Loader. Dann rufen wir diese Set-Wallet-Methode darauf auf und übergeben die Brieftasche an sie. Lassen Sie uns diese Methode erstellen. Hier. Wir setzen das Wallet-Entitätsfeld einfach auf die Wallet-Variable. Lassen Sie uns dieses Feld erstellen. Lassen Sie uns nun die initialisierte Methode erstellen , die ausgeführt wird, nachdem der Dialog angezeigt wird. Lassen Sie uns diesen Code und den Dialogcontroller „Wallet erstellen“ kopieren und hier einfügen. Dadurch wird das Schließen des Dialogfensters auf die Schaltfläche Abbrechen gesetzt . Lassen Sie uns diesen Code auch kopieren und in die neue initialisierte Methode einfügen. Dadurch wird die Okay-Knopf-Aktion gesetzt. Aber anstatt die Methode create wallet aufzurufen, wird die Load Wallet-Methode aufgerufen. Lass es uns erstellen. Zuerst. Wir stellen eine neue Wallet-Entität aus der Datenbank wieder her und legen sie als Wallet-Entitätsfeld fest. Dazu benötigen wir das Wallet-Repository. Also lasst uns es in diese Klasse injizieren. Dann nennen wir die Methode find by name darauf übergeben ihr den Namen der Wallet-Entität. Lassen Sie uns diese Methode erstellen. Die Methode wird genau so sein. Spring Boot Data JPA Magic übersetzt diesen Methodennamen automatisch in eine SQL-Abfrage und stellt die Wallet-Entität mit dem als Parameter übergebenen Namen aus der Datenbank wieder her. Jetzt erstellen wir ein Wallet-Objekt. Dazu müssen wir einen Wallet-Service einrichten. Also lasst uns es in diese Klasse injizieren. Wir rufen die Methode create auf übergeben die folgenden Parameter. Alle diese Parameter mit Ausnahme des Wallet-Passworts werden der Wallet-Entität in der Datenbank entnommen . Das Passwort wird dem Passwortfeld des Dialogs entnommen . Lassen Sie uns das Kontextobjekt in diese Klasse einfügen. Mithilfe des Kontextes wird nun ein geladenes Wallet-Ereignis veröffentlicht , das dieses und das erstellte Wallet an dieses Ereignis weitergibt . Schließlich rufen wir die Methode hide auf, um das Dialogfenster wie folgt zu schließen. Lassen Sie uns die geladene Wallet-Ereignisklasse erstellen. Übergibt den Parameter des Load Wallet-Dialog-Controllers an den Superkonstruktor. Und wir setzen das Wallet-Feld auf den Wallet-Konstruktorparameter. Lassen Sie uns einen Getter für das Wallet-Feld erstellen. Lassen Sie uns nun etwas Refactoring im erstellten Wallet-Import-Listener durchführen. Wir wollen es schaffen, auf geladene Wallet-Ereignisse zu achten. Aber so wie es jetzt ist, kann es nur auf das erstellte Wallet-Ereignis warten. Um das zu ändern, löschen wir diese Implement-Anweisung und diese Override-Annotation. Ändern wir den Namen dieser Methode, um Brieftasche und ihren Parameter in ein Wallet-Objekt zu importieren. Lassen Sie uns den Parameter der Importwallet-Methode in Wallet ändern . Lassen Sie uns nun eine Methode erstellen die mit der Event-Listener-Annotation annotiert ist. Es wird beim Ereignis „ Created Wallet“ aufgerufen und erhält als Parameter ein erstelltes Wallet-Ereignis . Hier rufen wir die Import-Wallet-Methode auf und übergeben das Event Wallet als Parameter. Dieses Refactoring wird dafür sorgen , dass die Dinge weiterhin wie zuvor funktionieren. Aber wenn wir jetzt auf ein anderes Ereignis warten möchten , können wir einfach eine weitere Methode mit Event-Listener-Anmerkungen erstellen Methode mit Event-Listener-Anmerkungen die das gewünschte Ereignis als Parameter übergibt. Genau das werden wir jetzt tun, indem wir das Load Wallet-Ereignis verwenden das Load Wallet-Ereignis das hier auch die Import-Wallet-Methode aufruft die Event-Wallet als Parameter übergibt. Dadurch importiert der Bitcoin-Knoten die Brieftasche, genau wie beim Erstellen einer neuen Brieftasche. Lassen Sie uns nun die geladene Wallet-Listener-Klasse im Listener-Paket erstellen . Lassen Sie uns die Komponentenannotation hinzufügen. Lassen Sie uns eine Methode mit Anmerkungen zum Event-Listener erstellen, als unloaded wallet event bezeichnet wird. Als Parameter wird ein geladenes Wallet-Ereignis verwendet. Hier rufen wir die Load Wallet-Methode übergeben das Event Wallet als Parameter. Lassen Sie uns diese Methode erstellen. Hier. Wir benötigen den Update Current Wallet Service. Also lasst uns es in diese Klasse injizieren. Und wir werden die Update-Methode darauf aufrufen. Um das Wallet als Parameter zu übergeben, ist auch der UTxOS-Aktualisierungsdienst erforderlich. Also lasst uns es in diese Klasse injizieren. Dann rufen wir die Aktualisierungsmethode auf übergeben die Wallet-Adressen und den Namen als Parameter. Mit diesen beiden Codezeilen erwarten wir, dass das aktuelle Wallet in das geladene Wallet geändert wird und dass seine Adressen, Transaktionen und Salden entsprechend aktualisiert werden. Lassen Sie uns nun einige Tests korrigieren. Wir haben die vorherigen Videos im Test des sequentiellen Adressgenerators kaputt gemacht. Lassen Sie uns diesen ersten Parameter in der Instanziierung des sequentiellen Adressgenerators löschen . Und legen wir 20 als letzten Parameter dieser Methode fest. Lass uns diesen Test durchführen. Toll, es funktioniert wie erwartet. Lassen Sie uns dasselbe mit dem Create Wallet Service Test machen. Okay, es funktioniert. Jetzt. Lassen Sie uns unseren Knoten ausführen. Lassen Sie uns das Projekt mit dieser Maven-IDE-Funktion bereinigen und kompilieren . Und lassen Sie uns den Load Wallet-Test durchführen. Es ist gescheitert. Das Problem liegt in der Hauptfenstersteuerung. Hier müssen wir die FXML Loader get Controller-Methode anstelle der Load-Methode aufrufen die FXML Loader get Controller-Methode . Lass uns den Test noch einmal durchführen. Toll, es ist vorbei. 70. 68 Wallet Teil 3 skillshare 2 laden: In diesem Video fügen wir weitere Tests hinzu und nehmen einige Optimierungen an der Load Wallet-Funktion vor. Eines der Merkmale, die unsere Brieftasche haben wird, ist die plausible Abstreitbarkeit. plausible Abstreitbarkeit ist in diesem Zusammenhang eine Sicherheitsfunktion , die Ihnen ermöglicht, Ihre Wallet-Adressen zu verbergen, indem ein anderes Passwort eingeben, um Ihr Wallet zu laden. Das bedeutet, dass unsere Brieftasche keine falschen Passwörter hat. Jedes eingegebene Passwort gewährt Zugriff auf verschiedene Adressen, aber wenn Sie Dritte beobachten, können Sie nicht feststellen, ob die geladenen Wallet-Adressen den Großteil Ihres Guthabens ausmachen. Lassen Sie uns einen Test für dieses Szenario erstellen. Lassen Sie uns diesen Test duplizieren und als Grundlage für unseren neuen Test verwenden. Benennen wir es um, um die Wallet mit einem anderen Passwort zu laden und Bitcoin zu erhalten. Lass es uns neu formatieren. Lassen Sie uns den Namen der Brieftasche erhöhen. Lassen Sie uns nun diese andere Passwortvariable definieren und sie als zweites Argument an die Load Wallet-Methode übergeben. Übergeben wir es auch als letzten Parameter der gültigen Methode der Adresse. Lassen Sie uns den Passwortparameter als optionalen Parameter für diese Methode festlegen und ihren Standardwert auf eine leere Zeichenfolge festlegen. Lassen Sie uns die Kennwortvariable durch die leere Zeichenfolge und die Methode mit zwei Hauptschlüsseln ersetzen . Lassen Sie uns unseren Node ausführen. Lassen Sie uns diese Methode kommentieren und unseren neuen Test ausführen. Toll, es ist vorbei. Dieser Test zeigt, dass unsere Anwendung bereits jedes Passwort zum Laden einer Brieftasche unterstützt und dass jedes Passwort einen separaten Satz von Adressen generiert. Lassen Sie uns diesen Test nicht kommentieren. Angesichts unserer Art, eine Brieftasche so zu betrachten, dass sie entsprechend ihren Passwörtern mehrere Adresssätze hat. Wir müssen ein Problem in unserer Anwendung beheben. Wenn wir über unsere Anwendung unseren Bitcoin-Knoten anrufen , verwenden wir unseren Wallet-Namen. Dies ist ein Problem, da bei Vorgängen wie dem Abrufen unserer Wallet-Transaktionen und UTXOs von unserem Knoten dieselben Informationen für verschiedene Adresssätze gesammelt werden für verschiedene Adresssätze die von verschiedenen Passwörter. Um unsere Notiz zu optimieren, verwenden RPC-Aufrufe und um nur Informationen für die generierten Adressen mit einem bestimmten Passwort zu sammeln nur Informationen für die generierten Adressen , die zuerst generierte Empfangsadresse als Namen der Brieftasche, die für uns wichtig ist Knoten. Gehen wir dazu zum Wallet-Datensatz. Lassen Sie uns hier die gute Methode für die erste Adresse erstellen. Es verwendet die Methode get addresses, um die erste Adresse der Brieftasche zurückzugeben. Jetzt müssen wir jeden Aufruf des Wallet-Namensfeldes, der für die Kommunikation mit unserem Knoten getätigt wurde, durch einen guten Methodenaufruf für die erste Adresse ersetzen jeden Aufruf des Wallet-Namensfeldes, der für die Kommunikation mit unserem Knoten getätigt wurde Kommunikation mit unserem Knoten getätigt . Lassen Sie uns unsere ID verwenden, um die Verwendungszwecke von das Namensfeld und führen Sie das Refactoring durch. Gehen wir nun zum Update Current Wallet Service und legen die erste Adresse der aktuellen Brieftasche fest. Lassen Sie uns diese Methode erstellen. Hier. Wir setzen das erste Adressfeld auf den empfangenen Parameter. Lassen Sie uns dieses Feld erstellen. Und lassen Sie uns einen Getter dafür erstellen. Lassen Sie uns nun die entsprechenden getName-Methodenaufrufe der aktuellen Wallet-Methode durch die Aufrufe der aktuellen Wallet-Methode „get first address“ ersetzen die entsprechenden getName-Methodenaufrufe der aktuellen Wallet-Methode . Gehen wir nun zum Load Wallet-Test, kommentieren Sie den ersten Test und führen Sie den verbleibenden Test durch. Großartige Dinge funktionieren weiterhin wie zuvor. Lassen Sie uns diesen Test nicht kommentieren. Gehen wir nun zur Adresskonfigurationsklasse. Da wir jetzt die erste Wallet-Adresse verwenden um mit unserem Node zu interagieren, muss die erste Adresse für eine Kombination aus mnemonischem Startwert und Passwort immer dieselbe sein . Daher müssen wir garantieren, dass die Liste der Adresskonfigurationen und ihrer Adressen immer in derselben Reihenfolge ist. Verwenden wir dazu die Bestellannotation in beiden Beans. Lassen Sie uns die Order-Annotation mit Null als Argument in dieser ersten Bean hinzufügen . Dadurch fügt Spring diese Bean als erstes Element in Adresskonfigurationslisten ein. Lassen Sie uns auch das zweite Argument des Adresskonfigobjekts in eine verknüpfte Hashmap ändern . Im Gegensatz zu Karten, die mit der Map of Methode generiert wurden , behält die verknüpfte Hashmap die Reihenfolge der Einfügungen Dies wird mit dem folgenden Code erreicht. Lassen Sie uns nun den gleichen Refactor für die andere Red Dress Config Bean durchführen. Und lassen Sie uns hier die Bestellanmerkung hinzufügen , indem wir eine als Parameter verwenden, um zu gewährleisten, dass sie eingefügt wird, nachdem die ersten Bean-Listen von Adresskonfigurationen abgerufen wurden. Lassen Sie uns nun eine weitere Optimierung durchführen. Das Importieren von Adressen in unseren Knoten ist manchmal langsam. Um zu vermeiden, dass Adressen unnötig in unseren Node importiert werden, überprüft unser Node, ob sie bereits importiert wurden. Erstellen wir dazu den vom Address-Client empfangenen Knoten im Node Dot Client-Paket. Dieser Client ruft alle aktuell geladenen Adressen von unserem Knoten ab. Lassen Sie uns die Service-Anmerkung hinzufügen. Und lassen Sie uns den Node-Client hineinstecken. Lassen Sie uns nun hier die Methode mit Listenadressen erstellen. Es gibt eine Liste von Knotenadressobjekten als Parameter zurück . Es wird einen Brieftaschennamen annehmen. Amen conf, das die Mindestanzahl von Konformationen der zurückgegebenen Adressen definiert die Mindestanzahl von Konformationen . Der Parameter include empty , der definiert, ob der Anruf Adressen ohne Guthaben zurückgibt. Und der Parameter include watch only , der dem Knoten mitteilt, ob wir Adressen abrufen wollen , deren entsprechende private Schlüssel der Node nicht kennt. Lassen Sie uns den Node-Adresseintrag im Punktknotenpaket der Domain erstellen . Es wird nur ein Adressfeld haben. Verwenden des Node-Clients. Lassen Sie uns hier den RPC-Anruf tätigen. Es wird ein Node-Adress-Array zurückgegeben. Der erste Parameter der Make-Request-Methode ist die Liste, die per Adressstring empfangen wird . Dann übergeben wir ein neues parametrisiertes Typreferenzobjekt. Als nächstes die Wallet-URL. Schließlich die aufgelisteten Parameter der Kleidungsmethode , die wir zuvor beschrieben haben. Jetzt wird eine Konvertierung des Node-Adress-Arrays in eine Node-Adressliste wie diese zurückgegeben des Node-Adress-Arrays in . Gehen wir nun zum Import Wallet-Service. Hier fügen wir eine if-Anweisung hinzu, um zu überprüfen, ob die Wallet-Adressen nicht auf diese Weise importiert wurden. Lassen Sie uns diese Methode erstellen. Im if-Body wird die Methode import addresses verwendet , um die Adressen nur zu importieren , wenn sie zuvor nicht importiert wurden. Lassen Sie uns die Methode Address important implementieren. Wir erhalten die importierten Adressen mithilfe des vom Address Client empfangenen Nodes. Also lasst uns es in diese Klasse injizieren. Dann rufen wir die Methode mit Listenadressen auf. die folgenden Parameter übergeben Sie die folgenden Parameter übergeben, wird das Ergebnis in einen Stream umgewandelt und die Map-Methode verwendet , um alle Knotenadressadressen zu extrahieren. Dann konvertieren wir das Ergebnis mithilfe der Collect-Methode in eine Reihe von Adressen. Als Nächstes konvertieren wir die Wallet-Adressen in einen Satz wie diesen. nun die Methode zum Entfernen der Wallet-Adressen verwenden, werden alle importierten Adressen daraus entfernt. Schließlich geben wir die Wallet-Adressen bei einem leeren Methodenaufruf zurück . Wenn das Ergebnis wahr ist, wurden bereits alle Wallet-Adressen importiert. Oh, wir haben vergessen, diese Zeile zu löschen. Lass es uns machen. Jetzt. Gehen wir zum Bitcoin-Test senden. Ab sofort werden wir einigen Tests einige Aussagen zur Load Wallet-Funktion hinzufügen . Wenn wir dabei Fehler finden , werden wir sie korrigieren. Fangen wir mit dem ersten Send Bitcoin-Test an. Lassen Sie uns diese Zeile an ihrer Stelle löschen. Lassen Sie uns einen Methodenaufruf für Weight Load Wallets hinzufügen. Mit dieser Methode wird versucht, diesen Test schneller laufen zu lassen. Lassen Sie uns es in der GUI-Testklasse erstellen. Nennen wir hier die Wafer-Methode. Übergeben dieser Parameter. Bei jeder Iteration dieses Callbacks wird die Schlafmethode verwendet, um 1 s zu warten . Dann prüfen wir ob die aktuelle erste Adresse der Brieftasche gesetzt ist. Lassen Sie uns also die aktuelle Brieftasche in diese Klasse injizieren. Mithilfe des Node List Wallets Client wird überprüft, ob der Knoten die Adresse mit der aktuellen ersten Wallet-Adresse geladen hat. Also lasst uns diesen Service in diese Klasse einbauen. Mit diesem Code warte ich, bis der Knoten das Wallet lädt. Lassen Sie uns nun ein Problem beheben, das manchmal zu Testfehlern führen kann. Hier entspricht der erwartete Gesamtgrößenparameter der Summe des aktuellen Iterationsindex plus eins. Lassen Sie uns nun die letzte Empfangsadressvariable erstellen die ihren Wert auf die im Fenster angezeigte Empfangsadresse setzt. Lassen Sie uns nun einige andere Variablen festlegen, die uns helfen, die Werte in der Brieftasche vor und nach dem Laden zu vergleichen . Zunächst die Größe der Transaktionstabelle. Dann der Saldo der ersten Zeile der Transaktionstabelle. Rufen wir nun die Load Wallet-Methode auf und übergeben den Wallet-Namen als Parameter. Lassen Sie uns diese Variable hier setzen. Jetzt legen wir die Transaktionstabelle nach der Ladevariable fest. Wir erhalten es mit der Suchmethode, genau wie vor dem Laden. Dann klicken wir auf den Tab Adressen und legen die Adresstabelle nach dem Laden auf dieselbe Weise variabel fest. Als Nächstes klicken wir auf den Tab Empfangen und legen die letzte Empfangsadresse, die Afterload-Variable und den Labeltext nach dem Laden als Variable fest. nun im damaligen Block Lassen Sie uns nun im damaligen Block diese beiden Zeilen löschen. Und lassen Sie uns die letzten Empfangsadressvariablen vor und nach dem Laden der Brieftasche vergleichen . Dann legen wir hier die Tabellengröße der Adressen und die ausgeglichenen Tabellenvariablen für die Adressen der ersten Zeile fest. Und lassen Sie uns diese beiden Vergleiche hinzufügen , die denen entsprechen, die wir gerade gelöscht haben. Lassen Sie uns nun die Größen der Adresstabellen vor und nach dem Laden der Brieftasche vergleichen . Und lassen Sie uns dasselbe mit dem Saldo der ersten Zeile der Adresstabelle tun. Lassen Sie uns nun diese beiden Zeilen löschen sie durch die folgenden Zeilen ersetzen, die dieselben Vergleiche durchführen aber die überarbeiteten Variablen verwenden. Und lassen Sie uns die folgenden Vergleiche der Variablen vor und nach dem Laden der Brieftasche hinzufügen . Lassen Sie uns alle anderen Tests in dieser Datei kommentieren. Und lassen Sie uns den verbleibenden Test durchführen. Der Test ist fehlgeschlagen, da die letzte Empfangsadresse vor und nach dem Laden des Wallets unterschiedlich ist. Im nächsten Video werden wir das beheben. 71. 69 Wallet teil 4 skillshare 2 laden: In diesem Video beheben wir den Fehler, dass vor und nach dem Laden einer Wallet unterschiedliche Empfangsadressen wir vor und nach dem Laden einer Wallet unterschiedliche Empfangsadressen hatten. Das passiert, weil wir die UTXOs verwenden , um den aktuellen Empfangsadressindex zu aktualisieren. Nach dem Laden des Wallets und dem Abrufen der Wallet-UTXOs sind die alten Ausgaben, die zur Aktualisierung der Empfangsadresse verwendet wurden, nicht mehr Teil des UTXO-Sets, da sie bereits ausgegeben wurden. Somit wird die Empfangsadresse am Ende nicht aktualisiert. Wir werden das beheben, indem wir den Code, der für die Aktualisierung der Empfangsadressen verantwortlich ist, vom Dienst „Aktuelle Wallet-Adressen aktualisieren“ in eine neue Klasse übertragen den Code, der für die Aktualisierung der Empfangsadressen verantwortlich ist, vom Dienst „Aktuelle Wallet-Adressen aktualisieren . Die neue Klasse Wir verwenden die abgerufenen Transaktionen von dem Knoten, der alle verwendeten Wallet-Adressen enthält , um die aktuellen Empfangsadressen zu aktualisieren. Lassen Sie uns also diese Klasse erstellen , die Update Current Wallet Receiving Address His Service im GUI Punkt Services-Paket heißt Wallet Receiving Address His Service . Lassen Sie uns die Service-Anmerkung hier hinzufügen. Lassen Sie uns nun einen Code aus dem Dienst „Aktuelle Wallet-Adressen aktualisieren“ kopieren und dem Dienst „Aktuelle Wallet-Adressen aktualisieren in diese Klasse einfügen. Lassen Sie uns diese Qualifizierungsanmerkung hinzufügen. Lassen Sie uns nun die Aktualisierungsmethode hier erstellen. Es wird eine Liste von Knoten-Transaktionen benötigt. Sie die Map-Methode verwenden, wird ein Adressstream aus dem Stream der Knoten-Transaktionen abgerufen. Dann filtern wir den Stream so, dass er nur Adressen in der aktuellen Brieftasche enthält. Dann nennen wir die Methode „Mark is used“ für jede Adresse. Nehmen wir diese Methode aus dem Dienst „Aktuelle Wallet-Adressen aktualisieren“. Jetzt rufen wir die Current Wallet get addressed types Methode auf. Lassen Sie uns diese Methode erstellen. Es gibt das Ergebnis des Aufrufs der Methode address get addressed types zurück . Es gibt eine Reihe von Adresstypen zurück. Lassen Sie uns diese Methode in der Adressklasse erstellen. Hier wird einfach der Schlüsselsatz des Adressfeldes zurückgegeben . Jetzt rufen wir für jeden Adresstyp die Methode für die Empfangsadresse für das Update auf. Um dies zu tun, wird der Typ dieses Methodenparameters in den Adresstyp geändert . Und wir werden diese Zeile löschen da wir sie nicht mehr benötigen. Gehen wir nun zum Dienst Aktuelle Wallet-Adressen aktualisieren , um denselben Code zu löschen, den wir in unsere neue Klasse eingefügt haben , und deren Verwendung. Gehen wir nun zum Update des utxOS-Dienstes. Lassen Sie uns den Dienst „Aktuelle Wallet-Empfangsadressen aktualisieren“ in diese Klasse einfügen . Und lassen Sie uns die Aktualisierungsmethode vom injizierten Dienst aufrufen injizierten Dienst die Knotentransaktionen als Parameter übergeben. Gehen wir nun zum Bitcoin-Test senden. Fügen wir hier den Sleep-Methodenaufruf hinzu, um eine neue Race-Bedingung zu vermeiden , die manchmal sicherstellt, dass Ihr Knoten läuft. Und lassen Sie uns diesen Test durchführen. Das Problem mit der Empfangsadresse wurde behoben, aber der Test schlug aufgrund eines anderen Fehlers fehl. Der Transaktionssaldo nach dem Laden einer Wallet wird nicht falsch berechnet. Lass uns das reparieren. Um diesen Fehler zu beheben, müssen wir besser verstehen, wie die Bitcoin Core List Transactions API funktioniert. Hier ist die Dokumentation der List-Transaktionen Bitcoin Core API. Beachten Sie, dass die API für jede Transaktion nur ein Adressfeld zurückgibt. Der Betrag bezieht sich nur darauf, dass der an diese Adresse gesendete Bitcoin-Betrag negativ ist, wenn er nicht zu unserer Brieftasche gehört , und andernfalls positiv. Wenn die Transaktion eine Änderungsausgabe hat, die API für jede Transaktion mehr als ein Register zurück . Jedes Register mit einem Adressfeld der Transaktionsausgabe. Sehen wir uns ein Beispiel für das Ergebnis dieser API für eine Transaktion an, die von unserer Wallet mit einer Eingabe und zwei Ausgaben gesendet wurde . Für dieselbe Transaktion die API drei Register zurück. Wir können anhand ihrer Transaktions-IDs erkennen, dass sie sich auf dieselbe Transaktion beziehen . Beachten Sie, dass die ersten beiden Register dieselbe Adresse haben. Diese Register beziehen sich auf die Änderungsausgabe. Die erste hat einen positiven Betrag darauf hinweist, dass es sich um eine Adresse handelt, die zu unserer Brieftasche gehört. Das ist der Änderungsbetrag. Das zweite Register hat den gleichen Betrag, aber negativ. Das bedeutet, dass unsere Wallets einen Betrag an diese Adresse geschickt haben. Es gibt auch eine negative Gebühr ist die Transaktionsgebühr , die wir bei der Transaktion bezahlt haben. Wenn wir den Betrag der ersten beiden Register addieren, erhalten wir Null. Dies ist genau der Saldo, den wir uns bei der Transaktion bezahlt haben . Schließlich enthält das dritte Register einen negativen Betrag, der darauf hinweist , dass wir Bitcoin an diese Adresse senden. Es wird auch eine Gebühr erhoben , die der Gebühr im zweiten Register entspricht . Wenn man bedenkt, wie diese API funktioniert, die korrekte Methode zur Berechnung des Transaktionssaldos darin, die für dieselbe Transaktion zurückgegebenen Registerbeträge und die Gebühr einer dieser Beträge zu summieren die für dieselbe Transaktion zurückgegebenen Registerbeträge und registriert, die Transaktion, die vor dem Laden einer Wallet ausgeglichen wurde, ist korrekt, da wir sie so berechnen, dass die zweite Transaktion berücksichtigt wird, die erstellt wurde, bevor wir sie an unseren Node senden. Nachdem wir unser Wallet geladen haben, verlieren wir die Transaktionsinformationen, die bei der Berechnung des Transaktionssaldos nicht berücksichtigt werden. Gehen wir also zum Transaktionsservice Update Current Wallet , um das Problem zu beheben. Unsere neue Lösung benötigt diesen Filter nicht mehr. Lassen Sie uns diese Zeile an ihrer Stelle löschen. Fügen wir der Collect-Methode einen Aufruf als Parameter hinzu. Wir rufen die Collectors grouping by method einen Verweis auf die Node-Transaktions-TX-ID mit diesem Code übergeben , erhalten wir eine Map, in der die Schlüssel Transaktions-IDs und die Werte Listen sind von Knoten-Transaktionen mit derselben Transaktions-ID. Rufen wir die Values-Methode für das Ergebnis auf und nicht die Stream-Methode, um einen Stream von Listen von Knotentransaktionen mit derselben T XID zu erhalten . Der Rest dieser Methode bleibt wie er ist. Lassen Sie uns die Transaktion aus der Methode erstellen. Es nimmt eine Liste von Knotentransaktionen und gibt eine Transaktionszeile zurück. Lassen Sie uns diese Methode hierher verschieben. Lassen Sie uns zuerst die Transaktionsgebühr abrufen. Ich werde es aus einem Stream ohne Transaktionsgebühren nehmen. Lassen Sie uns das Gebührenfeld in der Knoten-Transaktion erstellen. Dann filtern wir den Stream nach nominalen Gebühren. Dann rufen wir zuerst die Geldbuße an, um die ersten paar zurückzugeben und verwenden die URLs-Methode, um Null zurückzugeben, wenn keine Gebühr gefunden wird. Lassen Sie uns nun den Betrag berechnen. Sie die Map-Methode verwenden, wird ein Stream abgerufen, der alle Node-Transaktionsbeträge aus dem Node-Transaktionsstream enthält alle Node-Transaktionsbeträge . Dann verwenden wir die reduzierte Methode übergeben die Referenz zur Methode mit großer Dezimalzahl an alle Beträge. Schließlich verwenden wir die Methode or else, um Null zurückzugeben, ohne dass Transaktionen gefunden werden. Lassen Sie uns nun diese Zeile kopieren und hier einfügen. Wir verwenden die TX-ID der ersten Knotentransaktion als ersten Parameter der Transaktionszeileninstanziierung. Als Nächstes fügen wir die erhaltene Transaktionsgebühr zum Betrag hinzu und geben den Betrag als Parameter hier weiter. Schließlich übergeben wir Bestätigung der ersten Knoten-Transaktion rechtzeitig als Instantiierungsparameter der letzten Transaktionszeile . Lassen Sie uns diese Methode löschen, da wir sie nicht mehr benötigen. Lassen Sie uns diesen Send Bitcoin-Test erneut durchführen. Der erste Test wurde bestanden, aber der zweite schlug aufgrund einer Rennbedingung fehl. Lassen Sie uns das schnell mit der Schlafmethode beheben. Rufen Sie hier an. Wir werden diesen Fehler im nächsten Video besser beheben. Lassen Sie uns diese Zeile vorerst kommentieren, um nur die fehlgeschlagene Testnote auszuführen nur die fehlgeschlagene Testnote . Der Test ist bestanden. Lassen Sie uns den Rest des Tests auskommentieren. 72. 70 Wallet Teil 5 skillshare 2 1: In diesem Video fügen wir weitere Test-Assertions hinzu, um zu überprüfen, ob wir ein Wallet mit mehr generierten Adressen als die ursprüngliche Konfiguration der generierten Adressen korrekt laden können ein Wallet mit mehr generierten Adressen als . Aber lassen Sie uns zunächst eine Testmethode optimieren , um einige Rennbedingungen in einigen Tests zu vermeiden. In der Bitcoin-Testklasse senden. Lassen Sie uns diese beiden Aufrufe zur Schlafmethode löschen, da unser Fixed die Rennbedingungen besser bewältigen kann nachdem wir Bitcoins gesendet haben. Gehen wir zur GUI-Testklasse. Fügen wir diesen optionalen Parameter der Methode „Bitcoin senden und warten “ hinzu, wobei der Standardwert Hashtag-Empfangsadresse entspricht. Dann fügen wir diesem Rückgabewert Folgendes und eine Bedingung hinzu. Mit diesem Code hört das Warten nur auf, wenn sich das Empfangsadressfeld von der Adressvariablen unterscheidet. Daher vermeiden wir den Fehler, Bitcoins zweimal nacheinander an dieselbe Adresse zu senden . Gehen wir nun zum Bitcoin-Test über. Im letzten Test dieser Klasse fügen wir einige Assertionen hinzu, um zu testen ob wir ein Wallet mit mehr generierten Adressen als die ursprüngliche Konfiguration der generierten Adressen korrekt laden können mehr generierten Adressen als . Lassen Sie uns also die Brieftasche mit dem Namen Variable festlegen und durch den Parameter in der richtigen Methode ersetzen diese Variable durch den Parameter in der richtigen Methode ersetzen. Rufen wir nun hier die Weight Load Wallet-Methode auf und löschen die Sleep-Methodenaufrufe dieses Tests. Nachdem wir Bitcoins siebenmal empfangen haben, setzen wir nun die letzte Empfangsadressvariable auf den Wert, der im Feld für die Empfangsadresse angegeben ist. Lassen Sie uns nun diese Zeile in den Sand-Bitcoin-Test kopieren und hier einfügen. Lassen Sie uns diese Variable ändern , um sie an seine Tabellenansicht anzupassen. Machen wir dasselbe mit dieser anderen Zeile. Lassen Sie uns nun all diese Zeilen aus dem Bitcoin-Test kopieren und in unseren Test einfügen. Lassen Sie uns diese Zeile auch kopieren und in unseren neuen Test einfügen, um die letzte Empfangsadresse vor und nach dem Laden der Brieftasche zu vergleichen . Fügen wir diese Zeile hinzu, um die Größe der Transaktionstabelle vor und nach dem Laden des Wallets zu vergleichen Größe der Transaktionstabelle . In dieser Zeile machen wir dasselbe mit der Größe der Adressentabelle. Und in dieser anderen Zeile wird der Labeltext vor und nach dem Laden der Brieftasche verglichen . Lassen Sie uns unseren Node ausführen. Lassen Sie uns die anderen Tests in dieser Klasse kommentieren und unseren neuen Test ausführen. Der Test ist aufgrund des Unterschieds zwischen der letzten Empfangsadresse vor und nach dem Laden der Brieftasche fehlgeschlagen der letzten Empfangsadresse . Wenn Sie außerdem die Anzahl der Adressen in der Adresstabelle nach dem Laden bemerkt haben, sind es nur drei, obwohl die richtige Zahl sieben wäre. Das liegt daran, dass wir die Anzahl der generierten Adressen nicht speichern , nachdem wir sie generiert haben. Lass uns das reparieren. Gehen wir zum Update Aktuelle Wallet-Empfangsadressen , der Dienst benötigt hier das Wallet-Repository. Also lasst uns es in diese Klasse injizieren. Jetzt rufen wir die Methode zur Erhöhung der Anzahl generierter Adressen im Wallet-Repository auf. Als Parameter werden die anfängliche Anzahl der generierten Adressen und der aktuelle Wallet-Name übergeben . Lassen Sie uns diese Methode erstellen. Lassen Sie uns diesen Typparameter in die Integer-Klasse und diesen Parameternamen in inkrementieren. Wie der Name schon sagt, erhöht diese Methode das Feld für die Anzahl der generierten Adressen in unserer Brieftasche. Um das zu tun. Lassen Sie uns die Transaktionsanmerkung hinzufügen. Diese Anmerkung ist eine Anforderung der JPA-Bibliothek, da sie den SQL-Vorgang in zwei Schritten ausführt. Lassen Sie uns auch die modifizierende Anmerkung hinzufügen. Diese Anmerkung wird für Repository-Methoden benötigt , die Register und Tabellen modifizieren, was der Fall ist. Lassen Sie uns abschließend die Abfrageannotation zu dieser Methode hinzufügen. Diese Anmerkung gibt die SQL-Operation wir als Parameter ausführen möchten. Fügen wir die folgende Zeichenfolge hinzu. Diese SQL-ähnliche Anweisung erhöht die Anzahl der generierten Adressen, wobei der Inkrementwert als erstes Argument an die annotierte Methode übergeben wird. Die Where-Klausel bewirkt, dass dieser Vorgang nur in der Brieftasche ausgeführt wird , deren Name dem Name-Parameter entspricht. Um die Methodenparameter an die SQL-Variablen zu binden. Fügen wir diese beiden Gedichtanmerkungen zu diesen Parametern hinzu. Lassen Sie uns jetzt unseren Test erneut durchführen. Toll, es ist vorbei. Unsere Load Wallet-Funktion ist fertig. Jetzt ist es wichtig, alle unsere Anwendungstests durchzuführen, um zu überprüfen, ob ein Fehler aufgetreten ist. Aber zuerst werden wir einige unserer Tests korrigieren und optimieren, sodass sie die Weight Load Wallet-Methode verwenden und einige Aufrufe der Schlafmethode löschen , die nicht mehr benötigt werden. Lassen Sie uns diese Tests zunächst ungewöhnlich machen. Und lassen Sie uns die genannten Optimierungen vornehmen. In den Tests mit verschachtelten Segmenten, wie denen aus dieser Klasse, müssen wir einige Parameter hinzufügen, um Bitcoin- und Wait-Methodenaufrufe zu senden. Also lass es uns machen. Der letzte Parameter dieser Aufrufe muss die Zeichenfolge Hashtag Nested Segment Receiving Address sein. Bei einigen Methoden wie dieser müssen wir auch die ID setzen, plus eins ist das dritte Argument des Methodenaufrufs send Bitcoin and wait. Jetzt können wir alle unsere Anwendungstests durchführen. Sie müssen alle an meiner Maschine vorbeikommen. Sie brauchen eine halbe Stunde. Also habe ich das als Übung für den Schüler belassen. 73. 71 Wallet importieren: In diesem Video implementieren wir die Möglichkeit, ein Wallet mit dem mnemonischen Startwert zu importieren. Es ist wichtig, diese Option zu haben, um Ihr Wallet wiederherzustellen und um Fälle wiederherzustellen, in denen Sie die Hardware oder Dateien, die die Anwendung oder Datenbank mit Ihren Wallet-Daten enthalten, verlieren, zerstören oder keinen Zugriff darauf haben oder . In diesen Fällen geben Sie einfach Ihren gesicherten Startwert und optional Ihre Passphrase in die Importfunktion der Anwendung ein, um wieder Zugriff auf Ihr Wallet zu erhalten. Eine weitere Sache: Sie sind nicht darauf beschränkt, Ihre Brieftasche zurückzugewinnen. Mit dieser Anwendung können Sie die von dieser Anwendung generierten mnemonischen Daten verwenden , um Ihr Wallet und andere BIP 39-kompatible Wallets wiederherzustellen . Außerdem können Sie den Zugriff auf Ihre Bitcoin-Wallet-Adressen wiederherstellen , indem Sie Ihren von anderen Wallets generierten BIP 39-mnemonischen Wert in diese Anwendung importieren Sie Ihren von anderen Wallets generierten BIP 39-mnemonischen . Stellen Sie einfach sicher, dass beide Anwendungen die Ableitungspads der Adressen unterstützen , die Sie importieren möchten. Beginnen wir also mit der Erstellung des Import-Wallet-Tests. Es wird die GUI-Testklasse erweitern. Lassen Sie uns diesen Code aus dem Send Bitcoin Test kopieren und hier einfügen. Lassen Sie uns nun einen Test namens should import wallet and receive Bitcoin erstellen . Lassen Sie uns im One-Block die Variable mit dem Namen der Brieftasche festlegen. Und lassen Sie uns einen mnemonischen Startwert mit der Methode mnemonic seed service create erstellen. Rufen wir nun die Import-Wallet-Methode übergeben den Wallet-Namen und mnemonischen Startwert als Parameter. Lassen Sie uns diese Methode erstellen. Fügen wir dieser Methode auch ein Passwort als dritten optionalen Parameter hinzu. Hier klicken wir auf ein Menü mit dem Textimport. Dann klicken wir auf den Menüpunkt mit der Text-Wallet. Jetzt klicken wir auf die Komponente mit einer FX-ID oder einem Wallet-Namen. Diese Komponente wird ein Eingabefeld sein , in das wir den Namen der importierten Brieftasche eingeben. Als Nächstes rufen wir die Schreibmethode auf und übergeben die Namensvariable als Parameter, um den Namen in dieses Feld einzugeben. Als Nächstes klicken wir auf das Passwortfeld, das eine FX-ID oder ein Wallet-Passwort enthält. Dann schreiben wir das Passwort in dieses Feld. Als Nächstes klicken wir auf das mnemonische Startfeld und schreiben die mnemonische Startvariable in dieses Feld. Schließlich klicken wir auf die Schaltfläche Okay. Fügen wir auch den Sleep-Methodenaufruf , um zu warten, bis die Brieftasche geladen ist. Zurück zum Import Wallet-Test mit der Suchmethode. Lassen Sie uns den Adresswert abrufen, der im Feld für die Empfangsadresse vorhanden ist. Mit der Methode „Bitcoin senden und warten senden wir 1.000 Satoshi's an die abgerufene Adresse. Jetzt klicken wir auf den Tab Adressen. Dann rufen wir mit der Suchmethode die Adresstabelle ab und speichern sie in einer Variablen. Wir klicken auf den Tab Transaktionen, rufen die Transaktionstabelle auf und speichern sie in einer Variablen. Lassen Sie uns dasselbe auch mit dem als Text beschrifteten Gesamtsaldo tun . Lassen Sie uns nun zwei Variablen festlegen, um die Größe der Adressentabelle und die Größe der Transaktionstabelle zu speichern . Fügen wir die folgenden Assertionen blockieren wir dann, um zu überprüfen, ob die zuvor gesetzten Variablen die erwarteten Werte haben. Lassen Sie uns diesen Test nun duplizieren. Benennen wir es um in should import used wallet und received block. In diesem Test erstellen wir eine Brieftasche und erhalten Bitcoins darin, bevor wir die Brieftasche importieren Dann importieren wir die Brieftasche, generieren einen Block in unserer Notiz und prüfen, ob die Anwendung korrekt geladen wird und aktualisiert das importierte Wallet. Lassen Sie uns hier also einen bestimmten Block erstellen, in dem wir eine Brieftasche erstellen und einen Bitcoin an sie senden. Lassen Sie uns nun diese Zeile löschen. Lassen Sie uns diesen Variablennamen ändern, um den Namen der Brieftasche zu importieren und die Nummer des Wallet-Namens zu erhöhen. Wir verwenden diese Variable, um der importierten Brieftasche einen Namen zu geben, da wir nicht zwei Wallets mit demselben Namen erstellen können. Lassen Sie uns die Passwortvariable an diesen Methodenaufruf übergeben. nach dem Import der Brieftasche Lassen Sie uns nach dem Import der Brieftasche einen Block generieren. Lassen Sie uns dazu zunächst eine Notizadresse mit dem Node Get New Address Client generieren . Dann rufen wir die Generate-to-Address-Methode auf übergeben die Knotenadresse als Parameter, um einen Block zu generieren. Rufen wir nun die Schlafmethode auf, um zu warten, bis der Block gemint ist. Lassen Sie uns abschließend den erwarteten Gesamtsaldo ändern. Ich erwarte einen Saldo von einem bestätigten Bitcoin und null unbestätigten Bitcoin. Der Rest des Tests bleibt wie er ist. Jetzt. Gehen wir zum Playground Dot FXML um das Import-Feature-Menü zu entwerfen. Lassen Sie uns das Lademenü-Tag und seinen Inhalt duplizieren. Lassen Sie uns dieses Textattribut ändern, um es zu importieren. Diese FX-ID für den Import des Menüs FXML. Fügen wir hier auch das Action-Attribut hinzu, dessen Wert sich auf die Methode bezieht . Der Open-End-Port-Wallet-Dialog erstellt diese Methode später, um auf einen Klick auf diesen Menüpunkt zu reagieren , indem er eine Dialogfenster. Gehen wir zum Scene Builder, um zu sehen, wie es aussieht. Okay, das Importmenü wurde neben dem Lademenü hinzugefügt. Lassen Sie uns nun diesen Code kopieren und in das Hauptfenster FXML einfügen. Lassen Sie uns diese Methode im Hauptfenster-Controller erstellen. Code wird der Dialogmethode Open Create Wallet sehr ähnlich sein. Also lass es uns kopieren und hier einfügen. Lassen Sie uns den Titel des Dialogs ändern, um Wallet zu importieren. Und lassen Sie uns hier das Dialogfeld Wallet importieren durch das Dialogfeld Wallet laden ersetzen . Lassen Sie uns dieses Feld erstellen und es in diese Klasse einfügen. Die Wertanmerkung hier verweist auf den Dialog „Wallet importieren“ FXML. Lassen Sie uns nun die Eingabe erstellen, während ein Dialog FXML im FXML-Paket stattfindet. Lassen Sie uns den Inhalt des Dialogs „Wallet erstellen“ FXML als Grundlage verwenden , um ihn zu erstellen. Lassen Sie uns nun den Text der Dialogüberschrift ändern. Anstatt auf Erstellen zu klicken, bitten wir den Benutzer, einen gültigen mnemonischen Startwert einzugeben. Als Nächstes ändern wir den FX-Controller in den Import des Wallet-Dialog-Controllers. Gehen wir nun zum Scene Builder. Lassen Sie uns die Schaltfläche Erstellen löschen. Lassen Sie uns hier eine Bezeichnung einfügen und den Text auf das Erstellungsdatum ändern. Lassen Sie uns der Zelle ein Steuerelement für die Datumsauswahl hinzufügen. Lassen Sie uns auf den mnemonischen Seed-Textbereich klicken und ihn bearbeitbar machen. Zurück zum Texteditor. Lassen Sie uns diesen Namen von Fxi de Toilette und diese FX-ID in ein Wallet-Passwort ändern. Lassen Sie uns die FX-ID für die Datumsauswahl auf das Erstellungsdatum setzen. Lassen Sie uns nun den Import Wallet Dialogue Controller im Controller-Paket erstellen . Lassen Sie uns die Komponentenannotation hinzufügen. Lassen Sie uns all diese FXML-Felder zum Controller hinzufügen. Machen wir all diese Felder privat. Und lassen Sie uns ihnen die FXML-Annotation hinzufügen. Lassen Sie uns die initialisierte Methode vom Create Wallet Dialogue Controller kopieren und Create Wallet Dialogue Controller in unseren neuen Controller einfügen. Und lassen Sie uns dasselbe tun alle erforderlichen Eingaben erfüllt sind. Lassen Sie uns diese Namensvariable in den Walletnamen ändern. Lassen Sie uns diese Methode auch kopieren und in unsere neue Klasse einfügen. In der Event-Handler Okay Button rufen wir die Import Wallet-Methode auf. Mit dieser Methode wird einfach eine Wallet erstellt , die den Datentyp des Benutzers verwendet. Lassen Sie uns also die Methode create wallet aus dem Create Wallet Dialogue-Controller als Basis verwenden dem Create Wallet Dialogue-Controller , um es zu erstellen. Lassen Sie uns den Create Wallet Service in diese Klasse einfügen. Lassen Sie uns diese Variablen durch die Variablen in diesem Controller ändern . Und lassen Sie uns die anfängliche Anzahl der generierten Adressen in diese Klasse einfügen . Machen wir dasselbe mit diesem Kontextfeld. Anstatt nun ein neues Datum als Parameter für diese Methode zu verwenden , wird die Rechnungsdatumsmethode aufgerufen. Lassen Sie uns diese Methode erstellen. Wir verwenden hier die folgende Logik. Wenn der Benutzer kein Datum auswählt, verwenden wir das Datum, an dem Bitcoin zu funktionieren begann. Wenn er wählt, verwenden wir das gewählte Datum. Der Datumsparameter definiert, wie weit in der Vergangenheit der Knoten liegt , um Informationen über die importierten Wallet-Adressen zu finden . Je älter der Status ist, desto länger dauert es , bis der Knoten das Wallet importiert. Verwenden wir also die Standarddatumsmethode , um das Standarddatum zu definieren. Hier verwenden wir das einfache Objekt im Datumsformat mit dem folgenden Parameter. Dann versuchen wir, den einfachen Parse-Methodenaufruf im Datumsformat zurückzugeben den einfachen Parse-Methodenaufruf im Datumsformat der die Standard-Datumskonstante als Parameter übergibt. Wir verwenden den Catch-Block, um die Parse-Ausnahme in eine Runtime-Exception umzuwandeln. Lassen Sie uns diese Konstante definieren. Dies ist das Datum, an dem Bitcoin zu arbeiten begann. Hier. Wenn das Erstellungsdatum nicht Null ist, definieren wir die Datumsvariable auf den folgenden Wert neu . Schließlich geben wir das Datum zurück. Nach dem Erstellen des Wallets wird das importierte Wallet-Ereignis veröffentlicht. Lassen Sie uns es im GUI Dot Events-Paket erstellen. Hier übergeben wir diesen Parameter an den Superkonstruktor und setzen das Wallet-Feld auf den Wallet-Parameter. Lassen Sie uns einen Getter für dieses Feld erstellen. Gehen wir nun zum Save Wallet Listener. Dieser Listener reagiert auf importierte Wallet-Ereignisse, um importierte Wallets zu speichern. Lassen Sie uns es so umgestalten, dass es mehr als ein Ereignis hören kann . Lassen Sie uns dazu diese Implements-Anweisung entfernen. Lassen Sie uns diese Methode in uncreated wallet event umbenennen. Lassen Sie uns die Event-Listener-Annotation hinzufügen. Lassen Sie uns nun die unwichtige Wallet-Ereignismethode erstellen und importierte Wallet-Ereignis als Parameter übergeben. Lassen Sie uns diese Zeile kopieren und hier einfügen. Und lassen Sie uns dieser Methode die Event-Listener-Annotation hinzufügen . Wenn Sie eine Order-Annotation für annotierte Methoden mit Event-Listener-Anmerkungen festlegen annotierte Methoden mit Event-Listener-Anmerkungen wird die Reihenfolge der Ausführung dieser Listener vorhersehbar. Je kleiner der Annotationsparameter für die Reihenfolge ist, desto höher ist die Priorität, die dieser Listener ausführen muss , verglichen mit anderen Listenern desselben Ereignisses. Lassen Sie uns diese Anmerkung zu dieser Methode hinzufügen. Lassen Sie uns Null als Parameter übergeben damit dieser Listener der erste seiner Art ist, der ausgeführt wird . Fügen wir dieselbe Anmerkung zur Uncreated Wallet-Ereignismethode hinzu. Wir legen Wert darauf, das Wallet nach seiner Erstellung zuerst zu speichern , um sicherzustellen, dass wir, falls spätere Listener ausfallen, zumindest DataFirst speichern. Gehen wir nun zum erstellten Wallet-Import-Listener. Wir möchten, dass dieser Listener die importierte Brieftasche in den Bitcoin-Knoten importiert. Lassen Sie uns also die Ereignismethode „ Unloaded Wallet“ duplizieren. Lassen Sie uns seinen Namen in ein unwichtiges Wallet-Ereignis ändern und es als Ausnahme für das entsprechende Ereignis festlegen. Lassen Sie uns nun die Bestellanmerkung zu diesen Methoden hinzufügen. Die importierten und erstellten Wallet-Event-Listener erhalten einen als Parameter und den geladenen Wallet-Event-Listener Null. Auf diese Weise haben wir garantiert, dass die Brieftasche, wenn sie versucht, Daten vom Knoten abzurufen, diese bereits vom Knoten importiert werden. Gehen wir nun zum geladenen Wallet-Listener und fügen eine Listener-Methode für das importierte Wallet-Ereignis hinzu, wie wir es gerade in der vorherigen Klasse getan haben. Fügen wir nun beiden Methoden eine Order-Annotation hinzu, die als Parameter für die unwichtige Wallet-Ereignismethode und eine für die ungeladene Wallet-Ereignismethode übergeben die unwichtige Wallet-Ereignismethode und eine für wird, damit diese Listener danach ausgeführt werden alle anderen für ihre Veranstaltungen. Lassen Sie uns nun unseren Knoten ausführen. Und lassen Sie uns diesen Test durchführen. Der erste Test wurde bestanden, aber der zweite ist fehlgeschlagen. Mal sehen warum. Okay, eine Ausnahme wegen einer Verletzung Beschränkungen ist aufgetreten, weil wir zweimal versucht haben, eine Brieftasche mit demselben Namen zu speichern . Wir haben vergessen, die Wallet-Namen-Variable im Import-Wallet-Methodenaufruf für die Import-Brieftaschennamenvariable zu ändern Import-Wallet-Methodenaufruf für . Lassen Sie uns das beheben und den fehlerhaften Test erneut ausführen. Toll, es ist vorbei. 74. 72 Validiere die Wallet 2: In diesem Video werden wir einige Validierungen implementieren, bevor wir Import-Wallets erstellen und versuchen, Transaktionen zu versenden. Die erste Überprüfung verhindert , dass die Wallet-Erstellung fortgesetzt wird, wenn der Wallet-Name einem zuvor erstellten entspricht. Gehen wir also zum Create Wallet-Test , um einen Test für diesen Zustand zu erstellen. Es wird aufgerufen, sollte keine Brieftasche mit wiederholtem Namen erstellt werden. Lassen Sie uns eine Brieftasche im angegebenen Block erstellen, die erforderlichen Variablen und sie in der Methode create wallet verwenden. Lassen Sie uns im One-Block etwas Code hinzufügen, um eine Brieftasche mit demselben Namen wie die im angegebenen Block erstellte Wallet zu erstellen eine Brieftasche mit demselben Namen wie , aber jetzt mithilfe der GUI. Nachdem wir versucht haben, das Wallet zu erstellen, fügen wir hier den Sleep-Methodenaufruf hinzu. Wir erwarten, dass die Anwendung ein Warndialogfenster mit der Meldung anzeigt, dass der Wallet-Name bereits existiert. Definieren wir also eine Variable, die die Nachricht enthält. Jetzt verwenden wir die Suchmethode, um eine Komponente mit dieser Nachricht abzurufen und sie in der Node-Abfragevariablen zu speichern . Schließlich klicken wir auf die Schaltfläche Okay, um das Dialogfenster zu schließen. Im damaligen Block. Fügen wir den folgenden Vergleich hinzu, um zu überprüfen, ob die Meldung im Warndialogfenster Variablen für die Fehlermeldung entspricht. Gehen wir nun zum Dialog-Controller „ Wallet erstellen“. Bei der Methode create wallet verwenden wir eine if-Anweisung mit einem validierenden Wallet-Service, um zu überprüfen, ob der Wallet-Name gültig ist. Also lasst uns diesen Service in diese Klasse einbauen. Lassen Sie uns diesen Dienst und das Database Dot Services-Paket erstellen . Und lass uns damit fertig sein, es in diese Klasse zu injizieren. Rufen wir in der if-Anweisung die Methode wallet exists auf übergeben den Namenstext als Parameter. Lassen Sie uns diese Methode erstellen. Wir verwenden den Alert Error Service und den IF-Body. Also lasst uns es in diese Klasse injizieren. Jetzt rufen wir die Alert-Error-Methode dafür als Parameter auf . Lassen Sie uns diese Konstante bestehen. Lassen Sie uns diese Konstante in der Klasse „Fehlermeldungen“ erstellen. Es wird denselben Text haben, den wir im Test definiert haben. Lassen Sie uns diese Konstante hier importieren und die Return-Anweisung aufrufen. Gehen wir nun zum Validierungs-Wallet-Service. In der Wallet Exiss-Methode wird das Wallet-Repository geleitet. Also lasst uns es in diese Klasse injizieren. Jetzt geben wir den Methodenaufruf exists by name zurück und übergeben den Wallet-Namen als Parameter. Lassen Sie uns diese Methode einfach anhand dieser Methodensignatur erstellen . Spring Data JPA magic weiß bereits, wie man die gewünschten Informationen aus der Datenbank abfragt . Gehen wir zum Create Wallet Test. Lassen Sie uns diese Tests kommentieren. Führen Sie unseren Knoten aus und führen Sie unseren neuen Test aus. Toll, der Test ist bestanden. Lassen Sie uns diese Tests auskommentieren. Lassen Sie uns nun dieselbe Wallet-Namen-Validierung in der Funktion „Brieftasche importieren“ hinzufügen . Lassen Sie uns diesen Test kopieren und hier in den Import Wallet-Test einfügen. Lassen Sie uns seinen Namen so ändern, dass eine Brieftasche mit wiederholtem Namen nicht importiert werden sollte . Lassen Sie uns einige Anpassungen an diesem Test vornehmen. Lassen Sie uns zunächst die Nummer des Wallet-Namens erhöhen. Dann ändern wir es, um hier ein Wallet zu importieren , anstatt es zu erstellen. Und lassen Sie uns die Parameter dieser Methodenaufrufe ändern. Gehen wir nun zum Dialog-Controller „ Wallet erstellen “ und kopieren diesen If-Block hier. Und lassen Sie uns es hier in den Wallet-Dialog-Controller einfügen . Lassen Sie uns die notwendigen Dienste in diese Klasse einbauen. Lassen Sie uns diese Variable in den Namen der Brieftasche ändern. Lassen Sie uns nun diese Tests kommentieren und unseren neuen Test durchführen. Grad. Der Test ist bestanden. Lassen Sie uns diese Tests auskommentieren. Lassen Sie uns nun eine Adressvalidierung hinzufügen. Beim Versuch, Transaktionen zu senden. Derzeit können wir alles in das Feld zu sendende Adresse eingeben . Wenn wir versuchen, eine Transaktion an eine ungültige Adresse zu senden und ein Fehler auftritt und dieser von der Anwendung stillschweigend ignoriert wird, ohne dass der Benutzer es bemerkt, wird eine Validierung durchgeführt, die ein Warndialog erscheint auf dem Bildschirm, wenn die zu sendende Adresse ungültig ist. Lassen Sie uns zunächst zum Test „Bitcoin senden“ gehen , um einen Test für dieses Szenario zu erstellen. Nennen wir es, es sollte keine Bitcoin an eine ungültige Adresse senden. Lassen Sie uns Code hinzufügen, um mithilfe der GUI und des Windblocks ein Wallet zu erstellen . Warten wir auf die Erstellung der Brieftasche. Lassen Sie uns nun diesen Code kopieren und hier einfügen , um Geld an die Brieftasche zu senden. Lassen Sie uns diese vorherige Betragsvariable hier erstellen und ihren Wert auf 0,1 setzen. Lassen Sie uns eine auf die zweite Bereichsmethode setzen , die Parameter genannt wird. Lassen Sie uns nun eine Knotenadresse erstellen und einen Block dafür generieren. Klicken wir auf den Tab Senden und rufen die Methode „Bitcoin senden“ auf, um zu versuchen, 0,01 Bitcoin an die Adresse zu senden, an die Variable gesendet werden soll. Da die Variable „Zu sendende Adresse “ ungültige Adressen enthalten wird, erwarten wir, dass ein Warndialogfenster erscheint eine Meldung enthält, dass die zu sendende Adresse ungültig ist. Lassen Sie uns also eine Fehlermeldungsvariable mit der folgenden Meldung erstellen . Jetzt verwenden wir die Suchmethode, um eine Komponente mit dieser Nachricht abzurufen , die in der Node-Abfragevariablen gespeichert wird. Schließlich klicken wir auf die Schaltfläche Okay, um das Dialogfenster zu schließen. Blockieren Sie dann, lassen Sie uns den folgenden Vergleich hinzufügen , um zu überprüfen, ob die Meldung im Warndialogfenster der Variablen für die Fehlermeldung entspricht. Lassen Sie uns die Adresse definieren, an die eine Variable gesendet werden soll, mit einigen Testfällen im Where-Block. Lassen Sie uns diese Testfälle bestehen, die auf der Seite Projekt und Ressourcen verfügbar sind. Jeder Testfall hat einen Fehler. Die verschiedenen Teile des Codes werden erkannt. Der erste Testfall ist eine Zeichenfolge mit einem nicht existierenden Präfix. Der zweite Fall hat ein korrektes Reg-Test-Präfix, aber eine verbleibende ungültige Adresse. Die nächsten drei Adressen wären gültige Reg-Testadressen, aber ihre letzten Zeichen wurden geändert. Während der Adresserstellung. Ein Teil der Adresse verwendet den Rest der Adresse, um erstellt zu werden. Dieser Teil ist die Adressprüfsumme und hat die Funktion, Adressänderungen zu erkennen. Während der Adressdekodierung wird die Prüfsumme verifiziert, und wir würden erwarten, dass ein Fehler auftritt, wenn diese Überprüfung fehlschlägt. Die letzten drei Adressen sind gültig, stammen aber nicht aus der Reg-Testumgebung müssen daher als ungültig betrachtet werden. Gehen wir zum Script-Konfigurationsfinder. im Throw-Methodenaufruf von URLs ein Lambda übergeben, Lassen Sie uns im Throw-Methodenaufruf von URLs ein Lambda übergeben, dessen Text eine neue Create-Transaktions-Exception mit einer ungültigen Adresskonstante aus der Klasse „Error Messages“ zurückgibt neue Create-Transaktions-Exception mit einer ungültigen Adresskonstante . Die Ausnahme „Transaktion erstellen wird bereits später im Code erkannt und ihre Meldung wird bereits in einem Warndialogfenster angezeigt. Lassen Sie uns diese Konstante in der Klasse „Fehlermeldungen“ erstellen. Es wird denselben Text haben, den wir im Test definiert haben. Mit dieser Änderung erwarten wir, dass die Validierung Adressen mit ungültigen Präfixen abdeckt. Gehen wir nun zum Transaction Creators Service. Lassen Sie uns den Code in der Build-Ausgabemethode in einen Try-Catch-Block packen . Im Catch-Block wird die Ausnahme „Transaktion erstellen der die ungültige Adresskonstante übergeben wird. Mit dieser Änderung gehen wir davon aus, dass die Validierung Fehler bei der Dekodierung von Adressen abdeckt Fehler bei der Dekodierung von Adressen , deren Prüfsummenüberprüfung fehlschlägt. Gehen wir zum Bitcoin-Test senden. Lassen Sie uns nun diese Tests kommentieren und unseren neuen Test durchführen. Die letzten drei Testfälle sind fehlgeschlagen. Unserem Wallet ist es gelungen, Geld an diese Adressen zu senden. Dies geschah, weil bei der Adressdekodierung die Adresspräfixe verworfen wurden. Natürlich wurden die Transaktionen nur in der Reg-Testumgebung gesendet. Daher ist es wichtig, diese Adressen ungültig zu machen, um Situationen zu vermeiden, in denen Sie glauben Ihr Wallet in einer Umgebung betreiben, es aber tatsächlich in einer anderen läuft. Lass uns das reparieren. Gehen wir zur Address Matcher-Klasse. Lassen Sie uns diese Segmentmethode erstellen. Es gibt ein Zeichenkettenprädikat zurück. Und es wird eine ausreichend große Umgebung als Parameter verwenden. Jetzt erstellen wir ein Kartenobjekt mit Umgebungen als Schlüssel und Prädikaten von Zeichenketten als Werten. Wir verwenden die Map of Method, um diese Map zu erstellen. Für jede Umgebung wird ein Lambda festgelegt, um zu überprüfen, ob der Adressparameter das erwartete Präfix für diese Umgebung hat . Für Segue-Hauptnetzadressen erwarten wir, dass sie nicht mit BCR beginnen und mit BC-Testnetzadressen beginnen. Wir beginnen mit TB - und Reg-Testmodellen. Wir beginnen mit BCR t. Dann geben wir den Map.get-Methodenaufruf zurück und übergeben die Umgebung als Parameter. Lassen Sie uns nun diese Methode duplizieren und ihren Namen in sein verschachteltes Segment ändern. In diesem Fall können Netzadressen verwendet werden. Wir beginnen mit drei Tests, Net- und Reg-Testadressen. Wir beginnen mit zwei. Lassen Sie uns diese Methode duplizieren und ihren Namen in seine alten Hauptnetzadressen ändern . Wir beginnen mit einem. Testen Sie die Netz- und Reg-Testadressen. Wir beginnen mit M oder N. Lassen Sie uns nun diese Lambdas aus dieser Klasse entfernen. Gehen wir nun zur Adresskonfigurationsklasse. Fügen wir dieses Bitcoin-Umgebungsfeld hinzu. Lassen Sie uns hier eine Wertanmerkung hinzufügen, um den Wert dieses Felds mithilfe der Punkteigenschaften der Bitcoin-Umgebungsanwendung einzufügen dieses Felds mithilfe der Punkteigenschaften der Bitcoin-Umgebungsanwendung . Lassen Sie uns nun den Segmentparameter hier ändern, um ihn als Methode aufzurufen und das Bitcoin-Umgebungsfeld als Parameter zu übergeben. Lassen Sie uns hier dasselbe mit diesen verschachtelten Segmentparametern machen. Gehen wir nun zur Skriptkonfigurationsklasse. Wir nehmen die gleiche Änderung vor, die wir gerade in der Adresskonfigurationsklasse vorgenommen haben. Lassen Sie uns die Bitcoin-Umgebung in diese Klasse einfügen und die Skriptkonfig-Beans modifizieren um die richtigen Address-Matcher-Methoden aufzurufen. Bevor wir unseren neuen Test erneut ausführen, lassen Sie uns einige Tests korrigieren. Beim Test des sequentiellen Adressgenerators müssen wir die Bitcoin-Umgebung in der Adresskonfigurationsinstanziierung wie folgt einstellen . Lassen Sie uns diesen Test durchführen. Toll, es vergeht immer noch. Lassen Sie uns nun dasselbe mit dem Create Wallet Service Test machen. Okay, es vergeht immer noch. Machen wir dasselbe mit dem Test zur Auswahl einzelner Münzen nach dem Zufallsprinzip. Dieses Mal müssen wir die Bitcoin-Umgebung in der Skriptkonfiguration auf setzen . Lass es uns ausführen. Toll, es vergeht immer noch. Lassen Sie uns nun den Test des Transaction Creators Service beheben. Okay, es funktioniert immer noch. Lassen Sie uns abschließend dasselbe tun, das im Test des Transaktionsgrößenrechners festgelegt wurde . Aber dieses Mal müssen wir die Bitcoin-Umgebungen so einrichten , dass sie Net testen. Da wir in diesem Test Testnetzadressen verwenden, wurden die Tests bestanden. Gehen wir nun zum Bitcoin-Test senden. Lassen Sie uns diese Testfälle kommentieren, um nur die letzten drei auszuführen . Lass es uns ausführen. Toll, die Tests sind bestanden. Lassen Sie uns diese Tests auskommentieren. Und lassen Sie uns diesen Test mit dem Namen Buchstabe korrigieren. Es sendet, nicht gesendet. 75. 73 Progress skillshare 2: In diesem Video fügen wir Hauptfenster unserer Anwendung einen Fußzeilenbereich hinzu. Die Fußzeile enthält einen Fortschrittsbalken und eine Textbeschriftung. Der Fortschrittsbalken ist aktiv, wenn unser Wallet mit unserem Node kommuniziert, was manchmal eine Weile dauern kann. Das Textetikett zeigt eine kurze Beschreibung der Aktivität, die unser Wallet während dieser Kommunikation ausführt. Lassen Sie uns diesen Abschnitt im Playground Dot FXML entwerfen. Gehen wir zum Scene Builder. Zuerst. Fügen wir am unteren Rand des Hauptfensters ein H-Feld hinzu. Lassen Sie uns die Pref-Breite der H-Box auf 600 und die Pref-Höhe auf 19 ändern . Lassen Sie uns nun dem H-Feld einen Fortschrittsbalken hinzufügen. Lassen Sie uns auch ein Label hinzufügen. Wir setzen den linken Rand des Labels auf zehn und den Text auf eine leere Zeichenfolge. nun im Texteditor Lassen Sie uns nun im Texteditor diesen Code hier kopieren und in den Hauptfensterpunkt FXML einfügen. Lassen Sie uns nun den Fortschrittsbalken und die beschrifteten Komponenten in FXML-Dateien zusammenfassen. Lassen Sie uns zunächst den Fortschrittsbalken FXML erstellen. Lassen Sie uns diesen Inhalt löschen. Lassen Sie uns ein Ethik-Root-Tag mit einem Typ erstellen der auf die Java-FX-Klasse mit dem Fortschrittsbalken zeigt. Lassen Sie uns nun die Attribute aus dem Tag und dem Hauptfensterpunkt FXML kopieren und in unser neues FXML einfügen. Lassen Sie uns dieses XML-NSF X-Tag im Hauptfenster, FXML, festlegen . Lassen Sie uns diesen Fortschrittsbalken an seiner Stelle löschen. Fügen wir das Controller-Tag für den Fortschrittsbalken hinzu, das später erstellt wird. Lassen Sie uns nun eine FXML-Datei mit Fußzeilenpunkten erstellen , um das Label-Tag zu kapseln. Lassen Sie uns diesen Code löschen. Lassen Sie uns den Label-Tag-Code aus dem Hauptfenster FXML kopieren und in das neue FXML einfügen. Lassen Sie uns das Label-Tag in ein Ethik-Root-Tag ändern , dessen Typ auf die mit Java FX markierte Klasse verweist. Lassen Sie uns dieses XML-NSF x-Attribut zum neuen Tag hinzufügen. Lassen Sie uns nun die fehlenden Importe zu dieser Datei hinzufügen. Zurück zum Hauptfenster. Lassen Sie uns das kopierte Label-Tag durch das Footer-Controller-Tag ersetzen . Lassen Sie uns nun den Fortschrittsbalken-Controller erstellen und hier importieren. Machen wir dasselbe mit dem Footer-Controller. Gehen wir nun zum Fortschrittsbalken-Controller. Lassen Sie uns die Komponentenannotation hinzufügen. Lassen Sie uns den Controller-Konstruktor Receive Tab als Basis verwenden , um den Controller-Konstruktor für die Fortschrittsleiste zu erstellen. Lassen Sie uns die Namens- und Wertanmerkung so korrigieren , dass sie auf die richtigen verweisen. Und lassen Sie uns die aktuelle Brieftasche löschen da wir sie nicht benötigen. Lassen Sie uns nun diesen Konstruktor kopieren und in den Footer-Controller einfügen. Lassen Sie uns den Namen des Konstruktors korrigieren und die Komponentenannotation zu dieser Klasse hinzufügen. Lassen Sie uns die Wertanmerkung auf das richtige FXML zeigen. Lassen Sie uns nun diese Klasse dazu bringen, die Label-Klasse zu erweitern. Und die Fortschrittsbalken-Controller-Klasse wird die Fortschrittsbalkenklasse erweitern. Gehen wir zur GUI-Listener-Klasse und fügen beide Controller zum Set hinzu, damit sie als benutzerdefinierte Komponenten konfiguriert werden. Lassen Sie uns nun ein Observable erstellen , das den Fortschrittsstatus modelliert. Es wird die asynchrone Fortschrittsklasse sein die im Observables-Paket erstellt wurde. Lassen Sie uns eine Komponentenannotation hinzufügen. Um den Status des Fortschrittsbalkens zu definieren, wird ein doppeltes Eigenschaftsfeld namens Fortschritt erstellt. Lassen Sie uns es hier mit einem neuen einfachen Objekt mit doppelter Eigenschaft instanziieren einem neuen einfachen Objekt mit doppelter Eigenschaft Null als Parameter verwendet. Später wird der Parameter Null , der den Status des Fortschrittsbalkens auf inaktiv setzt, an den Fortschrittsbalken übergeben. Lassen Sie uns nun das Feld mit der Aufgabenbeschreibung erstellen. Es wird eine Zeichenketteneigenschaft sein und wir definieren den Text der Fußzeilenbeschriftung. Lassen Sie uns es mit einer neuen einfachen Zeichenketteneigenschaft instanziieren. Lassen Sie uns Getter für beide Eigenschaften erstellen. Die IDE hat zwei Getter für jedes Feld erstellt, einen für die Eigenschaft und der andere für den Wert der Eigenschaft benötigt nur die Getter für die Eigenschaften. Lassen Sie uns also die anderen Getter löschen. Lassen Sie uns nun die Startmethode hier erstellen. Wir verwenden es, um den Fortschrittswert auf die unbestimmte Fortschrittskonstante festzulegen . Der Wert dieser Konstante führt dazu, dass der Fortschrittsbalken einen Balken anzeigt, der sich nach links und rechts bewegt, was darauf hinweist, dass eine Aufgabe im Hintergrund ausgeführt wird. Lassen Sie uns auch die Stop-Methode definieren, die den Fortschrittswert wieder auf Null setzt. Die Fortschrittsleiste ist also inaktiv, was darauf hinweist, dass keine Aufgabe im Hintergrund ausgeführt wird. Lassen Sie uns abschließend die Methode zur festgelegten Aufgabenbeschreibung erstellen. Es wird eine Zeichenfolge als Parameter verwenden. Und es wird den Beschreibungsparameter auf das Feld Aufgabenbeschreibung setzen . Um nun zu kontrollieren, wann sich der Fortschrittsbalken und die Fußzeilenbeschriftung ändern, verwenden wir einen Aspekt. Lassen Sie uns die Fortschritts-Aspektklasse im GUI Dot Services-Paket erstellen . Im Frühling Stiefel. Und Aspect ist ein Methodenmodifikator. Wir verwenden einen Aspekt, um zu definieren, dass jede Methode, die mit einer bestimmten Anmerkung versehen ist, den Fortschrittsbalken startet , um den Text und die Fußzeilenbezeichnung zu finden, den Code in der Methode auszuführen und stellt den Status der Fortschrittsleiste und des Labels wieder her. Lassen Sie uns dazu die Aspekt- und Komponentenanmerkungen zu dieser Klasse hinzufügen . Lassen Sie uns den beobachtbaren asynchronen Fortschritt in diese Klasse einfügen . Lassen Sie uns nun die Methode zum Aktivieren des Fortschrittsbalkens erstellen. Es wird ein Objekt zurückgegeben. Fügen wir dieser Methode die Around-Annotation hinzu , da ihr Parameter eine Zeichenfolge mit dem Text bei der Anmerkung übergibt, die Klammer öffnen, den Fortschrittsbalken aktivieren und die Klammer schließen wird Klammer öffnen, den Fortschrittsbalken aktivieren . Diese Anmerkung definiert , dass der Aspekt Code vor und nach den geänderten Methoden ausführt. dem Parameter „ Fortschrittsbalken aktivieren“ definieren wir, dass der Aspekt Methoden modifiziert , die mit einer Anmerkung mit diesem Namen annotiert sind. Lassen Sie uns nun zwei Parameter zu dieser Methode hinzufügen. Der erste Verbindungspunkt ist der vorhergehende Verbindungspunkt , der als Griff für die annotierte Methode dient. Die zweite ist die Fortschrittsleiste beim Aktivieren, die Sie auf die Annotationsparameter zugreifen können. Lassen Sie uns diese Anmerkung erstellen und sie in einem neuen GUI-Annotationspaket erstellen. Um es zu einer Anmerkung zu machen, müssen wir dieses Schlüsselwort in eine Schnittstelle ändern. Fügen wir dieser Datei die Zielannotation hinzu , da ihr Parameter die Methodenkonstante übergibt. Dadurch wird die Anmerkung nur in Methoden gültig, nicht in Klassen oder Feldern. Fügen wir auch die Aufbewahrungsannotation die die Laufzeitkonstante als Parameter übergibt. Dadurch wird diese Anmerkung zur Laufzeit aktiv. Lassen Sie uns abschließend das Zeichenkettenwertfeld zu dieser Anmerkung hinzufügen . Dieses Feld wird mit dem Parameter gefüllt , der an diesen Annotationsaufruf übergeben wurde. Zurück zur Fortschritts-Aspektklasse. Hier übergibt der Methodenaufruf innerhalb einer Plattform, die später ausgeführt wird ein Lambda, dessen Körper die asynchrone Progressset-Taskbeschreibungsmethode aufruft die asynchrone Progressset-Taskbeschreibungsmethode Der Wert des aktivierten Fortschrittsbalkens wird ebenfalls als Parameter übergeben rufen Sie hier die asynchrone Fortschrittsstartmethode auf. Jetzt rufen wir den vorherigen Joinpoint Proceed-Methode und das vom Speicher zurückgegebene Objekt in der Ergebnisvariablen auf. Mit der Methode proceed wird die annotierte Methode ausgeführt und ihr Ergebnis zurückgegeben. Jetzt verpackt in eine plattformübergreifende Methode, die später ausgeführt wird, ändert den Status der asynchronen Fortschrittsfelder erneut. Aber dieses Mal setzen wir die Aufgabenbeschreibung auf eine leere Zeichenfolge und rufen die Stop-Methode für den asynchronen Fortschritt auf. Schließlich geben wir die Ergebnisvariable zurück , die das von der annotierten Methode zurückgegebene Objekt enthält . Gehen wir nun zum Fortschrittsbalken-Controller. Lassen Sie uns den beobachtbaren asynchronen Fortschritt in diese Klasse einfügen . Bindet das Fortschrittsfeld für asynchrone Fortschritte an die Fortschrittseigenschaft dieses Controllers in der initialisierten Methode. Gehen wir zum Footer-Controller. Lassen Sie uns den beobachtbaren asynchronen Fortschritt in diese Klasse einfügen . In der initialisierten Methode wird das Feld mit der Beschreibung der asynchronen Aufgabe an die Texteigenschaft dieses Controllers gebunden Feld mit der Beschreibung der asynchronen Aufgabe . Damit der Fortschrittsbalken funktioniert, müssen wir die Methoden, mit denen wir den Fortschritt verfolgen möchten, mit der Anmerkung „Fortschrittsbalken aktivieren “ annotieren . Lassen Sie uns das zuerst im Import Wallet-Service tun. Lassen Sie uns die Zeichenfolge mit dem Text Loading Wallet als Parameter übergeben. Lassen Sie uns diese Anmerkung kopieren und hier in die Sign and Send-Methode des sin-Transaktionsdienstes einfügen. Lassen Sie uns seinen Parameter auf Senden einer Transaktion ändern. Lassen Sie uns diese Anmerkung auch der Aktualisierungsmethode für UTXOS-Dienstklassen als Parameter hinzufügen der Aktualisierungsmethode für UTXOS-Dienstklassen . Lassen Sie uns den Satz Aktualisierung von UTXos weitergeben. Lassen Sie uns nun unseren Knoten ausführen. Und lassen Sie uns den Send Bitcoin Legacy Test durchführen, um den Fortschrittsbalken in Aktion zu überprüfen. Wie wir gesehen haben, funktionieren der Fortschrittsbalken und die Fußzeilenbeschriftung wie vorgesehen. Großartig. 76. 74 Abhängigkeiten aktualisieren skillshare 2: In diesem Video aktualisieren wir die Abhängigkeiten unseres Projekts. Es empfiehlt sich, die Abhängigkeiten eines Projekts auf dem neuesten Stand zu halten. Auf diese Weise profitieren wir von Bugs und Sicherheitslücken, die in unseren Abhängigkeiten vorgenommen wurden , wodurch unsere Anwendung sicherer wird . Gehen wir also zur Palm Dot-XML-Datei die die Version unserer veralteten Abhängigkeiten erhöht. Je nachdem, wann Sie sie aktualisieren, möglicherweise neuere Versionen verfügbar. Lassen Sie uns die übergeordnete Version von Spring Boot Starter erhöhen. Für mich ist die neueste Version 2.7. 0.5 wird die Java-Version auf 19 erhöhen. Lassen Sie uns diese tolle Version jetzt entfernen, da sie nicht mehr erforderlich ist. Ihre Version wird automatisch festgelegt. Gehen wir zu den Einstellungen der Projektstruktur. Lassen Sie uns die Java-Version des Projekts aktualisieren. Falls Sie benötigt werden, ist die Java-Version nicht verfügbar. Sie können auf SDK hinzufügen klicken, um es herunterzuladen. Lassen Sie uns das Sprachniveau des Projekts auf das neueste verfügbare Niveau einstellen . Lassen Sie uns nun die Version der Java FX Controls erhöhen. Machen wir dasselbe mit dem JavaFX FXML. Lassen Sie uns nun das Java FX Maven-Plugin und das G Maven-Plugin der Richtigkeit halber aktualisieren . Lassen Sie uns die Bitcoin-Java-Version in der Konfiguration des Maven-Abhängigkeits-Plug-ins auf 0.4, 0.4 aktualisieren . Klicken wir nun auf die Schaltfläche Maven Changes laden. Lassen Sie uns nun die Bitcoin Core Node-Version auf 23 aktualisieren. Laden wir es von der Website Bitcoin core.org herunter. Lassen Sie uns Version 23 herunterladen und im selben Ordner wie die vorherige Version installieren. habe ich schon gemacht, also überspringe ich diesen Teil. Jetzt. Stellen Sie sicher, dass Sie das Reg-Testumgebungs-Flag in der Datei bitcoin.com gesetzt haben. Bevor wir unseren Knoten ausführen, löschen wir die Reg-Testordner im Ordner Bitcoin no data und im Datenbankordner unserer Anwendung. Wir werden das nur tun, um unsere Testumgebung zu reinigen. Lassen Sie uns nun unseren Knoten ausführen, indem wir uns die Konsole ansehen. Beachten Sie, dass auf unserem Knoten Version 23 ausgeführt wird. Gut. Jetzt müssen wir eine kleine Änderung vornehmen, damit unser Wallet mit der neuen Bitcoin Core Node-Version ordnungsgemäß funktioniert . Schauen wir uns die Dokumentation zur Create Wallet RPC-Methode an, um sie besser zu verstehen. In Bitcoin Core Version 23 das Deskriptors-Argument der Create Wallet RPC-Methode standardmäßig auf true gesetzt, während es in der vorherigen Version auf false gesetzt wurde. Dadurch kann unser Application Wallet einige RPC-Methoden, die wir zur Behebung des Problems verwenden, nicht aufrufen einige RPC-Methoden, die wir zur Behebung des Problems verwenden, Es wird manuell auf False gesetzt , sodass sich die Änderung nicht mehr auf uns auswirkt. Gehen wir also zum Node Create Wallet Client. Fügen wir hier die folgenden Parameter hinzu. Fügen wir sie der Signatur der Create-Wallet-Methode hinzu. Außerdem ist der Parameter für deaktivierte private Schlüssel ein boolescher Wert und definiert, ob das erstellte Node-Wallet private Schlüssel generiert. Wenn der Wert auf true gesetzt ist, erstellt der leere Parameter eine Node-Wallet ohne Startwerte und Schlüssel. Die Passphrase setzt optionale Passphrase zur Verschlüsselung des NerdWallet ein. Wie der Name schon sagt, definiert der Parameter avoid reuse eine Richtlinie zur Vermeidung der Wiederverwendung von Adressen. Schließlich definiert der Deskriptors-Parameter ob es sich bei der erstellten Node-Wallet um eine Deskriptor-Wallet handelt. Eine Deskriptor-Wallet ist eine neue Art von Wallet im Bitcoin Core Node, die wir nicht verwenden werden. Gehen wir nun zum Node Load oder Create Wallet Service. Lassen Sie uns diese Variablen zu diesem Methodenaufruf hinzufügen. Lassen Sie uns nun diesen Code und den Node Create Wallet Client kopieren und hier einfügen. Gehen wir jetzt zum Wallet-Service. Fügen wir diesem Methodenaufruf die folgenden Werte hinzu. Hier setzen wir die deaktivierten privaten Schlüssel und leeren Parameter auf true. Seit unserer Anwendung wird der Knoten zwar nicht benötigt, um private Schlüssel und Seeds für uns zu erstellen. Die Passphrase wird eine leere Zeichenfolge sein. Wir setzen den Parameter avoid reuse auf false, da unser Knoten Adressen für uns generiert und der Deskriptorenparameter falsch ist. Gehen wir nun zur GUI-Testklasse. in diesem Methodenaufruf Lassen Sie uns in diesem Methodenaufruf die folgenden Werte übergeben. Im Gegensatz zum vorherigen Fall wollen wir dieses Mal private Schlüssel und Seeds generieren, da wir in unseren Tests das Node Wallet verwenden werden, um Bitcoins zu versenden. Daher sind die ersten beiden Parameter falsch. Die dritte wird eine leere Zeichenfolge sein. Der Parameter avoid reuse wird auf true gesetzt. Der Knoten vermeidet also die Wiederverwendung von Adressen für unsere Test-Wallet und das Argument der Deskriptoren ist falsch. Lassen Sie uns nun aus irgendeinem Grund noch eine Änderung vornehmen, nachdem unsere Abhängigkeiten aktualisiert haben. Wenn bei einigen Tests zwei Okay Buttons auf dem Bildschirm angezeigt werden , klickt Test FX am Ende auf die falsche. Um das zu beheben, gehen wir zum Warnfehler oder zum Dienst. Fügt programmgesteuert eine Fx-ID zur OK-Schaltfläche der Warnung hinzu. Um das zu tun, erstellen wir hier die Variable ok. Wir verwenden die Suchmethode, um die Tastenreferenz abzurufen und sie der Variablen ok. wie folgt zuzuweisen . Dann stellen wir die ID so ein, dass sie benachrichtigt wird. Okay. Gehen wir nun zum Create Wallet Test. in diesem Test, anstatt die Click-On-Methode mit dem Parameter okay aufzurufen , einen Verweis auf Lassen Sie uns in diesem Test, anstatt die Click-On-Methode mit dem Parameter okay aufzurufen, einen Verweis auf die Schaltfläche Okay mit der zugehörigen ID an den Alert-Dialog übergeben . Jetzt klickt dieser Test eindeutig auf die rechte OKA-Schaltfläche. Machen wir dasselbe mit jedem anderen Test mit demselben Problem im Projekt. Lassen Sie uns den im Import Wallet-Test beheben. Lassen Sie uns das nun im Send Bitcoin Nested Segue Test machen. Lassen Sie uns abschließend die Tests korrigieren und den Bitcoin-Test senden. Als Übung überlasse ich es nun dem Schüler, alle Anwendungstests durchzuführen. 77. 75 Mainnet 2: In diesem Video installieren und starten wir unsere Anwendung in der Hauptnetzumgebung. Da wir es mit echtem Geld zu tun haben, wird dringend empfohlen , dass Sie garantieren , dass alle Bewerbungstests bestanden sind. Außerdem ist es ratsam , mit kleinen Bitcoin-Beträgen zu spielen. Lassen Sie uns zunächst die Bitcoin-Java-Bibliothek in der POM-Datei auf Version 0.4, 0.5 aktualisieren die Bitcoin-Java-Bibliothek in der POM-Datei auf Version 0.4, . Diese Version behebt ein Problem beim Import der Wortlistendatei beim Ausführen der Anwendung nach der Installation. Gehen wir zum Mnemonic Seed Service und entfernen diese Wurf-Anweisungen, da wir sie nicht mehr benötigen. Lassen Sie uns dasselbe mit dieser Create Mnemonic Seed-Methode im Create Wallet Dialogue Controller tun. Lassen Sie uns nun unseren Knoten in der Hauptnetzumgebung ausführen. Gehen wir dazu zu unserer bitcoin.com-Datei und entfernen die Reg-Testkonfigurationszeile, speichern die Datei und führen den Bitcoin-Knoten aus. Okay, jetzt läuft unser Knoten in der Hauptnetzumgebung. Hier kommt der traurige Teil. Es kann Tage oder Wochen dauern, bis unsere Notiz in der Hauptnetzumgebung synchronisiert ist, da sie derzeit 436 GB groß ist. In meinem Fall gibt die Konsole an, dass der Fortschritt beim Herunterladen der Blockchain bei etwa 52% liegt. Später in diesem Video zeige ich Ihnen die Anwendung, die auf meinem anderen Computer läuft die bereits vollständig synchronisiert wurde. Lassen Sie uns zunächst unsere Anwendung so modifizieren , dass sie in der Hauptnetzumgebung ausgeführt wird. in der Datei mit den Punkteigenschaften der Anwendung Lassen Sie uns in der Datei mit den Punkteigenschaften der Anwendung die Bitcoin-Umgebungseinstellung zwei Hauptnetz ändern . Wir weisen der Note-RPC-URI-Konfiguration den Port 83 32 zu. Dies ist der Standardport, den der Bitcoin-Knoten verwendet , um seine RPC-API im Hauptnetz verfügbar zu machen. Als Nächstes setzen wir den Crypt-Schlüssel in der Spring Data Source-URL-Konfiguration auf diese Umgebungsvariable , die erfordert, dass wir diese Umgebungsvariable in unserem Betriebssystem festlegen diese Umgebungsvariable in , bevor wir unseren Code kompilieren. Auf diese Weise erhöhen wir die Sicherheit unserer Anwendung und vermeiden, dass die Datenbankvariablen in unserem Code offengelegt werden. Lassen Sie uns dasselbe mit den Werten der Spring Data Source-Benutzernamen- und Passwortkonfigurationen machen . Lassen Sie uns nun sichere Werte für diese Konfigurationen generieren. Verwenden wir dazu den SQL DB-Manager, den SQL DB-Manager um dies zu erreichen, indem wir die Crypt-Schlüsselfunktion wie folgt aufrufen . Lassen Sie uns drei Werte generieren und sie kopieren und in eine Textdatei einfügen. Es ist wichtig, dass Sie diese Werte an einem sicheren Ort aufbewahren , da jede Änderung dieser Werte vor dem erneuten Kompilieren der Anwendung dazu führt, dass der Zugriff auf die Datenbank verloren geht. In diesem Fall haben Sie immer noch Zugriff auf Ihre Brieftasche. Wenn Sie Ihre Wallets, Ihren Mnemonic Seed und Ihr Passwort behalten , aber Sie müssen die Datenbankdateien löschen und die Anwendung erneut kompilieren. Jetzt füge ich diese Umgebungsvariablenwerte direkt in die Anwendung ein, die Punkteigenschaften korrigieren können. Ich mache das, weil die Anwendung zumindest auf meinem Windows-Computer diese Werte nicht mit der Systemumgebung interpoliert . Erstens, das gleiche Problem tritt unter Linux nicht auf. Also ich denke, es ist ein seltsamer Fehler bei der Kompilierung. Teilen Sie mir im Kommentarbereich mit, ob Sie das gleiche Problem hatten. So können wir gemeinsam eine Lösung für dieses Problem finden. Moment können wir mit der Anwendung fortfahren. Punkteigenschaften sind, befindet sich auf der Anwendung fortfahren. Punkteigenschaften sind, befindet der Maven-Registerkarte. wir mit der rechten Maustaste auf die Schaltfläche Installieren. Klicken Sie auf „ Konfiguration ändern“. Im Runner-Tab. Lassen Sie uns das Kontrollkästchen Tests überspringen aktivieren , damit der Maven-Installationsbefehl die Anwendungstests nicht vor der Installation der Anwendung ausführt. Wenn Sie neuere IntelliJ AID-Versionen verwenden, ist diese Option möglicherweise über das Konfigurationssymbol in diesem Fenster verfügbar . Klicken Sie auf die Schaltfläche Okay. Doppelklicken Sie nun im Abschnitt Konfiguration ausführen auf die benutzerdefinierte Installationsoption . Großartig, die Anwendung wurde erfolgreich in dem angegebenen Ordner in der Konsole installiert. Bevor Sie es ausführen, stellen Sie sicher, dass Sie das Java SDK mit derselben Version wie die Anwendung installieren . Ich gehe auf die Oracle-Website , um es herunterzuladen und zu installieren. Schließen und öffnen Sie nach der Installation das Terminal. Kopieren Sie nun den Pfad, in dem Ihre Anwendung die JAR-Datei der Anwendung installiert hat. Sie können den Befehl java space double hyphen version verwenden um sicherzustellen, dass auf Ihrem Terminal die richtige Java-Version ausgeführt wird. Führen Sie nun den Befehl java space, hyphen jar space aus, den Pfad, den Sie gerade kopiert haben. Großartig, die Anwendung wurde erfolgreich in der Hauptnetzumgebung gestartet . Lass uns versuchen, eine neue Brieftasche zu erstellen. Es wurde erfolgreich ein neues Wallet erstellt, aber da unser Knoten immer noch sinkt, würde der Ladefortschrittsbalken noch lange aktiv bleiben , bevor wir ihn testen könnten. Jetzt zeige ich, wie das Wallet in der Hauptnetzumgebung meines Linux-Computers funktioniert , wo der Knoten zu 100% synchronisiert ist. Also habe ich die Anwendung einfach genauso installiert wie für Windows. Dies zeigt einen großen Java-Vorteil, nämlich die reibungslose plattformübergreifende Kompatibilität. Lassen Sie uns die Anwendung ausführen. Ab sofort werde ich aus Datenschutzgründen einige Daten, die Sie auf dem Bildschirm sehen, ausblenden . Zuerst lade ich eine Brieftasche. Ich habe es bereits korrekt erstellt und wie erwartet geladen. Jetzt erstelle ich eine neue Brieftasche. Ich werde den mnemonischen Samen mit Stift und Papier kommentieren , bevor ich auf die Schaltfläche Okay klicke. Jetzt kopiere ich die Adresse und füge sie in einen Texteditor ein. Jetzt werde ich die vorherige Brieftasche laden , in der sich etwas Geld befindet. Lassen Sie uns nun einige Satoshi's an die Adresse schicken, die wir aus der Adresstabelle kopiert haben . Wir können sehen, dass eine neue Änderungsadresse einige Mittel erhalten hat. Großartig. In der Transaktionstabelle sehen wir, dass eine neue Transaktion ohne Bestätigung erstellt wurde. Öffnen wir nun die Brieftasche , die Geld erhalten hat. Wir können sehen, dass sowohl die Adressentabelle die Transaktionstabelle ein neues Register haben , das darauf hinweist, dass wir einige Satoshis erfolgreich erhalten haben . Toll, alles funktioniert einwandfrei. 78. Extra-Kurs - Bitcoin Core v26: Willkommen zu unserem ersten zusätzlichen Kurs zur Aktualisierung unserer Anwendung für die Kommunikation mit Bitcoin Core Version 26. Wir werden sehen, dass es sehr gute Gründe gibt mit der neuesten Bitcoin-Core-Version auf dem Laufenden zu bleiben. Lassen Sie uns zunächst diese Website besuchen, um die Bitcoin-Core-Version 26 herunterzuladen. Klicken Sie auf die entsprechende Version für Ihr Betriebssystem. Da ich Windows verwende, werde ich die Datei herunterladen. Im Wesentlichen werden wir die aktuelle Version von Bitcoin Core überschreiben , die wir haben Stellen Sie sicher, dass Sie denselben Installationspfad wie unseren aktuellen wählen Installationspfad wie unseren aktuellen wählen In meinem Fall werde ich mit der Installation nicht fortfahren , da ich sie bereits habe. Für Sie sollte es jedoch so einfach sein , mehrmals auf die Schaltfläche Weiter zu klicken, bevor Sie die neu installierte Version ausführen . Lassen Sie uns die unmittelbaren Vorteile untersuchen, die es bietet, beginnend mit Bitcoin Core Version 25. Wir können den Versionshinweisen entnehmen, dass es einen neuen Index implementiert , der die Re-Scans von Wallets erheblich beschleunigt. Um uns für diesen neuen Filter zu entscheiden, fügen wir einfach den Blockfilter, der einer Einstellung entspricht , zu unserer Bitcoin-Konfigurationsdatei Nach dem Neustart des Knotens beginnt er mit der Erstellung dieses neuen Es kann einige Stunden dauern, bis der Vorgang abgeschlossen ist, aber danach werden wir feststellen, dass das Laden einer Wallet nach einiger Zeit, ohne dass unser Node ausgeführt wird, viel schneller wird Lassen Sie uns nun einige Änderungen besprechen, die in den Versionshinweisen zu Version 26 eingeführt wurden Versionshinweisen zu Version 26 Wir stellen fest, dass wir, um Wallets ohne Deskriptor verwenden zu können, eine veraltete RPC-Einstellung in unserer Bitcoin-Konfigurationsdatei festlegen müssen RPC-Einstellung in Folge werden Wallets ohne Deskriptor in zukünftigen Kernversionen als veraltet eingestuft In der Folge werden Wallets ohne Deskriptor in zukünftigen Kernversionen als veraltet eingestuft. Mach dir keine Sorgen. werden wir zeigen, wie wir unsere Anwendung auf Descriptor-Wallets migrieren unsere Anwendung auf Descriptor-Wallets nächsten Extraklasse Um sicherzustellen, dass unsere aktuellen Wallets mit der Bitcoin-Core-Version 26 funktionieren, fügen wir diese Einstellung vorerst mit der Bitcoin-Core-Version 26 funktionieren, zu unserer Bitcoin-Konfigurationsdatei schon dabei sind, fügen wir auch den Blockfilter einer Einstellung entspricht, die wir zuvor besprochen haben Lassen Sie uns nun unseren Bitcoin-Core-Knoten in der Reg-Testumgebung ausführen in der Reg-Testumgebung Wie immer sind wir fast fertig. Bei jeder wesentlichen Änderung, die wir an unserer Anwendung vornehmen, müssen wir alle unsere Tests durchführen, um sicherzustellen, dass alles ordnungsgemäß funktioniert. Ich habe das auf meiner Seite bereits gemacht und festgestellt, dass ein Test nicht mehr funktionierte, wenn er mit der neuen Bitcoin-Kernversion ausgeführt wurde. Es stellt sich heraus, dass der Test „Bitcoin nicht mit dem falschen Passwort senden “ aus der Testklasse „Bitcoin senden“ fehlgeschlagen ist. Allerdings nicht, weil die Transaktion erfolgreich gesendet wurde, sondern weil der tatsächlich zurückgegebene Fehler von dem erwarteten abwich Ich habe es debuggt und festgestellt, dass die Fehlerantwort, die Bitcoin Core in der neuen Version sendet , jetzt eine andere Nachricht enthält , nämlich diese Wir entfernen einfach das Non am Anfang und fügen am Ende failed hinzu Jetzt sollte die Zuordnung zwischen dieser Fehlerantwort von Core und unserer Anwendung korrekt sein. Das ist es. Wenn Sie jetzt unsere Tests durchführen, sollten sie alle erfolgreich sein. In der nächsten Extraklasse werden wir uns damit befassen, was eine Deskriptor-Wallet ist und wie wir unsere Anwendung anpassen können, um diese Art von Wallet zu erstellen . Wir sehen uns dann