[JAVA] bitcoinj document Japanische Übersetzung: Arbeiten mit der Brieftasche (1)

Einführung

bitcoinj ist eine Bitcoin-Bibliothek für die JVM-Sprache, die auf den SPV-Modus spezialisiert ist.

Dieses Mal übersetzte ich ungefähr 1/3 des Bitcoinj-Dokuments "Arbeiten mit der Brieftasche". [^ 1] Wir glauben, dass Sie durch das Lesen dieses Dokuments Ihr Wissen über die Erstellung Ihrer eigenen Brieftasche vertiefen werden.

Wenn Sie einen Fehler machen, weisen Sie bitte darauf hin.

Der Originaltext ist hier. Working with the wallet https://bitcoinj.github.io/working-with-the-wallet

Working with the wallet

Erfahren Sie, wie Sie die Wallet-Klasse verwenden und benutzerdefinierte Transaktionen erstellen.

Introduction

Die Wallet-Klasse ist eine der wichtigsten Klassen in Bitcoinj und hat die folgenden Funktionen.

Um verschiedene Arten von Apps zu erstellen, müssen Sie lernen, wie Sie Wallet verwenden.

In diesem Artikel wird davon ausgegangen, dass Sie das Whitepaper von Satoshi und Arbeiten mit Transaktionen gelesen haben.

Setup

Für einen optimalen Betrieb sollte die Brieftasche mit "BlockChain" und entweder "Peer" oder "PeerGroup" verbunden sein. BlockChain wird an den Wallet-Konstruktor übergeben und kann Blöcke in Bezug auf Wallet senden und empfangen sowie Wallet-bezogene Transaktionen extrahieren (Transaktionen, die Münzen mit dem Schlüssel in Wallet senden und empfangen). Peer / PeerGroup sendet Transaktionen an das Netzwerk, bevor die Transaktionen in der Brieftasche in den Block aufgenommen werden.

Die Brieftasche beginnt ohne Transaktionen, ohne Guthaben, unabhängig von ihrem Status in der Blockchain. Um Wallet verwenden zu können, müssen Sie die Blockchain herunterladen. Dadurch wird die Transaktion zur Analyse und Zahlung in Ihre Brieftasche geladen.

Wallet wallet = new Wallet(params);
BlockChain chain = new BlockChain(params, wallet, ...);
PeerGroup peerGroup = new PeerGroup(params, chain);
peerGroup.addWallet(wallet);
peerGroup.startAndWait();

Getting addresses

Natürlich können die oben genannten Codeteile nicht in die Brieftasche eingezahlt werden und sind nicht sehr nützlich. Verwenden Sie den folgenden API-Aufruf, um den Schlüssel und die Adresse aus der Brieftasche abzurufen:

Address a = wallet.currentReceiveAddress();
ECKey b = wallet.currentReceiveKey();
Address c = wallet.freshReceiveAddress();

assert b.toAddress(wallet.getParams()).equals(a);
assert !c.equals(a);

Diese werden zur Zahlung übergeben. Die Brieftasche hat das Konzept einer "aktuellen" Adresse. Dies gilt für GUI-Wallets, deren Adressen jederzeit angezeigt werden sollen. Wenn die aktuelle Adresse verwendet wird, wird sie in die neue Adresse geändert. Die Methode freshReceiveKey / Address gibt dagegen immer die neu abgeleitete Adresse zurück.

Seeds and mnemonic codes

Die von diesen Methoden zurückgegebenen Schlüssel und Adressen werden unter Verwendung der in BIP 32 und BIP 39 angegebenen Algorithmen deterministisch aus Seed abgeleitet. Die Lebensdauer des Schlüssels ist wie folgt.

  1. Das neue Wallet-Objekt verwendet "SecureRandom" und wählt eine zufällige 128-Bit-Entropie aus.
  2. Diese Zufälligkeit wird in "Gedächtniscode" umgewandelt. (Ein Mnemonikcode besteht aus 12 Wörtern unter Verwendung eines Wörterbuchs, das durch den BIP 39-Standard definiert ist.)
  3. Das 12-Wort-Zeichenfolgenformat wird als Eingabe für den Schlüsselableitungsalgorithmus (PBKDF2) verwendet und viele Male wiederholt, um einen "Startwert" zu erhalten. Beachten Sie, dass Seed nicht nur eine Reexpression der ursprünglichen zufälligen Entropie mit 12 Wörtern ist. Der Startwert wird aus einer 12-Wort-UTF-8-Byte-Zeichenfolgendarstellung abgeleitet.
  4. Der neu berechnete Startwert wird in einen privaten Hauptschlüssel und einen "Kettencode" aufgeteilt. Dies ermöglicht die Realisierung einer Schlüsselhierarchie mit dem von BIP32 angegebenen Algorithmus. Dieser Algorithmus nutzt die Eigenschaften der elliptischen Kurvenmathematik, damit die öffentlichen Schlüssel in der Hierarchie iterieren können, ohne auf den entsprechenden privaten Schlüssel zuzugreifen. Dies ist nützlich für Verkaufsadressen, da die Brieftasche nicht entschlüsselt werden muss, auch wenn sie durch ein Passwort geschützt ist. bitcoinj verwendet die empfohlene BIP 32-Standardbaumstruktur.
  5. Die Brieftasche berechnet den Satz der Vorausschau-Schlüssel vor. Dies ist nicht der Schlüssel, der von der Brieftasche mithilfe der aktuellen / freshReceiveKey-API ausgegeben wird, sondern wird in Zukunft verwendet. Durch die Vorberechnung können einige Ziele erreicht werden. Eine besteht darin, die API zu beschleunigen. Dies ist nützlich für GUI-Anwendungen, die nicht auf langsame EC-Vorgänge warten möchten. Die zweite ist die Benachrichtigung der Brieftasche, wenn eine Transaktion in Bezug auf einen nicht ausgegebenen Schlüssel generiert wird. Dies geschieht, wenn der Startwert auf mehrere Geräte repliziert und die Blockchain erneut abgespielt wird.

Schlüssel, einschließlich Seeds und vorberechneter Schlüssel, werden auf der Festplatte gespeichert, um ein langsames Ableiten von Schleifen beim Laden der Brieftasche zu vermeiden.

Der Mnemonik-Code ist einfacher zu handhaben und aufzuschreiben als ein roher privater Schlüssel. Der Mnemonikcode reduziert die Möglichkeit von Tippfehlern und ermöglicht es Benutzern, diese einfach mit einem Stift oder Papier aufzuschreiben. Daher ist es eine gute Idee, das Wort Benutzern als Sicherungsmechanismus zur Verfügung zu stellen (notieren Sie sich das Datum, um die Wiederherstellung zu beschleunigen).

Sie können wie folgt arbeiten:

DeterministicSeed seed = wallet.getKeyChainSeed();
println("Seed words are: " + Joiner.on(" ").join(seed.getMnemonicCode()));
println("Seed birthday is: " + seed.getCreationTimeSeconds());

String seedCode = "yard impulse luxury drive today throw farm pepper survey wreck glass federal";
long creationtime = 1409478661L;
DeterministicSeed seed = new DeterministicSeed(seedCode, null, "", creationtime);
Wallet restoredWallet = Wallet.fromSeed(params, seed);
// now sync the restored wallet as described below.

Die Vorausschauzone spielt eine wichtige Rolle, um die Brieftasche synchron zu halten. Die Standardgröße der Look-Ahead-Zone beträgt 100 Schlüssel. Wenn Brieftasche A in Brieftasche B repliziert wird, Brieftasche A 50 Schlüssel ausgibt und nur der letzte Schlüssel tatsächlich zum Empfangen der Zahlung verwendet wird, erkennt Brieftasche B die Zahlung und bewegt sich durch die Vorausschauzone. Und verfolgen Sie insgesamt 150 Tasten. Wenn Brieftasche A 120 Schlüssel verteilt und nur die 110. Zahlung erhält, weiß Brieftasche B nicht, was passiert ist. Aus diesem Grund ist es wichtig, die Anzahl der nicht bezahlten Adressen zu schätzen, die zu einem bestimmten Zeitpunkt für die Brieftaschensynchronisierung auf die Zahlung warten. Der Standardwert von 100 wurde entsprechend der Brieftasche des Verbrauchers ausgewählt. Für Händlerszenarien sind jedoch möglicherweise größere Zonen erforderlich.

Replaying the chain

Wenn Sie einen Schlüssel importieren, der bereits in Ihrer Brieftasche verwendet wurde, müssen Sie die Transaktion löschen, indem Sie die Brieftasche zurücksetzen (mithilfe der Methode "Zurücksetzen") und die Kette erneut herunterladen, um die Transaktion für den hinzugefügten Schlüssel abzurufen. .. Derzeit gibt es keine Möglichkeit, die Blockchain in einer Brieftasche abzuspielen, die bereits Transaktionen enthält. Wenn Sie dies versuchen, können Sie Ihre Brieftasche beschädigen. Dies kann sich in Zukunft ändern. Alternativ können Sie die rohen Transaktionsdaten von einer anderen Quelle wie dem Block Explorer herunterladen und die Transaktion direkt in Ihre Brieftasche einfügen. Dies wird derzeit jedoch nicht unterstützt und ist nicht getestet. Für die meisten Benutzer ist das Importieren eines vorhandenen Schlüssels eine schlechte Idee und stellt eine Situation dar, in der ein schwerwiegender Mangel an Funktionalität besteht. Bitte kontaktieren Sie uns, wenn Sie Ihre Schlüssel regelmäßig in Ihre Brieftasche importieren müssen.

Die Brieftasche arbeitet mit anderen Klassen im System zusammen, um die Synchronisation mit der Blockchain zu beschleunigen. Standardmäßig sind jedoch nur einige Optimierungen aktiviert. Bitte lesen Sie SpeedingUpChainSync, um den Optimierungsinhalt und die Einstellungsmethode der Brieftasche / PeerGroup zu verstehen.

Creating spends

Nachdem Sie die Kette eingeholt haben, können Sie einige Münzen ausgeben:

System.out.println("You have " + Coin.FRIENDLY_FORMAT.format(wallet.getBalance()));

Die Ausgaben bestehen aus 4 Schritten.

  1. Erstellen Sie eine Sendeanforderung.
  2. Vervollständigen Sie die Sendeanforderung.
  3. Übernehmen Sie die Transaktion und speichern Sie die Brieftasche.
  4. Senden Sie die generierte Transaktion

Der Einfachheit halber gibt es Hilfsmethoden, die diese Schritte ausführen. Im einfachsten Fall:

// Get the address 1RbxbA1yP2Lebauuef3cBiBho853f7jxs in object form.
Address targetAddress = new Address(params, "1RbxbA1yP2Lebauuef3cBiBho853f7jxs");
// Do the send of 1 BTC in the background. This could throw InsufficientMoneyException.
Wallet.SendResult result = wallet.sendCoins(peerGroup, targetAddress, Coin.COIN);
// Save the wallet to disk, optional if using auto saving (see below).
wallet.saveToFile(....);
// Wait for the transaction to propagate across the P2P network, indicating acceptance.
result.broadcastComplete.get();

Die Methode "sendCoins" gibt die generierte Transaktion und die "ListenableFuture" zurück. Mit ListenableFuture können Sie die Verarbeitung blockieren, bis die Transaktion vom Netzwerk akzeptiert wird (an einen Peer senden und von einem anderen empfangen). Außerdem können Sie für die zurückgegebene Zukunft einen Rückruf registrieren, um zu erfahren, wann die Weitergabe abgeschlossen ist, Ihren eigenen "TransactionConfidence.Listener" in der Transaktion registrieren, um den Weitergabestatus zu überwachen, oder sich selbst abbauen. Ich kann es schaffen

Auf niedrigeren Ebenen können Sie diese Schritte selbst ausführen:

// Make sure this code is run in a single thread at once.
SendRequest request = SendRequest.to(address, value);
// The SendRequest object can be customized at this point to modify how the transaction will be created.
wallet.completeTx(request);
// Ensure these funds won't be spent again.
wallet.commitTx(request.tx);
wallet.saveToFile(...);
// A proposed transaction is now sitting in request.tx - send it in the background.
ListenableFuture<Transaction> future = peerGroup.broadcastTransaction(request.tx);

// The future will complete when we've seen the transaction ripple across the network to a sufficient degree.
// Here, we just wait for it to finish, but we can also attach a listener that'll get run on a background
// thread when finished. Or we could just assume the network accepts the transaction and carry on.
future.get();

Verwenden Sie zum Erstellen einer Transaktion zunächst die statische Hilfsmethode des Objekts "SendRequest". Die "SendRequest" besteht aus einem teilweise ungültigen "Transaction" -Objekt, das unveränderte Elemente wie Gebühren, Adressänderungen und zukünftige Datenschutzfunktionen (wie Münzauswahlmethoden) enthält. Sie können Teiltransaktionen nach Bedarf ändern oder Ihre eigenen Transaktionen von Grund auf neu erstellen. Die statische Hilfsmethode von "SendRequest" ist eine weitere einfache Möglichkeit, eine Teiltransaktion zu erstellen.

Dann vervollständigen Sie die Anfrage. Dies bedeutet, dass die Transaktionen in der Sendeanforderung E / A hinzugefügt und signiert wurden, um die Transaktion zu validieren. Die Transaktion wird jetzt im Bitcoin-Netzwerk akzeptiert.

Beachten Sie, dass zwischen completeTx und commitTx keine Sperre besteht. Wenn die Brieftasche außerhalb Ihrer Kontrolle geändert wird, kann dieser Code daher zu Konflikten führen und fehlschlagen. Wenn beispielsweise der Brieftaschenschlüssel exportiert und an anderer Stelle verwendet wird und eine Transaktion, die die ausgewählte Ausgabe verwendet, zwischen zwei Methodenaufrufen erfolgt. Durch die Verwendung einer einfachen Struktur, die die Brieftasche sperrt, während beide Vorgänge ausgeführt werden, können Sie sicherstellen, dass Sie keine doppelten Ausgaben tätigen.

When to commit a transaction

Das Festschreiben einer Transaktion bedeutet, dass das Penta-Flag der Brieftasche aktualisiert wird, damit es nicht wiederverwendet wird. Es ist wichtig, die Transaktion zum richtigen Zeitpunkt festzuschreiben, und dafür gibt es verschiedene Strategien.

Das Standardverhalten von sendCoins () ist das Senden nach dem Festschreiben. In den meisten Fällen ist dies eine gute Wahl. Dies bedeutet, dass Sie bei einem Problem mit Ihrem Netzwerk oder wenn mehrere Threads gleichzeitig versuchen, eine Transaktion zu erstellen und zu senden, nicht versehentlich doppelte Ausgaben tätigen können. Wenn das Netzwerk die Transaktion jedoch aus irgendeinem Grund nicht akzeptiert (z. B. unzureichende Gebühren / nicht standardmäßiges Formular), berücksichtigt die Brieftasche das verbrauchte Geld und Sie müssen das Problem beheben.

Sie können auch "peerGroup.broadcastTransaction" verwenden, anstatt nur "wallet.commitTx" aufzurufen. Sobald eine Transaktion von mehreren Peers referenziert wird, wird die Transaktion an die Brieftasche übergeben und anschließend festgeschrieben. Der Hauptgrund, den Sie nach einer erfolgreichen Übertragung festschreiben möchten, besteht darin, dass Sie neuen Code ausprobieren und eine Transaktion erstellen, die nicht immer akzeptabel ist. In diesem Fall ist es mühsam, die Brieftasche ständig zurückzurollen. Nachdem sich herausstellt, dass das Netzwerk Transaktionen immer akzeptiert, können Sie Sendeanforderungen erstellen und abschließen und Transaktionsergebnisse festschreiben, alles unter einer einzigen Sperre. Mehrere Threads führen also nicht versehentlich zu doppelten Ausgaben.

[^ 1]: Ich wollte wirklich alles übersetzen, aber es war zu lang und ich habe versagt.

Recommended Posts

bitcoinj document Japanische Übersetzung: Arbeiten mit der Brieftasche (1)
Durchbrechen Sie mit MyBatis den japanischen Tisch
Resilience4j-Dokument Die japanische Übersetzung (inoffiziell) wurde veröffentlicht
settings.gradle Japanische Übersetzung
Gradle japanische Übersetzung
build.gradle Japanische Übersetzung