Normalerweise wird ja ein 256 bit private Key erzeugt, der in ein public Key umgewandelt, dann mit SHA256 und RIPEMD160 gehasht und mit Base58 encoded wird (vermutlich vereinfacht ausgedrückt)
Wo in dem ganzen Vorgang entscheided sich dann ob eine 1xx, 3xx oder bc1xxx Adresse rauskommt ?
VG
Sorry,
Vor dem Codieren wird der Zeichenkette noch ein Typ-abhängiges Version Prefix vorangestellt, was nach dem Codieren letztlich zu 1… oder 3… am Anfang der Adresse führt.
Bei Native Segwit werden andere Prefixes verwendet und anders codiert (Bech32), so dass am Ende bc1q… vorne steht.
Quelle:
→ https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch04.asciidoc#bitcoin-addresses
→ bitcoinbook/ch07.asciidoc at a3229bbbc0c929dc53ec11365051a6782695cb52 · bitcoinbook/bitcoinbook · GitHub
(jeweils runterscrollen für eine Prefix Übersicht)
Das ist bei einem Pay to Public Key Hash (P2PKH) Script genau so.
Hinter einer Adresse kann aber auch der Hash eines Redeem Scripts stehen, z.B. bei P2SH. Ich kann Bitcoin auch ganz ohne Schlüsselpaar absichern indem ich halt ein entsprechendes Script schreibe.
Was ich damit sagen will: Hinter dem Adresstyp steckt auch immer ein Script Standard.
Bei einer P2SH Adresse nimmt man dann eben einen anderen Prefix damit sofort ersichtlich ist welcher Standard verwendet wird.
Wenn ich dir einfach einen rohen Public Key gebe ohne weiteren Kontext hat deine Wallet keine Ahnung ob sie jetzt z.B. einen P2PK, P2PKH oder einen P2WPKH Output bauen soll. Eine Bitcoin Adresse ist nicht wie bei einer Postanschrift ein Zielort an den ich etwas „hin“ schicke (im Bitcoin Netzwerk gibt es nicht mal Adressen), sondern eine Wallet liest aus der Adresse was für einen Output sie bauen muss und mit welchem Inhalt.
Und dafür sind verschiedene Adressversionen eben praktisch weil sie einen gewünschten Standard implizieren. Die Scripts die sich dahinter verbergen machen aber die eigentliche Funktionsweise aus (und sind viel spannender).
Nochmal eine dumme Frage zu dem Ganzen:
Kann es also sein, dass 3 verschiedene Addressformate den gleichen private Key haben ?
VG
Obwohl dir meine erste Antwort anscheinend nicht gefallen hat, probiere ich trotzdem mal deine zweite Frage zu beantworten.
Ja, das ist so. Wenn du ausgehend von einem Private Key unterschiedliche Adresstypen ableitest (1…, 3…, bc1q…, bc1p), kann der Private Key für all diese Adressen verwendet werden. In einem UTXO steht auch nicht die Adresse, sondern ein Public Key, Public Key Hash oder Script Hash.
Auch wenn du dich auf einen Adresstyp beschränkst, gibt es bei manchen Typen andersherum pro einzelner Adresse eine unvollstellbare Zahl an gültigen Private Keys (z.B. 1…, 3… und bc1q… mit P2WPKH). Das kommt daher, dass der Public Key bei einigen Typen nach SHA-256 nochmal mit RIPEMD-160 gehasht wird.
Einer Private Key Anzahl von 2^{256} stehen also nur 2^{160} Adressen gegenüber. Es muss also viele Private Keys zur gleichen Adresse geben (Schubfachprinzip).
Bei Native Segwit Skripten (P2WSH) wird nur mit SHA-256 gehasht; bei Taproot Public Keys gar nicht. Dort ist es also etwas anders.
→ Was ist ein "Derivation Path" und wie funktionieren HD Wallets? - #10 von skyrmion
→ Reichen 12 Wörter? - #12 von skyrmion
doch, doch, mir gefallen ALLE Antworten von dir
Woher weiss aber die Wallet, welche Addresse zu dem private key gehört ?
Hab mir also per script einen privaten key erzeugt und daraus eine 1xx, eine 3xx und eine bc1xx Adresse erzeugt. Wenn ich den privaten key in electrum importiere zeigt er mir eine 1xxx Addresse an.
okok, ich denke vielleicht etwas umständlich
VG
Ich habe selbst noch keinen Private Key in Electrum importiert. Allerdings gibt es prinzipiell zwei Möglichkeiten:
Entweder du importierst den Private Key im Wallet Import Format (WIF). Das ist eine Standard-Codierung für Private Keys, die erstens eine Püfsumme enthält (gegen Schreibfehler) und zweitens der Wallet Software mitteilt, welchen Adressetyp du nutzt. Das WIF wurde also genau zur Lösung deiner Fragestellung eingeführt.
Oder du teilst Electrum händisch mit, welchen Adresstyp du nutzten möchtest. Laut der inoffiziellen Electrum Doku kannst du das, in dem du den Typ davorschreibst:
Note: if the addresses in the source wallet begin with 3 you have to prepend “p2wpkh-p2sh:” to each private key before importing it. If the addresses begin with bc1 then you prepend “p2wpkh:”. Click on the info button to see examples.
Theoretisch ist das wie von @skyrmion erklärt möglich, wird in der Praxis aber nicht vorkommen (also nur durch manuelles festlegen).
Hinter jedem Adresstyp bzw. Script Standard steckt auch ein anderer Ableitungspfad. Und auf dem Native Segwit Pfad landest du natürlich auch auf einem anderen Schlüssel als auf dem Legacy Pfad.
Wenn du allerdings nur darauf hinaus willst dass der Adresstyp der gleiche ist, kannst du natürlich mit P2SH ganz viele verschiedene Redeem Scripts schreiben die alle mit dem gleichen Schlüssel gesichert sind. Die Adressen sind dann halt unterschiedlich (weil der Script Hash unterschiedlich ist).
Das stimmt natürlich.
Wenn ich bei einem Private Key anfange, kann ich einfach die zugehörigen, unterschiedlichen Adresstypen ableiten. Dann habe ich einen einzelnen Schlüssel für all diese Adressen.
Wenn ich aber bei meinen 24 Wörtern anfange, werde ich für jeden Typ sowieso schon unterschiedliche Private Keys erhalten.
Weißt du eigentlich was bei gängiger Wallet Software heutzutage der Standard für Native Segwit Single Sig Wallets ist: Wird üblicherweise P2WPKH oder P2WSH verwendet?
Ich vermute P2WPKH, da wegen des RIPEMD-160 Hashes Platz gespart wird?
Edit: Ich ziehe die Frage zurück, da es Unsinn wäre ohne Grund P2WSH zu verwenden.
Genau, und du würdest das sowieso an der längeren Adresse bemerken.