/// <summary> /// Create an account for a specific account index and account name pattern. /// </summary> /// <param name="password">The password used to decrypt the wallet's encrypted seed.</param> /// <param name="encryptedSeed">The encrypted private key for this wallet.</param> /// <param name="chainCode">The chain code for this wallet.</param> /// <param name="network">The network for which this account will be created.</param> /// <param name="accountCreationTime">Creation time of the account to be created.</param> /// <param name="newAccountIndex">The optional account index to use.</param> /// <param name="newAccountName">The optional account name to use.</param> /// <returns>A new HD account.</returns> public HdAccount CreateAccount(string password, string encryptedSeed, byte[] chainCode, Network network, DateTimeOffset accountCreationTime, int newAccountIndex, string newAccountName = null) { if (string.IsNullOrEmpty(newAccountName)) { newAccountName = string.Format(Wallet.AccountNamePattern, newAccountIndex); } // Get the extended pub key used to generate addresses for this account. string accountHdPath = HdOperations.GetAccountHdPath((int)this.CoinType, newAccountIndex); Key privateKey = HdOperations.DecryptSeed(encryptedSeed, password, network); ExtPubKey accountExtPubKey = HdOperations.GetExtendedPublicKey(privateKey, chainCode, accountHdPath); return(new HdAccount { Index = newAccountIndex, ExtendedPubKey = accountExtPubKey.ToString(network), ExternalAddresses = new List <HdAddress>(), InternalAddresses = new List <HdAddress>(), Name = newAccountName, HdPath = accountHdPath, CreationTime = accountCreationTime }); }
private ExtPubKey GetExtendedPublicKey(CoreNode node) { ExtKey xPrivKey = node.Mnemonic.DeriveExtKey(WalletPassphrase); Key privateKey = xPrivKey.PrivateKey; ExtPubKey xPublicKey = HdOperations.GetExtendedPublicKey(privateKey, xPrivKey.ChainCode, KnownCoinTypes.Bitcoin, 0); return(xPublicKey); }
private ExtPubKey GetExtendedPublicKey(string nodeName) { ExtKey xPrivKey = this.nodeGroupBuilder.NodeMnemonics[nodeName].DeriveExtKey(WalletPassword); Key privateKey = xPrivKey.PrivateKey; ExtPubKey xPublicKey = HdOperations.GetExtendedPublicKey(privateKey, xPrivKey.ChainCode, (int)CoinType.Bitcoin, 0); return(xPublicKey); }
public void pubKeysDerivedFromExtendedPrivateAndPublicKeysMatch() { string password = "******"; string passphrase = password; string mnemonic = "chalk call anger chase endless level slow sleep coast left sand enter save bind curious puzzle stadium volume mixture shuffle hurry gas borrow believe"; ExtKey extendedKey = HdOperations.GetExtendedKey(mnemonic, passphrase); string encryptedSeed = extendedKey.PrivateKey.GetEncryptedBitcoinSecret(password, this.Network).ToWif(); Key privateKey = HdOperations.DecryptSeed(encryptedSeed, password, this.Network); string accountHdPath = HdOperations.GetAccountHdPath(COINTYPE, 0); string path = HdOperations.CreateHdPath(COINTYPE, 0, false, 0); ExtPubKey accountExtPubKey = HdOperations.GetExtendedPublicKey(privateKey, extendedKey.ChainCode, accountHdPath); var subjectPubKey = HdOperations.GeneratePublicKey(accountExtPubKey.ToString(this.Network), 0, false, this.Network); var subjectPrivKey = HdOperations.GetExtendedPrivateKey(privateKey, extendedKey.ChainCode, path, this.Network); Assert.Equal(subjectPubKey.ScriptPubKey, subjectPrivKey.PrivateKey.PubKey.ScriptPubKey); }