So leiten Sie den privaten Schlüssel ab, der einer Coinbase-Multi-Sig-Tresoradresse zugeordnet ist

Als ich auf Coinbase einen Multi-Sig-Tresor erstellte, erhielt ich:

  1. Ein öffentlicher Hauptschlüssel im erweiterten BIP32-Format mit Tiefe 0, übergeordnetem Fingerabdruck 00000000und untergeordnetem Index 0.
  2. Ein privater Schlüssel im WIF-Format ("User Seed"), von dem ich nicht weiß, ob er gehärtet wurde, von einem öffentlichen Schlüssel abgeleitet wurde, noch die Tiefe oder der Index.

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/14Mein 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).

Haben Sie etwas dagegen, ein Beispiel für eine xpub/WIF/generierte Adresse zu posten? Es würde mir helfen herauszufinden, was sie von dir wollen. (Offensichtlich keine, die Sie verwenden, um mit echtem Geld umzugehen.)

Antworten (1)

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 seedund 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_ckdan, um den erweiterten privaten Schlüssel des gewünschten Indexkindes zu erhalten. Zuletzt extrahieren wir den eigentlichen privaten Schlüssel mit bip32_bin_extract_keyund 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')
Super, das funktioniert einwandfrei!