5

I'm trying to create a bitcoinj determinstic key chain from a BIP32 master public key. This is the code that I have written so far:

val xpub = "xpub661MyMwAqRbcGiwzoCu93MuL6H91qANYUoYBwD4xSH8bRKJVNXsP1FUnNYiWUiu4trHbs3tavhbr4ih9bwNeVBmdQAnrA5SwSEVVCFza8dy"
val keyChainSeed : DeterministicKey =  DeterministicKey.deserializeB58(null,xpub, MainNetParams.get)
val w = Wallet.fromWatchingKey(MainNetParams.get, keyChainSeed)

but I get the following 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)

I'm not sure why this isn't working, as bitcoinj supports BIP32. Can anyone spot what I am doing incorrectly?

1 Answer 1

1

It looks like you're trying to get a key from a seed, rather than deriving a key using a path. This uses the default derivation settings, which attempt to derive a hardened key, which can't be done using an extended public key.

Try an explicit, non-hardened derivation instead:

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);

P.S. You should read the BIP32 spec if you haven't already.

1
  • This did not work, I'm still getting the same error. Commented May 15, 2015 at 21:59

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.