mirror of
https://github.com/dashpay/dash.git
synced 2024-12-29 05:49:11 +01:00
1b1badff8f
e5485e8e4be7f2ee0671f58c3dcce35c68ba0ee0 test, bench: make prevector and checkqueue swap member functions noexcept (Jon Atack) abc1ee509025d92db5311c3f5df3b61c09cad24f validation: make CScriptCheck and prevector swap member functions noexcept (Jon Atack) Pull request description: along with those seen elsewhere in the codebase (prevector and checkqueue units/fuzz/bench). A swap must not fail; when a class has a swap member function, it should be declared noexcept. https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#c84-a-swap-function-must-not-fail ACKs for top commit: pk-b2: ACKe5485e8e4b
w0xlt: ACKe5485e8e4b
Tree-SHA512: c82359d5e13f9262ce45efdae9baf71e41ed26568e0aff620e2bfb0ab37a62b6d56ae9340a28a0332c902cc1fa87da3fb72d6f6d6f53a8b7e695a5011f71f7f1
146 lines
4.1 KiB
C++
146 lines
4.1 KiB
C++
// Copyright (c) 2014-2022 The Dash Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
#ifndef BITCOIN_HDCHAIN_H
|
|
#define BITCOIN_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;
|
|
|
|
void Debug(const std::string& strName) 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_HDCHAIN_H
|