forked from dashpay/dash
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhdchain.h
143 lines (115 loc) · 4.07 KB
/
hdchain.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// Copyright (c) 2014-2024 The Dash Core developers
// Distributed under the MIT software license, see the accompanying
#ifndef BITCOIN_WALLET_HDCHAIN_H
#define BITCOIN_WALLET_HDCHAIN_H
#include <key.h>
#include <script/keyorigin.h>
#include <sync.h>
/* hd account data model */
class CHDAccount
{
public:
uint32_t nExternalChainCounter;
uint32_t nInternalChainCounter;
CHDAccount() : nExternalChainCounter(0), nInternalChainCounter(0) {}
SERIALIZE_METHODS(CHDAccount, obj)
{
READWRITE(obj.nExternalChainCounter, obj.nInternalChainCounter);
}
};
/* simple HD chain data model */
class CHDChain
{
private:
mutable RecursiveMutex cs;
static const int CURRENT_VERSION = 1;
int nVersion GUARDED_BY(cs) {CURRENT_VERSION};
uint256 id GUARDED_BY(cs);
bool fCrypted GUARDED_BY(cs) {false};
SecureVector vchSeed GUARDED_BY(cs);
SecureVector vchMnemonic GUARDED_BY(cs);
SecureVector vchMnemonicPassphrase GUARDED_BY(cs);
std::map<uint32_t, CHDAccount> GUARDED_BY(cs) mapAccounts;
public:
/** Default for -mnemonicbits */
static constexpr int DEFAULT_MNEMONIC_BITS = 128; // 128 bits == 12 words
CHDChain() = default;
CHDChain(const CHDChain& other) :
nVersion(other.nVersion),
id(other.id),
fCrypted(other.fCrypted),
vchSeed(other.vchSeed),
vchMnemonic(other.vchMnemonic),
vchMnemonicPassphrase(other.vchMnemonicPassphrase),
mapAccounts(other.mapAccounts)
{}
SERIALIZE_METHODS(CHDChain, obj)
{
LOCK(obj.cs);
READWRITE(
obj.nVersion,
obj.id,
obj.fCrypted,
obj.vchSeed,
obj.vchMnemonic,
obj.vchMnemonicPassphrase,
obj.mapAccounts
);
}
void swap(CHDChain& first, CHDChain& second) noexcept
{
// enable ADL (not necessary in our case, but good practice)
using std::swap;
// by swapping the members of two classes,
// the two classes are effectively swapped
LOCK2(first.cs, second.cs);
swap(first.nVersion, second.nVersion);
swap(first.id, second.id);
swap(first.fCrypted, second.fCrypted);
swap(first.vchSeed, second.vchSeed);
swap(first.vchMnemonic, second.vchMnemonic);
swap(first.vchMnemonicPassphrase, second.vchMnemonicPassphrase);
swap(first.mapAccounts, second.mapAccounts);
}
CHDChain& operator=(CHDChain from)
{
swap(*this, from);
return *this;
}
bool SetNull();
bool IsNull() const;
void SetCrypted(bool fCryptedIn);
bool IsCrypted() const;
bool SetMnemonic(const SecureVector& vchMnemonic, const SecureVector& vchMnemonicPassphrase, bool fUpdateID);
bool SetMnemonic(const SecureString& ssMnemonic, const SecureString& ssMnemonicPassphrase, bool fUpdateID);
bool GetMnemonic(SecureVector& vchMnemonicRet, SecureVector& vchMnemonicPassphraseRet) const;
bool GetMnemonic(SecureString& ssMnemonicRet, SecureString& ssMnemonicPassphraseRet) const;
bool SetSeed(const SecureVector& vchSeedIn, bool fUpdateID);
SecureVector GetSeed() const;
uint256 GetID() const { LOCK(cs); return id; }
uint256 GetSeedHash();
void DeriveChildExtKey(uint32_t nAccountIndex, bool fInternal, uint32_t nChildIndex, CExtKey& extKeyRet, KeyOriginInfo& key_origin);
void AddAccount();
bool GetAccount(uint32_t nAccountIndex, CHDAccount& hdAccountRet);
bool SetAccount(uint32_t nAccountIndex, const CHDAccount& hdAccount);
size_t CountAccounts();
};
/* hd pubkey data model */
class CHDPubKey
{
private:
static const int CURRENT_VERSION = 1;
int nVersion{CHDPubKey::CURRENT_VERSION};
public:
CExtPubKey extPubKey{};
uint256 hdchainID;
uint32_t nAccountIndex{0};
uint32_t nChangeIndex{0};
CHDPubKey() = default;
SERIALIZE_METHODS(CHDPubKey, obj)
{
READWRITE(obj.nVersion, obj.extPubKey, obj.hdchainID, obj.nAccountIndex, obj.nChangeIndex);
}
std::string GetKeyPath() const;
};
#endif // BITCOIN_WALLET_HDCHAIN_H