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