Wie werden verschiedene Adressen aus demselben privaten Schlüssel generiert?

Ich habe im " Technischer Hintergrund von Version 1 Bitcoin-Adressen " gelesen, dass Adressen eine Funktion des privaten Schlüssels sind. Mehr oder weniger:

Private Key -> Public Key -> Address

Wenn der öffentliche Schlüssel die einzige Eingabe ist, die zum Generieren einer Adresse benötigt wird, wie kommt es dann, dass ein Wallet jedes Mal eine andere Adresse generiert? Was ändert sich?

Eine deterministische Brieftasche ist eine Möglichkeit, einen privaten Schlüssel aus einer Passphrase zu generieren. Die Frage hier ist, dass anscheinend verschiedene Adressen aus einem einzigen privaten Schlüssel generiert werden können. Das ist zumindest der Eindruck, den mir mein Wallet Manager vermittelt.
Okay, jetzt sehe ich es. Die Antwort sind sequentielle oder hierarchische deterministische Wallets. Dieser Awnser erklärt es: bitcoin.stackexchange.com/questions/718/…
Anstatt uns in komplexe Mathematik zu vertiefen, verwenden wir ein bereits vorhandenes und praktisches Linux-Befehlszeilen-Passwortgenerator-Tool namens pwgen. Sie können pwgeneine Seed-Datei angeben und sie wird immer die gleichen Passwörter ausspucken, zum Beispiel zu Tausenden. Hier ist, wie:bash echo "sowing the seeds of love" > /tmp/seedfile.txt pwgen -H /tmp/seedfile.txt -N 1000

Antworten (4)

Privater und öffentlicher Schlüssel entsprechen einem Punkt auf der secp256k1-Kurve. Sie haben eine Eins-zu-Eins-Beziehung.

Die Adresse wird aus dem öffentlichen Schlüssel abgeleitet, indem ein ripemd160Hash nach einem sha256Hash auf dem öffentlichen Schlüssel durchgeführt wird. Mehrere öffentliche Schlüssel hashen an dieselbe Adresse, da der Adressraum nur 160 Bit beträgt, während der öffentliche Schlüsselraum 256 Bit beträgt.

Da beide Ableitungen ( private key > public key > address) deterministisch sind, können Sie nicht mehr als eine Adresse von einem privaten Schlüssel ableiten. *

Was Sie tun können, ist, zusätzliche private Schlüssel von einem "Master Private Key" mit einer bestimmten Ableitungsregel abzuleiten. Diese zusätzlichen privaten Schlüssel entsprechen offensichtlich neuen Adressen. Diese Art der Adressverwaltung wird als „hierarchical deterministic wallet“ bezeichnet.

* Genau genommen können Sie mehrere Adressen erstellen, indem Sie zwischen komprimierten und unkomprimierten Schlüsseln unterscheiden. Einzelheiten finden Sie in den Antworten von Sven und skaht .

Bei Bitcoin sind einem einzelnen privaten Schlüssel komprimierte und unkomprimierte private/öffentliche Schlüsselpaare zugeordnet. Unkomprimierte öffentliche Schlüsseladressen sind größer als neuere komprimierte öffentliche Adressen. (Kontrast 1b und 2b unten.) Unkomprimierte und komprimierte öffentliche Schlüssel müssen unterschiedliche zugeordnete Bitcoin-Adressen haben. Private Schlüssel, die im Wallet Input Format (WIF) codiert sind, kommunizieren implizit mit einem Hot Wallet, wenn unkomprimierte oder komprimierte Schlüssel verwendet werden sollen. Eine Blockchain zeichnet Gelder auf, die entweder unkomprimiert oder unabhängig komprimiert an eine Adresse gesendet werden.

Hier sind anschauliche Beispiele, die die Bitcoin-Explorer ( bx )-Befehlszeilenschnittstelle von libbitcoin verwenden und einen der absolut schlechtesten hexadezimal codierten privaten Schlüssel der Welt verwenden , der offensichtlich 256 Bit lang ist.0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff

1a) Unkomprimierter privater Schlüssel WIF-kodiert:

% echo "0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff" | bx base58check-encode -v 128

5HpHb4pzVWwsDAHNwwUS3VViCkwzcutaSJ57T4GNFw5UBNLSrRV

1b) Unkomprimierter öffentlicher Schlüssel:

% echo "0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff" | bx ec-öffentlich -u

040d47568a5e517067a2836c3823fbc58169a7662bfae934a4d41da3e23c98d816e7202dd702ffe038147f78aee4973a581972960a1460312ffb6f3f0f13d4a52c

1c) Unkomprimierte öffentliche Adresse:

% echo "0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff" | bx ec-öffentlich -u | bx ec-to-Adresse -v 0

1NGoV1EGZrwM7yvUYqRC7TMBMj7ftpjR2B

2a) Komprimierter privater Schlüssel WIF-kodiert:

% echo "0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff01" | bx base58check-encode -v 128

KwDiDMtpksBAcfyHsVS5XzmirtyjKWSeaeM9U1QppugixMUeKMqp

2b) Komprimierter öffentlicher Schlüssel:

% echo "0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff" | bx ec-to-public

020d47568a5e517067a2836c3823fbc58169a7662bfae934a4d41da3e23c98d816

2c) Komprimierte öffentliche Adresse:

% echo "0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff" | bx ec-öffentlich | bx ec-to-Adresse -v 0

1PbStXjfDNBU6FZA2iSeisVWwCFN9GK1eQ <- Kein Bot war hier schnell genug, um meine Experimente abzufangen

Wann immer Sie versuchen, jemandem Bitcoin zu erklären, ist es sehr sinnvoll, einfach zu sagen, dass die Ableitung private key > public key > addressdeterministisch ist. Wenn Sie jedoch daran interessiert sind, Ihren eigenen Code zu schreiben oder die vorhandene Codebasis aus verschiedenen Bibliotheken zu studieren, möchten Sie vielleicht wissen, dass ein privater Schlüssel tatsächlich zu zwei öffentlichen Schlüsseln führen kann (einer in komprimierter Form und einer in unkomprimierter Form), beides Codierungen des gleichen Punkts auf dersecp256k1elliptische Kurve, was aber zu zwei unterschiedlichen Hash-Werten führt. Daher haben wir zwei mögliche Hash-Werte und jeder Hash-Wert kann wiederum zu zwei verschiedenen (Pay-to-Public-Key-Hash) Adressen führen (eine für das Haupt-Bitcoin-Netzwerk und eine für das Testnetzwerk). Alles in allem (aus der Sicht eines Entwicklers und nicht nur eines Benutzers von Bitcoin) kann ein privater Schlüssel zu 4 möglichen Adressen führen. Ich hänge einen javaAusschnitt an:

import java.math.BigInteger;
import org.bitcoinj.core.ECKey;
import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.core.Address;
import org.bitcoinj.params.MainNetParams;
import org.bitcoinj.params.TestNet3Params;

public class Test {

  public static void main(String[] args){

  // An example of private key from the book 'Mastering Bitcoin'
  String k = "1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD";

  // Converting our string encoding as an actual number
  BigInteger priv = new BigInteger(k,16);

  // Creating a key object from our private key, with compressed public key
  ECKey k1 = ECKey.fromPrivate(priv, true);

  // Creating a key object from our private key, with uncompressed public key
  ECKey k2 = ECKey.fromPrivate(priv, false);


  // 03f028892bad7ed57d2fb57bf33081d5cfcf6f9ed3d3d7f159c2e2fff579dc341a
  System.out.println(k1.getPublicKeyAsHex()); // compressed

  // 04f028892bad7ed57d2fb57bf33081d5cfcf6f9ed3d3d7f159c2e2fff579dc341a...
  //...07cf33da18bd734c600b96a72bbc4749d5141c90ec8ac328ae52ddfe2e505bdb
  System.out.println(k2.getPublicKeyAsHex()); // uncompressed

  NetworkParameters main = MainNetParams.get();   // main bitcoin network
  NetworkParameters test = TestNet3Params.get();  // test bitcoin network

  Address addr1 = k1.toAddress(main); // main network, compressed
  Address addr2 = k1.toAddress(test); // test network, compressed
  Address addr3 = k2.toAddress(main); // main network, uncompressed
  Address addr4 = k2.toAddress(test); // test network, uncompressed

  System.out.println(addr1.toString()); // 1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy
  System.out.println(addr2.toString()); // mxdivjAqQSQj4LrAMX1XLQidyfU3pCWeS7
  System.out.println(addr3.toString()); // 1424C2F4bC9JidNjjTUZCbUxv6Sa1Mt62x
  System.out.println(addr4.toString()); // miY1V5L3QDaZVjrMT2Sw2WhHn63GzsNFQB

  }
}
Um Ihre Aussage zu verdeutlichen, ein privater Schlüssel kann zu 4 Adressen führen, 2, die im Testnetzwerk gültig sind, und 2, die im Live-Netzwerk gültig sind

Sie können eine unbegrenzte Anzahl von Adressen aus demselben privaten Schlüssel generieren . Der private Schlüssel ist einfach eine Zahl. aus der Sie komprimierte und unkomprimierte öffentliche Schlüssel generieren können. Aus den öffentlichen Schlüsseln können Sie Adressen für jedes Netzwerk (test, main, reg) für verschiedene Arten von Altcoins generieren, indem Sie das Netzwerkbyte ändern.

Mit unbegrenzt meine ich für jeden (Altcoin, Komprimierung, Netzwerk) da draußen.
-1 Das ist zwar richtig, aber hier wird nicht danach gefragt.