Estoy tratando de crear un bitcoinj
llavero determinista a partir de una clave pública maestra BIP32. Este es el código que he escrito hasta ahora:
val xpub = "xpub661MyMwAqRbcGiwzoCu93MuL6H91qANYUoYBwD4xSH8bRKJVNXsP1FUnNYiWUiu4trHbs3tavhbr4ih9bwNeVBmdQAnrA5SwSEVVCFza8dy"
val keyChainSeed : DeterministicKey = DeterministicKey.deserializeB58(null,xpub, MainNetParams.get)
val w = Wallet.fromWatchingKey(MainNetParams.get, keyChainSeed)
pero me sale el siguiente error:
No key found for absolute path M/0H.
java.lang.IllegalArgumentException: No key found for absolute path M/0H.
at org.bitcoinj.crypto.DeterministicHierarchy.get(DeterministicHierarchy.java:94)
at org.bitcoinj.crypto.DeterministicHierarchy.deriveChild(DeterministicHierarchy.java:152)
at org.bitcoinj.wallet.DeterministicKeyChain.initializeHierarchyUnencrypted(DeterministicKeyChain.java:590)
at org.bitcoinj.wallet.DeterministicKeyChain.<init>(DeterministicKeyChain.java:384)
at org.bitcoinj.wallet.DeterministicKeyChain.<init>(DeterministicKeyChain.java:393)
at org.bitcoinj.wallet.DeterministicKeyChain.watch(DeterministicKeyChain.java:444)
at org.bitcoinj.wallet.DeterministicKeyChain.watch(DeterministicKeyChain.java:436)
at org.bitcoinj.wallet.KeyChainGroup.<init>(KeyChainGroup.java:115)
at org.bitcoinj.core.Wallet.fromWatchingKey(Wallet.java:260)
at com.suredbits.core.bitcoin.WalletTest$$anonfun$2.apply$mcV$sp(WalletTest.scala:84)
at com.suredbits.core.bitcoin.WalletTest$$anonfun$2.apply(WalletTest.scala:80)
at com.suredbits.core.bitcoin.WalletTest$$anonfun$2.apply(WalletTest.scala:80)
No estoy seguro de por qué esto no funciona, ya que bitcoinj
es compatible con BIP32. ¿Alguien puede detectar lo que estoy haciendo incorrectamente?
Parece que está tratando de obtener una clave de una semilla, en lugar de derivar una clave usando una ruta. Esto usa la configuración de derivación predeterminada, que intenta derivar una clave reforzada, lo que no se puede hacer con una clave pública extendida.
Pruebe una derivación explícita, no endurecida en su lugar:
val xpub = "xpub661MyMwAqRbcGiwzoCu93MuL6H91qANYUoYBwD4xSH8bRKJVNXsP1FUnNYiWUiu4trHbs3tavhbr4ih9bwNeVBmdQAnrA5SwSEVVCFza8dy"
val keyChainSeed : DeterministicKey = DeterministicKey.deserializeB58(null,xpub, MainNetParams.get)
DeterministicKey key = HDKeyDerivation.deriveChildKey(
keyChainSeed, new ChildNumber(0, false));
val w = Wallet.fromWatchingKey(MainNetParams.get, key);
PD Debería leer la especificación BIP32 si aún no lo ha hecho.
chris stewart