BIP44 verwendet auf den meisten Ebenen Härtung/private Ableitung :
m / purpose' / coin_type' / account' / change / address_index
aber nicht auf der Ebene change und address_index. Erstens, was bringt das Härten und zweitens, was wäre der Nachteil, wenn man immer härtet, außer dass man auf dieser Ebene nur die Hälfte von 2³² Pfaden hat?
Soweit ich verstanden habe, ermöglichen nicht gehärtete Pfade bei Vorhandensein nur eines einfachen privaten Schlüssels, den xpriv-Schlüssel der Adresse zu erfahren, und wenn dieser nicht gehärtet ist, auch den nächsthöheren xpriv-Schlüssel bis hin zum ersten gehärteten Weg. Ist das so, und wenn ja, welchen Vorteil hätte es, außer 2 Milliarden Adressen mehr im externen und Änderungspfad dieses Kontos bereitzustellen, vorausgesetzt, dass der Überlauf in gehärtete Adressräume zulässig wäre?
Ein kleiner Code, um zu sehen, ob/was ich richtig gemacht habe:
var wallet = HDPrivateKey()
var hardened = wallet.derive(4, true)
var nonHardened = hardened.derive(4, false)
console.log(hardened.publicKey.toAddress().toString())
// the payee gets this anyway
console.log(hardened.publicKey.toString())
// once I spend from my address, I have to reveal this. It's probably secure to
// re-use the address but better not to.
console.log(hardened.privateKey.toString())
// at this point, you can spend funds that are received to above address and
// only that
console.log(hardened.xpubkey)
// you now know all my addresses I could derive from hardened. Do you know any
// private keys except for the one I explicitly shared a line before?
console.log(hardened.xprivkey)
// now you can spend from all the addresses derivable from hardened but learn
// nothing else about wallet.
console.log(nonHardened.publicKey.toAddress().toString())
console.log(nonHardened.publicKey.toString())
console.log(nonHardened.privateKey.toString())
console.log(nonHardened.xpubkey)
// in difference to the hardened case, you would now learn about nonHardened but
// also (once again) about hardened? What could you actually learn?
console.log(nonHardened.xprivkey)
// would this line leak any information that wasn't already leaked in the last
// block?
Die Ausgabe:
1c6dKRqvYPiCQx2R3u75pxGfy15g7jfU4
0342619d3209b6859f4d88e3b1deaa1acee734c94d625b7d59b286b6842c90bd60
4c461799315979063858208f6c3e8b33f29ceb10c42389690cd0a20427715845
xpub68GCDysH8nE2Nuodq1ncV4jYiWvajzZyjVr6Pt8N46QAKC3CPxjj8G6AcE7sdvGypzXZFRRHYjRokhTty6LC8MErRifGiJFeTbTBYL9QfTg
xprv9uGqpULPJQfjARjAizFc7vnpAV66LXr8NGvVbVikVksBSPi3rRRUaTmgkwDii6TFzWWFsch7Qc2v6eM1ZcJAJLv8ybvw7YY4qwLwvfFJoAp
1NsxMLRhXasbHaskKVQK4qiJpBZgjTs3Aq
026653baf78fb78cfb9845faa43080dfc452991422edc67f5ba085d02786364670
afdb89aaf2f02987dfc47cc655fb4e1fb5cdd545af44875b4176805dc8f60852
xpub69pTp8pV8Fcmkf3HuiWnzGE42MJcMrTtegoZaLApLUSvhugH6YNKgTtVfk2asMNZWKynCpFoCGePbHLfwJqsLtPskSv5cPF6j1FqmdaNCrE
xprv9vq7QdHbHt4UYAxpogynd8HKUKU7xPk3HTsxmwmCn8uwq7M8Z1458fa1pVZCfWYWUWMG7p7b99NzJnSwZAnQR6EmN4awbcKZrfdrcmXAXqy
Warum verwendet BIP44 überhaupt nicht gehärtete Pfade?
Stellen Sie sich vor, Sie haben eine Website, auf der Sie Dinge verkaufen möchten. Sie brauchen die Website, um Adressen generieren zu können, aber Sie möchten nicht, dass sie von ihnen Geld ausgeben kann.
Nun, Sie können der Website einen erweiterten öffentlichen Schlüssel auf Kontoebene geben, und sie kann daraus die nicht gehärteten Adressen generieren, die Sie benötigen. Sie könnten keine gehärteten Adressen erstellen; Sie benötigen den privaten Schlüssel des Kontos, um neue gehärtete Adressen zu erstellen.
// you now know all my addresses I could derive from hardened. Do you know any
// private keys except for the one I explicitly shared a line before?
Nein. Ich kenne einen privaten Schlüssel, aber ich kann den übergeordneten Schlüssel oder irgendwelche Geschwister nicht herausfinden.
// in difference to the hardened case, you would now learn about nonHardened but
// also (once again) about hardened? What could you actually learn?
Obwohl dieser Schlüssel nicht gehärtet ist, kenne ich den Kettencode des übergeordneten Schlüssels nicht, sodass ich keine Geschwisterschlüssel kompromittieren oder diesen Schlüssel sogar mit einem seiner Geschwister verknüpfen kann.
// would this line leak any information that wasn't already leaked in the last
// block?
Nö. Allerdings, wenn Sie auch ausgesetzt sind
wallet.derive("m").xpubkey
dann hätte ich genug Informationen, um Ihre Brieftasche zu kompromittieren.
Giszmo
Nick Odell
Giszmo
hardened.derive(1, true).derive(1, true).xprivkey is "xprv9zTLKFNn1CmW8oB3s8L1B4Bvn9E4nLmg2juMQv2HwbhhQhufDivMWcNSiio59CiNMXkUCBS4Npi9KAtefwB4KUNkrTkprbECsMLg3yEvJM8"
.Nick Odell
Giszmo
HDPrivateKey().derive(1,true).hdPublicKey.publicKey.toAddress().toString()
? Spuckt eine Adresse aus, wie ich es erwartet hätte.Nick Odell
Nick Odell
Giszmo