将应用程序中的KeyPath与用于Bip44钱包的Wallet32 Keypath相匹配

时间:2014-12-04 16:36:32

标签: c# bitcoin

我有一个应用程序,我创建一个带密码的高清钱包,并将公共主密钥保存到用户的数据库中。

然后,我希望用户能够将钱包备份到自己的钱包,在这种情况下我使用的是Wallet32。我在Wallet32中恢复帐户,该帐户使用的密钥路径为m / 44' / 0' / 0' /

在我的应用程序方面,我正在创建类似的键路径(在c#中):

KeyPath newKeyPath = new KeyPath("44/0/0/0/0" + nextDerivation);
var childKey = pubkey.Derive(newKeyPath);

nextDerivsation变量只是随着每次购买而递增。在应用程序端创建派生公钥时,它与wallet32中的派生公钥不匹配。因此,如果通过应用程序付款,则Wallet32无法提取。

我正在使用C#NBitcoin库。当我尝试在keyPath字符串中添加撇号时,如下所示:

KeyPath newKeyPath = new KeyPath("44'/0'/0'/0/0" + nextDerivation);
var childKey = pubkey.Derive(newKeyPath);

然后我得到一个"无效的输入格式"错误。我不确定这些撇号是否必要,但当我将相同的派生路径输入Bip32生成器时,我可以创建相同的公钥。我可以将付款发送到派生地址,然后wallet32选择它。

有人能指出我需要在NBitcoin库中使用KeyPath获得相同结果的正确方向吗?

1 个答案:

答案 0 :(得分:0)

为了更及时的回复,不要犹豫在github上询问,所以我会收到通知。

我的猜测是44'表示Wallet32正在使用"强化密钥" 44,与44相反,这意味着你使用非硬化键44(BIP32中的更多信息)

我不知道这样的符号,我可以在NBitcoin中支持它,因为我觉得它很有用,但我需要一些测试数据,你会为我生成一些吗?

现在,如果你想让它有效,可以考虑关键44&#39;换句话说,44等于(44u |(1u <&lt; 31)),第一位为1表示硬化。

如果你能给我一个例子(Root HD Key + path + Child HD Key),我可以更深入地调查并将其直接应用到NBitcoin中

[UPDATE]

在1.0.7.10(https://github.com/NicolasDorier/NBitcoin/commit/ce5b70d6d27d7fc2cedd089bfd1133a6cd490c97

中实施

您的代码应该按原样运行,运行Update-Package NBitcoin您的解决方案,感谢您指出。