6 #ifndef PIVX_EVO_DETERMINISTICMNS_H
7 #define PIVX_EVO_DETERMINISTICMNS_H
21 #include <immer/map.hpp>
22 #include <immer/map_transient.hpp>
24 #include <unordered_map>
64 template <
typename Stream>
76 READWRITE(obj.confirmedHashWithProRegTxHash);
134 #define DMN_STATE_DIFF_ALL_FIELDS \
135 DMN_STATE_DIFF_LINE(nRegisteredHeight) \
136 DMN_STATE_DIFF_LINE(nLastPaidHeight) \
137 DMN_STATE_DIFF_LINE(nPoSePenalty) \
138 DMN_STATE_DIFF_LINE(nPoSeRevivedHeight) \
139 DMN_STATE_DIFF_LINE(nPoSeBanHeight) \
140 DMN_STATE_DIFF_LINE(nRevocationReason) \
141 DMN_STATE_DIFF_LINE(confirmedHash) \
142 DMN_STATE_DIFF_LINE(confirmedHashWithProRegTxHash) \
143 DMN_STATE_DIFF_LINE(keyIDOwner) \
144 DMN_STATE_DIFF_LINE(pubKeyOperator) \
145 DMN_STATE_DIFF_LINE(keyIDVoting) \
146 DMN_STATE_DIFF_LINE(addr) \
147 DMN_STATE_DIFF_LINE(scriptPayout) \
148 DMN_STATE_DIFF_LINE(scriptOperatorPayout)
159 #define DMN_STATE_DIFF_LINE(f) if (a.f != b.f) { state.f = b.f; fields |= Field_##f; }
161 #undef DMN_STATE_DIFF_LINE
167 #define DMN_STATE_DIFF_LINE(f) if (obj.fields & Field_##f) READWRITE(obj.state.f);
169 #undef DMN_STATE_DIFF_LINE
174 #define DMN_STATE_DIFF_LINE(f) if (fields & Field_##f) target.f = state.f;
176 #undef DMN_STATE_DIFF_LINE
190 assert(_internalId != std::numeric_limits<uint64_t>::max());
195 assert(_internalId != std::numeric_limits<uint64_t>::max());
199 template <
typename Stream>
231 template <
typename Stream,
typename K,
typename T,
typename Hash,
typename Equal>
235 for (
typename immer::map<K, T, Hash, Equal>::const_iterator mi = m.begin(); mi != m.end(); ++mi)
239 template <
typename Stream,
typename K,
typename T,
typename Hash,
typename Equal>
242 m = immer::map<K, T, Hash, Equal>();
244 for (
unsigned int i = 0; i < nSize; i++) {
245 std::pair<K, T> item;
247 m = m.set(item.first, item.second);
253 template<
typename Stream,
typename K,
typename T,
typename Hash,
typename Equal>
259 template<
typename Stream,
typename K,
typename T,
typename Hash,
typename Equal>
268 typedef immer::map<uint256, CDeterministicMNCPtr>
MnMap;
292 template<
typename Stream>
300 for (
const auto& p :
mnMap) {
305 template<
typename Stream>
315 for (
size_t i = 0; i < cnt; i++) {
329 for (
const auto& p :
mnMap) {
330 if (!p.second->IsPoSeBanned()) {
337 template <
typename Callback>
340 for (
const auto& p :
mnMap) {
341 if (!onlyValid || !p.second->IsPoSeBanned()) {
390 std::vector<std::pair<arith_uint256, CDeterministicMNCPtr>>
CalculateScores(
const uint256& modifier)
const;
434 template <
typename T>
439 template <
typename T>
446 return GetMN(p->first);
450 template <
typename T>
453 static const T nullValue;
454 assert(v != nullValue);
458 assert(!oldEntry || oldEntry->first == dmn->proTxHash);
459 std::pair<uint256, uint32_t> newEntry(dmn->proTxHash, 1);
461 newEntry.second = oldEntry->second + 1;
465 template <
typename T>
468 static const T nullValue;
469 assert(oldValue != nullValue);
473 assert(p && p->first == dmn->proTxHash);
474 if (p->second == 1) {
480 template <
typename T>
483 if (oldValue == newValue) {
486 static const T nullValue;
488 if (oldValue != nullValue) {
492 if (newValue != nullValue) {
509 template<
typename Stream>
524 template<
typename Stream>
534 for (
size_t i = 0; i < tmp; i++) {
541 for (
size_t i = 0; i < tmp; i++) {
566 std::unordered_map<uint256, CDeterministicMNList, StaticSaltedHasher>
mnListsCache;
567 std::unordered_map<uint256, CDeterministicMNListDiff, StaticSaltedHasher>
mnListDiffsCache;
void Set(const BLSObject &_obj)
The block chain is a tree shaped structure starting with the genesis block at the root,...
CDeterministicMNStateCPtr pdmnState
uint64_t GetInternalId() const
void ToJson(UniValue &obj) const
CDeterministicMN(const CDeterministicMN &mn, uint64_t _internalId)
bool IsPoSeBanned() const
std::string ToString() const
CDeterministicMN(deserialize_type, Stream &s)
CDeterministicMN()=delete
COutPoint collateralOutpoint
CDeterministicMN(uint64_t _internalId)
SERIALIZE_METHODS(CDeterministicMN, obj)
std::set< uint64_t > removedMns
void Serialize(Stream &s) const
std::map< uint64_t, CDeterministicMNStateDiff > updatedMNs
std::vector< CDeterministicMNCPtr > addedMNs
void Unserialize(Stream &s)
void DeleteUniqueProperty(const CDeterministicMNCPtr &dmn, const T &oldValue)
immer::map< uint256, std::pair< uint256, uint32_t > > MnUniquePropertyMap
CDeterministicMNCPtr GetMNByOperatorKey(const CBLSPublicKey &pubKey)
CDeterministicMNCPtr GetValidMN(const uint256 &proTxHash) const
CDeterministicMNList ApplyDiff(const CBlockIndex *pindex, const CDeterministicMNListDiff &diff) const
CDeterministicMNCPtr GetMNByService(const CService &service) const
uint32_t nTotalRegisteredCount
void UpdateMN(const CDeterministicMNCPtr &oldDmn, const CDeterministicMNStateCPtr &pdmnState)
bool HasMN(const uint256 &proTxHash) const
uint32_t GetTotalRegisteredCount() const
void UpdateUniqueProperty(const CDeterministicMNCPtr &dmn, const T &oldValue, const T &newValue)
immer::map< uint256, CDeterministicMNCPtr > MnMap
immer::map< uint64_t, uint256 > MnInternalIdMap
bool HasMNByCollateral(const COutPoint &collateralOutpoint) const
void SetBlockHash(const uint256 &_blockHash)
void AddMN(const CDeterministicMNCPtr &dmn, bool fBumpTotalCount=true)
void AddUniqueProperty(const CDeterministicMNCPtr &dmn, const T &v)
std::vector< CDeterministicMNCPtr > CalculateQuorum(size_t maxSize, const uint256 &modifier) const
Calculate a quorum based on the modifier.
int CalcMaxPoSePenalty() const
Calculates the maximum penalty which is allowed at the height of this MN list.
void PoSeDecrease(const uint256 &proTxHash)
Decrease penalty score of MN by 1.
size_t GetValidMNsCount() const
int CalcPenalty(int percent) const
Returns a the given percentage from the max penalty for this MN list.
CDeterministicMNCPtr GetMNByInternalId(uint64_t internalId) const
CDeterministicMNCPtr GetMNPayee() const
bool HasUniqueProperty(const T &v) const
std::vector< std::pair< arith_uint256, CDeterministicMNCPtr > > CalculateScores(const uint256 &modifier) const
CDeterministicMNCPtr GetValidMNByCollateral(const COutPoint &collateralOutpoint) const
MnInternalIdMap mnInternalIdMap
const uint256 & GetBlockHash() const
void Serialize(Stream &s) const
CDeterministicMNListDiff BuildDiff(const CDeterministicMNList &to) const
void SetHeight(int _height)
void ForEachMN(bool onlyValid, Callback &&cb) const
void RemoveMN(const uint256 &proTxHash)
void Unserialize(Stream &s)
void PoSePunish(const uint256 &proTxHash, int penalty, bool debugLogs)
Punishes a MN for misbehavior.
CDeterministicMNCPtr GetMN(const uint256 &proTxHash) const
size_t GetAllMNsCount() const
CDeterministicMNCPtr GetMNByCollateral(const COutPoint &collateralOutpoint) const
CDeterministicMNList(const uint256 &_blockHash, int _height, uint32_t _totalRegisteredCount)
CDeterministicMNCPtr GetUniquePropertyMN(const T &v) const
bool HasValidMNByCollateral(const COutPoint &collateralOutpoint) const
std::vector< CDeterministicMNCPtr > GetProjectedMNPayees(unsigned int nCount) const
Calculates the projected MN payees for the next count blocks.
MnUniquePropertyMap mnUniquePropertyMap
CDeterministicMNList GetListForBlock(const CBlockIndex *pindex)
bool UndoBlock(const CBlock &block, const CBlockIndex *pindex)
static const int DISK_SNAPSHOTS
CDeterministicMNManager(CEvoDB &_evoDb)
bool LegacyMNObsolete() const
static const int LIST_DIFFS_CACHE_SIZE
void SetTipIndex(const CBlockIndex *pindex)
void CleanupCache(int nHeight)
static const int DISK_SNAPSHOT_PERIOD
bool ProcessBlock(const CBlock &block, const CBlockIndex *pindex, CValidationState &state, bool fJustCheck)
const CBlockIndex * tipIndex
bool IsDIP3Enforced() const
CDeterministicMNList GetListAtChainTip()
std::vector< CDeterministicMNCPtr > GetAllQuorumMembers(Consensus::LLMQType llmqType, const CBlockIndex *pindexQuorum)
void DecreasePoSePenalties(CDeterministicMNList &mnList)
std::unordered_map< uint256, CDeterministicMNListDiff, StaticSaltedHasher > mnListDiffsCache
bool BuildNewListFromBlock(const CBlock &block, const CBlockIndex *pindexPrev, CValidationState &state, CDeterministicMNList &mnListRet, bool debugLogs)
std::unordered_map< uint256, CDeterministicMNList, StaticSaltedHasher > mnListsCache
void HandleQuorumCommitment(llmq::CFinalCommitment &qc, const CBlockIndex *pindexQuorum, CDeterministicMNList &mnList, bool debugLogs)
@ Field_confirmedHashWithProRegTxHash
@ Field_nRegisteredHeight
@ Field_nPoSeRevivedHeight
@ Field_nRevocationReason
@ Field_scriptOperatorPayout
CDeterministicMNStateDiff(const CDeterministicMNState &a, const CDeterministicMNState &b)
void ApplyToState(CDeterministicMNState &target) const
CDeterministicMNStateDiff()
SERIALIZE_METHODS(CDeterministicMNStateDiff, obj)
CDeterministicMNState state
void BanIfNotBanned(int height)
void UpdateConfirmedHash(const uint256 &_proTxHash, const uint256 &_confirmedHash)
void ResetOperatorFields()
CBLSLazyPublicKey pubKeyOperator
CScript scriptOperatorPayout
uint256 confirmedHashWithProRegTxHash
std::string ToString() const
CDeterministicMNState(const ProRegPL &pl)
void ToJson(UniValue &obj) const
SERIALIZE_METHODS(CDeterministicMNState, obj)
uint16_t nRevocationReason
CDeterministicMNState(deserialize_type, Stream &s)
A reference to a CKey: the Hash160 of its serialized public key.
An outpoint - a combination of a transaction hash and an index n into its vout.
A hasher class for SHA-256.
void Finalize(unsigned char hash[OUTPUT_SIZE])
CSHA256 & Write(const unsigned char *data, size_t len)
Serialized script, used inside transaction inputs and outputs.
A combination of a network address (CNetAddr) and a (TCP) port.
Capture information about block/transaction validation.
CScript scriptOperatorPayout
CBLSPublicKey pubKeyOperator
unsigned int size() const
std::shared_ptr< const CDeterministicMNState > CDeterministicMNStateCPtr
void SerReadWrite(Stream &s, const immer::map< K, T, Hash, Equal > &m, CSerActionSerialize ser_action)
std::shared_ptr< CDeterministicMNState > CDeterministicMNStatePtr
#define DMN_STATE_DIFF_ALL_FIELDS
void SerializeImmerMap(Stream &os, const immer::map< K, T, Hash, Equal > &m)
std::unique_ptr< CDeterministicMNManager > deterministicMNManager
void UnserializeImmerMap(Stream &is, immer::map< K, T, Hash, Equal > &m)
std::shared_ptr< const CDeterministicMN > CDeterministicMNCPtr
uint256 SerializeHash(const T &obj, int nType=SER_GETHASH, int nVersion=PROTOCOL_VERSION)
Compute the 256-bit hash of an object's serialization.
#define T(expected, seed, data)
constexpr deserialize_type deserialize
void Serialize(Stream &s, char a)
void Unserialize(Stream &s, char &a)
uint64_t ReadCompactSize(Stream &is, bool range_check=true)
Decode a CompactSize-encoded variable-length integer.
void WriteCompactSize(CSizeComputer &os, uint64_t nSize)
Support for SERIALIZE_METHODS and READWRITE macro.
Dummy data type to identify deserializing constructors.