Als ich auf Coinbase einen Multi-Sig-Tresor erstellte, erhielt ich:
0
, übergeordnetem Fingerabdruck 00000000
und untergeordnetem Index 0
.Ich versuche, den Besitz einer Adresse zu beweisen, die vom öffentlichen Hauptschlüssel bei index abgeleitet ist 14
. Mit bip32.org konnte ich also den öffentlichen Schlüssel im erweiterten BIP32-Format bei index ableiten m/14
, der genau der Adresse entspricht, für die ich den Besitz nachweisen muss.
m/14
Mein Ziel ist es daher jetzt , basierend auf den mir vorliegenden Informationen den privaten Schlüssel abzuleiten, dessen Adresse mit der Adresse des abgeleiteten öffentlichen Schlüssels bei index identisch ist. Möglichst mit pybitcointools
.
Ich habe versucht, hier eine allgemeinere Frage zu stellen , aber es war ein guter Fall eines XY-Problems (ich habe eher nach meiner versuchten Lösung als nach dem tatsächlichen Problem gefragt).
Ich habe mich ein wenig mit dem Offline-Multisig-Tool von Coinbase beschäftigt, um herauszufinden, was der Benutzer-Seed tatsächlich war und welche Ableitungspfade er hatte. Es stellt sich heraus, dass der Benutzer-Seed genau das ist, ein Seed, der verwendet wird, um den Master Private Key zu erhalten. Dies geschieht durch Hashing mit HMAC-SHA512, wobei der Schlüssel die Zeichenfolge Bitcoin seed
und die Daten die Binärform des Benutzer-Seeds sind (was bedeutet, dass sie dekodiert und die Binärdaten abgerufen werden).
Um dies mit zu tun pybitcointools
, decodieren wir zuerst den WIF-Benutzer decode_privkey
-Seed mit und codieren ihn erneut mit encode_privkey
, um die binäre Form zu erhalten. Dann übergeben wir das an bip32_master_key
, um den bip32-Hauptschlüssel von diesem Seed zu erhalten. Und von dort aus rufen Sie einfach bip32_ckd
an, um den erweiterten privaten Schlüssel des gewünschten Indexkindes zu erhalten. Zuletzt extrahieren wir den eigentlichen privaten Schlüssel mit bip32_bin_extract_key
und codieren ihn mit encode_privkey
, um ihn in WIF-Form zu bringen, die importiert und in anderer Wallet-Software verwendet werden kann.
Der folgende Code erledigt all dies für Sie und druckt den vom Seed abgeleiteten erweiterten privaten Hauptschlüssel, den vom Hauptschlüssel abgeleiteten erweiterten öffentlichen Schlüssel (der mit Ihrem öffentlichen Schlüssel übereinstimmen sollte), den erweiterten untergeordneten privaten Schlüssel und aus dieser untergeordnete Schlüssel in WIF.
Ersetzen Sie die Werte für USER_PUB, USER_SEED und I durch Ihren tatsächlichen öffentlichen Benutzerschlüssel, Benutzerstartwert und untergeordneten Index, den Sie möchten. Die Werte, die ich hier habe, sind real und werden funktionieren.
from pybitcointools.deterministic import bip32_ckd, bip32_master_key, bip32_bin_extract_key, bip32_privtopub
from pybitcointools.main import decode_privkey, encode_privkey
USER_PUB = 'xpub661MyMwAqRbcEzdGMFKZXuVwbyHY2zKhiw6YFTrULfNBF53QVfXyoAiKMZKWkQA5444NXtLj9HPmgyN1xLCiJJ9dKAy4nLZJ87trHRnwUDb'
USER_SEED = 'L3XCYcQ2pwY3YTuwyPXzWsvVtGnCp4zL2ajP3XQt2pVhPuKiVM7r'
I = 14
user_seed = encode_privkey(decode_privkey(USER_SEED), 'bin')
priv = bip32_master_key(user_seed)
derived_pub = bip32_privtopub(priv)
child_priv = bip32_ckd(priv, I)
assert USER_PUB == derived_pub
print "Master Private Key corresponding to seed: " + priv
print "Master Public Key corresponding to seed: " + derived_pub
print "Extended Private key at index " + str(I) + ": " + child_priv
print "WIF format of that key: " + encode_privkey(bip32_bin_extract_key(child_priv), 'wif_compressed')
Nick Odell