Konvertieren der Bytes der BIP32-Version - x04\x88\xad\xe4
- von base256 in base58 und base58Check gibt 7irrX
bzw. 1kz713TZjju
zurück.
Ich dachte, die Versionsbytes repräsentierten xprv
. Was vermisse ich?
Ich verwende pybitcointools , falls das einen Unterschied macht.
Genau wie bei normalen Bitcoin-Adressen (oder irgendetwas, das mit Base 58 codiert ist), werden die Versionsbytes nicht selbst codiert. Wie im Abschnitt Serialisierungsformat beschrieben , gibt es 78-Byte-Nutzdaten, die versioniert und mit einer Prüfsumme versehen werden, bevor sie dann in Basis 58 codiert werden:
- 4 Byte: Versionsbytes (Mainnet: 0x0488B21E öffentlich, 0x0488ADE4 privat; Testnet: 0x043587CF öffentlich, 0x04358394 privat)
- 1 Byte: Tiefe: 0x00 für Masternodes, 0x01 für Level-1 abgeleitete Schlüssel, ....
- 4 Bytes: der Fingerabdruck des Elternschlüssels (0x00000000, wenn Hauptschlüssel)
- 4 Bytes: Kindnummer. Dies ist ser32(i) für i in xi = xpar/i, wobei xi der Schlüssel > - serialisiert wird. (0x00000000 wenn Hauptschlüssel)
- 32 Bytes: der Kettencode
- 33 Bytes: die Daten des öffentlichen Schlüssels oder des privaten Schlüssels (serP(K) für öffentliche Schlüssel, 0x00 || ser256(k) für private Schlüssel)
Es gibt keine Byte-zu-Zeichen-Zuordnung, wenn Sie eine Base58-Serialisierung einer Multibyte-Struktur durchführen. Es ist nicht so, dass 0x04 zu „x“, 0x88 zu „p“ usw. wird. Vielmehr wird die gesamte 86-Byte-Struktur (78 Nutzlast + 4 Version + 4 Prüfsumme) in etwas codiert, das mit „xpriv“ beginnt, wenn die 4 höchstwertigen Bytes der 86-Byte-Struktur sind [0x04, 0x88, 0xad, 0xe4].
changebase(TESTNET_PRIVATE + bytes(bytearray(78)), 256, 58) >>> 'tprv8ZgxMBicQKsPcsbCVeqqF1KVdH7gwDJbxbzpCxDUsoXHdb6SnTPYxdwSAKDC6KKJzv7khnNWRAJQsRA8BBQyiSfYnRt6zuu4vZQGKhCz4Jb
. :)Um die obige Antwort zu ergänzen, enthält die Datei Bitcoin chainparams.cpp die folgenden Informationen, um die Einhaltung von BIP 32 zu unterstützen:
Hauptnetz:
base58Prefixes[EXT_PUBLIC_KEY] = boost::assign::list_of(0x04)(0x88)(0xB2)(0x1E).convert_to_container<std::vector<unsigned char> >();
base58Prefixes[EXT_SECRET_KEY] = boost::assign::list_of(0x04)(0x88)(0xAD)(0xE4).convert_to_container<std::vector<unsigned char> >();
Testnetz:
base58Prefixes[EXT_PUBLIC_KEY] = boost::assign::list_of(0x04)(0x35)(0x87)(0xCF).convert_to_container<std::vector<unsigned char> >();
base58Prefixes[EXT_SECRET_KEY] = boost::assign::list_of(0x04)(0x35)(0x83)(0x94).convert_to_container<std::vector<unsigned char> >();
Der Befehl bitcoin-explorer (bx) wird unten verwendet, mit dem drittschlechtesten Gehirn-Wallet-Seed der Welt. Außerdem wurde bx für die Verwendung von Testnet und nicht von Mainnet kompiliert. Konzentrieren Sie sich daher auf 04358394 für tprv und 043587cf für tpub , die in den folgenden Beispielen angezeigt werden.
% echo '0' | bx base16-kodieren | bx sha512 | bx hd-neutprv8ZgxMBicQKsPdcvudXaExR6Wdz5VgdjGeZHsw5bjnypoxrCxnYsyVq2v9cPTzDsnyLAL1v4Z2tM3Rp2AA6vv9WDbNBtui5QEZTWYucefZox
% echo '0' | bx base16-kodieren | bx sha512 | bx hd-neu | bx base58check-dekodieren
wrapper
{
checksum 3287061687
payload 3583940000000000000000004b0dc73821a026c0c71d07a7655968352b52d7e5896dd3907df121f914f9743900a6b53d2f0e384dc6ced2caeb36f0c9cc6f3ab0677f73c31aca87b62bbcc9fe78
version 4
}
% echo '0' | bx base16-kodieren | bx sha512 | bx hd-neu | bx base58-dekodieren 04358394
000000000000000004b0dc73821a026c0c71d07a7655968352b52d7e5896dd3907df121f914f9743900a6b53d2f0e384dc6ced2caeb36f0c9cc6f3ab0c9cc6f3ab038.92bcc6f3ab038b794ecc3
% echo '0' | bx base16-kodieren | bx sha512 | bx hd-neu | bx hd-öffentlichtpubD9nYDjxx7QwpsEhUiS7MDJ68p25nu9yxEt1AofKmEjmL3kozwA3z8G4Cm556YCYYJwfnix2GLVTtCHZq79R8UsRZBJVRPtD9HKNQBzDZVo4
% echo '0' | bx base16-kodieren | bx sha512 | bx hd-neu | bx hd-Öffentlichkeit | bx base58- 043587cf
decode 01cf633b1c00000000c023d310564ead16b50e678b2ff20e2d0a0f210fcf9c603ebd16f17d0510663802605d719a28b2707dcc9d7a2b804ba70242330e7010161aec4f86a0771d9909e504b705bf
Jonas Schnelli
Zauberer von Ozzie