From a527845e4ff46ba883e2b0997b5b9c2d1063bdb1 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Thu, 12 Jul 2018 12:01:10 +0300 Subject: [PATCH 001/400] Bump to 0.12.4.0 pre-release (#2167) --- configure.ac | 6 +++--- doc/Doxyfile | 2 +- src/clientversion.h | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/configure.ac b/configure.ac index fe7382891283..5687cc66fbab 100644 --- a/configure.ac +++ b/configure.ac @@ -2,9 +2,9 @@ dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N) AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 0) define(_CLIENT_VERSION_MINOR, 12) -define(_CLIENT_VERSION_REVISION, 3) -define(_CLIENT_VERSION_BUILD, 2) -define(_CLIENT_VERSION_IS_RELEASE, true) +define(_CLIENT_VERSION_REVISION, 4) +define(_CLIENT_VERSION_BUILD, 0) +define(_CLIENT_VERSION_IS_RELEASE, false) define(_COPYRIGHT_YEAR, 2018) define(_COPYRIGHT_HOLDERS,[The %s developers]) define(_COPYRIGHT_HOLDERS_SUBSTITUTION,[[Dash Core]]) diff --git a/doc/Doxyfile b/doc/Doxyfile index 3dc283de4429..27caefebda08 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -41,7 +41,7 @@ PROJECT_NAME = "Dash Core" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 0.12.3.2 +PROJECT_NUMBER = 0.12.4.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/src/clientversion.h b/src/clientversion.h index 0a890f9e439b..6150c700ab81 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -16,11 +16,11 @@ //! These need to be macros, as clientversion.cpp's and dash*-res.rc's voodoo requires it #define CLIENT_VERSION_MAJOR 0 #define CLIENT_VERSION_MINOR 12 -#define CLIENT_VERSION_REVISION 3 -#define CLIENT_VERSION_BUILD 2 +#define CLIENT_VERSION_REVISION 4 +#define CLIENT_VERSION_BUILD 0 //! Set to true for release, false for prerelease or test build -#define CLIENT_VERSION_IS_RELEASE true +#define CLIENT_VERSION_IS_RELEASE false /** * Copyright year (2009-this) From 2c0d4c9d777f3abc05e5f280b7eb0ba18a55f0f3 Mon Sep 17 00:00:00 2001 From: gladcow Date: Thu, 12 Jul 2018 12:01:48 +0300 Subject: [PATCH 002/400] Save/load InstantSend cache (#2051) * CTxLockCandidate serialization * COutPointLock serialization * CInstantSend serialization * Read/write instantsend.dat file * Read\write InstantSend cache only if InstantSend is enabled --- src/init.cpp | 15 ++++++++++++ src/instantx.cpp | 18 +++++++++++++- src/instantx.h | 62 ++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 92 insertions(+), 3 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index e60cd794e085..585a26161e89 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -251,6 +251,11 @@ void PrepareShutdown() flatdb3.Dump(governance); CFlatDB flatdb4("netfulfilled.dat", "magicFulfilledCache"); flatdb4.Dump(netfulfilledman); + if(fEnableInstantSend) + { + CFlatDB flatdb5("instantsend.dat", "magicInstantSendCache"); + flatdb5.Dump(instantsend); + } } UnregisterNodeSignals(GetNodeSignals()); @@ -1914,6 +1919,16 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler) if(!flatdb4.Load(netfulfilledman)) { return InitError(_("Failed to load fulfilled requests cache from") + "\n" + (pathDB / strDBName).string()); } + + if(fEnableInstantSend) + { + strDBName = "instantsend.dat"; + uiInterface.InitMessage(_("Loading InstantSend data cache...")); + CFlatDB flatdb5(strDBName, "magicInstantSendCache"); + if(!flatdb5.Load(instantsend)) { + return InitError(_("Failed to load InstantSend data cache from") + "\n" + (pathDB / strDBName).string()); + } + } } diff --git a/src/instantx.cpp b/src/instantx.cpp index acccc7ea4c50..e41a683c6983 100644 --- a/src/instantx.cpp +++ b/src/instantx.cpp @@ -37,6 +37,7 @@ int nInstantSendDepth = DEFAULT_INSTANTSEND_DEPTH; int nCompleteTXLocks; CInstantSend instantsend; +const std::string CInstantSend::SERIALIZATION_VERSION_STRING = "CInstantSend-Version-1"; // Transaction Locks // @@ -797,6 +798,21 @@ bool CInstantSend::IsInstantSendReadyToLock(const uint256& txHash) return it != mapTxLockCandidates.end() && it->second.IsAllOutPointsReady(); } +void CInstantSend::Clear() +{ + LOCK(cs_instantsend); + + mapLockRequestAccepted.clear(); + mapLockRequestRejected.clear(); + mapTxLockVotes.clear(); + mapTxLockVotesOrphan.clear(); + mapTxLockCandidates.clear(); + mapVotedOutpoints.clear(); + mapLockedOutpoints.clear(); + mapMasternodeOrphanVotes.clear(); + nCachedBlockHeight = 0; +} + bool CInstantSend::IsLockedInstantSendTransaction(const uint256& txHash) { if(!fEnableInstantSend || GetfLargeWorkForkFound() || GetfLargeWorkInvalidChainFound() || @@ -928,7 +944,7 @@ void CInstantSend::SyncTransaction(const CTransaction& tx, const CBlockIndex *pi } } -std::string CInstantSend::ToString() +std::string CInstantSend::ToString() const { LOCK(cs_instantsend); return strprintf("Lock Candidates: %llu, Votes %llu", mapTxLockCandidates.size(), mapTxLockVotes.size()); diff --git a/src/instantx.h b/src/instantx.h index ac2c79749fce..1c95a03f9221 100644 --- a/src/instantx.h +++ b/src/instantx.h @@ -53,6 +53,8 @@ extern int nCompleteTXLocks; class CInstantSend { private: + static const std::string SERIALIZATION_VERSION_STRING; + // Keep track of current block height int nCachedBlockHeight; @@ -91,7 +93,37 @@ class CInstantSend bool IsInstantSendReadyToLock(const uint256 &txHash); public: - CCriticalSection cs_instantsend; + mutable CCriticalSection cs_instantsend; + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action) { + std::string strVersion; + if(ser_action.ForRead()) { + READWRITE(strVersion); + } + else { + strVersion = SERIALIZATION_VERSION_STRING; + READWRITE(strVersion); + } + + READWRITE(mapLockRequestAccepted); + READWRITE(mapLockRequestRejected); + READWRITE(mapTxLockVotes); + READWRITE(mapTxLockVotesOrphan); + READWRITE(mapTxLockCandidates); + READWRITE(mapVotedOutpoints); + READWRITE(mapLockedOutpoints); + READWRITE(mapMasternodeOrphanVotes); + READWRITE(nCachedBlockHeight); + + if(ser_action.ForRead() && (strVersion != SERIALIZATION_VERSION_STRING)) { + Clear(); + } + } + + void Clear(); void ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStream& vRecv, CConnman& connman); @@ -126,7 +158,7 @@ class CInstantSend void UpdatedBlockTip(const CBlockIndex *pindex); void SyncTransaction(const CTransaction& tx, const CBlockIndex *pindex, int posInBlock); - std::string ToString(); + std::string ToString() const; }; /** @@ -264,6 +296,8 @@ class COutPointLock static const int SIGNATURES_REQUIRED = 6; static const int SIGNATURES_TOTAL = 10; + COutPointLock() {} + COutPointLock(const COutPoint& outpointIn) : outpoint(outpointIn), mapMasternodeVotes() @@ -271,6 +305,15 @@ class COutPointLock COutPoint GetOutpoint() const { return outpoint; } + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action) { + READWRITE(outpoint); + READWRITE(mapMasternodeVotes); + READWRITE(fAttacked); + } + bool AddVote(const CTxLockVote& vote); std::vector GetVotes() const; bool HasMasternodeVoted(const COutPoint& outpointMasternodeIn) const; @@ -291,6 +334,11 @@ class CTxLockCandidate int64_t nTimeCreated; public: + CTxLockCandidate() : + nConfirmedHeight(-1), + nTimeCreated(GetTime()) + {} + CTxLockCandidate(const CTxLockRequest& txLockRequestIn) : nConfirmedHeight(-1), nTimeCreated(GetTime()), @@ -301,6 +349,16 @@ class CTxLockCandidate CTxLockRequest txLockRequest; std::map mapOutPointLocks; + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action) { + READWRITE(txLockRequest); + READWRITE(mapOutPointLocks); + READWRITE(nTimeCreated); + READWRITE(nConfirmedHeight); + } + uint256 GetHash() const { return txLockRequest.GetHash(); } void AddOutPointLock(const COutPoint& outpoint); From 8ee9333bc2b0e02e98c163076c0f8743b3e583b5 Mon Sep 17 00:00:00 2001 From: Nathan Marley Date: Thu, 12 Jul 2018 16:02:20 +0700 Subject: [PATCH 003/400] remove boost dependency from Dash-specific code (#2072) * replace boost casts in dash-specific code Specifically for spork.cpp : this should be temporary until all spork sigs are based on hash and not string serialization format, after which I expect the old signatures (else branch) should go away altogether. But I still think it's worth it to get pieces of the boost dependency removed, and this is an easy win, and could be merged now or in a patch release w/o issue. * replace boost::shared_ptr w/std::shared_ptr --- src/governance-classes.h | 4 +--- src/governance-object.cpp | 5 +++-- src/governance-vote.cpp | 16 +++++++--------- src/governance-vote.h | 2 -- src/masternode-payments.cpp | 8 ++++---- src/masternode.cpp | 20 ++++++++++---------- src/privatesend.cpp | 18 +++++++++--------- src/spork.cpp | 6 +++--- 8 files changed, 37 insertions(+), 42 deletions(-) diff --git a/src/governance-classes.h b/src/governance-classes.h index b75454675917..bb6aa0d45255 100644 --- a/src/governance-classes.h +++ b/src/governance-classes.h @@ -12,8 +12,6 @@ #include "script/standard.h" #include "util.h" -#include - class CSuperblock; class CGovernanceTrigger; class CGovernanceTriggerManager; @@ -22,7 +20,7 @@ class CSuperblockManager; static const int TRIGGER_UNKNOWN = -1; static const int TRIGGER_SUPERBLOCK = 1000; -typedef boost::shared_ptr CSuperblock_sptr; +typedef std::shared_ptr CSuperblock_sptr; // DECLARE GLOBAL VARIABLES FOR GOVERNANCE CLASSES extern CGovernanceTriggerManager triggerman; diff --git a/src/governance-object.cpp b/src/governance-object.cpp index 8ef5bf56dd33..890c1c14db8f 100644 --- a/src/governance-object.cpp +++ b/src/governance-object.cpp @@ -15,6 +15,7 @@ #include "util.h" #include +#include CGovernanceObject::CGovernanceObject(): cs(), @@ -225,8 +226,8 @@ std::string CGovernanceObject::GetSignatureMessage() const { LOCK(cs); std::string strMessage = nHashParent.ToString() + "|" + - boost::lexical_cast(nRevision) + "|" + - boost::lexical_cast(nTime) + "|" + + std::to_string(nRevision) + "|" + + std::to_string(nTime) + "|" + GetDataAsHexString() + "|" + masternodeOutpoint.ToStringShort() + "|" + nCollateralHash.ToString(); diff --git a/src/governance-vote.cpp b/src/governance-vote.cpp index 815497a978de..f20760fcb904 100644 --- a/src/governance-vote.cpp +++ b/src/governance-vote.cpp @@ -9,8 +9,6 @@ #include "messagesigner.h" #include "util.h" -#include - std::string CGovernanceVoting::ConvertOutcomeToString(vote_outcome_enum_t nOutcome) { switch(nOutcome) @@ -173,7 +171,7 @@ bool CGovernanceVote::Sign(const CKey& keyMasternode, const CPubKey& pubKeyMaste } else { std::string strMessage = masternodeOutpoint.ToStringShort() + "|" + nParentHash.ToString() + "|" + - boost::lexical_cast(nVoteSignal) + "|" + boost::lexical_cast(nVoteOutcome) + "|" + boost::lexical_cast(nTime); + std::to_string(nVoteSignal) + "|" + std::to_string(nVoteOutcome) + "|" + std::to_string(nTime); if(!CMessageSigner::SignMessage(strMessage, vchSig, keyMasternode)) { LogPrintf("CGovernanceVote::Sign -- SignMessage() failed\n"); @@ -199,9 +197,9 @@ bool CGovernanceVote::CheckSignature(const CPubKey& pubKeyMasternode) const if (!CHashSigner::VerifyHash(hash, pubKeyMasternode, vchSig, strError)) { // could be a signature in old format std::string strMessage = masternodeOutpoint.ToStringShort() + "|" + nParentHash.ToString() + "|" + - boost::lexical_cast(nVoteSignal) + "|" + - boost::lexical_cast(nVoteOutcome) + "|" + - boost::lexical_cast(nTime); + std::to_string(nVoteSignal) + "|" + + std::to_string(nVoteOutcome) + "|" + + std::to_string(nTime); if(!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { // nope, not in old format either @@ -211,9 +209,9 @@ bool CGovernanceVote::CheckSignature(const CPubKey& pubKeyMasternode) const } } else { std::string strMessage = masternodeOutpoint.ToStringShort() + "|" + nParentHash.ToString() + "|" + - boost::lexical_cast(nVoteSignal) + "|" + - boost::lexical_cast(nVoteOutcome) + "|" + - boost::lexical_cast(nTime); + std::to_string(nVoteSignal) + "|" + + std::to_string(nVoteOutcome) + "|" + + std::to_string(nTime); if(!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { LogPrint("gobject", "CGovernanceVote::IsValid -- VerifyMessage() failed, error: %s\n", strError); diff --git a/src/governance-vote.h b/src/governance-vote.h index 19909e49c003..3b851cad2222 100644 --- a/src/governance-vote.h +++ b/src/governance-vote.h @@ -8,8 +8,6 @@ #include "key.h" #include "primitives/transaction.h" -#include - class CGovernanceVote; class CConnman; diff --git a/src/masternode-payments.cpp b/src/masternode-payments.cpp index 73c97c24c594..df8e78982f2c 100644 --- a/src/masternode-payments.cpp +++ b/src/masternode-payments.cpp @@ -14,7 +14,7 @@ #include "spork.h" #include "util.h" -#include +#include /** Object for who's going to get paid on which blocks */ CMasternodePayments mnpayments; @@ -455,7 +455,7 @@ bool CMasternodePaymentVote::Sign() } } else { std::string strMessage = masternodeOutpoint.ToStringShort() + - boost::lexical_cast(nBlockHeight) + + std::to_string(nBlockHeight) + ScriptToAsmStr(payee); if(!CMessageSigner::SignMessage(strMessage, vchSig, activeMasternode.keyMasternode)) { @@ -905,7 +905,7 @@ bool CMasternodePaymentVote::CheckSignature(const CPubKey& pubKeyMasternode, int if (!CHashSigner::VerifyHash(hash, pubKeyMasternode, vchSig, strError)) { // could be a signature in old format std::string strMessage = masternodeOutpoint.ToStringShort() + - boost::lexical_cast(nBlockHeight) + + std::to_string(nBlockHeight) + ScriptToAsmStr(payee); if(!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { // nope, not in old format either @@ -921,7 +921,7 @@ bool CMasternodePaymentVote::CheckSignature(const CPubKey& pubKeyMasternode, int } } else { std::string strMessage = masternodeOutpoint.ToStringShort() + - boost::lexical_cast(nBlockHeight) + + std::to_string(nBlockHeight) + ScriptToAsmStr(payee); if (!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { diff --git a/src/masternode.cpp b/src/masternode.cpp index d1a7628e0e44..024a9aa90488 100644 --- a/src/masternode.cpp +++ b/src/masternode.cpp @@ -18,7 +18,7 @@ #include "wallet/wallet.h" #endif // ENABLE_WALLET -#include +#include CMasternode::CMasternode() : @@ -640,9 +640,9 @@ bool CMasternodeBroadcast::Sign(const CKey& keyCollateralAddress) return false; } } else { - std::string strMessage = addr.ToString(false) + boost::lexical_cast(sigTime) + + std::string strMessage = addr.ToString(false) + std::to_string(sigTime) + pubKeyCollateralAddress.GetID().ToString() + pubKeyMasternode.GetID().ToString() + - boost::lexical_cast(nProtocolVersion); + std::to_string(nProtocolVersion); if (!CMessageSigner::SignMessage(strMessage, vchSig, keyCollateralAddress)) { LogPrintf("CMasternodeBroadcast::Sign -- SignMessage() failed\n"); @@ -668,9 +668,9 @@ bool CMasternodeBroadcast::CheckSignature(int& nDos) const if (!CHashSigner::VerifyHash(hash, pubKeyCollateralAddress, vchSig, strError)) { // maybe it's in old format - std::string strMessage = addr.ToString(false) + boost::lexical_cast(sigTime) + + std::string strMessage = addr.ToString(false) + std::to_string(sigTime) + pubKeyCollateralAddress.GetID().ToString() + pubKeyMasternode.GetID().ToString() + - boost::lexical_cast(nProtocolVersion); + std::to_string(nProtocolVersion); if (!CMessageSigner::VerifyMessage(pubKeyCollateralAddress, vchSig, strMessage, strError)){ // nope, not in old format either @@ -680,9 +680,9 @@ bool CMasternodeBroadcast::CheckSignature(int& nDos) const } } } else { - std::string strMessage = addr.ToString(false) + boost::lexical_cast(sigTime) + + std::string strMessage = addr.ToString(false) + std::to_string(sigTime) + pubKeyCollateralAddress.GetID().ToString() + pubKeyMasternode.GetID().ToString() + - boost::lexical_cast(nProtocolVersion); + std::to_string(nProtocolVersion); if (!CMessageSigner::VerifyMessage(pubKeyCollateralAddress, vchSig, strMessage, strError)){ LogPrintf("CMasternodeBroadcast::CheckSignature -- Got bad Masternode announce signature, error: %s\n", strError); @@ -762,7 +762,7 @@ bool CMasternodePing::Sign(const CKey& keyMasternode, const CPubKey& pubKeyMaste } } else { std::string strMessage = CTxIn(masternodeOutpoint).ToString() + blockHash.ToString() + - boost::lexical_cast(sigTime); + std::to_string(sigTime); if (!CMessageSigner::SignMessage(strMessage, vchSig, keyMasternode)) { LogPrintf("CMasternodePing::Sign -- SignMessage() failed\n"); @@ -788,7 +788,7 @@ bool CMasternodePing::CheckSignature(const CPubKey& pubKeyMasternode, int &nDos) if (!CHashSigner::VerifyHash(hash, pubKeyMasternode, vchSig, strError)) { std::string strMessage = CTxIn(masternodeOutpoint).ToString() + blockHash.ToString() + - boost::lexical_cast(sigTime); + std::to_string(sigTime); if (!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { LogPrintf("CMasternodePing::CheckSignature -- Got bad Masternode ping signature, masternode=%s, error: %s\n", masternodeOutpoint.ToStringShort(), strError); @@ -798,7 +798,7 @@ bool CMasternodePing::CheckSignature(const CPubKey& pubKeyMasternode, int &nDos) } } else { std::string strMessage = CTxIn(masternodeOutpoint).ToString() + blockHash.ToString() + - boost::lexical_cast(sigTime); + std::to_string(sigTime); if (!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { LogPrintf("CMasternodePing::CheckSignature -- Got bad Masternode ping signature, masternode=%s, error: %s\n", masternodeOutpoint.ToStringShort(), strError); diff --git a/src/privatesend.cpp b/src/privatesend.cpp index ec16dead5d98..42852d49f826 100644 --- a/src/privatesend.cpp +++ b/src/privatesend.cpp @@ -19,7 +19,7 @@ #include "util.h" #include "utilmoneystr.h" -#include +#include bool CDarkSendEntry::AddScriptSig(const CTxIn& txin) { @@ -62,9 +62,9 @@ bool CDarksendQueue::Sign() } } else { std::string strMessage = CTxIn(masternodeOutpoint).ToString() + - boost::lexical_cast(nDenom) + - boost::lexical_cast(nTime) + - boost::lexical_cast(fReady); + std::to_string(nDenom) + + std::to_string(nTime) + + std::to_string(fReady); if(!CMessageSigner::SignMessage(strMessage, vchSig, activeMasternode.keyMasternode)) { LogPrintf("CDarksendQueue::Sign -- SignMessage() failed, %s\n", ToString()); @@ -94,9 +94,9 @@ bool CDarksendQueue::CheckSignature(const CPubKey& pubKeyMasternode) const } } else { std::string strMessage = CTxIn(masternodeOutpoint).ToString() + - boost::lexical_cast(nDenom) + - boost::lexical_cast(nTime) + - boost::lexical_cast(fReady); + std::to_string(nDenom) + + std::to_string(nTime) + + std::to_string(fReady); if(!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { LogPrintf("CDarksendQueue::CheckSignature -- Got bad Masternode queue signature: %s; error: %s\n", ToString(), strError); @@ -141,7 +141,7 @@ bool CDarksendBroadcastTx::Sign() return false; } } else { - std::string strMessage = tx->GetHash().ToString() + boost::lexical_cast(sigTime); + std::string strMessage = tx->GetHash().ToString() + std::to_string(sigTime); if(!CMessageSigner::SignMessage(strMessage, vchSig, activeMasternode.keyMasternode)) { LogPrintf("CDarksendBroadcastTx::Sign -- SignMessage() failed\n"); @@ -170,7 +170,7 @@ bool CDarksendBroadcastTx::CheckSignature(const CPubKey& pubKeyMasternode) const return false; } } else { - std::string strMessage = tx->GetHash().ToString() + boost::lexical_cast(sigTime); + std::string strMessage = tx->GetHash().ToString() + std::to_string(sigTime); if(!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { LogPrintf("CDarksendBroadcastTx::CheckSignature -- Got bad dstx signature, error: %s\n", strError); diff --git a/src/spork.cpp b/src/spork.cpp index c6b4e653e8a8..a00f6f7536c6 100644 --- a/src/spork.cpp +++ b/src/spork.cpp @@ -11,7 +11,7 @@ #include "net_processing.h" #include "netmessagemaker.h" -#include +#include CSporkManager sporkManager; @@ -262,7 +262,7 @@ bool CSporkMessage::Sign(const CKey& key) return false; } } else { - std::string strMessage = boost::lexical_cast(nSporkID) + boost::lexical_cast(nValue) + boost::lexical_cast(nTimeSigned); + std::string strMessage = std::to_string(nSporkID) + std::to_string(nValue) + std::to_string(nTimeSigned); if(!CMessageSigner::SignMessage(strMessage, vchSig, key)) { LogPrintf("CSporkMessage::Sign -- SignMessage() failed\n"); @@ -292,7 +292,7 @@ bool CSporkMessage::CheckSignature(const CKeyID& pubKeyId) const return false; } } else { - std::string strMessage = boost::lexical_cast(nSporkID) + boost::lexical_cast(nValue) + boost::lexical_cast(nTimeSigned); + std::string strMessage = std::to_string(nSporkID) + std::to_string(nValue) + std::to_string(nTimeSigned); if (!CMessageSigner::VerifyMessage(pubKeyId, vchSig, strMessage, strError)){ // Note: unlike for other messages we have to check for new format even with SPORK_6_NEW_SIGS From 43091a3efd1c6798b9ee34f97890adb66d775579 Mon Sep 17 00:00:00 2001 From: PaulieD Date: Thu, 12 Jul 2018 04:02:51 -0500 Subject: [PATCH 004/400] PrivateSend Enhancement: Up default round count to 4 and allow user to mix up to 16 rounds (#2128) * Allows a user to mix up to 16 rounds All codebase appears to accept up to 16 rounds, however this form was capped at 8; restricting users to 2-8 rounds. This commit allows a user to actually use up to 16 rounds in practice. This will greatly enhance the privacy of those very worried about their privacy, as well as possibly increasing liquidity and increasing the privacy of all users. * Up the default for PS mixing to 4 rounds. --- src/privatesend-client.h | 2 +- src/qt/forms/optionsdialog.ui | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/privatesend-client.h b/src/privatesend-client.h index 02b9d2be588c..0486a281bd0a 100644 --- a/src/privatesend-client.h +++ b/src/privatesend-client.h @@ -21,7 +21,7 @@ static const int MIN_PRIVATESEND_LIQUIDITY = 0; static const int MAX_PRIVATESEND_ROUNDS = 16; static const int MAX_PRIVATESEND_AMOUNT = MAX_MONEY / COIN; static const int MAX_PRIVATESEND_LIQUIDITY = 100; -static const int DEFAULT_PRIVATESEND_ROUNDS = 2; +static const int DEFAULT_PRIVATESEND_ROUNDS = 4; static const int DEFAULT_PRIVATESEND_AMOUNT = 1000; static const int DEFAULT_PRIVATESEND_LIQUIDITY = 0; diff --git a/src/qt/forms/optionsdialog.ui b/src/qt/forms/optionsdialog.ui index d4df3ba2fe0f..ff3351ec0f1e 100644 --- a/src/qt/forms/optionsdialog.ui +++ b/src/qt/forms/optionsdialog.ui @@ -224,7 +224,7 @@ 2 - 8 + 16 4 From 3c89983db6e983e57ac9f84a0cd6c49a5a7687a3 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Thu, 12 Jul 2018 12:03:26 +0300 Subject: [PATCH 005/400] Remove DarksendConfig (#2132) --- contrib/dash-qt.pro | 1 - src/Makefile.qt.include | 4 - src/qt/darksendconfig.cpp | 91 ---------------- src/qt/darksendconfig.h | 37 ------- src/qt/forms/darksendconfig.ui | 188 --------------------------------- src/qt/overviewpage.cpp | 10 -- 6 files changed, 331 deletions(-) delete mode 100644 src/qt/darksendconfig.cpp delete mode 100644 src/qt/darksendconfig.h delete mode 100644 src/qt/forms/darksendconfig.ui diff --git a/contrib/dash-qt.pro b/contrib/dash-qt.pro index 57a29cdea769..cde8c56930a8 100644 --- a/contrib/dash-qt.pro +++ b/contrib/dash-qt.pro @@ -3,7 +3,6 @@ FORMS += \ ../src/qt/forms/addressbookpage.ui \ ../src/qt/forms/askpassphrasedialog.ui \ ../src/qt/forms/coincontroldialog.ui \ - ../src/qt/forms/darksendconfig.ui \ ../src/qt/forms/debugwindow.ui \ ../src/qt/forms/editaddressdialog.ui \ ../src/qt/forms/helpmessagedialog.ui \ diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index c5c95fc614b0..c53c8e535366 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -31,7 +31,6 @@ QT_FORMS_UI = \ qt/forms/addressbookpage.ui \ qt/forms/askpassphrasedialog.ui \ qt/forms/coincontroldialog.ui \ - qt/forms/darksendconfig.ui \ qt/forms/editaddressdialog.ui \ qt/forms/helpmessagedialog.ui \ qt/forms/intro.ui \ @@ -62,7 +61,6 @@ QT_MOC_CPP = \ qt/moc_coincontroldialog.cpp \ qt/moc_coincontroltreewidget.cpp \ qt/moc_csvmodelwriter.cpp \ - qt/moc_darksendconfig.cpp \ qt/moc_editaddressdialog.cpp \ qt/moc_guiutil.cpp \ qt/moc_intro.cpp \ @@ -132,7 +130,6 @@ BITCOIN_QT_H = \ qt/coincontroldialog.h \ qt/coincontroltreewidget.h \ qt/csvmodelwriter.h \ - qt/darksendconfig.h \ qt/editaddressdialog.h \ qt/guiconstants.h \ qt/guiutil.h \ @@ -487,7 +484,6 @@ BITCOIN_QT_WALLET_CPP = \ qt/askpassphrasedialog.cpp \ qt/coincontroldialog.cpp \ qt/coincontroltreewidget.cpp \ - qt/darksendconfig.cpp \ qt/editaddressdialog.cpp \ qt/masternodelist.cpp \ qt/openuridialog.cpp \ diff --git a/src/qt/darksendconfig.cpp b/src/qt/darksendconfig.cpp deleted file mode 100644 index ceb7ec3f79ac..000000000000 --- a/src/qt/darksendconfig.cpp +++ /dev/null @@ -1,91 +0,0 @@ -#include "darksendconfig.h" -#include "ui_darksendconfig.h" - -#include "bitcoinunits.h" -#include "guiconstants.h" -#include "optionsmodel.h" -#include "privatesend-client.h" -#include "walletmodel.h" - -#include -#include -#include -#include - -DarksendConfig::DarksendConfig(QWidget *parent) : - QDialog(parent), - ui(new Ui::DarksendConfig), - model(0) -{ - ui->setupUi(this); - - connect(ui->buttonBasic, SIGNAL(clicked()), this, SLOT(clickBasic())); - connect(ui->buttonHigh, SIGNAL(clicked()), this, SLOT(clickHigh())); - connect(ui->buttonMax, SIGNAL(clicked()), this, SLOT(clickMax())); -} - -DarksendConfig::~DarksendConfig() -{ - delete ui; -} - -void DarksendConfig::setModel(WalletModel *model) -{ - this->model = model; -} - -void DarksendConfig::clickBasic() -{ - configure(true, 1000, 2); - - QString strAmount(BitcoinUnits::formatWithUnit( - model->getOptionsModel()->getDisplayUnit(), 1000 * COIN)); - QMessageBox::information(this, tr("PrivateSend Configuration"), - tr( - "PrivateSend was successfully set to basic (%1 and 2 rounds). You can change this at any time by opening Dash's configuration screen." - ).arg(strAmount) - ); - - close(); -} - -void DarksendConfig::clickHigh() -{ - configure(true, 1000, 8); - - QString strAmount(BitcoinUnits::formatWithUnit( - model->getOptionsModel()->getDisplayUnit(), 1000 * COIN)); - QMessageBox::information(this, tr("PrivateSend Configuration"), - tr( - "PrivateSend was successfully set to high (%1 and 8 rounds). You can change this at any time by opening Dash's configuration screen." - ).arg(strAmount) - ); - - close(); -} - -void DarksendConfig::clickMax() -{ - configure(true, 1000, 16); - - QString strAmount(BitcoinUnits::formatWithUnit( - model->getOptionsModel()->getDisplayUnit(), 1000 * COIN)); - QMessageBox::information(this, tr("PrivateSend Configuration"), - tr( - "PrivateSend was successfully set to maximum (%1 and 16 rounds). You can change this at any time by opening Dash's configuration screen." - ).arg(strAmount) - ); - - close(); -} - -void DarksendConfig::configure(bool enabled, int coins, int rounds) { - - QSettings settings; - - settings.setValue("nPrivateSendRounds", rounds); - settings.setValue("nPrivateSendAmount", coins); - - privateSendClient.nPrivateSendRounds = rounds; - privateSendClient.nPrivateSendAmount = coins; -} diff --git a/src/qt/darksendconfig.h b/src/qt/darksendconfig.h deleted file mode 100644 index a1e1a37c5ef6..000000000000 --- a/src/qt/darksendconfig.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef DARKSENDCONFIG_H -#define DARKSENDCONFIG_H - -#include - -namespace Ui { - class DarksendConfig; -} -class WalletModel; - -/** Multifunctional dialog to ask for passphrases. Used for encryption, unlocking, and changing the passphrase. - */ -class DarksendConfig : public QDialog -{ - Q_OBJECT - -public: - - DarksendConfig(QWidget *parent = 0); - ~DarksendConfig(); - - void setModel(WalletModel *model); - - -private: - Ui::DarksendConfig *ui; - WalletModel *model; - void configure(bool enabled, int coins, int rounds); - -private Q_SLOTS: - - void clickBasic(); - void clickHigh(); - void clickMax(); -}; - -#endif // DARKSENDCONFIG_H diff --git a/src/qt/forms/darksendconfig.ui b/src/qt/forms/darksendconfig.ui deleted file mode 100644 index 4ac909fbf6e7..000000000000 --- a/src/qt/forms/darksendconfig.ui +++ /dev/null @@ -1,188 +0,0 @@ - - - DarksendConfig - - - - 0 - 0 - 630 - 307 - - - - Configure PrivateSend - - - - - 20 - 70 - 151 - 27 - - - - Basic Privacy - - - - - - 20 - 140 - 151 - 27 - - - - High Privacy - - - - - - 20 - 210 - 151 - 27 - - - - Maximum Privacy - - - - - - 30 - 20 - 571 - 31 - - - - Please select a privacy level. - - - - - - 190 - 70 - 421 - 21 - - - - Use 2 separate masternodes to mix funds up to 1000 DASH - - - - - - 190 - 140 - 411 - 21 - - - - Use 8 separate masternodes to mix funds up to 1000 DASH - - - - - - 190 - 210 - 421 - 21 - - - - Use 16 separate masternodes - - - - - - 40 - 100 - 561 - 21 - - - - This option is the quickest and will cost about ~0.025 DASH to anonymize 1000 DASH - - - - - - 40 - 170 - 561 - 21 - - - - This option is moderately fast and will cost about 0.05 DASH to anonymize 1000 DASH - - - - - - 40 - 240 - 561 - 21 - - - - This is the slowest and most secure option. Using maximum anonymity will cost - - - - - - 40 - 260 - 561 - 21 - - - - 0.1 DASH per 1000 DASH you anonymize. - - - - - - 10 - 120 - 601 - 16 - - - - Qt::Horizontal - - - - - - 10 - 190 - 601 - 16 - - - - Qt::Horizontal - - - - - - diff --git a/src/qt/overviewpage.cpp b/src/qt/overviewpage.cpp index 806ff34decd8..1ea7c5d242e8 100644 --- a/src/qt/overviewpage.cpp +++ b/src/qt/overviewpage.cpp @@ -19,7 +19,6 @@ #include "walletmodel.h" #include "instantx.h" -#include "darksendconfig.h" #include "masternode-sync.h" #include "privatesend-client.h" @@ -646,15 +645,6 @@ void OverviewPage::togglePrivateSend(){ privateSendClient.UnlockCoins(); } else { ui->togglePrivateSend->setText(tr("Stop Mixing")); - - /* show darksend configuration if client has defaults set */ - - if(privateSendClient.nPrivateSendAmount == 0){ - DarksendConfig dlg(this); - dlg.setModel(walletModel); - dlg.exec(); - } - } } From 6da2837bdd033814856ed6fc2cb13a98d704b21b Mon Sep 17 00:00:00 2001 From: gladcow Date: Thu, 12 Jul 2018 12:04:42 +0300 Subject: [PATCH 006/400] InstantSend Integration tests (#2141) * adjust `AddLocal` method only in regtest mode * Create Masternodes in regtest * sentinelping call for masternodes * set externalip option for masternodes in regtest * fix MNB relay during masternodes creation * fix node_count naming * instantsend doublespend * decrease node restarts * prevent spending masternode collaterals * move long test to the test list start * remove InstantSend spork sending * remove spork-specific code * fix checking double spend rejection --- qa/pull-tester/rpc-tests.py | 1 + qa/rpc-tests/p2p-instantsend.py | 192 ++++++++++++++++++++++++++++ qa/rpc-tests/test_framework/util.py | 2 +- src/chainparams.cpp | 3 + src/chainparams.h | 3 + src/masternodeman.cpp | 4 +- src/net.cpp | 2 +- 7 files changed, 204 insertions(+), 3 deletions(-) create mode 100755 qa/rpc-tests/p2p-instantsend.py diff --git a/qa/pull-tester/rpc-tests.py b/qa/pull-tester/rpc-tests.py index 7690ee5511e9..3d2916d0d368 100755 --- a/qa/pull-tester/rpc-tests.py +++ b/qa/pull-tester/rpc-tests.py @@ -116,6 +116,7 @@ 'fundrawtransaction.py', 'fundrawtransaction-hd.py', # vv Tests less than 2m vv + 'p2p-instantsend.py', 'wallet.py', 'wallet-accounts.py', 'wallet-dump.py', diff --git a/qa/rpc-tests/p2p-instantsend.py b/qa/rpc-tests/p2p-instantsend.py new file mode 100755 index 000000000000..33aaa755b6b0 --- /dev/null +++ b/qa/rpc-tests/p2p-instantsend.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python3 +# Copyright (c) 2018 The Dash Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +from test_framework.mininode import * +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import * +from time import * + +''' +InstantSendTest -- test InstantSend functionality (prevent doublespend for unconfirmed transactions) +''' + +MASTERNODE_COLLATERAL = 1000 + + +class MasternodeInfo: + def __init__(self, key, collateral_id, collateral_out): + self.key = key + self.collateral_id = collateral_id + self.collateral_out = collateral_out + + +class InstantSendTest(BitcoinTestFramework): + def __init__(self): + super().__init__() + self.mn_count = 10 + self.num_nodes = self.mn_count + 4 + self.mninfo = [] + self.setup_clean_chain = True + self.is_network_split = False + # set sender, receiver, isolated nodes + self.isolated_idx = self.num_nodes - 1 + self.receiver_idx = self.num_nodes - 2 + self.sender_idx = self.num_nodes - 3 + + def create_simple_node(self): + idx = len(self.nodes) + self.nodes.append(start_node(idx, self.options.tmpdir, + ["-debug"])) + for i in range(0, idx): + connect_nodes(self.nodes[i], idx) + + def get_mnconf_file(self): + return os.path.join(self.options.tmpdir, "node0/regtest/masternode.conf") + + def prepare_masternodes(self): + for idx in range(0, self.mn_count): + key = self.nodes[0].masternode("genkey") + address = self.nodes[0].getnewaddress() + txid = self.nodes[0].sendtoaddress(address, MASTERNODE_COLLATERAL) + txrow = self.nodes[0].getrawtransaction(txid, True) + collateral_vout = 0 + for vout_idx in range(0, len(txrow["vout"])): + vout = txrow["vout"][vout_idx] + if vout["value"] == MASTERNODE_COLLATERAL: + collateral_vout = vout_idx + self.nodes[0].lockunspent(False, + [{"txid": txid, "vout": collateral_vout}]) + self.mninfo.append(MasternodeInfo(key, txid, collateral_vout)) + + def write_mn_config(self): + conf = self.get_mnconf_file() + f = open(conf, 'a') + for idx in range(0, self.mn_count): + f.write("mn%d 127.0.0.1:%d %s %s %d\n" % (idx + 1, p2p_port(idx + 1), + self.mninfo[idx].key, + self.mninfo[idx].collateral_id, + self.mninfo[idx].collateral_out)) + f.close() + + def create_masternodes(self): + for idx in range(0, self.mn_count): + self.nodes.append(start_node(idx + 1, self.options.tmpdir, + ['-debug=masternode', '-externalip=127.0.0.1', + '-masternode=1', + '-masternodeprivkey=%s' % self.mninfo[idx].key + ])) + for i in range(0, idx + 1): + connect_nodes(self.nodes[i], idx + 1) + + def sentinel(self): + for i in range(1, self.mn_count + 1): + self.nodes[i].sentinelping("1.1.0") + + def setup_network(self): + self.nodes = [] + # create faucet node for collateral and transactions + self.nodes.append(start_node(0, self.options.tmpdir, ["-debug"])) + required_balance = MASTERNODE_COLLATERAL * self.mn_count + 1 + while self.nodes[0].getbalance() < required_balance: + set_mocktime(get_mocktime() + 1) + self.nodes[0].generate(1) + # create masternodes + self.prepare_masternodes() + self.write_mn_config() + stop_node(self.nodes[0], 0) + self.nodes[0] = start_node(0, self.options.tmpdir, ["-debug"]) + self.create_masternodes() + # create connected simple nodes + for i in range(0, self.num_nodes - self.mn_count - 1): + self.create_simple_node() + # feed the sender with some balance + sender_addr = self.nodes[self.sender_idx].getnewaddress() + self.nodes[0].sendtoaddress(sender_addr, 1) + # make sender funds mature for InstantSend + for i in range(0, 2): + set_mocktime(get_mocktime() + 1) + self.nodes[0].generate(1) + # sync nodes + self.sync_all() + set_mocktime(get_mocktime() + 1) + sync_masternodes(self.nodes) + for i in range(1, self.mn_count + 1): + res = self.nodes[0].masternode("start-alias", "mn%d" % i) + assert(res["result"] == 'successful') + sync_masternodes(self.nodes) + #self.sentinel() + mn_info = self.nodes[0].masternodelist("status") + assert(len(mn_info) == self.mn_count) + for status in mn_info.values(): + assert(status == 'ENABLED') + + def create_raw_trx(self, node_from, node_to, amount): + # fill inputs + inputs=[] + balances = node_from.listunspent() + for tx in balances: + if tx['amount'] > amount: + input = {} + input["txid"] = tx['txid'] + input['vout'] = tx['vout'] + in_amount = float(tx['amount']) + inputs.append(input) + break + assert(len(inputs) > 0) + # fill outputs + receiver_address = node_to.getnewaddress() + change_address = node_from.getnewaddress() + fee = 0.001 + outputs={} + outputs[receiver_address] = amount + outputs[change_address] = in_amount - amount - fee + rawtx = node_from.createrawtransaction(inputs, outputs) + return node_from.signrawtransaction(rawtx) + + def run_test(self): + # create doublepending transaction, but don't relay it + dblspnd_tx = self.create_raw_trx(self.nodes[self.sender_idx], + self.nodes[self.isolated_idx], + 0.5) + # stop one node to isolate it from network + stop_node(self.nodes[self.isolated_idx], self.isolated_idx) + # instantsend to receiver + receiver_addr = self.nodes[self.receiver_idx].getnewaddress() + is_id = self.nodes[self.sender_idx].instantsendtoaddress(receiver_addr, 0.9) + # wait for instantsend locks + start = time() + locked = False + while True: + is_trx = self.nodes[self.sender_idx].gettransaction(is_id) + if is_trx['instantlock']: + locked = True + break + if time() > start + 10: + break + assert(locked) + # start last node + self.nodes[self.isolated_idx] = start_node(self.isolated_idx, + self.options.tmpdir, + ["-debug"]) + # send doublespend transaction to isolated node + self.nodes[self.isolated_idx].sendrawtransaction(dblspnd_tx['hex']) + # generate block on isolated node with doublespend transaction + set_mocktime(get_mocktime() + 1) + self.nodes[self.isolated_idx].generate(1) + wrong_block = self.nodes[self.isolated_idx].getbestblockhash() + # connect isolated block to network + for i in range(0, self.isolated_idx): + connect_nodes(self.nodes[i], self.isolated_idx) + # check doublespend block is rejected by other nodes + timeout = 10 + for i in range(0, self.isolated_idx): + res = self.nodes[i].waitforblock(wrong_block, timeout) + assert (res['hash'] != wrong_block) + # wait for long time only for first node + timeout = 1 + + +if __name__ == '__main__': + InstantSendTest().main() diff --git a/qa/rpc-tests/test_framework/util.py b/qa/rpc-tests/test_framework/util.py index 86b074243e5f..6cb94be5922a 100644 --- a/qa/rpc-tests/test_framework/util.py +++ b/qa/rpc-tests/test_framework/util.py @@ -30,7 +30,7 @@ COVERAGE_DIR = None # The maximum number of nodes a single test can spawn -MAX_NODES = 8 +MAX_NODES = 15 # Don't assign rpc or p2p ports lower than this PORT_MIN = 11000 # The number of ports to "reserve" for p2p and rpc, each diff --git a/src/chainparams.cpp b/src/chainparams.cpp index e01c9c8c09d2..23054a381a16 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -223,6 +223,7 @@ class CMainParams : public CChainParams { fMiningRequiresPeers = true; fDefaultConsistencyChecks = false; fRequireStandard = true; + fRequireRoutableExternalIP = true; fMineBlocksOnDemand = false; fAllowMultipleAddressesFromGroup = false; fAllowMultiplePorts = false; @@ -369,6 +370,7 @@ class CTestNetParams : public CChainParams { fMiningRequiresPeers = true; fDefaultConsistencyChecks = false; fRequireStandard = false; + fRequireRoutableExternalIP = true; fMineBlocksOnDemand = false; fAllowMultipleAddressesFromGroup = false; fAllowMultiplePorts = false; @@ -597,6 +599,7 @@ class CRegTestParams : public CChainParams { fMiningRequiresPeers = false; fDefaultConsistencyChecks = true; fRequireStandard = false; + fRequireRoutableExternalIP = false; fMineBlocksOnDemand = true; fAllowMultipleAddressesFromGroup = true; fAllowMultiplePorts = true; diff --git a/src/chainparams.h b/src/chainparams.h index 034e186bc73d..a0e0b07b3b0c 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -69,6 +69,8 @@ class CChainParams bool DefaultConsistencyChecks() const { return fDefaultConsistencyChecks; } /** Policy: Filter transactions that do not match well-defined patterns */ bool RequireStandard() const { return fRequireStandard; } + /** Require addresses specified with "-externalip" parameter to be routable */ + bool RequireRoutableExternalIP() const { return fRequireRoutableExternalIP; } uint64_t PruneAfterHeight() const { return nPruneAfterHeight; } /** Make miner stop after a block is found. In RPC, don't return until nGenProcLimit blocks are generated */ bool MineBlocksOnDemand() const { return fMineBlocksOnDemand; } @@ -106,6 +108,7 @@ class CChainParams bool fMiningRequiresPeers; bool fDefaultConsistencyChecks; bool fRequireStandard; + bool fRequireRoutableExternalIP; bool fMineBlocksOnDemand; bool fAllowMultipleAddressesFromGroup; bool fAllowMultiplePorts; diff --git a/src/masternodeman.cpp b/src/masternodeman.cpp index bec58a45dc9c..815cd09f3eb2 100644 --- a/src/masternodeman.cpp +++ b/src/masternodeman.cpp @@ -968,7 +968,9 @@ void CMasternodeMan::SyncAll(CNode* pnode, CConnman& connman) LOCK(cs); for (const auto& mnpair : mapMasternodes) { - if (mnpair.second.addr.IsRFC1918() || mnpair.second.addr.IsLocal()) continue; // do not send local network masternode + if (Params().RequireRoutableExternalIP() && + (mnpair.second.addr.IsRFC1918() || mnpair.second.addr.IsLocal())) + continue; // do not send local network masternode // NOTE: send masternode regardless of its current state, the other node will need it to verify old votes. LogPrint("masternode", "CMasternodeMan::%s -- Sending Masternode entry: masternode=%s addr=%s\n", __func__, mnpair.first.ToStringShort(), mnpair.second.addr.ToString()); PushDsegInvs(pnode, mnpair.second); diff --git a/src/net.cpp b/src/net.cpp index f0bd58abbe5a..988230de8e73 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -205,7 +205,7 @@ void AdvertiseLocal(CNode *pnode) // learn a new local address bool AddLocal(const CService& addr, int nScore) { - if (!addr.IsRoutable()) + if (!addr.IsRoutable() && Params().RequireRoutableExternalIP()) return false; if (!fDiscover && nScore < LOCAL_MANUAL) From 448e92f4aa3849803f5a21db68d3680583a79eb9 Mon Sep 17 00:00:00 2001 From: PaulieD Date: Thu, 12 Jul 2018 04:05:39 -0500 Subject: [PATCH 007/400] GetOutPointPrivateSendRounds readability (#2149) * .gitnore visual studio bs * Improves the readability of the `GetOutpointPrivateSendRounds` function by not having the second argument be needed, as the second arg should only not be 0 when it is recursively calling itself * Revert ".gitnore visual studio bs" This reverts commit 129b5242ade6a97a71810f492b5b347be219b691. * changed back comment and fixed allignment * refactor based on Udjin's suggestions. * refactor based on Udjin's suggestions. * fix alignment * Revert "fix alignment" This reverts commit c2cc2ae531c191258cd043b2b45a316443e4b860. * actually fix alignment * actually fix alignment --- src/qt/coincontroldialog.cpp | 4 ++-- src/wallet/rpcwallet.cpp | 2 +- src/wallet/wallet.cpp | 20 ++++++++++---------- src/wallet/wallet.h | 4 ++-- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/qt/coincontroldialog.cpp b/src/qt/coincontroldialog.cpp index ae07319657f6..b5c29fc8814c 100644 --- a/src/qt/coincontroldialog.cpp +++ b/src/qt/coincontroldialog.cpp @@ -433,7 +433,7 @@ void CoinControlDialog::viewItemChanged(QTreeWidgetItem* item, int column) item->setCheckState(COLUMN_CHECKBOX, Qt::Unchecked); else { coinControl->Select(outpt); - int nRounds = pwalletMain->GetOutpointPrivateSendRounds(outpt); + int nRounds = pwalletMain->GetCappedOutpointPrivateSendRounds(outpt); if (coinControl->fUsePrivateSend && nRounds < privateSendClient.nPrivateSendRounds) { QMessageBox::warning(this, windowTitle(), tr("Non-anonymized input selected. PrivateSend will be disabled.

If you still want to use PrivateSend, please deselect all non-nonymized inputs first and then check PrivateSend checkbox again."), @@ -781,7 +781,7 @@ void CoinControlDialog::updateView() // PrivateSend rounds COutPoint outpoint = COutPoint(out.tx->tx->GetHash(), out.i); - int nRounds = pwalletMain->GetOutpointPrivateSendRounds(outpoint); + int nRounds = pwalletMain->GetCappedOutpointPrivateSendRounds(outpoint); if (nRounds >= 0 || fDebug) itemOutput->setText(COLUMN_PRIVATESEND_ROUNDS, QString::number(nRounds)); else itemOutput->setText(COLUMN_PRIVATESEND_ROUNDS, tr("n/a")); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 96060030381a..54daf6c4a4f6 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2647,7 +2647,7 @@ UniValue listunspent(const JSONRPCRequest& request) entry.push_back(Pair("confirmations", out.nDepth)); entry.push_back(Pair("spendable", out.fSpendable)); entry.push_back(Pair("solvable", out.fSolvable)); - entry.push_back(Pair("ps_rounds", pwalletMain->GetOutpointPrivateSendRounds(COutPoint(out.tx->GetHash(), out.i)))); + entry.push_back(Pair("ps_rounds", pwalletMain->GetCappedOutpointPrivateSendRounds(COutPoint(out.tx->GetHash(), out.i)))); results.push_back(entry); } diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index b2aa465b5396..2260fc5da9c3 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -1506,10 +1506,10 @@ int CWallet::GetRealOutpointPrivateSendRounds(const COutPoint& outpoint, int nRo } // respect current settings -int CWallet::GetOutpointPrivateSendRounds(const COutPoint& outpoint) const +int CWallet::GetCappedOutpointPrivateSendRounds(const COutPoint& outpoint) const { LOCK(cs_wallet); - int realPrivateSendRounds = GetRealOutpointPrivateSendRounds(outpoint, 0); + int realPrivateSendRounds = GetRealOutpointPrivateSendRounds(outpoint); return realPrivateSendRounds > privateSendClient.nPrivateSendRounds ? privateSendClient.nPrivateSendRounds : realPrivateSendRounds; } @@ -2172,7 +2172,7 @@ CAmount CWalletTx::GetAnonymizedCredit(bool fUseCache) const if(pwallet->IsSpent(hashTx, i) || !pwallet->IsDenominated(outpoint)) continue; - const int nRounds = pwallet->GetOutpointPrivateSendRounds(outpoint); + const int nRounds = pwallet->GetCappedOutpointPrivateSendRounds(outpoint); if(nRounds >= privateSendClient.nPrivateSendRounds){ nCredit += pwallet->GetCredit(txout, ISMINE_SPENDABLE); if (!MoneyRange(nCredit)) @@ -2420,7 +2420,7 @@ float CWallet::GetAverageAnonymizedRounds() const for (const auto& outpoint : setWalletUTXO) { if(!IsDenominated(outpoint)) continue; - nTotal += GetOutpointPrivateSendRounds(outpoint); + nTotal += GetCappedOutpointPrivateSendRounds(outpoint); nCount++; } @@ -2444,7 +2444,7 @@ CAmount CWallet::GetNormalizedAnonymizedBalance() const if (!IsDenominated(outpoint)) continue; if (it->second.GetDepthInMainChain() < 0) continue; - int nRounds = GetOutpointPrivateSendRounds(outpoint); + int nRounds = GetCappedOutpointPrivateSendRounds(outpoint); nTotal += it->second.tx->vout[outpoint.n].nValue * nRounds / privateSendClient.nPrivateSendRounds; } @@ -2844,7 +2844,7 @@ bool CWallet::SelectCoins(const std::vector& vAvailableCoins, const CAm if(nCoinType == ONLY_DENOMINATED) { COutPoint outpoint = COutPoint(out.tx->GetHash(),out.i); - int nRounds = GetOutpointPrivateSendRounds(outpoint); + int nRounds = GetCappedOutpointPrivateSendRounds(outpoint); // make sure it's actually anonymized if(nRounds < privateSendClient.nPrivateSendRounds) continue; } @@ -2867,7 +2867,7 @@ bool CWallet::SelectCoins(const std::vector& vAvailableCoins, const CAm //make sure it's the denom we're looking for, round the amount up to smallest denom if(out.tx->tx->vout[out.i].nValue == nDenom && nValueRet + nDenom < nTargetValue + nSmallestDenom) { COutPoint outpoint = COutPoint(out.tx->GetHash(),out.i); - int nRounds = GetOutpointPrivateSendRounds(outpoint); + int nRounds = GetCappedOutpointPrivateSendRounds(outpoint); // make sure it's actually anonymized if(nRounds < privateSendClient.nPrivateSendRounds) continue; nValueRet += nDenom; @@ -3028,7 +3028,7 @@ bool CWallet::SelectCoinsByDenominations(int nDenom, CAmount nValueMin, CAmount CTxIn txin = CTxIn(out.tx->GetHash(), out.i); - int nRounds = GetOutpointPrivateSendRounds(txin.prevout); + int nRounds = GetCappedOutpointPrivateSendRounds(txin.prevout); if(nRounds >= nPrivateSendRoundsMax) continue; if(nRounds < nPrivateSendRoundsMin) continue; @@ -3112,7 +3112,7 @@ bool CWallet::SelectCoinsGrouppedByAddresses(std::vector& vecT // otherwise they will just lead to higher fee / lower priority if(wtx.tx->vout[i].nValue <= nSmallestDenom/10) continue; // ignore anonymized - if(GetOutpointPrivateSendRounds(COutPoint(outpoint.hash, i)) >= privateSendClient.nPrivateSendRounds) continue; + if(GetCappedOutpointPrivateSendRounds(COutPoint(outpoint.hash, i)) >= privateSendClient.nPrivateSendRounds) continue; } CompactTallyItem& item = mapTally[txdest]; @@ -3178,7 +3178,7 @@ bool CWallet::SelectCoinsDark(CAmount nValueMin, CAmount nValueMax, std::vector< if(nValueRet + out.tx->tx->vout[out.i].nValue <= nValueMax){ CTxIn txin = CTxIn(out.tx->GetHash(),out.i); - int nRounds = GetOutpointPrivateSendRounds(txin.prevout); + int nRounds = GetCappedOutpointPrivateSendRounds(txin.prevout); if(nRounds >= nPrivateSendRoundsMax) continue; if(nRounds < nPrivateSendRoundsMin) continue; diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 65caff1f7867..ee7b9376c147 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -820,9 +820,9 @@ class CWallet : public CCryptoKeyStore, public CValidationInterface int CountInputsWithAmount(CAmount nInputAmount); // get the PrivateSend chain depth for a given input - int GetRealOutpointPrivateSendRounds(const COutPoint& outpoint, int nRounds) const; + int GetRealOutpointPrivateSendRounds(const COutPoint& outpoint, int nRounds = 0) const; // respect current settings - int GetOutpointPrivateSendRounds(const COutPoint& outpoint) const; + int GetCappedOutpointPrivateSendRounds(const COutPoint& outpoint) const; bool IsDenominated(const COutPoint& outpoint) const; From 0e689341d2d7035ce3ed86746b0bdcb1f86da03b Mon Sep 17 00:00:00 2001 From: PaulieD Date: Thu, 12 Jul 2018 04:06:30 -0500 Subject: [PATCH 008/400] Implement Governance ZMQ notification messages (#2160) * fix whitespace * added zmq stuff for governance objects and votes it seems that zmq is currently not in a working state, need to figure that out. Need to: plug in the new methods added possibly plug in the old methods, as it doesn't look like they are. * formatting fix. Will probably need to revert for this PR * continue linking new zmq messages in * added comment, might need to revert * fixes error of it not knowing about the classes * Actually link in, all new govobjects and govvotes should be broadcast over zmq now. * fix compile error, forgot to change params when copying * fix compile error * add imports to the header files in zmqconfig.h * fixing linking(i think) error * Revert "added comment, might need to revert" This reverts commit 2918ea40fe9a96834c4bd89e13cb458cde6814f2. * Revert "formatting fix. Will probably need to revert for this PR" This reverts commit ca10558866ab61e3dd0c70541fdcfee6f5115157. * fix tabs etc * EOL added * optimization of hash.begin() @nmarley thoughts? * remove formatting changes * iterator i -> it and removal of notifier * typo in df879f57 * use auto for the iterators * introduce hash prefix * implement changes in zmq_sub.py, update the doc, and change argument name to fix typo * deref iterators before calling methods * continued e8a4c505 * missed one... continued e8a4c505 * killing some tabs * fix spacing for setting or comparing iterators * change order of new variables to match current setup * re-add elif's I didn't realize got removed * Revert "fix spacing for setting or comparing iterators" This reverts commit 8ce2068148dcd275ebba7ee6038d0db1c582b9f3. * Revert "use auto for the iterators" This reverts commit cb16cf0760bfaf68c56684877898611802bf2303. * Revert "missed one... continued e8a4c505" This reverts commit 2087cf894f7e9682508b4692b89897b4fa4e4b7a. * Revert "continued e8a4c505" This reverts commit a78c8ad2c9bb1602242a8f040e17ef958982348c. * Revert "deref iterators before calling methods" This reverts commit e8a4c505d1d34360eaf882d92cd8fbc55436cfcc. * Revert "iterator i -> it and removal of notifier" This reverts commit 29574248b1a0d05c18d60454d07c77979aae6fb2. * Revert "fix whitespace" This reverts commit 612be48d963000b4cbc5f64981a88a3225428b37. * Revert "typo in df879f5" * Revert "Optimization of hash.begin()" * fixes problem with revert * Udjin complain's a lot ;) * help text, init.cpp * add signals in validationinterface.cpp * Change location of vote notification call. * remain consistent * remove unneeded include due to change of notification location * implement raw notifications --- contrib/zmq/zmq_sub.py | 17 +++++++++++ doc/zmq.md | 4 +++ src/governance.cpp | 8 +++++- src/init.cpp | 2 ++ src/validationinterface.cpp | 6 ++++ src/validationinterface.h | 8 ++++++ src/zmq/zmqabstractnotifier.cpp | 10 +++++++ src/zmq/zmqabstractnotifier.h | 5 ++++ src/zmq/zmqconfig.h | 3 ++ src/zmq/zmqnotificationinterface.cpp | 38 +++++++++++++++++++++++++ src/zmq/zmqnotificationinterface.h | 3 ++ src/zmq/zmqpublishnotifier.cpp | 42 ++++++++++++++++++++++++++++ src/zmq/zmqpublishnotifier.h | 25 +++++++++++++++++ 13 files changed, 170 insertions(+), 1 deletion(-) diff --git a/contrib/zmq/zmq_sub.py b/contrib/zmq/zmq_sub.py index 47087e875b59..7fbfbbd005e6 100755 --- a/contrib/zmq/zmq_sub.py +++ b/contrib/zmq/zmq_sub.py @@ -14,9 +14,13 @@ zmqSubSocket.setsockopt(zmq.SUBSCRIBE, b"hashblock") zmqSubSocket.setsockopt(zmq.SUBSCRIBE, b"hashtx") zmqSubSocket.setsockopt(zmq.SUBSCRIBE, b"hashtxlock") +zmqSubSocket.setsockopt(zmq.SUBSCRIBE, b"hashgovernancevote") +zmqSubSocket.setsockopt(zmq.SUBSCRIBE, b"hashgovernanceobject") zmqSubSocket.setsockopt(zmq.SUBSCRIBE, b"rawblock") zmqSubSocket.setsockopt(zmq.SUBSCRIBE, b"rawtx") zmqSubSocket.setsockopt(zmq.SUBSCRIBE, b"rawtxlock") +zmqSubSocket.setsockopt(zmq.SUBSCRIBE, b"rawgovernancevote") +zmqSubSocket.setsockopt(zmq.SUBSCRIBE, b"rawgovernanceobject") zmqSubSocket.connect("tcp://127.0.0.1:%i" % port) try: @@ -48,6 +52,19 @@ elif topic == "rawtxlock": print('- RAW TX LOCK ('+sequence+') -') print(binascii.hexlify(body).decode("utf-8")) + elif topic == "hashgovernancevote": + print('- HASH GOVERNANCE VOTE ('+sequence+') -') + print(binascii.hexlify(body).decode("utf-8")) + elif topic == "hashgovernanceobject": + print('- HASH GOVERNANCE OBJECT ('+sequence+') -') + print(binascii.hexlify(body).decode("utf-8")) + elif topic == "rawgovernancevote": + print('- RAW GOVERNANCE VOTE ('+sequence+') -') + print(binascii.hexlify(body).decode("utf-8")) + elif topic == "rawgovernanceobject": + print('- RAW GOVERNANCE OBJECT ('+sequence+') -') + print(binascii.hexlify(body).decode("utf-8")) + except KeyboardInterrupt: zmqContext.destroy() diff --git a/doc/zmq.md b/doc/zmq.md index a708ca5ab666..489ab549a018 100644 --- a/doc/zmq.md +++ b/doc/zmq.md @@ -62,6 +62,10 @@ Currently, the following notifications are supported: -zmqpubrawblock=address -zmqpubrawtx=address -zmqpubrawtxlock=address + -zmqpubhashgovernancevote=address + -zmqpubhashgovernanceobject=address + -zmqpubrawgovernancevote=address + -zmqpubhashgovernanceobject=address The socket type is PUB and the address must be a valid ZeroMQ socket address. The same address can be used in more than one notification. diff --git a/src/governance.cpp b/src/governance.cpp index 4d33b6dde224..4bbb62a2374b 100644 --- a/src/governance.cpp +++ b/src/governance.cpp @@ -3,6 +3,7 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "consensus/validation.h" +#include "validationinterface.h" #include "governance.h" #include "governance-object.h" #include "governance-validators.h" @@ -264,7 +265,8 @@ void CGovernanceManager::ProcessMessage(CNode* pfrom, const std::string& strComm } return; } - + // SEND NOTIFICATION TO SCRIPT/ZMQ + GetMainSignals().NotifyGovernanceVote(vote); } } @@ -361,6 +363,10 @@ void CGovernanceManager::AddGovernanceObject(CGovernanceObject& govobj, CConnman CGovernanceException exception; CheckOrphanVotes(govobj, exception, connman); + // SEND NOTIFICATION TO SCRIPT/ZMQ + GetMainSignals().NotifyGovernanceObject(govobj); + + DBG( std::cout << "CGovernanceManager::AddGovernanceObject END" << std::endl; ); } diff --git a/src/init.cpp b/src/init.cpp index 585a26161e89..78adc74786c7 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -490,6 +490,8 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageOpt("-zmqpubhashblock=
", _("Enable publish hash block in
")); strUsage += HelpMessageOpt("-zmqpubhashtx=
", _("Enable publish hash transaction in
")); strUsage += HelpMessageOpt("-zmqpubhashtxlock=
", _("Enable publish hash transaction (locked via InstantSend) in
")); + strUsage += HelpMessageOpt("-zmqpubhashgovernancevote=
", _("Enable publish hash of governance votes in
")); + strUsage += HelpMessageOpt("-zmqpubhashgovernanceobject=
", _("Enable publish hash of governance objects (like proposals) in
")); strUsage += HelpMessageOpt("-zmqpubrawblock=
", _("Enable publish raw block in
")); strUsage += HelpMessageOpt("-zmqpubrawtx=
", _("Enable publish raw transaction in
")); strUsage += HelpMessageOpt("-zmqpubrawtxlock=
", _("Enable publish raw transaction (locked via InstantSend) in
")); diff --git a/src/validationinterface.cpp b/src/validationinterface.cpp index 56620c929479..436cedf1019c 100644 --- a/src/validationinterface.cpp +++ b/src/validationinterface.cpp @@ -26,6 +26,8 @@ void RegisterValidationInterface(CValidationInterface* pwalletIn) { g_signals.ScriptForMining.connect(boost::bind(&CValidationInterface::GetScriptForMining, pwalletIn, _1)); g_signals.BlockFound.connect(boost::bind(&CValidationInterface::ResetRequestCount, pwalletIn, _1)); g_signals.NewPoWValidBlock.connect(boost::bind(&CValidationInterface::NewPoWValidBlock, pwalletIn, _1, _2)); + g_signals.NotifyGovernanceObject.connect(boost::bind(&CValidationInterface::NotifyGovernanceObject, pwalletIn, _1)); + g_signals.NotifyGovernanceVote.connect(boost::bind(&CValidationInterface::NotifyGovernanceVote, pwalletIn, _1)); } void UnregisterValidationInterface(CValidationInterface* pwalletIn) { @@ -42,6 +44,8 @@ void UnregisterValidationInterface(CValidationInterface* pwalletIn) { g_signals.NewPoWValidBlock.disconnect(boost::bind(&CValidationInterface::NewPoWValidBlock, pwalletIn, _1, _2)); g_signals.NotifyHeaderTip.disconnect(boost::bind(&CValidationInterface::NotifyHeaderTip, pwalletIn, _1, _2)); g_signals.AcceptedBlockHeader.disconnect(boost::bind(&CValidationInterface::AcceptedBlockHeader, pwalletIn, _1)); + g_signals.NotifyGovernanceObject.disconnect(boost::bind(&CValidationInterface::NotifyGovernanceObject, pwalletIn, _1)); + g_signals.NotifyGovernanceVote.disconnect(boost::bind(&CValidationInterface::NotifyGovernanceVote, pwalletIn, _1)); } void UnregisterAllValidationInterfaces() { @@ -58,4 +62,6 @@ void UnregisterAllValidationInterfaces() { g_signals.NewPoWValidBlock.disconnect_all_slots(); g_signals.NotifyHeaderTip.disconnect_all_slots(); g_signals.AcceptedBlockHeader.disconnect_all_slots(); + g_signals.NotifyGovernanceObject.disconnect_all_slots(); + g_signals.NotifyGovernanceVote.disconnect_all_slots(); } diff --git a/src/validationinterface.h b/src/validationinterface.h index 7086840c7347..8ce15b30cd5f 100644 --- a/src/validationinterface.h +++ b/src/validationinterface.h @@ -18,6 +18,8 @@ class CReserveScript; class CTransaction; class CValidationInterface; class CValidationState; +class CGovernanceVote; +class CGovernanceObject; class uint256; // These functions dispatch to one or all registered wallets @@ -36,6 +38,8 @@ class CValidationInterface { virtual void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) {} virtual void SyncTransaction(const CTransaction &tx, const CBlockIndex *pindex, int posInBlock) {} virtual void NotifyTransactionLock(const CTransaction &tx) {} + virtual void NotifyGovernanceVote(const CGovernanceVote &vote) {} + virtual void NotifyGovernanceObject(const CGovernanceObject &object) {} virtual void SetBestChain(const CBlockLocator &locator) {} virtual bool UpdatedTransaction(const uint256 &hash) { return false;} virtual void Inventory(const uint256 &hash) {} @@ -69,6 +73,10 @@ struct CMainSignals { boost::signals2::signal SyncTransaction; /** Notifies listeners of an updated transaction lock without new data. */ boost::signals2::signal NotifyTransactionLock; + /** Notifies listeners of a new governance vote. */ + boost::signals2::signal NotifyGovernanceVote; + /** Notifies listeners of a new governance object. */ + boost::signals2::signal NotifyGovernanceObject; /** Notifies listeners of an updated transaction without new data (for now: a coinbase potentially becoming visible). */ boost::signals2::signal UpdatedTransaction; /** Notifies listeners of a new active block chain. */ diff --git a/src/zmq/zmqabstractnotifier.cpp b/src/zmq/zmqabstractnotifier.cpp index 76543a4a797a..ea993d6061bc 100644 --- a/src/zmq/zmqabstractnotifier.cpp +++ b/src/zmq/zmqabstractnotifier.cpp @@ -25,3 +25,13 @@ bool CZMQAbstractNotifier::NotifyTransactionLock(const CTransaction &/*transacti { return true; } + +bool CZMQAbstractNotifier::NotifyGovernanceVote(const CGovernanceVote& /*vote*/) +{ + return true; +} + +bool CZMQAbstractNotifier::NotifyGovernanceObject(const CGovernanceObject& /*object*/) +{ + return true; +} diff --git a/src/zmq/zmqabstractnotifier.h b/src/zmq/zmqabstractnotifier.h index 0d3f1fcd4e41..ee6aa3ad7e2c 100644 --- a/src/zmq/zmqabstractnotifier.h +++ b/src/zmq/zmqabstractnotifier.h @@ -8,6 +8,8 @@ #include "zmqconfig.h" class CBlockIndex; +class CGovernanceObject; +class CGovernanceVote; class CZMQAbstractNotifier; typedef CZMQAbstractNotifier* (*CZMQNotifierFactory)(); @@ -35,6 +37,9 @@ class CZMQAbstractNotifier virtual bool NotifyBlock(const CBlockIndex *pindex); virtual bool NotifyTransaction(const CTransaction &transaction); virtual bool NotifyTransactionLock(const CTransaction &transaction); + virtual bool NotifyGovernanceVote(const CGovernanceVote &vote); + virtual bool NotifyGovernanceObject(const CGovernanceObject &object); + protected: void *psocket; diff --git a/src/zmq/zmqconfig.h b/src/zmq/zmqconfig.h index 4dbc5226d554..b7168c962dcb 100644 --- a/src/zmq/zmqconfig.h +++ b/src/zmq/zmqconfig.h @@ -19,6 +19,9 @@ #include "primitives/block.h" #include "primitives/transaction.h" +#include "governance-object.h" +#include "governance-vote.h" + void zmqError(const char *str); #endif // BITCOIN_ZMQ_ZMQCONFIG_H diff --git a/src/zmq/zmqnotificationinterface.cpp b/src/zmq/zmqnotificationinterface.cpp index 475c0251bc07..7895f17aaa8b 100644 --- a/src/zmq/zmqnotificationinterface.cpp +++ b/src/zmq/zmqnotificationinterface.cpp @@ -38,9 +38,13 @@ CZMQNotificationInterface* CZMQNotificationInterface::Create() factories["pubhashblock"] = CZMQAbstractNotifier::Create; factories["pubhashtx"] = CZMQAbstractNotifier::Create; factories["pubhashtxlock"] = CZMQAbstractNotifier::Create; + factories["pubhashgovernancevote"] = CZMQAbstractNotifier::Create; + factories["pubhashgovernanceobject"] = CZMQAbstractNotifier::Create; factories["pubrawblock"] = CZMQAbstractNotifier::Create; factories["pubrawtx"] = CZMQAbstractNotifier::Create; factories["pubrawtxlock"] = CZMQAbstractNotifier::Create; + factories["pubrawgovernancevote"] = CZMQAbstractNotifier::Create; + factories["pubrawgovernanceobject"] = CZMQAbstractNotifier::Create; for (std::map::const_iterator i=factories.begin(); i!=factories.end(); ++i) { @@ -179,3 +183,37 @@ void CZMQNotificationInterface::NotifyTransactionLock(const CTransaction &tx) } } } + +void CZMQNotificationInterface::NotifyGovernanceVote(const CGovernanceVote &vote) +{ + for (std::list::iterator i = notifiers.begin(); i != notifiers.end(); ) + { + CZMQAbstractNotifier *notifier = *i; + if (notifier->NotifyGovernanceVote(vote)) + { + i++; + } + else + { + notifier->Shutdown(); + i = notifiers.erase(i); + } + } +} + +void CZMQNotificationInterface::NotifyGovernanceObject(const CGovernanceObject &object) +{ + for (std::list::iterator i = notifiers.begin(); i != notifiers.end(); ) + { + CZMQAbstractNotifier *notifier = *i; + if (notifier->NotifyGovernanceObject(object)) + { + i++; + } + else + { + notifier->Shutdown(); + i = notifiers.erase(i); + } + } +} diff --git a/src/zmq/zmqnotificationinterface.h b/src/zmq/zmqnotificationinterface.h index 13b5c8bf96ed..aeaed254a007 100644 --- a/src/zmq/zmqnotificationinterface.h +++ b/src/zmq/zmqnotificationinterface.h @@ -27,6 +27,9 @@ class CZMQNotificationInterface : public CValidationInterface void SyncTransaction(const CTransaction& tx, const CBlockIndex *pindex, int posInBlock) override; void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) override; void NotifyTransactionLock(const CTransaction &tx) override; + void NotifyGovernanceVote(const CGovernanceVote& vote) override; + void NotifyGovernanceObject(const CGovernanceObject& object) override; + private: CZMQNotificationInterface(); diff --git a/src/zmq/zmqpublishnotifier.cpp b/src/zmq/zmqpublishnotifier.cpp index be1f7ac0adfb..8a6c4167d0c8 100644 --- a/src/zmq/zmqpublishnotifier.cpp +++ b/src/zmq/zmqpublishnotifier.cpp @@ -13,9 +13,13 @@ static std::multimap mapPublishNotifi static const char *MSG_HASHBLOCK = "hashblock"; static const char *MSG_HASHTX = "hashtx"; static const char *MSG_HASHTXLOCK = "hashtxlock"; +static const char *MSG_HASHGVOTE = "hashgovernancevote"; +static const char *MSG_HASHGOBJ = "hashgovernanceobject"; static const char *MSG_RAWBLOCK = "rawblock"; static const char *MSG_RAWTX = "rawtx"; static const char *MSG_RAWTXLOCK = "rawtxlock"; +static const char *MSG_RAWGVOTE = "rawgovernancevote"; +static const char *MSG_RAWGOBJ = "rawgovernanceobject"; // Internal function to send multipart message static int zmq_send_multipart(void *sock, const void* data, size_t size, ...) @@ -173,6 +177,26 @@ bool CZMQPublishHashTransactionLockNotifier::NotifyTransactionLock(const CTransa return SendMessage(MSG_HASHTXLOCK, data, 32); } +bool CZMQPublishHashGovernanceVoteNotifier::NotifyGovernanceVote(const CGovernanceVote &vote) +{ + uint256 hash = vote.GetHash(); + LogPrint("zmq", "zmq: Publish hashgovernancevote %s\n", hash.GetHex()); + char data[32]; + for (unsigned int i = 0; i < 32; i++) + data[31 - i] = hash.begin()[i]; + return SendMessage(MSG_HASHGVOTE, data, 32); +} + +bool CZMQPublishHashGovernanceObjectNotifier::NotifyGovernanceObject(const CGovernanceObject &object) +{ + uint256 hash = object.GetHash(); + LogPrint("zmq", "zmq: Publish hashgovernanceobject %s\n", hash.GetHex()); + char data[32]; + for (unsigned int i = 0; i < 32; i++) + data[31 - i] = hash.begin()[i]; + return SendMessage(MSG_HASHGOBJ, data, 32); +} + bool CZMQPublishRawBlockNotifier::NotifyBlock(const CBlockIndex *pindex) { LogPrint("zmq", "zmq: Publish rawblock %s\n", pindex->GetBlockHash().GetHex()); @@ -211,3 +235,21 @@ bool CZMQPublishRawTransactionLockNotifier::NotifyTransactionLock(const CTransac ss << transaction; return SendMessage(MSG_RAWTXLOCK, &(*ss.begin()), ss.size()); } + +bool CZMQPublishRawGovernanceVoteNotifier::NotifyGovernanceVote(const CGovernanceVote &vote) +{ + uint256 nHash = vote.GetHash(); + LogPrint("gobject", "gobject: Publish rawgovernanceobject: hash = %s, vote = %d\n", nHash.ToString(), vote.ToString()); + CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); + ss << vote; + return SendMessage(MSG_RAWGVOTE, &(*ss.begin()), ss.size()); +} + +bool CZMQPublishRawGovernanceObjectNotifier::NotifyGovernanceObject(const CGovernanceObject &govobj) +{ + uint256 nHash = govobj.GetHash(); + LogPrint("gobject", "gobject: Publish rawgovernanceobject: hash = %s, type = %d\n", nHash.ToString(), govobj.GetObjectType()); + CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); + ss << govobj; + return SendMessage(MSG_RAWGOBJ, &(*ss.begin()), ss.size()); +} diff --git a/src/zmq/zmqpublishnotifier.h b/src/zmq/zmqpublishnotifier.h index 4ade12cdceac..31c90317d8c0 100644 --- a/src/zmq/zmqpublishnotifier.h +++ b/src/zmq/zmqpublishnotifier.h @@ -8,6 +8,8 @@ #include "zmqabstractnotifier.h" class CBlockIndex; +class CGovernanceVote; +class CGovernanceObject; class CZMQAbstractPublishNotifier : public CZMQAbstractNotifier { @@ -46,6 +48,18 @@ class CZMQPublishHashTransactionLockNotifier : public CZMQAbstractPublishNotifie bool NotifyTransactionLock(const CTransaction &transaction) override; }; +class CZMQPublishHashGovernanceVoteNotifier : public CZMQAbstractPublishNotifier +{ +public: + bool NotifyGovernanceVote(const CGovernanceVote &vote) override; +}; + +class CZMQPublishHashGovernanceObjectNotifier : public CZMQAbstractPublishNotifier +{ +public: + bool NotifyGovernanceObject(const CGovernanceObject &object) override; +}; + class CZMQPublishRawBlockNotifier : public CZMQAbstractPublishNotifier { public: @@ -64,4 +78,15 @@ class CZMQPublishRawTransactionLockNotifier : public CZMQAbstractPublishNotifier bool NotifyTransactionLock(const CTransaction &transaction) override; }; +class CZMQPublishRawGovernanceVoteNotifier : public CZMQAbstractPublishNotifier +{ +public: + bool NotifyGovernanceVote(const CGovernanceVote &vote) override; +}; + +class CZMQPublishRawGovernanceObjectNotifier : public CZMQAbstractPublishNotifier +{ +public: + bool NotifyGovernanceObject(const CGovernanceObject &object) override; +}; #endif // BITCOIN_ZMQ_ZMQPUBLISHNOTIFIER_H From df1be90ce1802f99e54a1791f4651e332f2af9d2 Mon Sep 17 00:00:00 2001 From: strophy <32928115+strophy@users.noreply.github.com> Date: Thu, 12 Jul 2018 17:07:17 +0800 Subject: [PATCH 009/400] Update links to obsolete documentation (#2162) * Update links to obsolete documentation * Change link text --- doc/README.md | 2 +- doc/README_windows.txt | 4 ++-- src/qt/utilitydialog.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/README.md b/doc/README.md index 59b619ca9f3e..9798a25b6ec4 100644 --- a/doc/README.md +++ b/doc/README.md @@ -24,7 +24,7 @@ Drag Dash-Qt to your applications folder, and then run Dash-Qt. ### Need Help? -* See the [Dash documentation](https://dashpay.atlassian.net/wiki/display/DOC) +* See the [Dash documentation](https://docs.dash.org) for help and more information. * Ask for help on [Dash Nation Discord](http://dashchat.org) * Ask for help on the [Dash Forum](https://dash.org/forum) diff --git a/doc/README_windows.txt b/doc/README_windows.txt index 1a347d4be28e..7c763782b034 100644 --- a/doc/README_windows.txt +++ b/doc/README_windows.txt @@ -18,6 +18,6 @@ However, it downloads and stores the entire history of Dash transactions; depending on the speed of your computer and network connection, the synchronization process can take anywhere from a few hours to a day or more. -See the dash wiki at: - https://dashpay.atlassian.net/wiki/ +See the Dash documentation at: + https://docs.dash.org for more help and information. diff --git a/src/qt/utilitydialog.cpp b/src/qt/utilitydialog.cpp index 4cb568ee03e9..a2822804bef0 100644 --- a/src/qt/utilitydialog.cpp +++ b/src/qt/utilitydialog.cpp @@ -161,7 +161,7 @@ your funds will already be anonymized. No additional waiting is required. \ This means those 1000 addresses last for about 100 mixing events. When 900 of them are used, your wallet must create more addresses. \ It can only do this, however, if you have automatic backups enabled.
\ Consequently, users who have backups disabled will also have PrivateSend disabled.
\ -For more info see https://dashpay.atlassian.net/wiki/display/DOC/PrivateSend \ +For more information, see the PrivateSend documentation. \ ")); ui->aboutMessage->setWordWrap(true); ui->helpMessage->setVisible(false); From fd70a1eb92893146e4d92040dd69e1c6c080a26c Mon Sep 17 00:00:00 2001 From: Nathan Marley Date: Thu, 12 Jul 2018 16:07:51 +0700 Subject: [PATCH 010/400] iterator cleanup in several places (#2164) * iterator cleanup in Dash-specific code * const * *Pair/pair * it++ -> ++it --- src/governance-classes.cpp | 10 +-- src/governance.cpp | 72 ++++++++++------------ src/instantx.cpp | 117 +++++++++++++----------------------- src/masternode-payments.cpp | 15 ++--- src/masternodeman.cpp | 23 +++---- src/privatesend-client.cpp | 3 +- src/privatesend.cpp | 4 +- src/spork.cpp | 8 +-- 8 files changed, 98 insertions(+), 154 deletions(-) diff --git a/src/governance-classes.cpp b/src/governance-classes.cpp index 5f6553ec1805..4cb2c00dcf28 100644 --- a/src/governance-classes.cpp +++ b/src/governance-classes.cpp @@ -239,16 +239,12 @@ std::vector CGovernanceTriggerManager::GetActiveTriggers() DBG( std::cout << "GetActiveTriggers: mapTrigger.size() = " << mapTrigger.size() << std::endl; ); // LOOK AT THESE OBJECTS AND COMPILE A VALID LIST OF TRIGGERS - trigger_m_it it = mapTrigger.begin(); - while(it != mapTrigger.end()) { - - CGovernanceObject* pObj = governance.FindGovernanceObject((*it).first); - + for (const auto& pair : mapTrigger) { + CGovernanceObject* pObj = governance.FindGovernanceObject(pair.first); if(pObj) { DBG( std::cout << "GetActiveTriggers: pObj->GetDataAsPlainString() = " << pObj->GetDataAsPlainString() << std::endl; ); - vecResults.push_back(it->second); + vecResults.push_back(pair.second); } - ++it; } DBG( std::cout << "GetActiveTriggers: vecResults.size() = " << vecResults.size() << std::endl; ); diff --git a/src/governance.cpp b/src/governance.cpp index 4bbb62a2374b..0a86adaf0fed 100644 --- a/src/governance.cpp +++ b/src/governance.cpp @@ -530,10 +530,10 @@ std::vector CGovernanceManager::GetCurrentVotes(const uint256& vote_rec_t voteRecord; if (!govobj.GetCurrentMNVotes(mnpair.first, voteRecord)) continue; - for (vote_instance_m_it it3 = voteRecord.mapInstances.begin(); it3 != voteRecord.mapInstances.end(); ++it3) { - int signal = (it3->first); - int outcome = ((it3->second).eOutcome); - int64_t nCreationTime = ((it3->second).nCreationTime); + for (const auto& voteInstancePair : voteRecord.mapInstances) { + int signal = voteInstancePair.first; + int outcome = voteInstancePair.second.eOutcome; + int64_t nCreationTime = voteInstancePair.second.nCreationTime; CGovernanceVote vote = CGovernanceVote(mnpair.first, nParentHash, (vote_signal_enum_t)signal, (vote_outcome_enum_t)outcome); vote.SetTime(nCreationTime); @@ -551,24 +551,15 @@ std::vector CGovernanceManager::GetAllNewerThan(int64_ std::vector vGovObjs; - object_m_cit it = mapObjects.begin(); - while(it != mapObjects.end()) - { + for (const auto& objPair : mapObjects) { // IF THIS OBJECT IS OLDER THAN TIME, CONTINUE - - if((*it).second.GetCreationTime() < nMoreThanTime) { - ++it; + if(objPair.second.GetCreationTime() < nMoreThanTime) { continue; } // ADD GOVERNANCE OBJECT TO LIST - - const CGovernanceObject* pGovObj = &((*it).second); + const CGovernanceObject* pGovObj = &(objPair.second); vGovObjs.push_back(pGovObj); - - // NEXT - - ++it; } return vGovObjs; @@ -730,9 +721,10 @@ void CGovernanceManager::SyncAll(CNode* pnode, CConnman& connman) const LOCK2(cs_main, cs); // all valid objects, no votes - for(object_m_cit it = mapObjects.begin(); it != mapObjects.end(); ++it) { - const CGovernanceObject& govobj = it->second; - std::string strHash = it->first.ToString(); + for (const auto& objPair : mapObjects) { + uint256 nHash = objPair.first; + const CGovernanceObject& govobj = objPair.second; + std::string strHash = nHash.ToString(); LogPrint("gobject", "CGovernanceManager::%s -- attempting to sync govobj: %s, peer=%d\n", __func__, strHash, pnode->id); @@ -744,7 +736,7 @@ void CGovernanceManager::SyncAll(CNode* pnode, CConnman& connman) const // Push the inventory budget proposal message over to the other client LogPrint("gobject", "CGovernanceManager::%s -- syncing govobj: %s, peer=%d\n", __func__, strHash, pnode->id); - pnode->PushInventory(CInv(MSG_GOVERNANCE_OBJECT, it->first)); + pnode->PushInventory(CInv(MSG_GOVERNANCE_OBJECT, nHash)); ++nObjCount; } @@ -910,8 +902,8 @@ void CGovernanceManager::CheckMasternodeOrphanVotes(CConnman& connman) ScopedLockBool guard(cs, fRateChecksEnabled, false); - for(object_m_it it = mapObjects.begin(); it != mapObjects.end(); ++it) { - it->second.CheckOrphanVotes(connman); + for (auto& objPair : mapObjects) { + objPair.second.CheckOrphanVotes(connman); } } @@ -1092,22 +1084,25 @@ int CGovernanceManager::RequestGovernanceObjectVotes(const std::vector& if(mapObjects.empty()) return -2; - for(object_m_it it = mapObjects.begin(); it != mapObjects.end(); ++it) { - if(mapAskedRecently.count(it->first)) { - std::map::iterator it1 = mapAskedRecently[it->first].begin(); - while(it1 != mapAskedRecently[it->first].end()) { - if(it1->second < nNow) { - mapAskedRecently[it->first].erase(it1++); + for (const auto& objPair : mapObjects) { + uint256 nHash = objPair.first; + if(mapAskedRecently.count(nHash)) { + auto it = mapAskedRecently[nHash].begin(); + while(it != mapAskedRecently[nHash].end()) { + if(it->second < nNow) { + mapAskedRecently[nHash].erase(it++); } else { - ++it1; + ++it; } } - if(mapAskedRecently[it->first].size() >= nPeersPerHashMax) continue; + if(mapAskedRecently[nHash].size() >= nPeersPerHashMax) continue; } - if(it->second.nObjectType == GOVERNANCE_OBJECT_TRIGGER) { - vpGovObjsTriggersTmp.push_back(&(it->second)); + + auto govObj = objPair.second; + if(govObj.nObjectType == GOVERNANCE_OBJECT_TRIGGER) { + vpGovObjsTriggersTmp.push_back(&govObj); } else { - vpGovObjsTmp.push_back(&(it->second)); + vpGovObjsTmp.push_back(&govObj); } } } @@ -1194,8 +1189,8 @@ void CGovernanceManager::RebuildIndexes() LOCK(cs); cmapVoteToObject.Clear(); - for(object_m_it it = mapObjects.begin(); it != mapObjects.end(); ++it) { - CGovernanceObject& govobj = it->second; + for (auto& objPair : mapObjects) { + CGovernanceObject& govobj = objPair.second; std::vector vecVotes = govobj.GetVoteFile().GetVotes(); for(size_t i = 0; i < vecVotes.size(); ++i) { cmapVoteToObject.Insert(vecVotes[i].GetHash(), &govobj); @@ -1242,10 +1237,8 @@ std::string CGovernanceManager::ToString() const int nTriggerCount = 0; int nOtherCount = 0; - object_m_cit it = mapObjects.begin(); - - while(it != mapObjects.end()) { - switch(it->second.GetObjectType()) { + for (const auto& objPair : mapObjects) { + switch(objPair.second.GetObjectType()) { case GOVERNANCE_OBJECT_PROPOSAL: nProposalCount++; break; @@ -1256,7 +1249,6 @@ std::string CGovernanceManager::ToString() const nOtherCount++; break; } - ++it; } return strprintf("Governance Objects: %d (Proposals: %d, Triggers: %d, Other: %d; Erased: %d), Votes: %d", diff --git a/src/instantx.cpp b/src/instantx.cpp index e41a683c6983..4bd0c0b483d1 100644 --- a/src/instantx.cpp +++ b/src/instantx.cpp @@ -223,12 +223,10 @@ void CInstantSend::Vote(CTxLockCandidate& txLockCandidate, CConnman& connman) if(mapLockRequestAccepted.find(txHash) == mapLockRequestAccepted.end()) return; // check if we need to vote on this candidate's outpoints, // it's possible that we need to vote for several of them - std::map::iterator itOutpointLock = txLockCandidate.mapOutPointLocks.begin(); - while(itOutpointLock != txLockCandidate.mapOutPointLocks.end()) { - - int nPrevoutHeight = GetUTXOHeight(itOutpointLock->first); + for (auto& outpointLockPair : txLockCandidate.mapOutPointLocks) { + int nPrevoutHeight = GetUTXOHeight(outpointLockPair.first); if(nPrevoutHeight == -1) { - LogPrint("instantsend", "CInstantSend::Vote -- Failed to find UTXO %s\n", itOutpointLock->first.ToStringShort()); + LogPrint("instantsend", "CInstantSend::Vote -- Failed to find UTXO %s\n", outpointLockPair.first.ToStringShort()); return; } @@ -238,20 +236,18 @@ void CInstantSend::Vote(CTxLockCandidate& txLockCandidate, CConnman& connman) int nMinRequiredProtocol = std::max(MIN_INSTANTSEND_PROTO_VERSION, mnpayments.GetMinMasternodePaymentsProto()); if(!mnodeman.GetMasternodeRank(activeMasternode.outpoint, nRank, nLockInputHeight, nMinRequiredProtocol)) { LogPrint("instantsend", "CInstantSend::Vote -- Can't calculate rank for masternode %s\n", activeMasternode.outpoint.ToStringShort()); - ++itOutpointLock; continue; } int nSignaturesTotal = COutPointLock::SIGNATURES_TOTAL; if(nRank > nSignaturesTotal) { LogPrint("instantsend", "CInstantSend::Vote -- Masternode not in the top %d (%d)\n", nSignaturesTotal, nRank); - ++itOutpointLock; continue; } LogPrint("instantsend", "CInstantSend::Vote -- In the top %d (%d)\n", nSignaturesTotal, nRank); - std::map >::iterator itVoted = mapVotedOutpoints.find(itOutpointLock->first); + std::map >::iterator itVoted = mapVotedOutpoints.find(outpointLockPair.first); // Check to see if we already voted for this outpoint, // refuse to vote twice or to include the same outpoint in another tx @@ -259,23 +255,22 @@ void CInstantSend::Vote(CTxLockCandidate& txLockCandidate, CConnman& connman) if(itVoted != mapVotedOutpoints.end()) { for (const auto& hash : itVoted->second) { std::map::iterator it2 = mapTxLockCandidates.find(hash); - if(it2->second.HasMasternodeVoted(itOutpointLock->first, activeMasternode.outpoint)) { + if(it2->second.HasMasternodeVoted(outpointLockPair.first, activeMasternode.outpoint)) { // we already voted for this outpoint to be included either in the same tx or in a competing one, // skip it anyway fAlreadyVoted = true; LogPrintf("CInstantSend::Vote -- WARNING: We already voted for this outpoint, skipping: txHash=%s, outpoint=%s\n", - txHash.ToString(), itOutpointLock->first.ToStringShort()); + txHash.ToString(), outpointLockPair.first.ToStringShort()); break; } } } if(fAlreadyVoted) { - ++itOutpointLock; continue; // skip to the next outpoint } // we haven't voted for this outpoint yet, let's try to do this now - CTxLockVote vote(txHash, itOutpointLock->first, activeMasternode.outpoint); + CTxLockVote vote(txHash, outpointLockPair.first, activeMasternode.outpoint); if(!vote.Sign()) { LogPrintf("CInstantSend::Vote -- Failed to sign consensus vote\n"); @@ -289,27 +284,25 @@ void CInstantSend::Vote(CTxLockCandidate& txLockCandidate, CConnman& connman) // vote constructed sucessfully, let's store and relay it uint256 nVoteHash = vote.GetHash(); mapTxLockVotes.insert(std::make_pair(nVoteHash, vote)); - if(itOutpointLock->second.AddVote(vote)) { + if(outpointLockPair.second.AddVote(vote)) { LogPrintf("CInstantSend::Vote -- Vote created successfully, relaying: txHash=%s, outpoint=%s, vote=%s\n", - txHash.ToString(), itOutpointLock->first.ToStringShort(), nVoteHash.ToString()); + txHash.ToString(), outpointLockPair.first.ToStringShort(), nVoteHash.ToString()); if(itVoted == mapVotedOutpoints.end()) { std::set setHashes; setHashes.insert(txHash); - mapVotedOutpoints.insert(std::make_pair(itOutpointLock->first, setHashes)); + mapVotedOutpoints.insert(std::make_pair(outpointLockPair.first, setHashes)); } else { - mapVotedOutpoints[itOutpointLock->first].insert(txHash); - if(mapVotedOutpoints[itOutpointLock->first].size() > 1) { + mapVotedOutpoints[outpointLockPair.first].insert(txHash); + if(mapVotedOutpoints[outpointLockPair.first].size() > 1) { // it's ok to continue, just warn user LogPrintf("CInstantSend::Vote -- WARNING: Vote conflicts with some existing votes: txHash=%s, outpoint=%s, vote=%s\n", - txHash.ToString(), itOutpointLock->first.ToStringShort(), nVoteHash.ToString()); + txHash.ToString(), outpointLockPair.first.ToStringShort(), nVoteHash.ToString()); } } vote.Relay(connman); } - - ++itOutpointLock; } } @@ -548,11 +541,8 @@ void CInstantSend::LockTransactionInputs(const CTxLockCandidate& txLockCandidate if(!txLockCandidate.IsAllOutPointsReady()) return; - std::map::const_iterator it = txLockCandidate.mapOutPointLocks.begin(); - - while(it != txLockCandidate.mapOutPointLocks.end()) { - mapLockedOutpoints.insert(std::make_pair(it->first, txHash)); - ++it; + for (const auto& pair : txLockCandidate.mapOutPointLocks) { + mapLockedOutpoints.insert(std::make_pair(pair.first, txHash)); } LogPrint("instantsend", "CInstantSend::LockTransactionInputs -- done, txid=%s\n", txHash.ToString()); } @@ -648,12 +638,9 @@ int64_t CInstantSend::GetAverageMasternodeOrphanVoteTime() // NOTE: should never actually call this function when mapMasternodeOrphanVotes is empty if(mapMasternodeOrphanVotes.empty()) return 0; - std::map::iterator it = mapMasternodeOrphanVotes.begin(); int64_t total = 0; - - while(it != mapMasternodeOrphanVotes.end()) { - total+= it->second; - ++it; + for (const auto& pair : mapMasternodeOrphanVotes) { + total += pair.second; } return total / mapMasternodeOrphanVotes.size(); @@ -673,11 +660,10 @@ void CInstantSend::CheckAndRemove() uint256 txHash = txLockCandidate.GetHash(); if(txLockCandidate.IsExpired(nCachedBlockHeight)) { LogPrintf("CInstantSend::CheckAndRemove -- Removing expired Transaction Lock Candidate: txid=%s\n", txHash.ToString()); - std::map::iterator itOutpointLock = txLockCandidate.mapOutPointLocks.begin(); - while(itOutpointLock != txLockCandidate.mapOutPointLocks.end()) { - mapLockedOutpoints.erase(itOutpointLock->first); - mapVotedOutpoints.erase(itOutpointLock->first); - ++itOutpointLock; + + for (const auto& pair : txLockCandidate.mapOutPointLocks) { + mapLockedOutpoints.erase(pair.first); + mapVotedOutpoints.erase(pair.first); } mapLockRequestAccepted.erase(txHash); mapLockRequestRejected.erase(txHash); @@ -828,11 +814,9 @@ bool CInstantSend::IsLockedInstantSendTransaction(const uint256& txHash) if(itLockCandidate->second.mapOutPointLocks.empty()) return false; // and all of these outputs must be included in mapLockedOutpoints with correct hash - std::map::iterator itOutpointLock = itLockCandidate->second.mapOutPointLocks.begin(); - while(itOutpointLock != itLockCandidate->second.mapOutPointLocks.end()) { + for (const auto& pair : itLockCandidate->second.mapOutPointLocks) { uint256 hashLocked; - if(!GetLockedOutPointTxHash(itOutpointLock->first, hashLocked) || hashLocked != txHash) return false; - ++itOutpointLock; + if(!GetLockedOutPointTxHash(pair.first, hashLocked) || hashLocked != txHash) return false; } return true; @@ -912,35 +896,28 @@ void CInstantSend::SyncTransaction(const CTransaction& tx, const CBlockIndex *pi txHash.ToString(), nHeightNew); itLockCandidate->second.SetConfirmedHeight(nHeightNew); // Loop through outpoint locks - std::map::iterator itOutpointLock = itLockCandidate->second.mapOutPointLocks.begin(); - while(itOutpointLock != itLockCandidate->second.mapOutPointLocks.end()) { + for (const auto& pair : itLockCandidate->second.mapOutPointLocks) { + // Check corresponding lock votes - std::vector vVotes = itOutpointLock->second.GetVotes(); - std::vector::iterator itVote = vVotes.begin(); - std::map::iterator it; - while(itVote != vVotes.end()) { - uint256 nVoteHash = itVote->GetHash(); + for (const auto& vote : pair.second.GetVotes()) { + uint256 nVoteHash = vote.GetHash(); LogPrint("instantsend", "CInstantSend::SyncTransaction -- txid=%s nHeightNew=%d vote %s updated\n", txHash.ToString(), nHeightNew, nVoteHash.ToString()); - it = mapTxLockVotes.find(nVoteHash); + const auto& it = mapTxLockVotes.find(nVoteHash); if(it != mapTxLockVotes.end()) { it->second.SetConfirmedHeight(nHeightNew); } - ++itVote; } - ++itOutpointLock; } } // check orphan votes - std::map::iterator itOrphanVote = mapTxLockVotesOrphan.begin(); - while(itOrphanVote != mapTxLockVotesOrphan.end()) { - if(itOrphanVote->second.GetTxHash() == txHash) { + for (const auto& pair : mapTxLockVotesOrphan) { + if(pair.second.GetTxHash() == txHash) { LogPrint("instantsend", "CInstantSend::SyncTransaction -- txid=%s nHeightNew=%d vote %s updated\n", - txHash.ToString(), nHeightNew, itOrphanVote->first.ToString()); - mapTxLockVotes[itOrphanVote->first].SetConfirmedHeight(nHeightNew); + txHash.ToString(), nHeightNew, pair.first.ToString()); + mapTxLockVotes[pair.first].SetConfirmedHeight(nHeightNew); } - ++itOrphanVote; } } @@ -1178,10 +1155,8 @@ bool COutPointLock::AddVote(const CTxLockVote& vote) std::vector COutPointLock::GetVotes() const { std::vector vRet; - std::map::const_iterator itVote = mapMasternodeVotes.begin(); - while(itVote != mapMasternodeVotes.end()) { - vRet.push_back(itVote->second); - ++itVote; + for (const auto& pair : mapMasternodeVotes) { + vRet.push_back(pair.second); } return vRet; } @@ -1193,10 +1168,8 @@ bool COutPointLock::HasMasternodeVoted(const COutPoint& outpointMasternodeIn) co void COutPointLock::Relay(CConnman& connman) const { - std::map::const_iterator itVote = mapMasternodeVotes.begin(); - while(itVote != mapMasternodeVotes.end()) { - itVote->second.Relay(connman); - ++itVote; + for (const auto& pair : mapMasternodeVotes) { + pair.second.Relay(connman); } } @@ -1227,10 +1200,8 @@ bool CTxLockCandidate::IsAllOutPointsReady() const { if(mapOutPointLocks.empty()) return false; - std::map::const_iterator it = mapOutPointLocks.begin(); - while(it != mapOutPointLocks.end()) { - if(!it->second.IsReady()) return false; - ++it; + for (const auto& pair : mapOutPointLocks) { + if(!pair.second.IsReady()) return false; } return true; } @@ -1245,10 +1216,8 @@ int CTxLockCandidate::CountVotes() const { // Note: do NOT use vote count to figure out if tx is locked, use IsAllOutPointsReady() instead int nCountVotes = 0; - std::map::const_iterator it = mapOutPointLocks.begin(); - while(it != mapOutPointLocks.end()) { - nCountVotes += it->second.CountVotes(); - ++it; + for (const auto& pair : mapOutPointLocks) { + nCountVotes += pair.second.CountVotes(); } return nCountVotes; } @@ -1267,9 +1236,7 @@ bool CTxLockCandidate::IsTimedOut() const void CTxLockCandidate::Relay(CConnman& connman) const { connman.RelayTransaction(*txLockRequest.tx); - std::map::const_iterator itOutpointLock = mapOutPointLocks.begin(); - while(itOutpointLock != mapOutPointLocks.end()) { - itOutpointLock->second.Relay(connman); - ++itOutpointLock; + for (const auto& pair : mapOutPointLocks) { + pair.second.Relay(connman); } } diff --git a/src/masternode-payments.cpp b/src/masternode-payments.cpp index df8e78982f2c..34e6b6e51541 100644 --- a/src/masternode-payments.cpp +++ b/src/masternode-payments.cpp @@ -1009,12 +1009,11 @@ void CMasternodePayments::RequestLowDataPaymentBlocks(CNode* pnode, CConnman& co pindex = pindex->pprev; } - auto it = mapMasternodeBlocks.begin(); - - while(it != mapMasternodeBlocks.end()) { + for (auto& mnBlockPayees : mapMasternodeBlocks) { + int nBlockHeight = mnBlockPayees.first; int nTotalVotes = 0; bool fFound = false; - for (const auto& payee : it->second.vecPayees) { + for (const auto& payee : mnBlockPayees.second.vecPayees) { if(payee.GetVoteCount() >= MNPAYMENTS_SIGNATURES_REQUIRED) { fFound = true; break; @@ -1025,24 +1024,23 @@ void CMasternodePayments::RequestLowDataPaymentBlocks(CNode* pnode, CConnman& co // or no clear winner was found but there are at least avg number of votes if(fFound || nTotalVotes >= (MNPAYMENTS_SIGNATURES_TOTAL + MNPAYMENTS_SIGNATURES_REQUIRED)/2) { // so just move to the next block - ++it; continue; } // DEBUG DBG ( // Let's see why this failed - for (const auto& payee : it->second.vecPayees) { + for (const auto& payee : mnBlockPayees.second.vecPayees) { CTxDestination address1; ExtractDestination(payee.GetPayee(), address1); CBitcoinAddress address2(address1); printf("payee %s votes %d\n", address2.ToString().c_str(), payee.GetVoteCount()); } - printf("block %d votes total %d\n", it->first, nTotalVotes); + printf("block %d votes total %d\n", nBlockHeight, nTotalVotes); ) // END DEBUG // Low data block found, let's try to sync it uint256 hash; - if(GetBlockHash(hash, it->first)) { + if(GetBlockHash(hash, nBlockHeight)) { vToFetch.push_back(CInv(MSG_MASTERNODE_PAYMENT_BLOCK, hash)); } // We should not violate GETDATA rules @@ -1052,7 +1050,6 @@ void CMasternodePayments::RequestLowDataPaymentBlocks(CNode* pnode, CConnman& co // Start filling new batch vToFetch.clear(); } - ++it; } // Ask for the rest of it if(!vToFetch.empty()) { diff --git a/src/masternodeman.cpp b/src/masternodeman.cpp index 815cd09f3eb2..a0c763c0d2a1 100644 --- a/src/masternodeman.cpp +++ b/src/masternodeman.cpp @@ -772,14 +772,11 @@ void CMasternodeMan::ProcessPendingMnbRequests(CConnman& connman) bool fDone = connman.ForNode(itPendingMNB->first, [&](CNode* pnode) { // compile request vector std::vector vToFetch; - std::set& setHashes = itPendingMNB->second.second; - std::set::iterator it = setHashes.begin(); - while(it != setHashes.end()) { - if(*it != uint256()) { - vToFetch.push_back(CInv(MSG_MASTERNODE_ANNOUNCE, *it)); - LogPrint("masternode", "-- asking for mnb %s from addr=%s\n", it->ToString(), pnode->addr.ToString()); + for (auto& nHash : itPendingMNB->second.second) { + if(nHash != uint256()) { + vToFetch.push_back(CInv(MSG_MASTERNODE_ANNOUNCE, nHash)); + LogPrint("masternode", "-- asking for mnb %s from addr=%s\n", nHash.ToString(), pnode->addr.ToString()); } - ++it; } // ask for data @@ -1013,20 +1010,18 @@ void CMasternodeMan::DoFullVerificationStep(CConnman& connman) int nRanksTotal = (int)vecMasternodeRanks.size(); // send verify requests only if we are in top MAX_POSE_RANK - rank_pair_vec_t::iterator it = vecMasternodeRanks.begin(); - while(it != vecMasternodeRanks.end()) { - if(it->first > MAX_POSE_RANK) { + for (auto& rankPair : vecMasternodeRanks) { + if(rankPair.first > MAX_POSE_RANK) { LogPrint("masternode", "CMasternodeMan::DoFullVerificationStep -- Must be in top %d to send verify request\n", (int)MAX_POSE_RANK); return; } - if(it->second.outpoint == activeMasternode.outpoint) { - nMyRank = it->first; + if(rankPair.second.outpoint == activeMasternode.outpoint) { + nMyRank = rankPair.first; LogPrint("masternode", "CMasternodeMan::DoFullVerificationStep -- Found self at rank %d/%d, verifying up to %d masternodes\n", nMyRank, nRanksTotal, (int)MAX_POSE_CONNECTIONS); break; } - ++it; } // edge case: list is too short and this masternode is not enabled @@ -1044,7 +1039,7 @@ void CMasternodeMan::DoFullVerificationStep(CConnman& connman) sort(vSortedByAddr.begin(), vSortedByAddr.end(), CompareByAddr()); - it = vecMasternodeRanks.begin() + nOffset; + auto it = vecMasternodeRanks.begin() + nOffset; while(it != vecMasternodeRanks.end()) { if(it->second.IsPoSeVerified() || it->second.IsPoSeBanned()) { LogPrint("masternode", "CMasternodeMan::DoFullVerificationStep -- Already %s%s%s masternode %s address %s, skipping...\n", diff --git a/src/privatesend-client.cpp b/src/privatesend-client.cpp index 02e43e8d0c85..eb411f78b121 100644 --- a/src/privatesend-client.cpp +++ b/src/privatesend-client.cpp @@ -1342,7 +1342,8 @@ bool CPrivateSendClient::CreateDenominated(const CompactTallyItem& tallyItem, bo do { std::vector vecStandardDenoms = CPrivateSend::GetStandardDenominations(); - BOOST_REVERSE_FOREACH(CAmount nDenomValue, vecStandardDenoms) { + for (auto it = vecStandardDenoms.rbegin(); it != vecStandardDenoms.rend(); ++it) { + CAmount nDenomValue = *it; if(fSkip) { // Note: denoms are skipped if there are already DENOMS_COUNT_MAX of them diff --git a/src/privatesend.cpp b/src/privatesend.cpp index 42852d49f826..b991667262f0 100644 --- a/src/privatesend.cpp +++ b/src/privatesend.cpp @@ -417,8 +417,8 @@ int CPrivateSend::GetDenominationsByAmounts(const std::vector& vecAmoun CScript scriptTmp = CScript(); std::vector vecTxOut; - BOOST_REVERSE_FOREACH(CAmount nAmount, vecAmount) { - CTxOut txout(nAmount, scriptTmp); + for (auto it = vecAmount.rbegin(); it != vecAmount.rend(); ++it) { + CTxOut txout((*it), scriptTmp); vecTxOut.push_back(txout); } diff --git a/src/spork.cpp b/src/spork.cpp index a00f6f7536c6..4ecdddc8d1c0 100644 --- a/src/spork.cpp +++ b/src/spork.cpp @@ -73,12 +73,8 @@ void CSporkManager::ProcessSpork(CNode* pfrom, const std::string& strCommand, CD ExecuteSpork(spork.nSporkID, spork.nValue); } else if (strCommand == NetMsgType::GETSPORKS) { - - std::map::iterator it = mapSporksActive.begin(); - - while(it != mapSporksActive.end()) { - connman.PushMessage(pfrom, CNetMsgMaker(pfrom->GetSendVersion()).Make(NetMsgType::SPORK, it->second)); - it++; + for (const auto& pair : mapSporksActive) { + connman.PushMessage(pfrom, CNetMsgMaker(pfrom->GetSendVersion()).Make(NetMsgType::SPORK, pair.second)); } } From 42c193df08362ba480cd9315af393081e553ab8c Mon Sep 17 00:00:00 2001 From: Nathan Marley Date: Thu, 12 Jul 2018 16:08:22 +0700 Subject: [PATCH 011/400] replace map count/insert w/emplace in instantx.cpp (#2165) * replace map count/insert w/emplace in instantx.cpp This feels like an optimization, something about: ``` if map.count(key) return false else insert(pair) return true ``` ... just feels icky. Plus, `vote.GetMasternodeOutpoint()` is only called once. The previous version might be slightly more readable, however. * use std::pair template constructor shortcut --- src/instantx.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/instantx.cpp b/src/instantx.cpp index 4bd0c0b483d1..afe7f7e10f2d 100644 --- a/src/instantx.cpp +++ b/src/instantx.cpp @@ -1146,10 +1146,7 @@ bool CTxLockVote::IsFailed() const bool COutPointLock::AddVote(const CTxLockVote& vote) { - if(mapMasternodeVotes.count(vote.GetMasternodeOutpoint())) - return false; - mapMasternodeVotes.insert(std::make_pair(vote.GetMasternodeOutpoint(), vote)); - return true; + return mapMasternodeVotes.emplace(vote.GetMasternodeOutpoint(), vote).second; } std::vector COutPointLock::GetVotes() const From e23339d6f0b1658e4e8bfb783bae263fb50c73ae Mon Sep 17 00:00:00 2001 From: Nathan Marley Date: Thu, 12 Jul 2018 16:08:43 +0700 Subject: [PATCH 012/400] use nullptr in Dash-specific code (#2166) This is recommended in modern C++ code as nullptr is more type-safe and can't be converted to an integer, unlike NULL. --- src/governance-classes.cpp | 2 +- src/governance-object.cpp | 2 +- src/governance.cpp | 12 ++++++------ src/governance.h | 4 ++-- src/masternode.cpp | 4 ++-- src/masternodeconfig.cpp | 2 +- src/masternodeman.cpp | 18 +++++++++--------- src/privatesend-client.cpp | 2 +- src/rpc/governance.cpp | 6 +++--- 9 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/governance-classes.cpp b/src/governance-classes.cpp index 4cb2c00dcf28..6722efe26622 100644 --- a/src/governance-classes.cpp +++ b/src/governance-classes.cpp @@ -284,7 +284,7 @@ bool CSuperblockManager::IsSuperblockTriggered(int nBlockHeight) CGovernanceObject* pObj = pSuperblock->GetGovernanceObject(); if(!pObj) { - LogPrintf("CSuperblockManager::IsSuperblockTriggered -- pObj == NULL, continuing\n"); + LogPrintf("CSuperblockManager::IsSuperblockTriggered -- pObj == nullptr, continuing\n"); DBG( std::cout << "IsSuperblockTriggered pObj is NULL, continuing" << std::endl; ); continue; } diff --git a/src/governance-object.cpp b/src/governance-object.cpp index 890c1c14db8f..0874139ec0f5 100644 --- a/src/governance-object.cpp +++ b/src/governance-object.cpp @@ -777,7 +777,7 @@ void CGovernanceObject::CheckOrphanVotes(CConnman& connman) continue; } CGovernanceException exception; - if(!ProcessVote(NULL, vote, exception, connman)) { + if(!ProcessVote(nullptr, vote, exception, connman)) { LogPrintf("CGovernanceObject::CheckOrphanVotes -- Failed to add orphan vote: %s\n", exception.what()); } else { diff --git a/src/governance.cpp b/src/governance.cpp index 0a86adaf0fed..7909a7a1cb5f 100644 --- a/src/governance.cpp +++ b/src/governance.cpp @@ -65,7 +65,7 @@ bool CGovernanceManager::HaveVoteForHash(const uint256& nHash) const { LOCK(cs); - CGovernanceObject* pGovobj = NULL; + CGovernanceObject* pGovobj = nullptr; return cmapVoteToObject.Get(nHash, pGovobj) && pGovobj->GetVoteFile().HasVote(nHash); } @@ -79,7 +79,7 @@ bool CGovernanceManager::SerializeVoteForHash(const uint256& nHash, CDataStream& { LOCK(cs); - CGovernanceObject* pGovobj = NULL; + CGovernanceObject* pGovobj = nullptr; return cmapVoteToObject.Get(nHash,pGovobj) && pGovobj->GetVoteFile().SerializeVoteToStream(nHash, ss); } @@ -287,7 +287,7 @@ void CGovernanceManager::CheckOrphanVotes(CGovernanceObject& govobj, CGovernance if(pairVote.second < nNow) { fRemove = true; } - else if(govobj.ProcessVote(NULL, vote, exception, connman)) { + else if(govobj.ProcessVote(nullptr, vote, exception, connman)) { vote.Relay(connman); fRemove = true; } @@ -350,7 +350,7 @@ void CGovernanceManager::AddGovernanceObject(CGovernanceObject& govobj, CConnman DBG( std::cout << "CGovernanceManager::AddGovernanceObject After AddNewTrigger" << std::endl; ); } - LogPrintf("CGovernanceManager::AddGovernanceObject -- %s new, received from %s\n", strHash, pfrom? pfrom->GetAddrName() : "NULL"); + LogPrintf("CGovernanceManager::AddGovernanceObject -- %s new, received from %s\n", strHash, pfrom ? pfrom->GetAddrName() : "nullptr"); govobj.Relay(connman); // Update the rate buffer @@ -489,7 +489,7 @@ CGovernanceObject* CGovernanceManager::FindGovernanceObject(const uint256& nHash if(mapObjects.count(nHash)) return &mapObjects[nHash]; - return NULL; + return nullptr; } std::vector CGovernanceManager::GetMatchingVotes(const uint256& nParentHash) const @@ -624,7 +624,7 @@ bool CGovernanceManager::ConfirmInventoryRequest(const CInv& inv) } - hash_s_t* setHash = NULL; + hash_s_t* setHash = nullptr; switch(inv.type) { case MSG_GOVERNANCE_OBJECT: setHash = &setRequestedObjects; diff --git a/src/governance.h b/src/governance.h index 73be71e533e2..9a0bac58d1b3 100644 --- a/src/governance.h +++ b/src/governance.h @@ -307,7 +307,7 @@ class CGovernanceManager std::vector GetCurrentVotes(const uint256& nParentHash, const COutPoint& mnCollateralOutpointFilter) const; std::vector GetAllNewerThan(int64_t nMoreThanTime) const; - void AddGovernanceObject(CGovernanceObject& govobj, CConnman& connman, CNode* pfrom = NULL); + void AddGovernanceObject(CGovernanceObject& govobj, CConnman& connman, CNode* pfrom = nullptr); void UpdateCachesAndClean(); @@ -388,7 +388,7 @@ class CGovernanceManager bool MasternodeRateCheck(const CGovernanceObject& govobj, bool fUpdateFailStatus, bool fForce, bool& fRateCheckBypassed); bool ProcessVoteAndRelay(const CGovernanceVote& vote, CGovernanceException& exception, CConnman& connman) { - bool fOK = ProcessVote(NULL, vote, exception, connman); + bool fOK = ProcessVote(nullptr, vote, exception, connman); if(fOK) { vote.Relay(connman); } diff --git a/src/masternode.cpp b/src/masternode.cpp index 024a9aa90488..53f0e9285664 100644 --- a/src/masternode.cpp +++ b/src/masternode.cpp @@ -343,7 +343,7 @@ void CMasternode::UpdateLastPaid(const CBlockIndex *pindex, int nMaxBlocksToScan } } - if (BlockReading->pprev == NULL) { assert(BlockReading); break; } + if (BlockReading->pprev == nullptr) { assert(BlockReading); break; } BlockReading = BlockReading->pprev; } @@ -847,7 +847,7 @@ bool CMasternodePing::CheckAndUpdate(CMasternode* pmn, bool fFromNewBroadcast, i return false; } - if (pmn == NULL) { + if (pmn == nullptr) { LogPrint("masternode", "CMasternodePing::CheckAndUpdate -- Couldn't find Masternode entry, masternode=%s\n", masternodeOutpoint.ToStringShort()); return false; } diff --git a/src/masternodeconfig.cpp b/src/masternodeconfig.cpp index 2dac44eaf195..0e2e67be796a 100644 --- a/src/masternodeconfig.cpp +++ b/src/masternodeconfig.cpp @@ -21,7 +21,7 @@ bool CMasternodeConfig::read(std::string& strErrRet) { if (!streamConfig.good()) { FILE* configFile = fopen(pathMasternodeConfigFile.string().c_str(), "a"); - if (configFile != NULL) { + if (configFile != nullptr) { std::string strHeader = "# Masternode config file\n" "# Format: alias IP:port masternodeprivkey collateral_output_txid collateral_output_index\n" "# Example: mn1 127.0.0.2:19999 93HaYBVUCYjEMeeH1Y4sBGLALQZE1Yc1K64xiqgX37tGBDQL8Xg 2bcd3c84c84f87eaa86e4e56834c92927a07f9e18718810b92e0d0324456a67c 0\n"; diff --git a/src/masternodeman.cpp b/src/masternodeman.cpp index a0c763c0d2a1..9e7f07d2e955 100644 --- a/src/masternodeman.cpp +++ b/src/masternodeman.cpp @@ -253,7 +253,7 @@ void CMasternodeMan::CheckAndRemove(CConnman& connman) // mapSeenMasternodeBroadcast.erase(itMnbReplies->first); int nDos; itMnbReplies->second[0].fRecovery = true; - CheckMnbAndUpdateMasternodeList(NULL, itMnbReplies->second[0], nDos, connman); + CheckMnbAndUpdateMasternodeList(nullptr, itMnbReplies->second[0], nDos, connman); } LogPrint("masternode", "CMasternodeMan::CheckAndRemove -- removing mnb recovery reply, masternode=%s, size=%d\n", itMnbReplies->second[0].outpoint.ToStringShort(), (int)itMnbReplies->second.size()); mMnbRecoveryGoodReplies.erase(itMnbReplies++); @@ -445,7 +445,7 @@ CMasternode* CMasternodeMan::Find(const COutPoint &outpoint) { LOCK(cs); auto it = mapMasternodes.find(outpoint); - return it == mapMasternodes.end() ? NULL : &(it->second); + return it == mapMasternodes.end() ? nullptr : &(it->second); } bool CMasternodeMan::Get(const COutPoint& outpoint, CMasternode& masternodeRet) @@ -571,7 +571,7 @@ bool CMasternodeMan::GetNextMasternodeInQueueForPayment(int nBlockHeight, bool f int nTenthNetwork = nMnCount/10; int nCountTenth = 0; arith_uint256 nHighest = 0; - const CMasternode *pBestMasternode = NULL; + const CMasternode *pBestMasternode = nullptr; for (const auto& s : vecMasternodeLastPaid) { arith_uint256 nScore = s.second->CalculateScore(blockHash); if(nScore > nHighest){ @@ -862,7 +862,7 @@ void CMasternodeMan::ProcessMessage(CNode* pfrom, const std::string& strCommand, if(nDos > 0) { // if anything significant failed, mark that node Misbehaving(pfrom->GetId(), nDos); - } else if(pmn != NULL) { + } else if(pmn != nullptr) { // nothing significant failed, mn is a known one too return; } @@ -1081,8 +1081,8 @@ void CMasternodeMan::CheckSameAddr() { LOCK(cs); - CMasternode* pprevMasternode = NULL; - CMasternode* pverifiedMasternode = NULL; + CMasternode* pprevMasternode = nullptr; + CMasternode* pverifiedMasternode = nullptr; for (auto& mnpair : mapMasternodes) { vSortedByAddr.push_back(&mnpair.second); @@ -1096,7 +1096,7 @@ void CMasternodeMan::CheckSameAddr() // initial step if(!pprevMasternode) { pprevMasternode = pmn; - pverifiedMasternode = pmn->IsPoSeVerified() ? pmn : NULL; + pverifiedMasternode = pmn->IsPoSeVerified() ? pmn : nullptr; continue; } // second+ step @@ -1111,7 +1111,7 @@ void CMasternodeMan::CheckSameAddr() pverifiedMasternode = pmn; } } else { - pverifiedMasternode = pmn->IsPoSeVerified() ? pmn : NULL; + pverifiedMasternode = pmn->IsPoSeVerified() ? pmn : nullptr; } pprevMasternode = pmn; } @@ -1276,7 +1276,7 @@ void CMasternodeMan::ProcessVerifyReply(CNode* pnode, CMasternodeVerification& m { LOCK(cs); - CMasternode* prealMasternode = NULL; + CMasternode* prealMasternode = nullptr; std::vector vpMasternodesToBan; uint256 hash1 = mnv.GetSignatureHash1(blockHash); diff --git a/src/privatesend-client.cpp b/src/privatesend-client.cpp index eb411f78b121..61f4f427909f 100644 --- a/src/privatesend-client.cpp +++ b/src/privatesend-client.cpp @@ -486,7 +486,7 @@ bool CPrivateSendClient::CheckPoolStateUpdate(PoolState nStateNew, int nEntriesC // bool CPrivateSendClient::SignFinalTransaction(const CTransaction& finalTransactionNew, CNode* pnode, CConnman& connman) { - if(fMasternodeMode || pnode == NULL) return false; + if(fMasternodeMode || pnode == nullptr) return false; finalMutableTransaction = finalTransactionNew; LogPrintf("CPrivateSendClient::SignFinalTransaction -- finalMutableTransaction=%s", finalMutableTransaction.ToString()); diff --git a/src/rpc/governance.cpp b/src/rpc/governance.cpp index 830e9f7cdcd6..a6b1ebaed5d0 100644 --- a/src/rpc/governance.cpp +++ b/src/rpc/governance.cpp @@ -717,7 +717,7 @@ UniValue gobject(const JSONRPCRequest& request) // FIND THE GOVERNANCE OBJECT THE USER IS LOOKING FOR CGovernanceObject* pGovObj = governance.FindGovernanceObject(hash); - if(pGovObj == NULL) + if(pGovObj == nullptr) throw JSONRPCError(RPC_INVALID_PARAMETER, "Unknown governance object"); // REPORT BASIC OBJECT STATS @@ -797,7 +797,7 @@ UniValue gobject(const JSONRPCRequest& request) CGovernanceObject* pGovObj = governance.FindGovernanceObject(hash); - if(pGovObj == NULL) { + if(pGovObj == nullptr) { throw JSONRPCError(RPC_INVALID_PARAMETER, "Unknown governance-hash"); } @@ -840,7 +840,7 @@ UniValue gobject(const JSONRPCRequest& request) CGovernanceObject* pGovObj = governance.FindGovernanceObject(hash); - if(pGovObj == NULL) { + if(pGovObj == nullptr) { throw JSONRPCError(RPC_INVALID_PARAMETER, "Unknown governance-hash"); } From 5036d7dfc525f16dfb6394fed9af1555e064febf Mon Sep 17 00:00:00 2001 From: Oleg Girko Date: Thu, 12 Jul 2018 10:09:02 +0100 Subject: [PATCH 013/400] depends: Update Qt download url (#2177) --- depends/packages/qt.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/packages/qt.mk b/depends/packages/qt.mk index d5354c6bf650..e8301eb692a8 100644 --- a/depends/packages/qt.mk +++ b/depends/packages/qt.mk @@ -1,6 +1,6 @@ PACKAGE=qt $(package)_version=5.7.1 -$(package)_download_path=http://download.qt.io/official_releases/qt/5.7/$($(package)_version)/submodules +$(package)_download_path=https://download.qt.io/archive/qt/5.7/$($(package)_version)/submodules $(package)_suffix=opensource-src-$($(package)_version).tar.gz $(package)_file_name=qtbase-$($(package)_suffix) $(package)_sha256_hash=95f83e532d23b3ddbde7973f380ecae1bac13230340557276f75f2e37984e410 From 23dde9f12b7970b71e22193218787df16cad4c4f Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Thu, 12 Jul 2018 11:17:19 +0200 Subject: [PATCH 014/400] Remove a few annoying debug prints from CMasternodeMan (#2179) These are occurring every second and cause more noise than actual information. --- src/masternodeman.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/masternodeman.cpp b/src/masternodeman.cpp index 9e7f07d2e955..89434e3155df 100644 --- a/src/masternodeman.cpp +++ b/src/masternodeman.cpp @@ -163,8 +163,6 @@ void CMasternodeMan::Check() { LOCK2(cs_main, cs); - LogPrint("masternode", "CMasternodeMan::Check -- nLastSentinelPingTime=%d, IsSentinelPingActive()=%d\n", nLastSentinelPingTime, IsSentinelPingActive()); - for (auto& mnpair : mapMasternodes) { // NOTE: internally it checks only every MASTERNODE_CHECK_SECONDS seconds // since the last time, so expect some MNs to skip this @@ -795,7 +793,6 @@ void CMasternodeMan::ProcessPendingMnbRequests(CConnman& connman) ++itPendingMNB; } } - LogPrint("masternode", "%s -- mapPendingMNB size: %d\n", __func__, mapPendingMNB.size()); } void CMasternodeMan::ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStream& vRecv, CConnman& connman) @@ -1170,7 +1167,6 @@ void CMasternodeMan::ProcessPendingMnvRequests(CConnman& connman) ++itPendingMNV; } } - LogPrint("masternode", "%s -- mapPendingMNV size: %d\n", __func__, mapPendingMNV.size()); } void CMasternodeMan::SendVerifyReply(CNode* pnode, CMasternodeVerification& mnv, CConnman& connman) From f3e380659a89afdce5b3e43a77c9ae9d052f8d20 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Thu, 12 Jul 2018 15:28:59 +0200 Subject: [PATCH 015/400] Move to in-docker CI builds and add Jenkins support (#2178) * GCC-7 and glibc-2.27 compat code * Statically link libstdc++ for GCC based builds Makes sure binaries which are built on a newer build host still work on older distros. * Use python3 when installing MacOS native tools * Move actual build logic out of Travis and upgrade to gcc-7 Travis will now simply call a few scripts which do the actual work. These scripts will first create a "builder image" which contains the necessary environment for the actual build. Then scripts are called inside this builder image to do the build. This should make us more independant from Travis and also allows us to do local CI testing. The build matrix is also moved out of .travis.yml and instead moved into ci/matrix.sh. This script is sourced with only "BUILD_TARGET" being set so that it internally can figure out which other environment variables need to be set. This commit also upgrades the used GCC version to 7. This is due to the use of ubuntu:bionic as base image for the builder image. * Add Jenkinsfiles for regular CI and nightly gitian builds * Automatically download OSX SDK in gitian-build.sh * Remove bogus "export MAKEJOBS=-j5" * Forward cache/src dirs into builder container Fixes caching issues on Travis. * fix * Fail build immediately when building depends took too long --- .travis.yml | 116 ++++++++++--------------- Jenkinsfile | 93 ++++++++++++++++++++ Jenkinsfile.gitian | 123 +++++++++++++++++++++++++++ ci/Dockerfile.builder | 58 +++++++++++++ ci/Dockerfile.gitian-builder | 17 ++++ ci/build_depends.sh | 29 +++++++ ci/build_src.sh | 37 ++++++++ ci/matrix.sh | 88 +++++++++++++++++++ ci/test_integrationtests.sh | 18 ++++ ci/test_unittests.sh | 27 ++++++ contrib/gitian-build.sh | 10 +++ depends/hosts/linux.mk | 2 +- depends/hosts/mingw32.mk | 2 +- depends/packages/native_biplist.mk | 4 +- depends/packages/native_ds_store.mk | 4 +- depends/packages/native_mac_alias.mk | 4 +- src/Makefile.am | 1 + src/compat/glibc_compat.cpp | 45 ++++++++++ 18 files changed, 601 insertions(+), 77 deletions(-) create mode 100644 Jenkinsfile create mode 100644 Jenkinsfile.gitian create mode 100644 ci/Dockerfile.builder create mode 100644 ci/Dockerfile.gitian-builder create mode 100755 ci/build_depends.sh create mode 100755 ci/build_src.sh create mode 100755 ci/matrix.sh create mode 100755 ci/test_integrationtests.sh create mode 100755 ci/test_unittests.sh diff --git a/.travis.yml b/.travis.yml index 5a81f2049473..70267409a506 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,18 +1,21 @@ # errata: -# - A travis bug causes caches to trample eachother when using the same -# compiler key (which we don't use anyway). This is worked around for now by -# replacing the "compilers" with a build name prefixed by the no-op ":" -# command. See: https://github.com/travis-ci/travis-ci/issues/4393 # - sudo/dist/group are set so as to get Blue Box VMs, necessary for [loopback] # IPv6 support sudo: required dist: trusty -group: deprecated-2017Q3 os: linux language: generic +addons: + apt: + packages: + # Use more recent docker version + - docker-ce + # Can be removed if Travis ever upgrades to Bionic + - realpath + services: - docker @@ -20,9 +23,7 @@ cache: apt: true ccache: true directories: - - depends/built - - depends/sdk-sources - - $HOME/.ccache + - $HOME/cache env: global: @@ -30,78 +31,55 @@ env: - secure: "J0T+zrRBBzBnxoioCD378cRSJUF8Vms32QMmrENVVfuJl03oBQv0QxSatLEiD4PtRPrN00mJ8/k/HdqFQ0SN1yg6a00duOZ6C9jk6t/fExBO1LNhp3Z7lcaMUrNEyRN6sgfVeznDVTGj9jBQU2HNlwHk0UD9BNp/k+Bjhrtw7Njp9JTLZKBgxrXk0WZmfk0d75Q+9DajA1j2tSfWVpwzv6HMGfqIH1wsVEakBY+tnaE6EO3IdzdWHhf/iV+Tx0tL0Qz/6mejgSuoGLTJLmeTrceTTmsDlN3B95y+XfcYDs6EP7gpzN8Ffg/mLV8xJ2Myj7+b1o+smMJZE5tLuPIeAu0YsfkPNa/tNLotOlDxF72per0kXyNYbRf+JrpxiOu9pLCtdtd40V2SsiNhpQqHVy+b+wkkqo2syTHT+9UNkqEi3WFm6TqFuOeQNtDm6R0hRl/Talw/ZEeKs68z1Cf6VyBrZG5LqtOurtWlKwXCe/Tr1i2g4BEAcbywphtCCcfgMK9YSGQnjKkGk6k9gVEa2bneYLZz1RSh2OpXnIsIJOX7X0hNd5xtQDLgbpSUlKwVcEriWeGe12GCszKNX9gdEo2bHeq4xAJ6BE+ot745z9dc+nC2BJ6Su+I5L6zBg4m2FWn0TWhPvz/6JR26t6ls/E7m+hkwJTCHnIUiFmmzpEw=" # DOCKER_HUB_PASSWORD - secure: "RLzlMhfLqwSBrZqJOVOd61suXBn+HtUR3vOZfuFYF/Qmjjj5TE41+rObZmzc54hP/ZL+OH6blnibpvfDXlX+eN38ivFQfuxkJIGL68SJsEwNBRwW39Yw6Hl5RdI41MLCH7ByN15wifLp1JKBilHJ7XGMOUjI7P0yl7JjX8GBXUCtJbVLRugo80/yn+XQ1NdnlpbpYHNjMEQFWSODPa3pSK5McWvyQjDZDgS+IkdrZmIYJPMa7bmKH5I/edUPSmXQT905FgEwq9u8XR0SyBopli21EK9l6GkXIIvmDTYz5vT26Apvi2B4Aoazlklg+KNRUJuLGerpt6kbnU0gMSUChVkFfFhOk6GRSN3a/AUfD2FOudvMhet2QvlPHx+GYdEUr5XVo5HW42pHsqfD6eDtHd8VLTsHP0q4C8V85fNMv21lkkehy2ry8fx/RRy6x4O2wg2mua+79UkGKXp75gMKzWEcth34PCFCOu37l2F8R/ANnrQ52K/8vIQ88TtU2OpYX89fHjLojBxu+WKEBGZH2LRPsZBOUHeeO5C/xKDrhZU24ORnMW8wg66Qg5GIX1KI4a8yp73Mpues5hzpJ6wkMuRrQt40ymKndLCjv8KSd+5BfP6Or/KIrzDNYdZaasjk7JNi6rcZmm9d3fTAo+Ja/mjpUCIOo3SX14luzVCJIig=" - - MAKEJOBS=-j5 - - RUN_TESTS=false - - CHECK_DOC=0 - - BOOST_TEST_RANDOM=1$TRAVIS_BUILD_ID - - CCACHE_SIZE=400M - - CCACHE_TEMPDIR=/tmp/.ccache-temp - - CCACHE_COMPRESS=1 - - BASE_OUTDIR=$TRAVIS_BUILD_DIR/out - - SDK_URL=https://bitcoincore.org/depends-sources/sdks - - PYTHON_DEBUG=1 - - WINEDEBUG=fixme-all - DOCKER_BUILD=false matrix: -# ARM - - HOST=arm-linux-gnueabihf PPA="ppa:bitcoin/bitcoin" PACKAGES="g++-arm-linux-gnueabihf" DEP_OPTS="NO_QT=1" CHECK_DOC=1 GOAL="install" BITCOIN_CONFIG="--enable-glibc-back-compat --enable-reduce-exports" -# Win32 - - HOST=i686-w64-mingw32 DPKG_ADD_ARCH="i386" DEP_OPTS="NO_QT=1" PPA="ppa:bitcoin/bitcoin" PACKAGES="python3 nsis g++-mingw-w64-i686 wine1.7 bc" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-gui --enable-reduce-exports" MAKEJOBS="-j4" -# 32-bit + dash - - HOST=i686-pc-linux-gnu PPA="ppa:bitcoin/bitcoin" PACKAGES="g++-multilib bc python3-zmq" DEP_OPTS="NO_QT=1" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-zmq --enable-glibc-back-compat --enable-reduce-exports LDFLAGS=-static-libstdc++" USE_SHELL="/bin/dash" PYZMQ=true -# Win64 - - HOST=x86_64-w64-mingw32 DPKG_ADD_ARCH="i386" DEP_OPTS="NO_QT=1" PPA="ppa:bitcoin/bitcoin" PACKAGES="python3 nsis g++-mingw-w64-x86-64 wine1.7 bc" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-gui --enable-reduce-exports" MAKEJOBS="-j4" -# dashd - - HOST=x86_64-unknown-linux-gnu PPA="ppa:bitcoin/bitcoin" PACKAGES="bc python3-zmq" DEP_OPTS="NO_QT=1 NO_UPNP=1 DEBUG=1" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-zmq --enable-glibc-back-compat --enable-reduce-exports" CPPFLAGS="-DDEBUG_LOCKORDER -DENABLE_DASH_DEBUG" PYZMQ=true -# No wallet - - HOST=x86_64-unknown-linux-gnu PPA="ppa:bitcoin/bitcoin" PACKAGES="python3" DEP_OPTS="NO_WALLET=1" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-glibc-back-compat --enable-reduce-exports" -# Cross-Mac - - HOST=x86_64-apple-darwin11 PPA="ppa:bitcoin/bitcoin" PACKAGES="cmake imagemagick libcap-dev librsvg2-bin libz-dev libbz2-dev libtiff-tools python3-dev" BITCOIN_CONFIG="--enable-gui --enable-reduce-exports" OSX_SDK=10.11 GOAL="deploy" -# dashd release build (for docker) - - HOST=x86_64-unknown-linux-gnu PPA="ppa:bitcoin/bitcoin" PACKAGES="bc python3-zmq" DEP_OPTS="NO_QT=1 NO_UPNP=1" GOAL="install" BITCOIN_CONFIG="--enable-zmq --enable-glibc-back-compat --enable-reduce-exports" PYZMQ=true DOCKER_BUILD=true + - BUILD_TARGET=arm-linux + - BUILD_TARGET=win32 + - BUILD_TARGET=win64 + - BUILD_TARGET=linux32 + - BUILD_TARGET=linux64 + - BUILD_TARGET=linux64_nowallet + - BUILD_TARGET=linux64_release DOCKER_BUILD=true + - BUILD_TARGET=mac + +before_cache: + # Save builder image + - docker save dash-builder-$BUILD_TARGET-$TRAVIS_JOB_NUMBER $(docker history -q dash-builder-$BUILD_TARGET-$TRAVIS_JOB_NUMBER | grep -v \) | gzip -2 > $HOME/cache/docker/dash-builder-$BUILD_TARGET.tar.gz -before_install: - - git clone https://github.com/dashpay/dash_hash - - travis_retry sudo apt-get install python3-pip python3-dev - - travis_retry sudo add-apt-repository ppa:ubuntu-wine/ppa -y - - export PATH=$(echo $PATH | tr ':' "\n" | sed '/\/opt\/python/d' | tr "\n" ":" | sed "s|::|:|g") install: - - if [ "$PYZMQ" = "true" ]; then pip3 install pyzmq --user ; fi - - if [ -n "$PPA" ]; then travis_retry sudo add-apt-repository "$PPA" -y; fi - - if [ -n "$DPKG_ADD_ARCH" ]; then sudo dpkg --add-architecture "$DPKG_ADD_ARCH" ; fi - - if [ -n "$PACKAGES" ]; then travis_retry sudo apt-get update; fi - - if [ -n "$PACKAGES" ]; then travis_retry sudo apt-get install --no-install-recommends --no-upgrade -qq $PACKAGES; fi - - cd dash_hash && python3 setup.py install --user && cd .. + # Our scripts try to be Travis agnostic + - export PULL_REQUEST="$TRAVIS_PULL_REQUEST" + - export JOB_NUMBER="$TRAVIS_JOB_NUMBER" + - export HOST_SRC_DIR=$TRAVIS_BUILD_DIR + - export HOST_CACHE_DIR=$HOME/cache + - source ./ci/matrix.sh + - mkdir -p $HOST_CACHE_DIR/docker && mkdir -p $HOST_CACHE_DIR/ccache && mkdir -p $HOST_CACHE_DIR/depends && mkdir -p $HOST_CACHE_DIR/sdk-sources + # Keep this as it makes caching related debugging easier + - ls -lah $HOST_CACHE_DIR && ls -lah $HOST_CACHE_DIR/depends && ls -lah $HOST_CACHE_DIR/ccache && ls -lah $HOST_CACHE_DIR/docker + # Load cached builder image + - if [ -f $HOST_CACHE_DIR/docker/dash-builder-$BUILD_TARGET.tar.gz ]; then zcat $HOST_CACHE_DIR/docker/dash-builder-$BUILD_TARGET.tar.gz | docker load || true; fi + - docker build --pull -t $BUILDER_IMAGE_NAME --build-arg=USER_ID=$UID --build-arg=GROUP_ID=$UID --build-arg=BUILD_TARGET=$BUILD_TARGET -f ci/Dockerfile.builder ci before_script: - - unset CC; unset CXX - - unset DISPLAY # Make sure stdout is in blocking mode. Otherwise builds will fail due to large writes to stdout # See https://github.com/travis-ci/travis-ci/issues/4704. If this gets fixed, this line can also be removed. - python3 -c 'import os,sys,fcntl; flags = fcntl.fcntl(sys.stdout, fcntl.F_GETFL); fcntl.fcntl(sys.stdout, fcntl.F_SETFL, flags&~os.O_NONBLOCK);' - #- if [ "$CHECK_DOC" = 1 ]; then contrib/devtools/check-doc.py; fi TODO reenable after all Bitcoin PRs have been merged and docs fully fixed - - mkdir -p depends/SDKs depends/sdk-sources - - if [ -n "$OSX_SDK" -a ! -f depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz ]; then curl --location --fail $SDK_URL/MacOSX${OSX_SDK}.sdk.tar.gz -o depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz; fi - - if [ -n "$OSX_SDK" -a -f depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz ]; then tar -C depends/SDKs -xf depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz; fi - - make $MAKEJOBS -C depends HOST=$HOST $DEP_OPTS script: - export TRAVIS_COMMIT_LOG=`git log --format=fuller -1` - - if [ -n "$USE_SHELL" ]; then export CONFIG_SHELL="$USE_SHELL"; fi - - OUTDIR=$BASE_OUTDIR/$TRAVIS_PULL_REQUEST/$TRAVIS_JOB_NUMBER-$HOST - - BITCOIN_CONFIG_ALL="--disable-dependency-tracking --prefix=$TRAVIS_BUILD_DIR/depends/$HOST --bindir=$OUTDIR/bin --libdir=$OUTDIR/lib" - - depends/$HOST/native/bin/ccache --max-size=$CCACHE_SIZE - - test -n "$USE_SHELL" && eval '"$USE_SHELL" -c "./autogen.sh"' || ./autogen.sh - - mkdir build && cd build - - ../configure --cache-file=config.cache $BITCOIN_CONFIG_ALL $BITCOIN_CONFIG || ( cat config.log && false) - - make distdir VERSION=$HOST - - cd dashcore-$HOST - - ./configure --cache-file=../config.cache $BITCOIN_CONFIG_ALL $BITCOIN_CONFIG || ( cat config.log && false) - - make $MAKEJOBS $GOAL || ( echo "Build failure. Verbose build follows." && make $GOAL V=1 ; false ) - - export LD_LIBRARY_PATH=$TRAVIS_BUILD_DIR/depends/$HOST/lib - - if [ "$RUN_TESTS" = "true" ]; then travis_wait 30 make $MAKEJOBS check VERBOSE=1; fi - - if [ "$RUN_TESTS" = "true" ]; then qa/pull-tester/rpc-tests.py --coverage; fi - - cd ../.. - - if [ "$DOCKER_BUILD" = "true" ]; then BUILD_DIR=build/dashcore-$HOST ./docker/build-docker.sh; fi + # Our scripts try to be Travis agnostic + - $DOCKER_RUN_IN_BUILDER ./ci/build_depends.sh; + # Skip Dash Core build if depends build take more than 20 mins. + - if [ $SECONDS -lt 1200 ]; then $DOCKER_RUN_IN_BUILDER ./ci/build_src.sh && export SRC_BUILT="true"; fi + - | + if [ "$SRC_BUILT" = "true" ]; then + travis_wait 30 $DOCKER_RUN_IN_BUILDER ./ci/test_unittests.sh; + $DOCKER_RUN_IN_BUILDER ./ci/test_integrationtests.sh; + if [ "$DOCKER_BUILD" = "true" ]; then BUILD_DIR=build-ci/dashcore-$BUILD_TARGET ./docker/build-docker.sh; fi; + else + # Let the build fail immediately. Caches are still uploaded even after failure. The next Travis run should then + # use the caches and thus be much faster, causing the build to succeed + false + fi; after_script: - echo $TRAVIS_COMMIT_RANGE - echo $TRAVIS_COMMIT_LOG diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 000000000000..3df07ed035ca --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,93 @@ +// This Jenkinsfile will build a builder image and then run the actual build and tests inside this image +// It's very important to not execute any scripts outside of the builder container, as it's our protection against +// external developers bringing in harmful code into Jenkins. +// Jenkins will only run the build if this Jenkinsfile was not modified in an external pull request. Only branches +// which are part of the Dash repo will allow modification to the Jenkinsfile. + +def targets = [ + 'win32', + 'win64', + 'linux32', + 'linux64', + 'linux64_nowallet', + 'linux64_release', + 'mac', +] + +def tasks = [:] +for(int i = 0; i < targets.size(); i++) { + def target = targets[i] + + tasks["${target}"] = { + node { + def BUILD_NUMBER = sh(returnStdout: true, script: 'echo $BUILD_NUMBER').trim() + def BRANCH_NAME = sh(returnStdout: true, script: 'echo $BRANCH_NAME').trim() + def UID = sh(returnStdout: true, script: 'id -u').trim() + def HOME = sh(returnStdout: true, script: 'echo $HOME').trim() + def pwd = sh(returnStdout: true, script: 'pwd').trim() + + checkout scm + + // restore cache + try { + copyArtifacts(projectName: "dashpay-dash/${BRANCH_NAME}", optional: true, selector: lastSuccessful(), filter: "ci-cache-${target}.tar.gz") + } catch (Exception e) { + } + if (fileExists("ci-cache-${target}.tar.gz")) { + hasCache = true + echo "Using cache from dashpay-dash/${BRANCH_NAME}" + } else { + try { + copyArtifacts(projectName: 'dashpay-dash/develop', optional: true, selector: lastSuccessful(), filter: "ci-cache-${target}.tar.gz"); + } catch (Exception e) { + } + if (fileExists("ci-cache-${target}.tar.gz")) { + hasCache = true + echo "Using cache from dashpay-dash/develop" + } + } + + def env = [ + "BUILD_TARGET=${target}", + "PULL_REQUEST=false", + "JOB_NUMBER=${BUILD_NUMBER}", + ] + withEnv(env) { + def builderImageName="dash-builder-${target}" + + def builderImage + stage("${target}/builder-image") { + builderImage = docker.build("${builderImageName}", "--build-arg BUILD_TARGET=${target} ci -f ci/Dockerfile.builder") + } + + if (hasCache) { + sh "cd ${pwd} && tar xzfv ci-cache-${target}.tar.gz" + } else { + sh "mkdir -p ${pwd}/ci-cache-${target}" + } + + builderImage.inside("-t") { + stage("${target}/depends") { + sh './ci/build_depends.sh' + } + stage("${target}/build") { + sh './ci/build_src.sh' + } + stage("${target}/test") { + sh './ci/test_unittests.sh' + } + stage("${target}/test") { + sh './ci/test_integrationtests.sh' + } + } + + // archive cache + sh "tar czfv ci-cache-${target}.tar.gz ci-cache-${target}" + archiveArtifacts artifacts: "ci-cache-${target}.tar.gz", fingerprint: true + } + } + } +} + +parallel tasks + diff --git a/Jenkinsfile.gitian b/Jenkinsfile.gitian new file mode 100644 index 000000000000..f7a0c212eab5 --- /dev/null +++ b/Jenkinsfile.gitian @@ -0,0 +1,123 @@ +def targets = [ + 'linux', + 'win', + 'osx', +] + +def osslTarUrl = 'http://downloads.sourceforge.net/project/osslsigncode/osslsigncode/osslsigncode-1.7.1.tar.gz' +def osslPatchUrl = 'https://bitcoincore.org/cfields/osslsigncode-Backports-to-1.7.1.patch' +def SDK_URL='https://bitcoincore.org/depends-sources/sdks' +def OSX_SDK='10.11' +def proc = 4 +def mem = 2000 + +def repositoryUrl = "https://github.com/dashpay/dash.git" +def commit = "develop" + +def tasks = [:] +for(int i = 0; i < targets.size(); i++) { + def target = targets[i] + + tasks["${target}"] = { + node { + deleteDir() // cleanup workspace + + def pwd = sh(returnStdout: true, script: 'pwd').trim() + def dockerGid = sh(returnStdout: true, script: "stat -c '%g' /var/run/docker.sock").trim() + def BRANCH_NAME = sh(returnStdout: true, script: 'echo $BRANCH_NAME').trim() + def hasCache = false + + def gitianDescriptor + + stage("${target}/prepare") { + dir('dash') { + checkout scm + gitianDescriptor = readYaml file: "contrib/gitian-descriptors/gitian-${target}.yml" + } + dir('gitian-builder') { + git url: 'https://github.com/dashpay/gitian-builder.git' + } + sh "mkdir -p dashcore-binaries" + if (target == "osx") { + dir('gitian-builder') { + sh 'mkdir -p inputs' + sh "curl --location --fail $SDK_URL/MacOSX${OSX_SDK}.sdk.tar.gz -o inputs/MacOSX${OSX_SDK}.sdk.tar.gz" + } + } + + // restore cache + try { + copyArtifacts(projectName: "dashpay-dash-gitian-nightly/${BRANCH_NAME}", optional: true, selector: lastSuccessful(), filter: "cache-${gitianDescriptor.name}.tar.gz") + } catch (Exception e) { + } + if (fileExists("cache-${gitianDescriptor.name}.tar.gz")) { + hasCache = true + echo "Using cache from dashpay-dash-gitian-nightly/${BRANCH_NAME}" + } else { + try { + copyArtifacts(projectName: 'dashpay-dash-gitian-nightly/develop', optional: true, selector: lastSuccessful(), filter: "cache-${gitianDescriptor.name}.tar.gz"); + } catch (Exception e) { + } + if (fileExists("cache-${gitianDescriptor.name}.tar.gz")) { + hasCache = true + echo "Using cache from dashpay-dash-gitian-nightly/develop" + } + } + } + + def gitianImage + stage("${target}/builder-image") { + dir('dash') { + gitianImage = docker.build("dash-gitian:${env.BUILD_ID}", 'ci -f ci/Dockerfile.gitian-builder') + } + } + + gitianImage.inside("--group-add ${dockerGid} -t -v \"/var/run/docker.sock:/var/run/docker.sock\"") { + sh "mkdir -p gitian-builder/cache" + if (hasCache) { + sh "cd gitian-builder/cache && tar xzfv ../../cache-${gitianDescriptor.name}.tar.gz" + } + + stage("${target}/download") { + dir('gitian-builder') { + sh "mkdir -p inputs" + sh "cd inputs && curl -R -O ${osslPatchUrl}" + sh "cd inputs && curl -R -O ${osslTarUrl}" + sh "make -C ../dash/depends download SOURCES_PATH=`pwd`/cache/common" + } + } + stage("${target}/base-vm") { + dir('gitian-builder') { + sh "./bin/make-base-vm --suite trusty --arch amd64 --docker" + } + } + + stage("${target}/gbuild") { + dir('gitian-builder') { + // make sure an old version is not running + sh "docker rm -fv gitian-target || true" + + try { + sh """ + tail -F var/install.log & + tail -F var/build.log & + USE_DOCKER=1 ./bin/gbuild -j ${proc} -m ${mem} --commit dash=${commit} --url dash=${repositoryUrl} ../dash/contrib/gitian-descriptors/gitian-${target}.yml + """ + } finally { + // make sure it doesn't run forever + sh "docker rm -fv gitian-target || true" + } + sh "mv build/out/dashcore-* ../dashcore-binaries/" + sh "mv build/out/src/dashcore-* ../dashcore-binaries/" + } + archiveArtifacts artifacts: 'dashcore-binaries/*', fingerprint: true + } + + sh "cd gitian-builder/cache && tar czfv ../../cache-${gitianDescriptor.name}.tar.gz common ${gitianDescriptor.name}" + archiveArtifacts artifacts: "cache-${gitianDescriptor.name}.tar.gz", fingerprint: true + } + } + } +} + +parallel tasks diff --git a/ci/Dockerfile.builder b/ci/Dockerfile.builder new file mode 100644 index 000000000000..66d28227184c --- /dev/null +++ b/ci/Dockerfile.builder @@ -0,0 +1,58 @@ +FROM ubuntu:bionic + +# Build and base stuff +# (zlib1g-dev and libssl-dev are needed for the Qt host binary builds, but should not be used by target binaries) +RUN apt-get update && apt-get install -y \ + git \ + g++ \ + autotools-dev libtool m4 automake autoconf pkg-config \ + zlib1g-dev \ + libssl1.0-dev \ + curl \ + ccache \ + bsdmainutils \ + python3-pip python3-dev \ + && rm -rf /var/lib/apt/lists + +# Python stuff +RUN pip3 install pyzmq # really needed? + +# dash_hash +RUN git clone https://github.com/dashpay/dash_hash +RUN cd dash_hash && python3 setup.py install + +ARG USER_ID=1000 +ARG GROUP_ID=1000 + +# add user with specified (or default) user/group ids +ENV USER_ID ${USER_ID} +ENV GROUP_ID ${GROUP_ID} +RUN groupadd -g ${GROUP_ID} dash +RUN useradd -u ${USER_ID} -g dash -s /bin/bash -m -d /dash dash + +# Extra packages +ARG BUILD_TARGET=linux64 +ADD matrix.sh /tmp/matrix.sh +RUN . /tmp/matrix.sh && \ + if [ -n "$DPKG_ADD_ARCH" ]; then dpkg --add-architecture "$DPKG_ADD_ARCH" ; fi && \ + if [ -n "$PACKAGES" ]; then apt-get update && apt-get install -y --no-install-recommends --no-upgrade $PACKAGES && rm -rf /var/lib/apt/lists; fi + +# Make sure std::thread and friends is available +# Will fail on non-win builds, but we ignore this +RUN \ + update-alternatives --set i686-w64-mingw32-gcc /usr/bin/i686-w64-mingw32-gcc-posix; \ + update-alternatives --set i686-w64-mingw32-g++ /usr/bin/i686-w64-mingw32-g++-posix; \ + update-alternatives --set x86_64-w64-mingw32-gcc /usr/bin/x86_64-w64-mingw32-gcc-posix; \ + update-alternatives --set x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix; \ + exit 0 + +RUN mkdir /dash-src && \ + mkdir -p /cache/ccache && \ + mkdir /cache/depends && \ + mkdir /cache/sdk-sources && \ + chown $USER_ID:$GROUP_ID /dash-src && \ + chown $USER_ID:$GROUP_ID /cache && \ + chown $USER_ID:$GROUP_ID /cache -R +WORKDIR /dash-src + +USER dash diff --git a/ci/Dockerfile.gitian-builder b/ci/Dockerfile.gitian-builder new file mode 100644 index 000000000000..79bd2a381b45 --- /dev/null +++ b/ci/Dockerfile.gitian-builder @@ -0,0 +1,17 @@ +FROM ubuntu:bionic + +RUN apt-get update && apt-get install -y \ + ruby curl make libltdl7 git apache2 apt-cacher-ng python-vm-builder ruby qemu-utils \ + && rm -rf /var/lib/apt/lists + +ARG USER_ID=1000 +ARG GROUP_ID=1000 + +# add user with specified (or default) user/group ids +ENV USER_ID ${USER_ID} +ENV GROUP_ID ${GROUP_ID} +RUN groupadd -g ${GROUP_ID} dash +RUN useradd -u ${USER_ID} -g dash -s /bin/bash -m -d /dash dash + +WORKDIR /dash +USER dash \ No newline at end of file diff --git a/ci/build_depends.sh b/ci/build_depends.sh new file mode 100755 index 000000000000..d4e7cd0e59ca --- /dev/null +++ b/ci/build_depends.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +# This script is executed inside the builder image + +set -e + +source ./ci/matrix.sh + +unset CC; unset CXX +unset DISPLAY + +mkdir -p $CACHE_DIR/depends +mkdir -p $CACHE_DIR/sdk-sources + +ln -s $CACHE_DIR/depends depends/built +ln -s $CACHE_DIR/sdk-sources depends/sdk-sources + +mkdir -p depends/SDKs + +if [ -n "$OSX_SDK" ]; then + if [ ! -f depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz ]; then + curl --location --fail $SDK_URL/MacOSX${OSX_SDK}.sdk.tar.gz -o depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz + fi + if [ -f depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz ]; then + tar -C depends/SDKs -xf depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz + fi +fi + +make $MAKEJOBS -C depends HOST=$HOST $DEP_OPTS diff --git a/ci/build_src.sh b/ci/build_src.sh new file mode 100755 index 000000000000..2a659e7efc8a --- /dev/null +++ b/ci/build_src.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash + +# This script is executed inside the builder image + +set -e + +source ./ci/matrix.sh + +unset CC; unset CXX +unset DISPLAY + +export CCACHE_COMPRESS=${CCACHE_COMPRESS:-1} +export CCACHE_SIZE=${CCACHE_SIZE:-400M} + +#if [ "$CHECK_DOC" = 1 ]; then contrib/devtools/check-doc.py; fi TODO reenable after all Bitcoin PRs have been merged and docs fully fixed + +depends/$HOST/native/bin/ccache --max-size=$CCACHE_SIZE + +if [ -n "$USE_SHELL" ]; then + export CONFIG_SHELL="$USE_SHELL" +fi + +BITCOIN_CONFIG_ALL="--disable-dependency-tracking --prefix=$BUILD_DIR/depends/$HOST --bindir=$OUT_DIR/bin --libdir=$OUT_DIR/lib" + +test -n "$USE_SHELL" && eval '"$USE_SHELL" -c "./autogen.sh"' || ./autogen.sh + +rm -rf build-ci +mkdir build-ci +cd build-ci + +../configure --cache-file=config.cache $BITCOIN_CONFIG_ALL $BITCOIN_CONFIG || ( cat config.log && false) +make distdir VERSION=$BUILD_TARGET + +cd dashcore-$BUILD_TARGET +./configure --cache-file=../config.cache $BITCOIN_CONFIG_ALL $BITCOIN_CONFIG || ( cat config.log && false) + +make $MAKEJOBS $GOAL || ( echo "Build failure. Verbose build follows." && make $GOAL V=1 ; false ) diff --git a/ci/matrix.sh b/ci/matrix.sh new file mode 100755 index 000000000000..15e918bc53e4 --- /dev/null +++ b/ci/matrix.sh @@ -0,0 +1,88 @@ +#!/usr/bin/env bash + +# This script is meant to be sourced into the actual build script. It contains the build matrix and will set all +# necessary environment variables for the request build target + +export BUILD_TARGET=${BUILD_TARGET:-linux64} +export PULL_REQUEST=${PULL_REQUEST:-false} +export JOB_NUMBER=${JOB_NUMBER:-1} + +export BUILDER_IMAGE_NAME="dash-builder-$BUILD_TARGET-$JOB_NUMBER" + +export HOST_SRC_DIR=${HOST_SRC_DIR:-$(pwd)} +export HOST_CACHE_DIR=${HOST_CACHE_DIR:-$(pwd)/ci-cache-$BUILD_TARGET} + +export SRC_DIR=${SRC_DIR:-$HOST_SRC_DIR} +export BUILD_DIR=$SRC_DIR +export OUT_DIR=$BUILD_DIR/out + +export CACHE_DIR=${CACHE_DIR:-$HOST_CACHE_DIR} +export CCACHE_DIR=$CACHE_DIR/ccache + +export DOCKER_RUN_VOLUME_ARGS="-v $HOST_SRC_DIR:$SRC_DIR -v $HOST_CACHE_DIR:$CACHE_DIR" +export DOCKER_RUN_ENV_ARGS="-e SRC_DIR=$SRC_DIR -e CACHE_DIR=$CACHE_DIR -e PULL_REQUEST=$PULL_REQUEST -e JOB_NUMBER=$JOB_NUMBER -e BUILD_TARGET=$BUILD_TARGET" +export DOCKER_RUN_ARGS="$DOCKER_RUN_VOLUME_ARGS $DOCKER_RUN_ENV_ARGS" +export DOCKER_RUN_IN_BUILDER="docker run -t --rm -w $SRC_DIR $DOCKER_RUN_ARGS $BUILDER_IMAGE_NAME" + +# Default values for targets +export GOAL="install" +export SDK_URL=${SDK_URL:-https://bitcoincore.org/depends-sources/sdks} +export PYTHON_DEBUG=1 +export MAKEJOBS="-j4" + +if [ "$BUILD_TARGET" = "arm-linux" ]; then + export HOST=arm-linux-gnueabihf + export PACKAGES="g++-arm-linux-gnueabihf" + export DEP_OPTS="NO_QT=1" + export CHECK_DOC=1 + export BITCOIN_CONFIG="--enable-glibc-back-compat --enable-reduce-exports" +elif [ "$BUILD_TARGET" = "win32" ]; then + export HOST=i686-w64-mingw32 + export DPKG_ADD_ARCH="i386" + export DEP_OPTS="NO_QT=1" + export PACKAGES="python3 nsis g++-mingw-w64-i686 wine-stable wine32 bc" + export BITCOIN_CONFIG="--enable-gui --enable-reduce-exports" + export DIRECT_WINE_EXEC_TESTS=true + export RUN_TESTS=true +elif [ "$BUILD_TARGET" = "win64" ]; then + export HOST=x86_64-w64-mingw32 + export DPKG_ADD_ARCH="i386" + export DEP_OPTS="NO_QT=1" + export PACKAGES="python3 nsis g++-mingw-w64-x86-64 wine-stable wine64 bc" + export BITCOIN_CONFIG="--enable-gui --enable-reduce-exports" + export DIRECT_WINE_EXEC_TESTS=true + export RUN_TESTS=true +elif [ "$BUILD_TARGET" = "linux32" ]; then + export HOST=i686-pc-linux-gnu + export PACKAGES="g++-multilib bc python3-zmq" + export DEP_OPTS="NO_QT=1" + export BITCOIN_CONFIG="--enable-zmq --enable-glibc-back-compat --enable-reduce-exports LDFLAGS=-static-libstdc++" + export USE_SHELL="/bin/dash" + export PYZMQ=true + export RUN_TESTS=true +elif [ "$BUILD_TARGET" = "linux64" ]; then + export HOST=x86_64-unknown-linux-gnu + export PACKAGES="bc python3-zmq" + export DEP_OPTS="NO_QT=1 NO_UPNP=1 DEBUG=1" + export BITCOIN_CONFIG="--enable-zmq --enable-glibc-back-compat --enable-reduce-exports" + export CPPFLAGS="-DDEBUG_LOCKORDER -DENABLE_DASH_DEBUG" + export PYZMQ=true + export RUN_TESTS=true +elif [ "$BUILD_TARGET" = "linux64_nowallet" ]; then + export HOST=x86_64-unknown-linux-gnu + export PACKAGES="python3" + export DEP_OPTS="NO_WALLET=1" + export BITCOIN_CONFIG="--enable-glibc-back-compat --enable-reduce-exports" +elif [ "$BUILD_TARGET" = "linux64_release" ]; then + export HOST=x86_64-unknown-linux-gnu + export PACKAGES="bc python3-zmq" + export DEP_OPTS="NO_QT=1 NO_UPNP=1" + export BITCOIN_CONFIG="--enable-zmq --enable-glibc-back-compat --enable-reduce-exports" + export PYZMQ=true +elif [ "$BUILD_TARGET" = "mac" ]; then + export HOST=x86_64-apple-darwin11 + export PACKAGES="cmake imagemagick libcap-dev librsvg2-bin libz-dev libbz2-dev libtiff-tools" + export BITCOIN_CONFIG="--enable-gui --enable-reduce-exports" + export OSX_SDK=10.11 + export GOAL="deploy" +fi diff --git a/ci/test_integrationtests.sh b/ci/test_integrationtests.sh new file mode 100755 index 000000000000..2223a98c89d0 --- /dev/null +++ b/ci/test_integrationtests.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +# This script is executed inside the builder image + +set -e + +source ./ci/matrix.sh + +if [ "$RUN_TESTS" != "true" ]; then + echo "Skipping integration tests" + exit 0 +fi + +export LD_LIBRARY_PATH=$BUILD_DIR/depends/$HOST/lib + +cd build-ci/dashcore-$BUILD_TARGET + +./qa/pull-tester/rpc-tests.py --coverage diff --git a/ci/test_unittests.sh b/ci/test_unittests.sh new file mode 100755 index 000000000000..f5af7e39637e --- /dev/null +++ b/ci/test_unittests.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +# This script is executed inside the builder image + +set -e + +source ./ci/matrix.sh + +if [ "$RUN_TESTS" != "true" ]; then + echo "Skipping unit tests" + exit 0 +fi + +# TODO this is not Travis agnostic +export BOOST_TEST_RANDOM=1$TRAVIS_BUILD_ID +export LD_LIBRARY_PATH=$BUILD_DIR/depends/$HOST/lib + +export WINEDEBUG=fixme-all +export BOOST_TEST_LOG_LEVEL=test_suite + +cd build-ci/dashcore-$BUILD_TARGET +if [ "$DIRECT_WINE_EXEC_TESTS" = "true" ]; then + # Inside Docker, binfmt isn't working so we can't trust in make invoking windows binaries correctly + wine ./src/test/test_dash.exe +else + make $MAKEJOBS check VERBOSE=1 +fi diff --git a/contrib/gitian-build.sh b/contrib/gitian-build.sh index 15392c17778f..b0d9b5ca485e 100755 --- a/contrib/gitian-build.sh +++ b/contrib/gitian-build.sh @@ -28,6 +28,9 @@ scriptName=$(basename -- "$0") signProg="gpg --detach-sign" commitFiles=true +SDK_URL=${SDK_URL:-https://bitcoincore.org/depends-sources/sdks} +OSX_SDK=${OSX_SDK:-10.11} + # Help Message read -d '' usage <<- EOF Usage: $scriptName [-c|u|v|b|s|B|o|h|j|m|] signer version @@ -316,6 +319,13 @@ then echo "" echo "Compiling ${VERSION} Mac OSX" echo "" + + if [ -n "$OSX_SDK" ]; then + if [ ! -f inputs/MacOSX${OSX_SDK}.sdk.tar.gz ]; then + curl --location --fail $SDK_URL/MacOSX${OSX_SDK}.sdk.tar.gz -o inputs/MacOSX${OSX_SDK}.sdk.tar.gz + fi + fi + ./bin/gbuild -j ${proc} -m ${mem} --commit dash=${COMMIT} --url dash=${url} ../dash/contrib/gitian-descriptors/gitian-osx.yml ./bin/gsign -p "$signProg" --signer "$SIGNER" --release ${VERSION}-osx-unsigned --destination ../gitian.sigs/ ../dash/contrib/gitian-descriptors/gitian-osx.yml mv build/out/dashcore-*-osx-unsigned.tar.gz inputs/dashcore-osx-unsigned.tar.gz diff --git a/depends/hosts/linux.mk b/depends/hosts/linux.mk index b13a0f1ad714..602206d63421 100644 --- a/depends/hosts/linux.mk +++ b/depends/hosts/linux.mk @@ -1,5 +1,5 @@ linux_CFLAGS=-pipe -linux_CXXFLAGS=$(linux_CFLAGS) +linux_CXXFLAGS=$(linux_CFLAGS) -static-libstdc++ linux_release_CFLAGS=-O2 linux_release_CXXFLAGS=$(linux_release_CFLAGS) diff --git a/depends/hosts/mingw32.mk b/depends/hosts/mingw32.mk index dbfb62fdcf98..83fc501a1990 100644 --- a/depends/hosts/mingw32.mk +++ b/depends/hosts/mingw32.mk @@ -1,5 +1,5 @@ mingw32_CFLAGS=-pipe -mingw32_CXXFLAGS=$(mingw32_CFLAGS) +mingw32_CXXFLAGS=$(mingw32_CFLAGS) -static-libstdc++ mingw32_release_CFLAGS=-O2 mingw32_release_CXXFLAGS=$(mingw32_release_CFLAGS) diff --git a/depends/packages/native_biplist.mk b/depends/packages/native_biplist.mk index 3c6e8900f664..373490aedcaa 100644 --- a/depends/packages/native_biplist.mk +++ b/depends/packages/native_biplist.mk @@ -11,10 +11,10 @@ define $(package)_preprocess_cmds endef define $(package)_build_cmds - python setup.py build + python3 setup.py build endef define $(package)_stage_cmds mkdir -p $($(package)_install_libdir) && \ - python setup.py install --root=$($(package)_staging_dir) --prefix=$(build_prefix) --install-lib=$($(package)_install_libdir) + python3 setup.py install --root=$($(package)_staging_dir) --prefix=$(build_prefix) --install-lib=$($(package)_install_libdir) endef diff --git a/depends/packages/native_ds_store.mk b/depends/packages/native_ds_store.mk index 49f5829ac1c0..e2d035d480c9 100644 --- a/depends/packages/native_ds_store.mk +++ b/depends/packages/native_ds_store.mk @@ -8,10 +8,10 @@ $(package)_install_libdir=$(build_prefix)/lib/python/dist-packages $(package)_dependencies=native_biplist define $(package)_build_cmds - python setup.py build + python3 setup.py build endef define $(package)_stage_cmds mkdir -p $($(package)_install_libdir) && \ - python setup.py install --root=$($(package)_staging_dir) --prefix=$(build_prefix) --install-lib=$($(package)_install_libdir) + python3 setup.py install --root=$($(package)_staging_dir) --prefix=$(build_prefix) --install-lib=$($(package)_install_libdir) endef diff --git a/depends/packages/native_mac_alias.mk b/depends/packages/native_mac_alias.mk index 85a8a402bf92..9982a52a335c 100644 --- a/depends/packages/native_mac_alias.mk +++ b/depends/packages/native_mac_alias.mk @@ -12,10 +12,10 @@ define $(package)_preprocess_cmds endef define $(package)_build_cmds - python setup.py build + python3 setup.py build endef define $(package)_stage_cmds mkdir -p $($(package)_install_libdir) && \ - python setup.py install --root=$($(package)_staging_dir) --prefix=$(build_prefix) --install-lib=$($(package)_install_libdir) + python3 setup.py install --root=$($(package)_staging_dir) --prefix=$(build_prefix) --install-lib=$($(package)_install_libdir) endef diff --git a/src/Makefile.am b/src/Makefile.am index a54e81c1d1bf..b015c2388077 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -425,6 +425,7 @@ libdash_util_a_SOURCES = \ if GLIBC_BACK_COMPAT libdash_util_a_SOURCES += compat/glibc_compat.cpp +AM_LDFLAGS += -Wl,--wrap=log2f -Wl,--wrap=__divmoddi4 endif # cli: shared between dash-cli and dash-qt diff --git a/src/compat/glibc_compat.cpp b/src/compat/glibc_compat.cpp index f5f61a3abfce..1df6e217fbe9 100644 --- a/src/compat/glibc_compat.cpp +++ b/src/compat/glibc_compat.cpp @@ -7,6 +7,7 @@ #endif #include +#include #if defined(HAVE_SYS_SELECT_H) #include @@ -27,3 +28,47 @@ extern "C" FDELT_TYPE __fdelt_warn(FDELT_TYPE a) return a / __NFDBITS; } extern "C" FDELT_TYPE __fdelt_chk(FDELT_TYPE) __attribute__((weak, alias("__fdelt_warn"))); + +#if defined(__i386__) || defined(__arm__) + +extern "C" int64_t __udivmoddi4(uint64_t u, uint64_t v, uint64_t* rp); + +extern "C" int64_t __wrap___divmoddi4(int64_t u, int64_t v, int64_t* rp) +{ + int32_t c1 = 0, c2 = 0; + int64_t uu = u, vv = v; + int64_t w; + int64_t r; + + if (uu < 0) { + c1 = ~c1, c2 = ~c2, uu = -uu; + } + if (vv < 0) { + c1 = ~c1, vv = -vv; + } + + w = __udivmoddi4(uu, vv, (uint64_t*)&r); + if (c1) + w = -w; + if (c2) + r = -r; + + *rp = r; + return w; +} +#endif + +extern "C" float log2f_old(float x); +#ifdef __i386__ +__asm(".symver log2f_old,log2f@GLIBC_2.1"); +#elif defined(__amd64__) +__asm(".symver log2f_old,log2f@GLIBC_2.2.5"); +#elif defined(__arm__) +__asm(".symver log2f_old,log2f@GLIBC_2.4"); +#elif defined(__aarch64__) +__asm(".symver log2f_old,log2f@GLIBC_2.17"); +#endif +extern "C" float __wrap_log2f(float x) +{ + return log2f_old(x); +} From 753c2436bd0a4b0e6a0b38a6675c054ae4b92a9a Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Thu, 12 Jul 2018 17:43:20 +0200 Subject: [PATCH 016/400] Fix MissingPropertyException on Jenkins when no cache was found (#2180) --- Jenkinsfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Jenkinsfile b/Jenkinsfile index 3df07ed035ca..237332da361c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -25,6 +25,7 @@ for(int i = 0; i < targets.size(); i++) { def UID = sh(returnStdout: true, script: 'id -u').trim() def HOME = sh(returnStdout: true, script: 'echo $HOME').trim() def pwd = sh(returnStdout: true, script: 'pwd').trim() + def hasCache = false checkout scm From dac090964fbdd96d896f725932aada71db736abf Mon Sep 17 00:00:00 2001 From: Nathan Marley Date: Fri, 13 Jul 2018 17:00:55 +0700 Subject: [PATCH 017/400] remove dashpay.io dns seed entry (#2181) --- src/chainparams.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 23054a381a16..f98388947532 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -202,7 +202,6 @@ class CMainParams : public CChainParams { vSeeds.push_back(CDNSSeedData("dash.org", "dnsseed.dash.org")); vSeeds.push_back(CDNSSeedData("dashdot.io", "dnsseed.dashdot.io")); vSeeds.push_back(CDNSSeedData("masternode.io", "dnsseed.masternode.io")); - vSeeds.push_back(CDNSSeedData("dashpay.io", "dnsseed.dashpay.io")); // Dash addresses start with 'X' base58Prefixes[PUBKEY_ADDRESS] = std::vector(1,76); From 1681d6366fde20f09ddd9be77ad3f80d76da80ad Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Mon, 16 Jul 2018 15:47:37 +0300 Subject: [PATCH 018/400] Replace Dash-specific threads with Dash-specific scheduled tasks (#2043) * Replace Dash-specific threads with scheduled tasks * Fix rare crash when trying to shutdown wallet during mixing Should stop PS and release all keys _before_ wallet is destroyed. * fix nowallet * update doc --- doc/developer-notes.md | 2 -- src/activemasternode.h | 2 ++ src/init.cpp | 30 ++++++++++++++----- src/instantx.h | 2 ++ src/masternode-payments.h | 2 ++ src/masternode-sync.cpp | 2 +- src/masternode-sync.h | 2 ++ src/masternodeman.cpp | 29 +++++++++++++++++++ src/masternodeman.h | 1 + src/netfulfilledman.h | 2 ++ src/privatesend-client.cpp | 34 +++++++--------------- src/privatesend-client.h | 4 +-- src/privatesend-server.cpp | 25 ++++------------ src/privatesend-server.h | 4 +-- src/privatesend.cpp | 59 -------------------------------------- src/privatesend.h | 2 -- 16 files changed, 84 insertions(+), 118 deletions(-) diff --git a/doc/developer-notes.md b/doc/developer-notes.md index a021fd00a724..be67692e2a47 100644 --- a/doc/developer-notes.md +++ b/doc/developer-notes.md @@ -189,8 +189,6 @@ Threads - BitcoinMiner : Generates coins (if wallet is enabled). -- ThreadCheckDarkSendPool : Runs masternode list and sync data update loops - - Shutdown : Does an orderly shutdown of everything. Ignoring IDE/editor files diff --git a/src/activemasternode.h b/src/activemasternode.h index 7617b434d3de..2efd6ec5e116 100644 --- a/src/activemasternode.h +++ b/src/activemasternode.h @@ -76,6 +76,8 @@ class CActiveMasternode bool UpdateSentinelPing(int version); + void DoMaintenance(CConnman &connman) { ManageState(connman); } + private: void ManageStateInitial(CConnman& connman); void ManageStateRemote(); diff --git a/src/init.cpp b/src/init.cpp index 78adc74786c7..0f1d952d3d35 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -241,8 +241,13 @@ void PrepareShutdown() peerLogic.reset(); g_connman.reset(); - // STORE DATA CACHES INTO SERIALIZED DAT FILES if (!fLiteMode) { +#ifdef ENABLE_WALLET + // Stop PrivateSend, release keys + privateSendClient.fEnablePrivateSend = false; + privateSendClient.ResetPool(); +#endif + // STORE DATA CACHES INTO SERIALIZED DAT FILES CFlatDB flatdb1("mncache.dat", "magicMasternodeCache"); flatdb1.Dump(mnodeman); CFlatDB flatdb2("mnpayments.dat", "magicMasternodePaymentsCache"); @@ -1941,15 +1946,26 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler) // GetMainSignals().UpdatedBlockTip(chainActive.Tip()); pdsNotificationInterface->InitializeCurrentBlockTip(); - // ********************************************************* Step 11d: start dash-ps- threads + // ********************************************************* Step 11d: schedule Dash-specific tasks + + if (!fLiteMode) { + scheduler.scheduleEvery(boost::bind(&CNetFulfilledRequestManager::DoMaintenance, boost::ref(netfulfilledman)), 60); + scheduler.scheduleEvery(boost::bind(&CMasternodeSync::DoMaintenance, boost::ref(masternodeSync), boost::ref(*g_connman)), MASTERNODE_SYNC_TICK_SECONDS); + scheduler.scheduleEvery(boost::bind(&CMasternodeMan::DoMaintenance, boost::ref(mnodeman), boost::ref(*g_connman)), 1); + scheduler.scheduleEvery(boost::bind(&CActiveMasternode::DoMaintenance, boost::ref(activeMasternode), boost::ref(*g_connman)), 1); + + scheduler.scheduleEvery(boost::bind(&CMasternodePayments::DoMaintenance, boost::ref(mnpayments)), 60); + scheduler.scheduleEvery(boost::bind(&CGovernanceManager::DoMaintenance, boost::ref(governance), boost::ref(*g_connman)), 60 * 5); - threadGroup.create_thread(boost::bind(&ThreadCheckPrivateSend, boost::ref(*g_connman))); - if (fMasternodeMode) - threadGroup.create_thread(boost::bind(&ThreadCheckPrivateSendServer, boost::ref(*g_connman))); + scheduler.scheduleEvery(boost::bind(&CInstantSend::DoMaintenance, boost::ref(instantsend)), 60); + + if (fMasternodeMode) + scheduler.scheduleEvery(boost::bind(&CPrivateSendServer::DoMaintenance, boost::ref(privateSendServer), boost::ref(*g_connman)), 1); #ifdef ENABLE_WALLET - else - threadGroup.create_thread(boost::bind(&ThreadCheckPrivateSendClient, boost::ref(*g_connman))); + else + scheduler.scheduleEvery(boost::bind(&CPrivateSendClient::DoMaintenance, boost::ref(privateSendClient), boost::ref(*g_connman)), 1); #endif // ENABLE_WALLET + } // ********************************************************* Step 12: start node diff --git a/src/instantx.h b/src/instantx.h index 1c95a03f9221..3448144e1626 100644 --- a/src/instantx.h +++ b/src/instantx.h @@ -159,6 +159,8 @@ class CInstantSend void SyncTransaction(const CTransaction& tx, const CBlockIndex *pindex, int posInBlock); std::string ToString() const; + + void DoMaintenance() { CheckAndRemove(); } }; /** diff --git a/src/masternode-payments.h b/src/masternode-payments.h index d539aad8a017..bd2c0086740d 100644 --- a/src/masternode-payments.h +++ b/src/masternode-payments.h @@ -232,6 +232,8 @@ class CMasternodePayments int GetStorageLimit() const; void UpdatedBlockTip(const CBlockIndex *pindex, CConnman& connman); + + void DoMaintenance() { CheckAndRemove(); } }; #endif diff --git a/src/masternode-sync.cpp b/src/masternode-sync.cpp index 589225260a90..d78bc11f2575 100644 --- a/src/masternode-sync.cpp +++ b/src/masternode-sync.cpp @@ -133,7 +133,7 @@ void CMasternodeSync::ProcessMessage(CNode* pfrom, const std::string& strCommand void CMasternodeSync::ProcessTick(CConnman& connman) { static int nTick = 0; - if(nTick++ % MASTERNODE_SYNC_TICK_SECONDS != 0) return; + nTick++; // reset the sync process if the last call to this function was more than 60 minutes ago (client was in sleep mode) static int64_t nTimeLastProcess = GetTime(); diff --git a/src/masternode-sync.h b/src/masternode-sync.h index 40b13b2589c3..8a7464f05456 100644 --- a/src/masternode-sync.h +++ b/src/masternode-sync.h @@ -77,6 +77,8 @@ class CMasternodeSync void AcceptedBlockHeader(const CBlockIndex *pindexNew); void NotifyHeaderTip(const CBlockIndex *pindexNew, bool fInitialDownload, CConnman& connman); void UpdatedBlockTip(const CBlockIndex *pindexNew, bool fInitialDownload, CConnman& connman); + + void DoMaintenance(CConnman &connman) { ProcessTick(connman); } }; #endif diff --git a/src/masternodeman.cpp b/src/masternodeman.cpp index 89434e3155df..71f9b4e757e7 100644 --- a/src/masternodeman.cpp +++ b/src/masternodeman.cpp @@ -6,6 +6,7 @@ #include "addrman.h" #include "alert.h" #include "clientversion.h" +#include "init.h" #include "governance.h" #include "masternode-payments.h" #include "masternode-sync.h" @@ -1757,3 +1758,31 @@ void CMasternodeMan::NotifyMasternodeUpdates(CConnman& connman) fMasternodesAdded = false; fMasternodesRemoved = false; } + +void CMasternodeMan::DoMaintenance(CConnman& connman) +{ + if(fLiteMode) return; // disable all Dash specific functionality + + if(!masternodeSync.IsBlockchainSynced() || ShutdownRequested()) + return; + + static unsigned int nTick = 0; + + nTick++; + + // make sure to check all masternodes first + mnodeman.Check(); + + mnodeman.ProcessPendingMnbRequests(connman); + mnodeman.ProcessPendingMnvRequests(connman); + + if(nTick % 60 == 0) { + mnodeman.ProcessMasternodeConnections(connman); + mnodeman.CheckAndRemove(connman); + mnodeman.WarnMasternodeDaemonUpdates(); + } + + if(fMasternodeMode && (nTick % (60 * 5) == 0)) { + mnodeman.DoFullVerificationStep(connman); + } +} diff --git a/src/masternodeman.h b/src/masternodeman.h index cfceaedb7cc4..11e7751c9e3b 100644 --- a/src/masternodeman.h +++ b/src/masternodeman.h @@ -244,6 +244,7 @@ class CMasternodeMan */ void NotifyMasternodeUpdates(CConnman& connman); + void DoMaintenance(CConnman &connman); }; #endif diff --git a/src/netfulfilledman.h b/src/netfulfilledman.h index c1b2e1c171e1..2a67d23eb16e 100644 --- a/src/netfulfilledman.h +++ b/src/netfulfilledman.h @@ -44,6 +44,8 @@ class CNetFulfilledRequestManager void Clear(); std::string ToString() const; + + void DoMaintenance() { CheckAndRemove(); } }; #endif diff --git a/src/privatesend-client.cpp b/src/privatesend-client.cpp index 61f4f427909f..9a3660c1febb 100644 --- a/src/privatesend-client.cpp +++ b/src/privatesend-client.cpp @@ -1449,34 +1449,22 @@ void CPrivateSendClient::UpdatedBlockTip(const CBlockIndex *pindex) } -//TODO: Rename/move to core -void ThreadCheckPrivateSendClient(CConnman& connman) +void CPrivateSendClient::DoMaintenance(CConnman& connman) { if(fLiteMode) return; // disable all Dash specific functionality if(fMasternodeMode) return; // no client-side mixing on masternodes - static bool fOneThread; - if(fOneThread) return; - fOneThread = true; + if(!masternodeSync.IsBlockchainSynced() || ShutdownRequested()) + return; - // Make this thread recognisable as the PrivateSend thread - RenameThread("dash-ps-client"); + static unsigned int nTick = 0; + static unsigned int nDoAutoNextRun = nTick + PRIVATESEND_AUTO_TIMEOUT_MIN; - unsigned int nTick = 0; - unsigned int nDoAutoNextRun = nTick + PRIVATESEND_AUTO_TIMEOUT_MIN; - - while (true) - { - MilliSleep(1000); - - if(masternodeSync.IsBlockchainSynced() && !ShutdownRequested()) { - nTick++; - privateSendClient.CheckTimeout(); - privateSendClient.ProcessPendingDsaRequest(connman); - if(nDoAutoNextRun == nTick) { - privateSendClient.DoAutomaticDenominating(connman); - nDoAutoNextRun = nTick + PRIVATESEND_AUTO_TIMEOUT_MIN + GetRandInt(PRIVATESEND_AUTO_TIMEOUT_MAX - PRIVATESEND_AUTO_TIMEOUT_MIN); - } - } + nTick++; + privateSendClient.CheckTimeout(); + privateSendClient.ProcessPendingDsaRequest(connman); + if(nDoAutoNextRun == nTick) { + privateSendClient.DoAutomaticDenominating(connman); + nDoAutoNextRun = nTick + PRIVATESEND_AUTO_TIMEOUT_MIN + GetRandInt(PRIVATESEND_AUTO_TIMEOUT_MAX - PRIVATESEND_AUTO_TIMEOUT_MIN); } } diff --git a/src/privatesend-client.h b/src/privatesend-client.h index 0486a281bd0a..7b9c9f2ce3a1 100644 --- a/src/privatesend-client.h +++ b/src/privatesend-client.h @@ -190,8 +190,8 @@ class CPrivateSendClient : public CPrivateSendBase void CheckTimeout(); void UpdatedBlockTip(const CBlockIndex *pindex); -}; -void ThreadCheckPrivateSendClient(CConnman& connman); + void DoMaintenance(CConnman& connman); +}; #endif diff --git a/src/privatesend-server.cpp b/src/privatesend-server.cpp index c77215a952dc..c6dbff6a2590 100644 --- a/src/privatesend-server.cpp +++ b/src/privatesend-server.cpp @@ -890,29 +890,14 @@ void CPrivateSendServer::SetState(PoolState nStateNew) nState = nStateNew; } -//TODO: Rename/move to core -void ThreadCheckPrivateSendServer(CConnman& connman) +void CPrivateSendServer::DoMaintenance(CConnman& connman) { if(fLiteMode) return; // disable all Dash specific functionality if(!fMasternodeMode) return; // only run on masternodes - static bool fOneThread; - if(fOneThread) return; - fOneThread = true; - - // Make this thread recognisable as the PrivateSend thread - RenameThread("dash-ps-server"); - - unsigned int nTick = 0; - - while (true) - { - MilliSleep(1000); + if(!masternodeSync.IsBlockchainSynced() || ShutdownRequested()) + return; - if(masternodeSync.IsBlockchainSynced() && !ShutdownRequested()) { - nTick++; - privateSendServer.CheckTimeout(connman); - privateSendServer.CheckForCompleteQueue(connman); - } - } + privateSendServer.CheckTimeout(connman); + privateSendServer.CheckForCompleteQueue(connman); } diff --git a/src/privatesend-server.h b/src/privatesend-server.h index 86af1e77b99a..eb6207692554 100644 --- a/src/privatesend-server.h +++ b/src/privatesend-server.h @@ -73,8 +73,8 @@ class CPrivateSendServer : public CPrivateSendBase void CheckTimeout(CConnman& connman); void CheckForCompleteQueue(CConnman& connman); -}; -void ThreadCheckPrivateSendServer(CConnman& connman); + void DoMaintenance(CConnman& connman); +}; #endif diff --git a/src/privatesend.cpp b/src/privatesend.cpp index b991667262f0..de585b728f68 100644 --- a/src/privatesend.cpp +++ b/src/privatesend.cpp @@ -5,14 +5,10 @@ #include "activemasternode.h" #include "consensus/validation.h" -#include "governance.h" -#include "init.h" -#include "instantx.h" #include "masternode-payments.h" #include "masternode-sync.h" #include "masternodeman.h" #include "messagesigner.h" -#include "netfulfilledman.h" #include "netmessagemaker.h" #include "script/sign.h" #include "txmempool.h" @@ -510,58 +506,3 @@ void CPrivateSend::SyncTransaction(const CTransaction& tx, const CBlockIndex *pi mapDSTX[txHash].SetConfirmedHeight(posInBlock == CMainSignals::SYNC_TRANSACTION_NOT_IN_BLOCK ? -1 : pindex->nHeight); LogPrint("privatesend", "CPrivateSendClient::SyncTransaction -- txid=%s\n", txHash.ToString()); } - -//TODO: Rename/move to core -void ThreadCheckPrivateSend(CConnman& connman) -{ - if(fLiteMode) return; // disable all Dash specific functionality - - static bool fOneThread; - if(fOneThread) return; - fOneThread = true; - - // Make this thread recognisable as the PrivateSend thread - RenameThread("dash-ps"); - - unsigned int nTick = 0; - - while (true) - { - MilliSleep(1000); - - // try to sync from all available nodes, one step at a time - masternodeSync.ProcessTick(connman); - - if(masternodeSync.IsBlockchainSynced() && !ShutdownRequested()) { - - nTick++; - - // make sure to check all masternodes first - mnodeman.Check(); - - mnodeman.ProcessPendingMnbRequests(connman); - mnodeman.ProcessPendingMnvRequests(connman); - - // check if we should activate or ping every few minutes, - // slightly postpone first run to give net thread a chance to connect to some peers - if(nTick % MASTERNODE_MIN_MNP_SECONDS == 15) - activeMasternode.ManageState(connman); - - if(nTick % 60 == 0) { - netfulfilledman.CheckAndRemove(); - mnodeman.ProcessMasternodeConnections(connman); - mnodeman.CheckAndRemove(connman); - mnodeman.WarnMasternodeDaemonUpdates(); - mnpayments.CheckAndRemove(); - instantsend.CheckAndRemove(); - } - if(fMasternodeMode && (nTick % (60 * 5) == 0)) { - mnodeman.DoFullVerificationStep(connman); - } - - if(nTick % (60 * 5) == 0) { - governance.DoMaintenance(connman); - } - } - } -} diff --git a/src/privatesend.h b/src/privatesend.h index 3530c0f70d06..e04f046b5048 100644 --- a/src/privatesend.h +++ b/src/privatesend.h @@ -437,6 +437,4 @@ class CPrivateSend static void SyncTransaction(const CTransaction& tx, const CBlockIndex *pindex, int posInBlock); }; -void ThreadCheckPrivateSend(CConnman& connman); - #endif From d7e210341189bb9e0e0d9ee604003608aac49e7a Mon Sep 17 00:00:00 2001 From: PaulieD Date: Mon, 16 Jul 2018 07:48:02 -0500 Subject: [PATCH 019/400] Fixes inaccurate round count in CoinControlDialog (#2137) * fixes #2068 * Revert prior and update in correct location --- src/qt/coincontroldialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qt/coincontroldialog.cpp b/src/qt/coincontroldialog.cpp index b5c29fc8814c..afec817dea2d 100644 --- a/src/qt/coincontroldialog.cpp +++ b/src/qt/coincontroldialog.cpp @@ -433,7 +433,7 @@ void CoinControlDialog::viewItemChanged(QTreeWidgetItem* item, int column) item->setCheckState(COLUMN_CHECKBOX, Qt::Unchecked); else { coinControl->Select(outpt); - int nRounds = pwalletMain->GetCappedOutpointPrivateSendRounds(outpt); + int nRounds = pwalletMain->GetRealOutpointPrivateSendRounds(outpt); if (coinControl->fUsePrivateSend && nRounds < privateSendClient.nPrivateSendRounds) { QMessageBox::warning(this, windowTitle(), tr("Non-anonymized input selected. PrivateSend will be disabled.

If you still want to use PrivateSend, please deselect all non-nonymized inputs first and then check PrivateSend checkbox again."), @@ -781,7 +781,7 @@ void CoinControlDialog::updateView() // PrivateSend rounds COutPoint outpoint = COutPoint(out.tx->tx->GetHash(), out.i); - int nRounds = pwalletMain->GetCappedOutpointPrivateSendRounds(outpoint); + int nRounds = pwalletMain->GetRealOutpointPrivateSendRounds(outpoint); if (nRounds >= 0 || fDebug) itemOutput->setText(COLUMN_PRIVATESEND_ROUNDS, QString::number(nRounds)); else itemOutput->setText(COLUMN_PRIVATESEND_ROUNDS, tr("n/a")); From 7a85e24c3706d6b9db9526848c4e3f228add8856 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Mon, 16 Jul 2018 14:48:47 +0200 Subject: [PATCH 020/400] Remove deprecated gitian-rpi2.yml descriptor (#2183) Since backporting Bitcoin 0.14 code, we have the arm-linux-gnueabihf and aarch64-linux-gnu hosts in gitian-linux.yml --- contrib/gitian-descriptors/gitian-rpi2.yml | 112 --------------------- 1 file changed, 112 deletions(-) delete mode 100644 contrib/gitian-descriptors/gitian-rpi2.yml diff --git a/contrib/gitian-descriptors/gitian-rpi2.yml b/contrib/gitian-descriptors/gitian-rpi2.yml deleted file mode 100644 index a7119da378fd..000000000000 --- a/contrib/gitian-descriptors/gitian-rpi2.yml +++ /dev/null @@ -1,112 +0,0 @@ ---- -name: "dash-raspberry-0.12" -enable_cache: true -suites: -- "precise" -architectures: -- "amd64" -packages: -- "g++-multilib" -- "git-core" -- "pkg-config" -- "autoconf2.13" -- "libtool" -- "automake" -- "faketime" -- "bsdmainutils" -- "binutils-gold" -reference_datetime: "2017-01-01 00:00:00" -remotes: -- "url": "https://github.com/dashpay/dash.git" - "dir": "dash" -files: -- "raspberrypi-tools.tar.gz" -script: | - WRAP_DIR=$HOME/wrapped - HOSTS="arm-linux-gnueabihf" - CONFIGFLAGS="--enable-upnp-default --enable-glibc-back-compat" - FAKETIME_HOST_PROGS="" - FAKETIME_PROGS="date ar ranlib nm strip" - - tar --warning=no-timestamp -xzf raspberrypi-tools.tar.gz - export TOOLCHAIN_BIN=$(pwd)/raspberrypi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin - export PATH=$PATH:$TOOLCHAIN_BIN - - export QT_RCC_TEST=1 - export GZIP="-9n" - export TAR_OPTIONS="--mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME"" - export TZ="UTC" - export BUILD_DIR=`pwd` - mkdir -p ${WRAP_DIR} - if test -n "$GBUILD_CACHE_ENABLED"; then - export SOURCES_PATH=${GBUILD_COMMON_CACHE} - export BASE_CACHE=${GBUILD_PACKAGE_CACHE} - mkdir -p ${BASE_CACHE} ${SOURCES_PATH} - fi - - # Create global faketime wrappers - for prog in ${FAKETIME_PROGS}; do - echo '#!/bin/bash' > ${WRAP_DIR}/${prog} - echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog} - echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog} - echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${prog} - echo "\$REAL \$@" >> $WRAP_DIR/${prog} - chmod +x ${WRAP_DIR}/${prog} - done - - # Create per-host faketime wrappers - for i in $HOSTS; do - for prog in ${FAKETIME_HOST_PROGS}; do - echo '#!/bin/bash' > ${WRAP_DIR}/${i}-${prog} - echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} - echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog} - echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${i}-${prog} - echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog} - chmod +x ${WRAP_DIR}/${i}-${prog} - done - done - export PATH=${WRAP_DIR}:${PATH} - - cd dash - BASEPREFIX=`pwd`/depends - # Build dependencies for each host - for i in $HOSTS; do - make ${MAKEOPTS} NO_QT=1 -C ${BASEPREFIX} HOST="${i}" - done - - # Create the release tarball using (arbitrarily) the first host - ./autogen.sh - ./configure --prefix=${BASEPREFIX}/`echo "${HOSTS}" | awk '{print $1;}'` - make NO_QT=1 dist - SOURCEDIST=`echo dashcore-*.tar.gz` - DISTNAME=`echo ${SOURCEDIST} | sed 's/.tar.*//'` - # Correct tar file order - mkdir -p temp - pushd temp - tar xf ../$SOURCEDIST - find dashcore-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST - popd - - ORIGPATH="$PATH" - # Extract the release tarball into a dir for each host and build - for i in ${HOSTS}; do - export PATH=${BASEPREFIX}/${i}/native/bin:${ORIGPATH} - mkdir -p distsrc-${i} - cd distsrc-${i} - INSTALLPATH=`pwd`/installed/${DISTNAME} - mkdir -p ${INSTALLPATH} - tar --strip-components=1 -xf ../$SOURCEDIST - - ./configure --prefix=${BASEPREFIX}/${i} --bindir=${INSTALLPATH}/bin --includedir=${INSTALLPATH}/include --libdir=${INSTALLPATH}/lib --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} - make ${MAKEOPTS} NO_QT=1 - make NO_QT=1 install-strip - cd installed - find . -name "lib*.la" -delete - find . -name "lib*.a" -delete - rm -rf ${DISTNAME}/lib/pkgconfig - find ${DISTNAME} | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}.tar.gz - cd ../../ - done - mkdir -p $OUTDIR/src - mv $SOURCEDIST $OUTDIR/src - mv ${OUTDIR}/${DISTNAME}-arm-*.tar.gz ${OUTDIR}/${DISTNAME}-RPi2.tar.gz From b476173258d8fb3845ef31bc2d1bd03440c41ebc Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Mon, 16 Jul 2018 14:49:23 +0200 Subject: [PATCH 021/400] Install python3 in gitian builds (#2182) We mostly switched to python3, so we should also install it in gitian builds. Especially the osx build needs as it otherwise fails due to missing setuptools. --- contrib/gitian-descriptors/gitian-linux.yml | 1 + contrib/gitian-descriptors/gitian-osx.yml | 4 +++- contrib/gitian-descriptors/gitian-win.yml | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 2c26d4fd60d4..76a66fa3286a 100755 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -27,6 +27,7 @@ packages: - "bsdmainutils" - "ca-certificates" - "python" +- "python3" remotes: - "url": "https://github.com/dashpay/dash.git" "dir": "dash" diff --git a/contrib/gitian-descriptors/gitian-osx.yml b/contrib/gitian-descriptors/gitian-osx.yml index 9abc4776fbbd..5efe3bc3348c 100644 --- a/contrib/gitian-descriptors/gitian-osx.yml +++ b/contrib/gitian-descriptors/gitian-osx.yml @@ -25,7 +25,9 @@ packages: - "libbz2-dev" - "python" - "python-dev" -- "python-setuptools" +- "python3" +- "python3-dev" +- "python3-setuptools" - "fonts-tuffy" remotes: - "url": "https://github.com/dashpay/dash.git" diff --git a/contrib/gitian-descriptors/gitian-win.yml b/contrib/gitian-descriptors/gitian-win.yml index 68aa01440880..a97d52152799 100755 --- a/contrib/gitian-descriptors/gitian-win.yml +++ b/contrib/gitian-descriptors/gitian-win.yml @@ -21,6 +21,7 @@ packages: - "zip" - "ca-certificates" - "python" +- "python3" remotes: - "url": "https://github.com/dashpay/dash.git" "dir": "dash" From ace980834f1e70686cee17b94ed90a6cc946e49c Mon Sep 17 00:00:00 2001 From: gladcow Date: Fri, 20 Jul 2018 16:32:41 +0300 Subject: [PATCH 022/400] Extend Bloom Filter support to InstantSend related messages (#2184) * use bloom filters for IX lock votes * code style fixes --- src/instantx.cpp | 6 +++++- src/net.cpp | 15 +++++++++++++++ src/net.h | 1 + 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/instantx.cpp b/src/instantx.cpp index afe7f7e10f2d..3f02f4794153 100644 --- a/src/instantx.cpp +++ b/src/instantx.cpp @@ -1121,7 +1121,11 @@ bool CTxLockVote::Sign() void CTxLockVote::Relay(CConnman& connman) const { CInv inv(MSG_TXLOCK_VOTE, GetHash()); - connman.RelayInv(inv); + CTxLockRequest request; + if(instantsend.GetTxLockRequest(txHash, request)) + connman.RelayInvFiltered(inv, *request.tx); + else + connman.RelayInv(inv); } bool CTxLockVote::IsExpired(int nHeight) const diff --git a/src/net.cpp b/src/net.cpp index 988230de8e73..630ab50b5b25 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -2640,6 +2640,21 @@ void CConnman::RelayInv(CInv &inv, const int minProtoVersion) { pnode->PushInventory(inv); } +void CConnman::RelayInvFiltered(CInv &inv, const CTransaction& relatedTx, const int minProtoVersion) +{ + LOCK(cs_vNodes); + for (const auto& pnode : vNodes) { + if(pnode->nVersion < minProtoVersion) + continue; + { + LOCK(pnode->cs_filter); + if(pnode->pfilter && !pnode->pfilter->IsRelevantAndUpdate(relatedTx)) + continue; + } + pnode->PushInventory(inv); + } +} + void CConnman::RecordBytesRecv(uint64_t bytes) { LOCK(cs_totalBytesRecv); diff --git a/src/net.h b/src/net.h index cd135e5f230d..bc58b4ebac23 100644 --- a/src/net.h +++ b/src/net.h @@ -309,6 +309,7 @@ class CConnman void RelayTransaction(const CTransaction& tx); void RelayTransaction(const CTransaction& tx, const CDataStream& ss); void RelayInv(CInv &inv, const int minProtoVersion = MIN_PEER_PROTO_VERSION); + void RelayInvFiltered(CInv &inv, const CTransaction &relatedTx, const int minProtoVersion = MIN_PEER_PROTO_VERSION); // Addrman functions size_t GetAddressCount() const; From eb202e812f9cf936faf79df3b1b48a83599fbdf1 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Fri, 20 Jul 2018 15:33:02 +0200 Subject: [PATCH 023/400] Use ccache in gitian builds (#2185) * Use subdirectory for depends cache in gitian builds * Make timestamps of wrappers deterministic * Use ccache in gitian builds * Upgrade ccache to latest version (3.4.2) * Build the branch that belongs to the Jenkins build instead of develop --- Jenkinsfile.gitian | 2 +- contrib/gitian-descriptors/gitian-linux.yml | 35 ++++++++++++++++-- contrib/gitian-descriptors/gitian-osx.yml | 26 ++++++++++++-- contrib/gitian-descriptors/gitian-win.yml | 39 +++++++++++++++++++-- depends/packages/native_ccache.mk | 4 +-- 5 files changed, 97 insertions(+), 9 deletions(-) diff --git a/Jenkinsfile.gitian b/Jenkinsfile.gitian index f7a0c212eab5..27e25693ccbc 100644 --- a/Jenkinsfile.gitian +++ b/Jenkinsfile.gitian @@ -12,7 +12,6 @@ def proc = 4 def mem = 2000 def repositoryUrl = "https://github.com/dashpay/dash.git" -def commit = "develop" def tasks = [:] for(int i = 0; i < targets.size(); i++) { @@ -25,6 +24,7 @@ for(int i = 0; i < targets.size(); i++) { def pwd = sh(returnStdout: true, script: 'pwd').trim() def dockerGid = sh(returnStdout: true, script: "stat -c '%g' /var/run/docker.sock").trim() def BRANCH_NAME = sh(returnStdout: true, script: 'echo $BRANCH_NAME').trim() + def commit = BRANCH_NAME def hasCache = false def gitianDescriptor diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 76a66fa3286a..f69f7063203c 100755 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -51,18 +51,37 @@ script: | mkdir -p ${WRAP_DIR} if test -n "$GBUILD_CACHE_ENABLED"; then export SOURCES_PATH=${GBUILD_COMMON_CACHE} - export BASE_CACHE=${GBUILD_PACKAGE_CACHE} + export BASE_CACHE=${GBUILD_PACKAGE_CACHE}/depends mkdir -p ${BASE_CACHE} ${SOURCES_PATH} + + # Setup ccache to use correct cache directories and fix the compiler check of ccache + CONFIGFLAGS="${CONFIGFLAGS} --enable-ccache" + export CCACHE_DIR=${GBUILD_PACKAGE_CACHE}/ccache + # As we later wrap the gcc binaries, this is fast + export CCACHE_COMPILERCHECK="content" + if [ -f ${GBUILD_PACKAGE_CACHE}/ccache.tar.gz ]; then + pushd ${GBUILD_PACKAGE_CACHE} + tar xzf ccache.tar.gz + rm ccache.tar.gz + popd + fi + else + CONFIGFLAGS="${CONFIGFLAGS} --disable-ccache" fi + # We include the GCC version in all wrappers so that ccache can detect compiler upgrades when hashing the wrappers + GCCVERSION=`gcc --version | head -1` + function create_global_faketime_wrappers { for prog in ${FAKETIME_PROGS}; do echo '#!/bin/bash' > ${WRAP_DIR}/${prog} + echo "# GCCVERSION=${GCCVERSION}" >> ${WRAP_DIR}/${prog} echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog} echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog} echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${prog} echo "\$REAL \$@" >> $WRAP_DIR/${prog} chmod +x ${WRAP_DIR}/${prog} + touch -d "${REFERENCE_DATETIME}" ${WRAP_DIR}/${prog} done } @@ -70,11 +89,13 @@ script: | for i in $HOSTS; do for prog in ${FAKETIME_HOST_PROGS}; do echo '#!/bin/bash' > ${WRAP_DIR}/${i}-${prog} + echo "# GCCVERSION=${GCCVERSION}" >> ${WRAP_DIR}/${i}-${prog} echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog} echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${i}-${prog} echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog} chmod +x ${WRAP_DIR}/${i}-${prog} + touch -d "${REFERENCE_DATETIME}" ${WRAP_DIR}/${i}-${prog} done done } @@ -100,6 +121,7 @@ script: | rm -f ${WRAP_DIR}/${prog} cat << EOF > ${WRAP_DIR}/${prog} #!/bin/bash + # GCCVERSION=${GCCVERSION} REAL="`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1`" for var in "\$@" do @@ -112,6 +134,7 @@ script: | \$REAL \$@ EOF chmod +x ${WRAP_DIR}/${prog} + touch -d "${REFERENCE_DATETIME}" ${WRAP_DIR}/${prog} done cd dash @@ -155,7 +178,7 @@ script: | mkdir -p ${INSTALLPATH} tar --strip-components=1 -xf ../$SOURCEDIST - CONFIG_SITE=${BASEPREFIX}/${i}/share/config.site ./configure --prefix=/ --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} CFLAGS="${HOST_CFLAGS}" CXXFLAGS="${HOST_CXXFLAGS}" LDFLAGS="${HOST_LDFLAGS}" + CONFIG_SITE=${BASEPREFIX}/${i}/share/config.site ./configure --prefix=/ --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} CFLAGS="${HOST_CFLAGS}" CXXFLAGS="${HOST_CXXFLAGS}" LDFLAGS="${HOST_LDFLAGS}" make ${MAKEOPTS} make ${MAKEOPTS} -C src check-security @@ -183,3 +206,11 @@ script: | done mkdir -p $OUTDIR/src mv $SOURCEDIST $OUTDIR/src + + # Compress ccache (otherwise the assert file will get too huge) + if [ "$CCACHE_DIR" != "" ]; then + pushd ${GBUILD_PACKAGE_CACHE} + tar czf ccache.tar.gz ccache + rm -rf ccache + popd + fi diff --git a/contrib/gitian-descriptors/gitian-osx.yml b/contrib/gitian-descriptors/gitian-osx.yml index 5efe3bc3348c..28097c609a53 100644 --- a/contrib/gitian-descriptors/gitian-osx.yml +++ b/contrib/gitian-descriptors/gitian-osx.yml @@ -49,8 +49,20 @@ script: | mkdir -p ${WRAP_DIR} if test -n "$GBUILD_CACHE_ENABLED"; then export SOURCES_PATH=${GBUILD_COMMON_CACHE} - export BASE_CACHE=${GBUILD_PACKAGE_CACHE} + export BASE_CACHE=${GBUILD_PACKAGE_CACHE}/depends mkdir -p ${BASE_CACHE} ${SOURCES_PATH} + + # Setup ccache to use correct cache directories + CONFIGFLAGS="${CONFIGFLAGS} --enable-ccache" + export CCACHE_DIR=${GBUILD_PACKAGE_CACHE}/ccache + if [ -f ${GBUILD_PACKAGE_CACHE}/ccache.tar.gz ]; then + pushd ${GBUILD_PACKAGE_CACHE} + tar xzf ccache.tar.gz + rm ccache.tar.gz + popd + fi + else + CONFIGFLAGS="${CONFIGFLAGS} --disable-ccache" fi export ZERO_AR_DATE=1 @@ -63,6 +75,7 @@ script: | echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${prog} echo "\$REAL \$@" >> $WRAP_DIR/${prog} chmod +x ${WRAP_DIR}/${prog} + touch -d "${REFERENCE_DATETIME}" ${WRAP_DIR}/${prog} done } @@ -75,6 +88,7 @@ script: | echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${i}-${prog} echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog} chmod +x ${WRAP_DIR}/${i}-${prog} + touch -d "${REFERENCE_DATETIME}" ${WRAP_DIR}/${i}-${prog} done done } @@ -126,7 +140,7 @@ script: | mkdir -p ${INSTALLPATH} tar --strip-components=1 -xf ../$SOURCEDIST - CONFIG_SITE=${BASEPREFIX}/${i}/share/config.site ./configure --prefix=/ --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} + CONFIG_SITE=${BASEPREFIX}/${i}/share/config.site ./configure --prefix=/ --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} make ${MAKEOPTS} make install-strip DESTDIR=${INSTALLPATH} @@ -158,3 +172,11 @@ script: | mkdir -p $OUTDIR/src mv $SOURCEDIST $OUTDIR/src mv ${OUTDIR}/${DISTNAME}-x86_64-*.tar.gz ${OUTDIR}/${DISTNAME}-osx64.tar.gz + + # Compress ccache (otherwise the assert file will get too huge) + if [ "$CCACHE_DIR" != "" ]; then + pushd ${GBUILD_PACKAGE_CACHE} + tar czf ccache.tar.gz ccache + rm -rf ccache + popd + fi diff --git a/contrib/gitian-descriptors/gitian-win.yml b/contrib/gitian-descriptors/gitian-win.yml index a97d52152799..a19c6bbd0946 100755 --- a/contrib/gitian-descriptors/gitian-win.yml +++ b/contrib/gitian-descriptors/gitian-win.yml @@ -43,18 +43,37 @@ script: | mkdir -p ${WRAP_DIR} if test -n "$GBUILD_CACHE_ENABLED"; then export SOURCES_PATH=${GBUILD_COMMON_CACHE} - export BASE_CACHE=${GBUILD_PACKAGE_CACHE} + export BASE_CACHE=${GBUILD_PACKAGE_CACHE}/depends mkdir -p ${BASE_CACHE} ${SOURCES_PATH} + + # Setup ccache to use correct cache directories and fix the compiler check of ccache + CONFIGFLAGS="${CONFIGFLAGS} --enable-ccache" + export CCACHE_DIR=${GBUILD_PACKAGE_CACHE}/ccache + # As we later wrap the gcc binaries, this is fast + export CCACHE_COMPILERCHECK="content" + if [ -f ${GBUILD_PACKAGE_CACHE}/ccache.tar.gz ]; then + pushd ${GBUILD_PACKAGE_CACHE} + tar xzf ccache.tar.gz + rm ccache.tar.gz + popd + fi + else + CONFIGFLAGS="${CONFIGFLAGS} --disable-ccache" fi + # We include the GCC version in all wrappers so that ccache can detect compiler upgrades when hashing the wrappers + GCCVERSION=`gcc --version | head -1` + function create_global_faketime_wrappers { for prog in ${FAKETIME_PROGS}; do echo '#!/bin/bash' > ${WRAP_DIR}/${prog} + echo "# GCCVERSION=${GCCVERSION}" >> ${WRAP_DIR}/${prog} echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog} echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog} echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${prog} echo "\$REAL \$@" >> $WRAP_DIR/${prog} chmod +x ${WRAP_DIR}/${prog} + touch -d "${REFERENCE_DATETIME}" ${WRAP_DIR}/${prog} done } @@ -62,11 +81,13 @@ script: | for i in $HOSTS; do for prog in ${FAKETIME_HOST_PROGS}; do echo '#!/bin/bash' > ${WRAP_DIR}/${i}-${prog} + echo "# GCCVERSION=${GCCVERSION}" >> ${WRAP_DIR}/${i}-${prog} echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog} echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${i}-${prog} echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog} chmod +x ${WRAP_DIR}/${i}-${prog} + touch -d "${REFERENCE_DATETIME}" ${WRAP_DIR}/${i}-${prog} done done } @@ -78,19 +99,25 @@ script: | mkdir -p ${WRAP_DIR}/${i} for prog in collect2; do echo '#!/bin/bash' > ${WRAP_DIR}/${i}/${prog} + echo "# GCCVERSION=${GCCVERSION}" >> ${WRAP_DIR}/${i}/${prog} REAL=$(${i}-gcc -print-prog-name=${prog}) echo "export MALLOC_PERTURB_=255" >> ${WRAP_DIR}/${i}/${prog} echo "${REAL} \$@" >> $WRAP_DIR/${i}/${prog} chmod +x ${WRAP_DIR}/${i}/${prog} + touch -d "${REFERENCE_DATETIME}" ${WRAP_DIR}/${i}/${prog} done for prog in gcc g++; do echo '#!/bin/bash' > ${WRAP_DIR}/${i}-${prog} + echo "# GCCVERSION=${GCCVERSION}" >> ${WRAP_DIR}/${i}-${prog} echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} + echo '# Add the gcc version to the wrapper so that ccache takes this into account (we use CCACHE_COMPILERCHECK=content)' >> ${WRAP_DIR}/${i}-${prog} + echo "# `${prog} --version | head -1`" >> ${WRAP_DIR}/${i}-${prog} echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog} echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${i}-${prog} echo "export COMPILER_PATH=${WRAP_DIR}/${i}" >> ${WRAP_DIR}/${i}-${prog} echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog} chmod +x ${WRAP_DIR}/${i}-${prog} + touch -d "${REFERENCE_DATETIME}" ${WRAP_DIR}/${i}-${prog} done done } @@ -142,7 +169,7 @@ script: | mkdir -p ${INSTALLPATH} tar --strip-components=1 -xf ../$SOURCEDIST - CONFIG_SITE=${BASEPREFIX}/${i}/share/config.site ./configure --prefix=/ --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} CFLAGS="${HOST_CFLAGS}" CXXFLAGS="${HOST_CXXFLAGS}" + CONFIG_SITE=${BASEPREFIX}/${i}/share/config.site ./configure --prefix=/ --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} CFLAGS="${HOST_CFLAGS}" CXXFLAGS="${HOST_CXXFLAGS}" make ${MAKEOPTS} make ${MAKEOPTS} -C src check-security make deploy @@ -167,3 +194,11 @@ script: | mv ${OUTDIR}/${DISTNAME}-i686-*-debug.zip ${OUTDIR}/${DISTNAME}-win32-debug.zip mv ${OUTDIR}/${DISTNAME}-x86_64-*.zip ${OUTDIR}/${DISTNAME}-win64.zip mv ${OUTDIR}/${DISTNAME}-i686-*.zip ${OUTDIR}/${DISTNAME}-win32.zip + + # Compress ccache (otherwise the assert file will get too huge) + if [ "$CCACHE_DIR" != "" ]; then + pushd ${GBUILD_PACKAGE_CACHE} + tar czf ccache.tar.gz ccache + rm -rf ccache + popd + fi diff --git a/depends/packages/native_ccache.mk b/depends/packages/native_ccache.mk index 4ed61a49e9ca..3be669dc47cb 100644 --- a/depends/packages/native_ccache.mk +++ b/depends/packages/native_ccache.mk @@ -1,8 +1,8 @@ package=native_ccache -$(package)_version=3.3.3 +$(package)_version=3.4.2 $(package)_download_path=https://samba.org/ftp/ccache $(package)_file_name=ccache-$($(package)_version).tar.bz2 -$(package)_sha256_hash=2985bc5e32ebe38d2958d508eb54ddcad39eed909489c0c2988035214597ca54 +$(package)_sha256_hash=3aa5587793d4c790bd22999bfc678250c029307b3afb9d16f6f4a49c67b78fb3 define $(package)_set_vars $(package)_config_opts= From a5643f899d4a8765fca4594568271950e43f4921 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Wed, 25 Jul 2018 18:09:30 +0300 Subject: [PATCH 024/400] Switch RequestGovernanceObjectVotes from pointers to hashes (#2189) * No need for pointers to gobjects, can simply use hashes in RequestGovernanceObjectVotes * Drop `swap` and `=` in GovernanceObject Were used for shuffling, no longer needed --- src/governance-object.cpp | 24 ----------------------- src/governance-object.h | 8 -------- src/governance.cpp | 40 +++++++++++++++++++-------------------- 3 files changed, 19 insertions(+), 53 deletions(-) diff --git a/src/governance-object.cpp b/src/governance-object.cpp index 0874139ec0f5..0677ac1e9f08 100644 --- a/src/governance-object.cpp +++ b/src/governance-object.cpp @@ -735,30 +735,6 @@ void CGovernanceObject::UpdateSentinelVariables() if(GetAbsoluteNoCount(VOTE_SIGNAL_VALID) >= nAbsVoteReq) fCachedValid = false; } -void CGovernanceObject::swap(CGovernanceObject& first, CGovernanceObject& second) // nothrow -{ - // 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 - swap(first.nHashParent, second.nHashParent); - swap(first.nRevision, second.nRevision); - swap(first.nTime, second.nTime); - swap(first.nDeletionTime, second.nDeletionTime); - swap(first.nCollateralHash, second.nCollateralHash); - swap(first.vchData, second.vchData); - swap(first.nObjectType, second.nObjectType); - - // swap all cached valid flags - swap(first.fCachedFunding, second.fCachedFunding); - swap(first.fCachedValid, second.fCachedValid); - swap(first.fCachedDelete, second.fCachedDelete); - swap(first.fCachedEndorsed, second.fCachedEndorsed); - swap(first.fDirtyCache, second.fDirtyCache); - swap(first.fExpired, second.fExpired); -} - void CGovernanceObject::CheckOrphanVotes(CConnman& connman) { int64_t nNow = GetAdjustedTime(); diff --git a/src/governance-object.h b/src/governance-object.h index 1fcb8f2978a1..2ec25e620b0f 100644 --- a/src/governance-object.h +++ b/src/governance-object.h @@ -194,8 +194,6 @@ class CGovernanceObject CGovernanceObject(const CGovernanceObject& other); - void swap(CGovernanceObject& first, CGovernanceObject& second); // nothrow - // Public Getter methods int64_t GetCreationTime() const { @@ -355,12 +353,6 @@ class CGovernanceObject // AFTER DESERIALIZATION OCCURS, CACHED VARIABLES MUST BE CALCULATED MANUALLY } - CGovernanceObject& operator=(CGovernanceObject from) - { - swap(*this, from); - return *this; - } - private: // FUNCTIONS FOR DEALING WITH DATA STRING void LoadData(); diff --git a/src/governance.cpp b/src/governance.cpp index 7909a7a1cb5f..53459b928ca1 100644 --- a/src/governance.cpp +++ b/src/governance.cpp @@ -1065,8 +1065,8 @@ int CGovernanceManager::RequestGovernanceObjectVotes(const std::vector& int nTimeout = 60 * 60; size_t nPeersPerHashMax = 3; - std::vector vpGovObjsTmp; - std::vector vpGovObjsTriggersTmp; + std::vector vTriggerObjHashes; + std::vector vOtherObjHashes; // This should help us to get some idea about an impact this can bring once deployed on mainnet. // Testnet is ~40 times smaller in masternode count, but only ~1000 masternodes usually vote, @@ -1098,32 +1098,30 @@ int CGovernanceManager::RequestGovernanceObjectVotes(const std::vector& if(mapAskedRecently[nHash].size() >= nPeersPerHashMax) continue; } - auto govObj = objPair.second; - if(govObj.nObjectType == GOVERNANCE_OBJECT_TRIGGER) { - vpGovObjsTriggersTmp.push_back(&govObj); + if(objPair.second.nObjectType == GOVERNANCE_OBJECT_TRIGGER) { + vTriggerObjHashes.push_back(nHash); } else { - vpGovObjsTmp.push_back(&govObj); + vOtherObjHashes.push_back(nHash); } } } - LogPrint("gobject", "CGovernanceManager::RequestGovernanceObjectVotes -- start: vpGovObjsTriggersTmp %d vpGovObjsTmp %d mapAskedRecently %d\n", - vpGovObjsTriggersTmp.size(), vpGovObjsTmp.size(), mapAskedRecently.size()); + LogPrint("gobject", "CGovernanceManager::RequestGovernanceObjectVotes -- start: vTriggerObjHashes %d vOtherObjHashes %d mapAskedRecently %d\n", + vTriggerObjHashes.size(), vOtherObjHashes.size(), mapAskedRecently.size()); FastRandomContext insecure_rand; - // shuffle pointers - std::random_shuffle(vpGovObjsTriggersTmp.begin(), vpGovObjsTriggersTmp.end(), insecure_rand); - std::random_shuffle(vpGovObjsTmp.begin(), vpGovObjsTmp.end(), insecure_rand); + std::random_shuffle(vTriggerObjHashes.begin(), vTriggerObjHashes.end(), insecure_rand); + std::random_shuffle(vOtherObjHashes.begin(), vOtherObjHashes.end(), insecure_rand); for (int i = 0; i < nMaxObjRequestsPerNode; ++i) { uint256 nHashGovobj; // ask for triggers first - if(vpGovObjsTriggersTmp.size()) { - nHashGovobj = vpGovObjsTriggersTmp.back()->GetHash(); + if(vTriggerObjHashes.size()) { + nHashGovobj = vTriggerObjHashes.back(); } else { - if(vpGovObjsTmp.empty()) break; - nHashGovobj = vpGovObjsTmp.back()->GetHash(); + if(vOtherObjHashes.empty()) break; + nHashGovobj = vOtherObjHashes.back(); } bool fAsked = false; for (const auto& pnode : vNodesCopy) { @@ -1147,17 +1145,17 @@ int CGovernanceManager::RequestGovernanceObjectVotes(const std::vector& if(mapAskedRecently[nHashGovobj].size() >= nPeersPerHashMax) break; } // NOTE: this should match `if` above (the one before `while`) - if(vpGovObjsTriggersTmp.size()) { - vpGovObjsTriggersTmp.pop_back(); + if(vTriggerObjHashes.size()) { + vTriggerObjHashes.pop_back(); } else { - vpGovObjsTmp.pop_back(); + vOtherObjHashes.pop_back(); } if(!fAsked) i--; } - LogPrint("gobject", "CGovernanceManager::RequestGovernanceObjectVotes -- end: vpGovObjsTriggersTmp %d vpGovObjsTmp %d mapAskedRecently %d\n", - vpGovObjsTriggersTmp.size(), vpGovObjsTmp.size(), mapAskedRecently.size()); + LogPrint("gobject", "CGovernanceManager::RequestGovernanceObjectVotes -- end: vTriggerObjHashes %d vOtherObjHashes %d mapAskedRecently %d\n", + vTriggerObjHashes.size(), vOtherObjHashes.size(), mapAskedRecently.size()); - return int(vpGovObjsTriggersTmp.size() + vpGovObjsTmp.size()); + return int(vTriggerObjHashes.size() + vOtherObjHashes.size()); } bool CGovernanceManager::AcceptObjectMessage(const uint256& nHash) From 65b9045269e95478e2b886ca28cd73670e286e12 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Wed, 25 Jul 2018 18:09:48 +0300 Subject: [PATCH 025/400] Add helpers GetSentinelString() and GetDaemonString() to CMasternodePing (#2192) --- src/masternode.cpp | 10 ++++++++++ src/masternode.h | 3 +++ src/rpc/masternode.cpp | 12 ++++++------ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/masternode.cpp b/src/masternode.cpp index 53f0e9285664..26fae469b195 100644 --- a/src/masternode.cpp +++ b/src/masternode.cpp @@ -930,6 +930,16 @@ void CMasternodePing::Relay(CConnman& connman) connman.RelayInv(inv); } +std::string CMasternodePing::GetSentinelString() const +{ + return nSentinelVersion > DEFAULT_SENTINEL_VERSION ? SafeIntVersionToString(nSentinelVersion) : "Unknown"; +} + +std::string CMasternodePing::GetDaemonString() const +{ + return nDaemonVersion > DEFAULT_DAEMON_VERSION ? FormatVersion(nDaemonVersion) : "Unknown"; +} + void CMasternode::AddGovernanceVote(uint256 nGovernanceObjectHash) { if(mapGovernanceObjectsVotedOn.count(nGovernanceObjectHash)) { diff --git a/src/masternode.h b/src/masternode.h index 38253aa44a2f..9e738e7d4df6 100644 --- a/src/masternode.h +++ b/src/masternode.h @@ -101,6 +101,9 @@ class CMasternodePing bool CheckAndUpdate(CMasternode* pmn, bool fFromNewBroadcast, int& nDos, CConnman& connman); void Relay(CConnman& connman); + std::string GetSentinelString() const; + std::string GetDaemonString() const; + explicit operator bool() const; }; diff --git a/src/rpc/masternode.cpp b/src/rpc/masternode.cpp index 612fe7ce840a..d6dd81c50810 100644 --- a/src/rpc/masternode.cpp +++ b/src/rpc/masternode.cpp @@ -557,12 +557,12 @@ UniValue masternodelist(const JSONRPCRequest& request) strOutpoint.find(strFilter) == std::string::npos) continue; obj.push_back(Pair(strOutpoint, strAddress)); } else if (strMode == "daemon") { - std::string strDaemon = mn.lastPing.nDaemonVersion > DEFAULT_DAEMON_VERSION ? FormatVersion(mn.lastPing.nDaemonVersion) : "Unknown"; + std::string strDaemon = mn.lastPing.GetDaemonString(); if (strFilter !="" && strDaemon.find(strFilter) == std::string::npos && strOutpoint.find(strFilter) == std::string::npos) continue; obj.push_back(Pair(strOutpoint, strDaemon)); } else if (strMode == "sentinel") { - std::string strSentinel = mn.lastPing.nSentinelVersion > DEFAULT_SENTINEL_VERSION ? SafeIntVersionToString(mn.lastPing.nSentinelVersion) : "Unknown"; + std::string strSentinel = mn.lastPing.GetSentinelString(); if (strFilter !="" && strSentinel.find(strFilter) == std::string::npos && strOutpoint.find(strFilter) == std::string::npos) continue; obj.push_back(Pair(strOutpoint, strSentinel)); @@ -589,7 +589,7 @@ UniValue masternodelist(const JSONRPCRequest& request) CBitcoinAddress(mn.pubKeyCollateralAddress.GetID()).ToString() << " " << (int64_t)mn.lastPing.sigTime << " " << std::setw(8) << (int64_t)(mn.lastPing.sigTime - mn.sigTime) << " " << - SafeIntVersionToString(mn.lastPing.nSentinelVersion) << " " << + mn.lastPing.GetSentinelString() << " " << (mn.lastPing.fSentinelIsCurrent ? "current" : "expired") << " " << mn.addr.ToString(); std::string strInfo = streamInfo.str(); @@ -603,7 +603,7 @@ UniValue masternodelist(const JSONRPCRequest& request) mn.GetStatus() << " " << mn.nProtocolVersion << " " << mn.lastPing.nDaemonVersion << " " << - SafeIntVersionToString(mn.lastPing.nSentinelVersion) << " " << + mn.lastPing.GetSentinelString() << " " << (mn.lastPing.fSentinelIsCurrent ? "current" : "expired") << " " << (int64_t)mn.lastPing.sigTime << " " << (int64_t)(mn.lastPing.sigTime - mn.sigTime) << " " << @@ -617,8 +617,8 @@ UniValue masternodelist(const JSONRPCRequest& request) objMN.push_back(Pair("payee", CBitcoinAddress(mn.pubKeyCollateralAddress.GetID()).ToString())); objMN.push_back(Pair("status", mn.GetStatus())); objMN.push_back(Pair("protocol", mn.nProtocolVersion)); - objMN.push_back(Pair("daemonversion", mn.lastPing.nDaemonVersion > DEFAULT_DAEMON_VERSION ? FormatVersion(mn.lastPing.nDaemonVersion) : "Unknown")); - objMN.push_back(Pair("sentinelversion", mn.lastPing.nSentinelVersion > DEFAULT_SENTINEL_VERSION ? SafeIntVersionToString(mn.lastPing.nSentinelVersion) : "Unknown")); + objMN.push_back(Pair("daemonversion", mn.lastPing.GetDaemonString())); + objMN.push_back(Pair("sentinelversion", mn.lastPing.GetSentinelString())); objMN.push_back(Pair("sentinelstate", (mn.lastPing.fSentinelIsCurrent ? "current" : "expired"))); objMN.push_back(Pair("lastseen", (int64_t)mn.lastPing.sigTime)); objMN.push_back(Pair("activeseconds", (int64_t)(mn.lastPing.sigTime - mn.sigTime))); From 30fa8bc33c641739e165f646b68ff666fe0e854f Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sat, 28 Jul 2018 16:50:41 +0300 Subject: [PATCH 026/400] Make sure pwalletMain is not null whenever it's used in PS client (#2190) * Make sure pwalletMain is not null whenever it's used in PS client * partially revert --- src/privatesend-client.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/privatesend-client.cpp b/src/privatesend-client.cpp index 9a3660c1febb..2b41408f6afc 100644 --- a/src/privatesend-client.cpp +++ b/src/privatesend-client.cpp @@ -235,6 +235,8 @@ void CPrivateSendClient::SetNull() // void CPrivateSendClient::UnlockCoins() { + if (!pwalletMain) return; + while(true) { TRY_LOCK(pwalletMain->cs_wallet, lockWallet); if(!lockWallet) {MilliSleep(50); continue;} @@ -486,6 +488,8 @@ bool CPrivateSendClient::CheckPoolStateUpdate(PoolState nStateNew, int nEntriesC // bool CPrivateSendClient::SignFinalTransaction(const CTransaction& finalTransactionNew, CNode* pnode, CConnman& connman) { + if (!pwalletMain) return false; + if(fMasternodeMode || pnode == nullptr) return false; finalMutableTransaction = finalTransactionNew; @@ -619,6 +623,13 @@ bool CPrivateSendClient::WaitForAnotherBlock() bool CPrivateSendClient::CheckAutomaticBackup() { + if (!pwalletMain) { + LogPrint("privatesend", "CPrivateSendClient::CheckAutomaticBackup -- Wallet is not initialized, no mixing available.\n"); + strAutoDenomResult = _("Wallet is not initialized") + ", " + _("no mixing available."); + fEnablePrivateSend = false; // no mixing + return false; + } + switch(nWalletBackups) { case 0: LogPrint("privatesend", "CPrivateSendClient::CheckAutomaticBackup -- Automatic backups disabled, no mixing available.\n"); @@ -837,6 +848,8 @@ bool CPrivateSendClient::DoAutomaticDenominating(CConnman& connman, bool fDryRun bool CPrivateSendClient::JoinExistingQueue(CAmount nBalanceNeedsAnonymized, CConnman& connman) { + if (!pwalletMain) return false; + std::vector vecStandardDenoms = CPrivateSend::GetStandardDenominations(); // Look through the queues and see if anything matches for (auto& dsq : vecDarksendQueue) { @@ -917,6 +930,8 @@ bool CPrivateSendClient::JoinExistingQueue(CAmount nBalanceNeedsAnonymized, CCon bool CPrivateSendClient::StartNewQueue(CAmount nValueMin, CAmount nBalanceNeedsAnonymized, CConnman& connman) { + if (!pwalletMain) return false; + int nTries = 0; int nMnCountEnabled = mnodeman.CountEnabled(MIN_PRIVATESEND_PEER_PROTO_VERSION); @@ -1198,6 +1213,8 @@ bool CPrivateSendClient::PrepareDenominate(int nMinRounds, int nMaxRounds, std:: // Create collaterals by looping through inputs grouped by addresses bool CPrivateSendClient::MakeCollateralAmounts(CConnman& connman) { + if (!pwalletMain) return false; + std::vector vecTally; if(!pwalletMain->SelectCoinsGrouppedByAddresses(vecTally, false)) { LogPrint("privatesend", "CPrivateSendClient::MakeCollateralAmounts -- SelectCoinsGrouppedByAddresses can't find any inputs!\n"); @@ -1224,6 +1241,8 @@ bool CPrivateSendClient::MakeCollateralAmounts(CConnman& connman) // Split up large inputs or create fee sized inputs bool CPrivateSendClient::MakeCollateralAmounts(const CompactTallyItem& tallyItem, bool fTryDenominated, CConnman& connman) { + if (!pwalletMain) return false; + LOCK2(cs_main, pwalletMain->cs_wallet); // denominated input is always a single one, so we can check its amount directly and return early @@ -1296,6 +1315,8 @@ bool CPrivateSendClient::MakeCollateralAmounts(const CompactTallyItem& tallyItem // Create denominations by looping through inputs grouped by addresses bool CPrivateSendClient::CreateDenominated(CConnman& connman) { + if (!pwalletMain) return false; + LOCK2(cs_main, pwalletMain->cs_wallet); std::vector vecTally; @@ -1318,6 +1339,8 @@ bool CPrivateSendClient::CreateDenominated(CConnman& connman) // Create denominations bool CPrivateSendClient::CreateDenominated(const CompactTallyItem& tallyItem, bool fCreateMixingCollaterals, CConnman& connman) { + if (!pwalletMain) return false; + std::vector vecSend; CKeyHolderStorage keyHolderStorageDenom; From ac30196bc51901aa6b17282b0fb389a89bc8fb5f Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sat, 28 Jul 2018 16:50:58 +0300 Subject: [PATCH 027/400] Show some info about the wallet dumped via dumpwallet (#2191) Also show a warning that the file must be kept secure. --- src/wallet/rpcdump.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp index 70dd72c07f47..b21fbf0b5194 100644 --- a/src/wallet/rpcdump.cpp +++ b/src/wallet/rpcdump.cpp @@ -771,6 +771,12 @@ UniValue dumpwallet(const JSONRPCRequest& request) file << strprintf("# mined on %s\n", EncodeDumpTime(chainActive.Tip()->GetBlockTime())); file << "\n"; + UniValue obj(UniValue::VOBJ); + obj.push_back(Pair("dashcoreversion", CLIENT_BUILD)); + obj.push_back(Pair("lastblockheight", chainActive.Height())); + obj.push_back(Pair("lastblockhash", chainActive.Tip()->GetBlockHash().ToString())); + obj.push_back(Pair("lastblocktime", EncodeDumpTime(chainActive.Tip()->GetBlockTime()))); + // add the base58check encoded extended master if the wallet uses HD CHDChain hdChainCurrent; if (pwalletMain->GetHDChain(hdChainCurrent)) @@ -813,6 +819,7 @@ UniValue dumpwallet(const JSONRPCRequest& request) file << "# WARNING: ACCOUNT " << i << " IS MISSING!" << "\n\n"; } } + obj.push_back(Pair("hdaccounts", int(hdChainCurrent.CountAccounts()))); } for (std::vector >::const_iterator it = vKeyBirth.begin(); it != vKeyBirth.end(); it++) { @@ -835,7 +842,13 @@ UniValue dumpwallet(const JSONRPCRequest& request) file << "\n"; file << "# End of dump\n"; file.close(); - return NullUniValue; + + std::string strWarning = strprintf(_("%s file contains all private keys from this wallet. Do not share it with anyone!"), request.params[0].get_str().c_str()); + obj.push_back(Pair("keys", int(vKeyBirth.size()))); + obj.push_back(Pair("file", request.params[0].get_str().c_str())); + obj.push_back(Pair("warning", strWarning)); + + return obj; } From 3d002c94637eec55f68f39b1205fdaf24f4689de Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sat, 28 Jul 2018 16:51:13 +0300 Subject: [PATCH 028/400] Fix active masternode task schedule (#2193) --- src/init.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/init.cpp b/src/init.cpp index 0f1d952d3d35..b9416bcdee43 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1952,7 +1952,7 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler) scheduler.scheduleEvery(boost::bind(&CNetFulfilledRequestManager::DoMaintenance, boost::ref(netfulfilledman)), 60); scheduler.scheduleEvery(boost::bind(&CMasternodeSync::DoMaintenance, boost::ref(masternodeSync), boost::ref(*g_connman)), MASTERNODE_SYNC_TICK_SECONDS); scheduler.scheduleEvery(boost::bind(&CMasternodeMan::DoMaintenance, boost::ref(mnodeman), boost::ref(*g_connman)), 1); - scheduler.scheduleEvery(boost::bind(&CActiveMasternode::DoMaintenance, boost::ref(activeMasternode), boost::ref(*g_connman)), 1); + scheduler.scheduleEvery(boost::bind(&CActiveMasternode::DoMaintenance, boost::ref(activeMasternode), boost::ref(*g_connman)), MASTERNODE_MIN_MNP_SECONDS); scheduler.scheduleEvery(boost::bind(&CMasternodePayments::DoMaintenance, boost::ref(mnpayments)), 60); scheduler.scheduleEvery(boost::bind(&CGovernanceManager::DoMaintenance, boost::ref(governance), boost::ref(*g_connman)), 60 * 5); From 96435288fa6792f70b55dc248464a267c5f1b776 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sat, 28 Jul 2018 16:51:29 +0300 Subject: [PATCH 029/400] Move block template specific stuff from CBlock to CBlockTemplate (#2195) --- src/miner.cpp | 4 ++-- src/miner.h | 2 ++ src/primitives/block.h | 4 ---- src/rpc/mining.cpp | 12 ++++++------ 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index fcb03eae3ad0..0290dedbca18 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -170,9 +170,9 @@ std::unique_ptr BlockAssembler::CreateNewBlock(const CScript& sc // Update coinbase transaction with additional info about masternode and governance payments, // get some info back to pass to getblocktemplate - FillBlockPayments(coinbaseTx, nHeight, blockReward, pblock->txoutMasternode, pblock->voutSuperblock); + FillBlockPayments(coinbaseTx, nHeight, blockReward, pblocktemplate->txoutMasternode, pblocktemplate->voutSuperblock); // LogPrintf("CreateNewBlock -- nBlockHeight %d blockReward %lld txoutMasternode %s coinbaseTx %s", - // nHeight, blockReward, pblock->txoutMasternode.ToString(), coinbaseTx.ToString()); + // nHeight, blockReward, pblocktemplate->txoutMasternode.ToString(), coinbaseTx.ToString()); pblock->vtx[0] = MakeTransactionRef(std::move(coinbaseTx)); pblocktemplate->vTxFees[0] = -nFees; diff --git a/src/miner.h b/src/miner.h index 5934492c77f6..7770e95ba0cf 100644 --- a/src/miner.h +++ b/src/miner.h @@ -30,6 +30,8 @@ struct CBlockTemplate CBlock block; std::vector vTxFees; std::vector vTxSigOps; + CTxOut txoutMasternode; // masternode payment + std::vector voutSuperblock; // superblock payment }; // Container for tracking updates to ancestor feerate as we include (parent) diff --git a/src/primitives/block.h b/src/primitives/block.h index dbf80237cdb1..dda9a9d609b7 100644 --- a/src/primitives/block.h +++ b/src/primitives/block.h @@ -76,8 +76,6 @@ class CBlock : public CBlockHeader std::vector vtx; // memory only - mutable CTxOut txoutMasternode; // masternode payment - mutable std::vector voutSuperblock; // superblock payment mutable bool fChecked; CBlock() @@ -103,8 +101,6 @@ class CBlock : public CBlockHeader { CBlockHeader::SetNull(); vtx.clear(); - txoutMasternode = CTxOut(); - voutSuperblock.clear(); fChecked = false; } diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp index 0ded5a6c178d..723fc698f8a5 100644 --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -699,21 +699,21 @@ UniValue getblocktemplate(const JSONRPCRequest& request) result.push_back(Pair("height", (int64_t)(pindexPrev->nHeight+1))); UniValue masternodeObj(UniValue::VOBJ); - if(pblock->txoutMasternode != CTxOut()) { + if(pblocktemplate->txoutMasternode != CTxOut()) { CTxDestination address1; - ExtractDestination(pblock->txoutMasternode.scriptPubKey, address1); + ExtractDestination(pblocktemplate->txoutMasternode.scriptPubKey, address1); CBitcoinAddress address2(address1); masternodeObj.push_back(Pair("payee", address2.ToString().c_str())); - masternodeObj.push_back(Pair("script", HexStr(pblock->txoutMasternode.scriptPubKey))); - masternodeObj.push_back(Pair("amount", pblock->txoutMasternode.nValue)); + masternodeObj.push_back(Pair("script", HexStr(pblocktemplate->txoutMasternode.scriptPubKey))); + masternodeObj.push_back(Pair("amount", pblocktemplate->txoutMasternode.nValue)); } result.push_back(Pair("masternode", masternodeObj)); result.push_back(Pair("masternode_payments_started", pindexPrev->nHeight + 1 > consensusParams.nMasternodePaymentsStartBlock)); result.push_back(Pair("masternode_payments_enforced", sporkManager.IsSporkActive(SPORK_8_MASTERNODE_PAYMENT_ENFORCEMENT))); UniValue superblockObjArray(UniValue::VARR); - if(pblock->voutSuperblock.size()) { - for (const auto& txout : pblock->voutSuperblock) { + if(pblocktemplate->voutSuperblock.size()) { + for (const auto& txout : pblocktemplate->voutSuperblock) { UniValue entry(UniValue::VOBJ); CTxDestination address1; ExtractDestination(txout.scriptPubKey, address1); From a83ab550104499ed68713dbbd5bd4a3f7cf7e99a Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sat, 28 Jul 2018 16:51:45 +0300 Subject: [PATCH 030/400] Fix wallet lock check in DoAutomaticDenominating (#2196) --- src/privatesend-client.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/privatesend-client.cpp b/src/privatesend-client.cpp index 2b41408f6afc..5c915c7a7429 100644 --- a/src/privatesend-client.cpp +++ b/src/privatesend-client.cpp @@ -700,7 +700,6 @@ bool CPrivateSendClient::DoAutomaticDenominating(CConnman& connman, bool fDryRun { if(fMasternodeMode) return false; // no client-side mixing on masternodes if(!fEnablePrivateSend) return false; - if(!pwalletMain || pwalletMain->IsLocked(true)) return false; if(nState != POOL_STATE_IDLE) return false; if(!masternodeSync.IsMasternodeListSynced()) { @@ -708,6 +707,16 @@ bool CPrivateSendClient::DoAutomaticDenominating(CConnman& connman, bool fDryRun return false; } + if (!pwalletMain) { + strAutoDenomResult = _("Wallet is not initialized"); + return false; + } + + if(!fDryRun && pwalletMain->IsLocked(true)) { + strAutoDenomResult = _("Wallet is locked."); + return false; + } + if(!CheckAutomaticBackup()) return false; @@ -722,11 +731,6 @@ bool CPrivateSendClient::DoAutomaticDenominating(CConnman& connman, bool fDryRun return false; } - if(!fDryRun && pwalletMain->IsLocked(true)) { - strAutoDenomResult = _("Wallet is locked."); - return false; - } - if(WaitForAnotherBlock()) { LogPrintf("CPrivateSendClient::DoAutomaticDenominating -- Last successful PrivateSend action was too recent\n"); strAutoDenomResult = _("Last successful PrivateSend action was too recent."); From 0a6f47323ba9da7a25e6bcb8b11aa4b21e6c71fd Mon Sep 17 00:00:00 2001 From: gladcow Date: Sat, 28 Jul 2018 19:39:37 +0300 Subject: [PATCH 031/400] Remove dummy confirmations in RPC API and GUI for InstantSend transactions (#2040) * remove instandsenddepth option * remove CInstantSend::GetConfirmations * Explicit IXlocks processing in the code using GetDepthInMainChain * remove dummy confirmations for IX locks * remove unused constant * Track IS status in TransactionStatus * Highlight IS in tx list * Customize confirmation icons for IS txes * Fix issues: - bring back removed comment; - simplify 2 complex condition to ose `IsTrusted()` function only; - rename `IsLockedIX` function to 'IsLockedByInstantSend`; * Revert condition with IsTrusted() * code style fix * remove dummy confirmations from instantsend.md * fix instantsend.md --- doc/instantsend.md | 54 +------------------ src/governance-object.cpp | 5 +- src/init.cpp | 4 -- src/instantx.cpp | 6 --- src/instantx.h | 10 ---- src/qt/guiconstants.h | 2 + src/qt/transactionrecord.cpp | 1 + src/qt/transactionrecord.h | 2 + src/qt/transactiontablemodel.cpp | 34 ++++++++++-- src/qt/walletmodel.cpp | 2 +- src/wallet/rpcwallet.cpp | 92 ++++++++++++++++---------------- src/wallet/wallet.cpp | 38 +++++++------ src/wallet/wallet.h | 9 ++-- 13 files changed, 111 insertions(+), 148 deletions(-) diff --git a/doc/instantsend.md b/doc/instantsend.md index d85cbf1393cb..bea11735c098 100644 --- a/doc/instantsend.md +++ b/doc/instantsend.md @@ -25,56 +25,4 @@ When a wallet InstantSend transaction is successfully locked a shell command pro #### RPC -Details pertaining to an observed "Transaction Lock" can also be retrieved through RPC, it’s important however to understand the underlying mechanism. - -By default, the Dash Core daemon will launch using the following constant: - -``` -static const int DEFAULT_INSTANTSEND_DEPTH = 5; -``` - -This value can be overridden by passing the following argument to the Dash Core daemon: - -``` --instantsenddepth= -``` - -The key thing to understand is that this value indicates the number of "confirmations" a successful Transaction Lock represents. When Wallet RPC commands which support `minconf` and `addlockconf` parameters (such as `listreceivedbyaddress`) are performed and `addlockconf` is `true`, then `instantsenddepth` attribute is taken into account when returning information about the transaction. In this case the value in `confirmations` field you see through RPC is showing the number of `"Blockchain Confirmations" + "InstantSend Depth"` (assuming the funds were sent via InstantSend). - -There is also a field named `instantlock` (that is present in commands such as `listsinceblock`). The value in this field indicates whether a given transaction is locked via InstantSend. - -**Examples** - -1. `listreceivedbyaddress 0 true` - * InstantSend transaction just occurred: - * confirmations: 5 - * InstantSend transaction received one confirmation from blockchain: - * confirmations: 6 - * non-InstantSend transaction just occurred: - * confirmations: 0 - * non-InstantSend transaction received one confirmation from blockchain: - * confirmations: 1 - -2. `listreceivedbyaddress 0` - * InstantSend transaction just occurred: - * confirmations: 0 - * InstantSend transaction received one confirmation from blockchain: - * confirmations: 1 - * non-InstantSend transaction just occurred: - * confirmations: 0 - * non-InstantSend transaction received one confirmation from blockchain: - * confirmations: 1 - -3. `listsinceblock` - * InstantSend transaction just occurred: - * confirmations: 0 - * instantlock: true - * InstantSend transaction received one confirmation from blockchain: - * confirmations: 1 - * instantlock: true - * non-InstantSend transaction just occurred: - * confirmations: 0 - * instantlock: false - * non-InstantSend transaction received one confirmation from blockchain: - * confirmations: 1 - * instantlock: false +Details pertaining to an observed "Transaction Lock" can also be retrieved through RPC. There is a boolean field named `instantlock` which indicates whether a given transaction is locked via InstantSend. This field is present in the output of some wallet RPC commands e.g. `listsinceblock`, `gettransaction` etc. as well as in the output of some mempool RPC commands e.g. `getmempoolentry` and a couple of others like `getrawmempool` (for `verbose=true` only). diff --git a/src/governance-object.cpp b/src/governance-object.cpp index 0677ac1e9f08..c62a28177796 100644 --- a/src/governance-object.cpp +++ b/src/governance-object.cpp @@ -605,7 +605,7 @@ bool CGovernanceObject::IsCollateralValid(std::string& strError, bool& fMissingC // GET CONFIRMATIONS FOR TRANSACTION AssertLockHeld(cs_main); - int nConfirmationsIn = instantsend.GetConfirmations(nCollateralHash); + int nConfirmationsIn = 0; if (nBlockHash != uint256()) { BlockMap::iterator mi = mapBlockIndex.find(nBlockHash); if (mi != mapBlockIndex.end() && (*mi).second) { @@ -616,7 +616,8 @@ bool CGovernanceObject::IsCollateralValid(std::string& strError, bool& fMissingC } } - if(nConfirmationsIn < GOVERNANCE_FEE_CONFIRMATIONS) { + if((nConfirmationsIn < GOVERNANCE_FEE_CONFIRMATIONS) && + (!instantsend.IsLockedInstantSendTransaction(nCollateralHash))){ strError = strprintf("Collateral requires at least %d confirmations to be relayed throughout the network (it has only %d)", GOVERNANCE_FEE_CONFIRMATIONS, nConfirmationsIn); if (nConfirmationsIn >= GOVERNANCE_MIN_RELAY_FEE_CONFIRMATIONS) { fMissingConfirmations = true; diff --git a/src/init.cpp b/src/init.cpp index b9416bcdee43..cc6f38b7fc99 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -576,7 +576,6 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageGroup(_("InstantSend options:")); strUsage += HelpMessageOpt("-enableinstantsend=", strprintf(_("Enable InstantSend, show confirmations for locked transactions (0-1, default: %u)"), 1)); - strUsage += HelpMessageOpt("-instantsenddepth=", strprintf(_("Show N confirmations for a successfully locked transaction (%u-%u, default: %u)"), MIN_INSTANTSEND_DEPTH, MAX_INSTANTSEND_DEPTH, DEFAULT_INSTANTSEND_DEPTH)); strUsage += HelpMessageOpt("-instantsendnotify=", _("Execute command when a wallet InstantSend transaction is successfully locked (%s in cmd is replaced by TxID)")); @@ -1873,11 +1872,8 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler) #endif // ENABLE_WALLET fEnableInstantSend = GetBoolArg("-enableinstantsend", 1); - nInstantSendDepth = GetArg("-instantsenddepth", DEFAULT_INSTANTSEND_DEPTH); - nInstantSendDepth = std::min(std::max(nInstantSendDepth, MIN_INSTANTSEND_DEPTH), MAX_INSTANTSEND_DEPTH); LogPrintf("fLiteMode %d\n", fLiteMode); - LogPrintf("nInstantSendDepth %d\n", nInstantSendDepth); #ifdef ENABLE_WALLET LogPrintf("PrivateSend liquidityprovider: %d\n", privateSendClient.nLiquidityProvider); LogPrintf("PrivateSend rounds: %d\n", privateSendClient.nPrivateSendRounds); diff --git a/src/instantx.cpp b/src/instantx.cpp index 3f02f4794153..3ede2725dc7e 100644 --- a/src/instantx.cpp +++ b/src/instantx.cpp @@ -33,7 +33,6 @@ extern CWallet* pwalletMain; extern CTxMemPool mempool; bool fEnableInstantSend = true; -int nInstantSendDepth = DEFAULT_INSTANTSEND_DEPTH; int nCompleteTXLocks; CInstantSend instantsend; @@ -838,11 +837,6 @@ int CInstantSend::GetTransactionLockSignatures(const uint256& txHash) return -1; } -int CInstantSend::GetConfirmations(const uint256 &nTXHash) -{ - return IsLockedInstantSendTransaction(nTXHash) ? nInstantSendDepth : 0; -} - bool CInstantSend::IsTxLockCandidateTimedOut(const uint256& txHash) { if(!fEnableInstantSend) return false; diff --git a/src/instantx.h b/src/instantx.h index 3448144e1626..46999443978b 100644 --- a/src/instantx.h +++ b/src/instantx.h @@ -26,14 +26,6 @@ extern CInstantSend instantsend; (1000/2900.0)**5 = 0.004875397277841433 */ -// The INSTANTSEND_DEPTH is the "pseudo block depth" level assigned to locked -// txs to indicate the degree of confidence in their eventual confirmation and -// inability to be double-spent (adjustable via command line argument) -static const int MIN_INSTANTSEND_DEPTH = 0; -static const int MAX_INSTANTSEND_DEPTH = 60; -/// Default number of "pseudo-confirmations" for an InstantSend tx -static const int DEFAULT_INSTANTSEND_DEPTH = 5; - static const int MIN_INSTANTSEND_PROTO_VERSION = 70208; /// For how long we are going to accept votes/locks @@ -145,8 +137,6 @@ class CInstantSend bool IsLockedInstantSendTransaction(const uint256& txHash); /// Get the actual number of accepted lock signatures int GetTransactionLockSignatures(const uint256& txHash); - /// Get instantsend confirmations (only) - int GetConfirmations(const uint256 &nTXHash); /// Remove expired entries from maps void CheckAndRemove(); diff --git a/src/qt/guiconstants.h b/src/qt/guiconstants.h index d1d6ae3c4221..e19910f2aecf 100644 --- a/src/qt/guiconstants.h +++ b/src/qt/guiconstants.h @@ -34,6 +34,8 @@ static const bool DEFAULT_SPLASHSCREEN = true; #define COLOR_TX_STATUS_DANGER QColor(200, 100, 100) /* Transaction list -- TX status decoration - default color */ #define COLOR_BLACK QColor(0, 0, 0) +/* Transaction list -- TX status decoration - LockedByInstantSend color */ +#define COLOR_TX_STATUS_LOCKED QColor(0, 128, 255) /* Tooltips longer than this (in characters) are converted into rich text, so that they can be word-wrapped. diff --git a/src/qt/transactionrecord.cpp b/src/qt/transactionrecord.cpp index 21ee35593c6f..e61667050471 100644 --- a/src/qt/transactionrecord.cpp +++ b/src/qt/transactionrecord.cpp @@ -291,6 +291,7 @@ void TransactionRecord::updateStatus(const CWalletTx &wtx) } else { + status.lockedByInstantSend = wtx.IsLockedByInstantSend(); if (status.depth < 0) { status.status = TransactionStatus::Conflicted; diff --git a/src/qt/transactionrecord.h b/src/qt/transactionrecord.h index 673b01736836..9e6bfc377884 100644 --- a/src/qt/transactionrecord.h +++ b/src/qt/transactionrecord.h @@ -42,6 +42,8 @@ class TransactionStatus /// Transaction counts towards available balance bool countsForBalance; + /// Transaction was locked via InstantSend + bool lockedByInstantSend; /// Sorting key based on status std::string sortKey; diff --git a/src/qt/transactiontablemodel.cpp b/src/qt/transactiontablemodel.cpp index d24087aca6de..db16222d9149 100644 --- a/src/qt/transactiontablemodel.cpp +++ b/src/qt/transactiontablemodel.cpp @@ -484,6 +484,24 @@ QString TransactionTableModel::formatTxAmount(const TransactionRecord *wtx, bool return QString(str); } +QIcon IconWithShiftedColor(const QString& filename, bool shift) +{ + if (!shift) + return QIcon(filename); + + QImage img(filename); + img = img.convertToFormat(QImage::Format_ARGB32); + for (int x = img.width(); x--; ) + { + for (int y = img.height(); y--; ) + { + const QRgb rgb = img.pixel(x, y); + img.setPixel(x, y, qRgba(qRed(rgb), qGreen(rgb), qBlue(rgb)+128, qAlpha(rgb))); + } + } + return QIcon(QPixmap::fromImage(img)); +} + QVariant TransactionTableModel::txStatusDecoration(const TransactionRecord *wtx) const { QString theme = GUIUtil::getThemeName(); @@ -495,17 +513,19 @@ QVariant TransactionTableModel::txStatusDecoration(const TransactionRecord *wtx) case TransactionStatus::Offline: return COLOR_TX_STATUS_OFFLINE; case TransactionStatus::Unconfirmed: + // TODO: use special icon for InstantSend 0-conf return QIcon(":/icons/" + theme + "/transaction_0"); case TransactionStatus::Abandoned: return QIcon(":/icons/" + theme + "/transaction_abandoned"); case TransactionStatus::Confirming: switch(wtx->status.depth) { - case 1: return QIcon(":/icons/" + theme + "/transaction_1"); - case 2: return QIcon(":/icons/" + theme + "/transaction_2"); - case 3: return QIcon(":/icons/" + theme + "/transaction_3"); - case 4: return QIcon(":/icons/" + theme + "/transaction_4"); - default: return QIcon(":/icons/" + theme + "/transaction_5"); + // TODO: use special icons for InstantSend instead of color shifting + case 1: return IconWithShiftedColor(":/icons/" + theme + "/transaction_1", wtx->status.lockedByInstantSend); + case 2: return IconWithShiftedColor(":/icons/" + theme + "/transaction_2", wtx->status.lockedByInstantSend); + case 3: return IconWithShiftedColor(":/icons/" + theme + "/transaction_3", wtx->status.lockedByInstantSend); + case 4: return IconWithShiftedColor(":/icons/" + theme + "/transaction_4", wtx->status.lockedByInstantSend); + default: return IconWithShiftedColor(":/icons/" + theme + "/transaction_5", wtx->status.lockedByInstantSend); }; case TransactionStatus::Confirmed: return QIcon(":/icons/" + theme + "/transaction_confirmed"); @@ -608,6 +628,10 @@ QVariant TransactionTableModel::data(const QModelIndex &index, int role) const { return COLOR_TX_STATUS_DANGER; } + if(rec->status.lockedByInstantSend) + { + return COLOR_TX_STATUS_LOCKED; + } // Non-confirmed (but not immature) as transactions are grey if(!rec->status.countsForBalance && rec->status.status != TransactionStatus::Immature) { diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index d5e5550b599d..c71bf374e4d3 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -754,7 +754,7 @@ bool WalletModel::transactionCanBeAbandoned(uint256 hash) const { LOCK2(cs_main, wallet->cs_wallet); const CWalletTx *wtx = wallet->GetWalletTx(hash); - if (!wtx || wtx->isAbandoned() || wtx->GetDepthInMainChain() > 0 || wtx->InMempool()) + if (!wtx || wtx->isAbandoned() || wtx->GetDepthInMainChain() > 0 || wtx->IsLockedByInstantSend() || wtx->InMempool()) return false; return true; } diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 54daf6c4a4f6..d3dd34e864bf 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -58,7 +58,7 @@ void EnsureWalletIsUnlocked() void WalletTxToJSON(const CWalletTx& wtx, UniValue& entry) { - int confirms = wtx.GetDepthInMainChain(false); + int confirms = wtx.GetDepthInMainChain(); bool fLocked = instantsend.IsLockedInstantSendTransaction(wtx.GetHash()); entry.push_back(Pair("confirmations", confirms)); entry.push_back(Pair("instantlock", fLocked)); @@ -657,12 +657,12 @@ UniValue getreceivedbyaddress(const JSONRPCRequest& request) if (request.fHelp || request.params.size() < 1 || request.params.size() > 3) throw std::runtime_error( - "getreceivedbyaddress \"address\" ( minconf addlockconf )\n" + "getreceivedbyaddress \"address\" ( minconf addlocked )\n" "\nReturns the total amount received by the given address in transactions with at least minconf confirmations.\n" "\nArguments:\n" "1. \"address\" (string, required) The dash address for transactions.\n" "2. minconf (numeric, optional, default=1) Only include transactions confirmed at least this many times.\n" - "3. addlockconf (bool, optional, default=false) Whether to add " + std::to_string(nInstantSendDepth) + " confirmations to transactions locked via InstantSend.\n" + "3. addlocked (bool, optional, default=false) Whether to include transactions locked via InstantSend.\n" "\nResult:\n" "amount (numeric) The total amount in " + CURRENCY_UNIT + " received at this address.\n" "\nExamples:\n" @@ -690,7 +690,7 @@ UniValue getreceivedbyaddress(const JSONRPCRequest& request) int nMinDepth = 1; if (request.params.size() > 1) nMinDepth = request.params[1].get_int(); - bool fAddLockConf = (request.params.size() > 2 && request.params[2].get_bool()); + bool fAddLocked = (request.params.size() > 2 && request.params[2].get_bool()); // Tally CAmount nAmount = 0; @@ -702,7 +702,7 @@ UniValue getreceivedbyaddress(const JSONRPCRequest& request) BOOST_FOREACH(const CTxOut& txout, wtx.tx->vout) if (txout.scriptPubKey == scriptPubKey) - if (wtx.GetDepthInMainChain(fAddLockConf) >= nMinDepth) + if ((wtx.GetDepthInMainChain() >= nMinDepth) || (fAddLocked && wtx.IsLockedByInstantSend())) nAmount += txout.nValue; } @@ -717,12 +717,12 @@ UniValue getreceivedbyaccount(const JSONRPCRequest& request) if (request.fHelp || request.params.size() < 1 || request.params.size() > 3) throw std::runtime_error( - "getreceivedbyaccount \"account\" ( minconf addlockconf )\n" + "getreceivedbyaccount \"account\" ( minconf addlocked )\n" "\nDEPRECATED. Returns the total amount received by addresses with in transactions with specified minimum number of confirmations.\n" "\nArguments:\n" "1. \"account\" (string, required) The selected account, may be the default account using \"\".\n" "2. minconf (numeric, optional, default=1) Only include transactions confirmed at least this many times.\n" - "3. addlockconf (bool, optional, default=false) Whether to add " + std::to_string(nInstantSendDepth) + " confirmations to transactions locked via InstantSend.\n" + "3. addlocked (bool, optional, default=false) Whether to include transactions locked via InstantSend.\n" "\nResult:\n" "amount (numeric) The total amount in " + CURRENCY_UNIT + " received for this account.\n" "\nExamples:\n" @@ -742,7 +742,7 @@ UniValue getreceivedbyaccount(const JSONRPCRequest& request) int nMinDepth = 1; if (request.params.size() > 1) nMinDepth = request.params[1].get_int(); - bool fAddLockConf = (request.params.size() > 2 && request.params[2].get_bool()); + bool fAddLocked = (request.params.size() > 2 && request.params[2].get_bool()); // Get the set of pub keys assigned to account std::string strAccount = AccountFromValue(request.params[0]); @@ -760,7 +760,7 @@ UniValue getreceivedbyaccount(const JSONRPCRequest& request) { CTxDestination address; if (ExtractDestination(txout.scriptPubKey, address) && IsMine(*pwalletMain, address) && setAddress.count(address)) - if (wtx.GetDepthInMainChain(fAddLockConf) >= nMinDepth) + if ((wtx.GetDepthInMainChain() >= nMinDepth) || (fAddLocked && wtx.IsLockedByInstantSend())) nAmount += txout.nValue; } } @@ -776,7 +776,7 @@ UniValue getbalance(const JSONRPCRequest& request) if (request.fHelp || request.params.size() > 4) throw std::runtime_error( - "getbalance ( \"account\" minconf addlockconf include_watchonly )\n" + "getbalance ( \"account\" minconf addlocked include_watchonly )\n" "\nIf account is not specified, returns the server's total available balance.\n" "If account is specified (DEPRECATED), returns the balance in the account.\n" "Note that the account \"\" is not the same as leaving the parameter out.\n" @@ -784,7 +784,7 @@ UniValue getbalance(const JSONRPCRequest& request) "\nArguments:\n" "1. \"account\" (string, optional) DEPRECATED. The selected account, or \"*\" for entire wallet. It may be the default account using \"\".\n" "2. minconf (numeric, optional, default=1) Only include transactions confirmed at least this many times.\n" - "3. addlockconf (bool, optional, default=false) Whether to add " + std::to_string(nInstantSendDepth) + " confirmations to transactions locked via InstantSend.\n" + "3. addlocked (bool, optional, default=false) Whether to add balance from transactions locked via InstantSend.\n" "4. include_watchonly (bool, optional, default=false) Also include balance in watch-only addresses (see 'importaddress')\n" "\nResult:\n" "amount (numeric) The total amount in " + CURRENCY_UNIT + " received for this account.\n" @@ -805,7 +805,7 @@ UniValue getbalance(const JSONRPCRequest& request) int nMinDepth = 1; if (request.params.size() > 1) nMinDepth = request.params[1].get_int(); - bool fAddLockConf = (request.params.size() > 2 && request.params[2].get_bool()); + bool fAddLocked = (request.params.size() > 2 && request.params[2].get_bool()); isminefilter filter = ISMINE_SPENDABLE; if(request.params.size() > 3) if(request.params[3].get_bool()) @@ -827,7 +827,7 @@ UniValue getbalance(const JSONRPCRequest& request) std::list listReceived; std::list listSent; wtx.GetAmounts(listReceived, listSent, allFee, strSentAccount, filter); - if (wtx.GetDepthInMainChain(fAddLockConf) >= nMinDepth) + if ((wtx.GetDepthInMainChain() >= nMinDepth) || (fAddLocked && wtx.IsLockedByInstantSend())) { BOOST_FOREACH(const COutputEntry& r, listReceived) nBalance += r.amount; @@ -841,7 +841,7 @@ UniValue getbalance(const JSONRPCRequest& request) std::string strAccount = AccountFromValue(request.params[0]); - CAmount nBalance = pwalletMain->GetAccountBalance(strAccount, nMinDepth, filter, fAddLockConf); + CAmount nBalance = pwalletMain->GetAccountBalance(strAccount, nMinDepth, filter, fAddLocked); return ValueFromAmount(nBalance); } @@ -916,7 +916,7 @@ UniValue sendfrom(const JSONRPCRequest& request) if (request.fHelp || request.params.size() < 3 || request.params.size() > 7) throw std::runtime_error( - "sendfrom \"fromaccount\" \"toaddress\" amount ( minconf addlockconf \"comment\" \"comment_to\" )\n" + "sendfrom \"fromaccount\" \"toaddress\" amount ( minconf addlocked \"comment\" \"comment_to\" )\n" "\nDEPRECATED (use sendtoaddress). Sent an amount from an account to a dash address." + HelpRequiringPassphrase() + "\n" "\nArguments:\n" @@ -927,7 +927,7 @@ UniValue sendfrom(const JSONRPCRequest& request) "2. \"toaddress\" (string, required) The dash address to send funds to.\n" "3. amount (numeric or string, required) The amount in " + CURRENCY_UNIT + " (transaction fee is added on top).\n" "4. minconf (numeric, optional, default=1) Only use funds with at least this many confirmations.\n" - "5. addlockconf (bool, optional, default=false) Whether to add " + std::to_string(nInstantSendDepth) + " confirmations to transactions locked via InstantSend.\n" + "5. addlocked (bool, optional, default=false) Whether to include transactions locked via InstantSend.\n" "6. \"comment\" (string, optional) A comment used to store what the transaction is for. \n" " This is not part of the transaction, just kept in your wallet.\n" "7. \"comment_to\" (string, optional) An optional comment to store the name of the person or organization \n" @@ -956,7 +956,7 @@ UniValue sendfrom(const JSONRPCRequest& request) int nMinDepth = 1; if (request.params.size() > 3) nMinDepth = request.params[3].get_int(); - bool fAddLockConf = (request.params.size() > 4 && request.params[4].get_bool()); + bool fAddLocked = (request.params.size() > 4 && request.params[4].get_bool()); CWalletTx wtx; wtx.strFromAccount = strAccount; @@ -968,7 +968,7 @@ UniValue sendfrom(const JSONRPCRequest& request) EnsureWalletIsUnlocked(); // Check funds - CAmount nBalance = pwalletMain->GetAccountBalance(strAccount, nMinDepth, ISMINE_SPENDABLE, fAddLockConf); + CAmount nBalance = pwalletMain->GetAccountBalance(strAccount, nMinDepth, ISMINE_SPENDABLE, fAddLocked); if (nAmount > nBalance) throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Account has insufficient funds"); @@ -985,7 +985,7 @@ UniValue sendmany(const JSONRPCRequest& request) if (request.fHelp || request.params.size() < 2 || request.params.size() > 8) throw std::runtime_error( - "sendmany \"fromaccount\" {\"address\":amount,...} ( minconf addlockconf \"comment\" [\"address\",...] subtractfeefromamount use_is use_ps )\n" + "sendmany \"fromaccount\" {\"address\":amount,...} ( minconf addlocked \"comment\" [\"address\",...] subtractfeefromamount use_is use_ps )\n" "\nSend multiple times. Amounts are double-precision floating point numbers." + HelpRequiringPassphrase() + "\n" "\nArguments:\n" @@ -996,7 +996,7 @@ UniValue sendmany(const JSONRPCRequest& request) " ,...\n" " }\n" "3. minconf (numeric, optional, default=1) Only use the balance confirmed at least this many times.\n" - "4. addlockconf (bool, optional, default=false) Whether to add " + std::to_string(nInstantSendDepth) + " confirmations to transactions locked via InstantSend.\n" + "4. addlocked (bool, optional, default=false) Whether to include transactions locked via InstantSend.\n" "5. \"comment\" (string, optional) A comment\n" "6. subtractfeefromamount (array, optional) A json array with addresses.\n" " The fee will be equally deducted from the amount of each selected address.\n" @@ -1030,7 +1030,7 @@ UniValue sendmany(const JSONRPCRequest& request) int nMinDepth = 1; if (request.params.size() > 2) nMinDepth = request.params[2].get_int(); - bool fAddLockConf = (request.params.size() > 3 && request.params[3].get_bool()); + bool fAddLocked = (request.params.size() > 3 && request.params[3].get_bool()); CWalletTx wtx; wtx.strFromAccount = strAccount; @@ -1076,7 +1076,7 @@ UniValue sendmany(const JSONRPCRequest& request) EnsureWalletIsUnlocked(); // Check funds - CAmount nBalance = pwalletMain->GetAccountBalance(strAccount, nMinDepth, ISMINE_SPENDABLE, fAddLockConf); + CAmount nBalance = pwalletMain->GetAccountBalance(strAccount, nMinDepth, ISMINE_SPENDABLE, fAddLocked); if (totalAmount > nBalance) throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Account has insufficient funds"); @@ -1177,7 +1177,7 @@ UniValue ListReceived(const UniValue& params, bool fByAccounts) int nMinDepth = 1; if (params.size() > 0) nMinDepth = params[0].get_int(); - bool fAddLockConf = (params.size() > 1 && params[1].get_bool()); + bool fAddLocked = (params.size() > 1 && params[1].get_bool()); // Whether to include empty accounts bool fIncludeEmpty = false; @@ -1198,8 +1198,8 @@ UniValue ListReceived(const UniValue& params, bool fByAccounts) if (wtx.IsCoinBase() || !CheckFinalTx(*wtx.tx)) continue; - int nDepth = wtx.GetDepthInMainChain(fAddLockConf); - if (nDepth < nMinDepth) + int nDepth = wtx.GetDepthInMainChain(); + if ((nDepth < nMinDepth) && !(fAddLocked && wtx.IsLockedByInstantSend())) continue; BOOST_FOREACH(const CTxOut& txout, wtx.tx->vout) @@ -1303,11 +1303,11 @@ UniValue listreceivedbyaddress(const JSONRPCRequest& request) if (request.fHelp || request.params.size() > 4) throw std::runtime_error( - "listreceivedbyaddress ( minconf addlockconf include_empty include_watchonly)\n" + "listreceivedbyaddress ( minconf addlocked include_empty include_watchonly)\n" "\nList incoming payments grouped by receiving address.\n" "\nArguments:\n" "1. minconf (numeric, optional, default=1) The minimum number of confirmations before payments are included.\n" - "2. addlockconf (bool, optional, default=false) Whether to add " + std::to_string(nInstantSendDepth) + " confirmations to transactions locked via InstantSend.\n" + "2. addlocked (bool, optional, default=false) Whether to include transactions locked via InstantSend.\n" "3. include_empty (bool, optional, default=false) Whether to include addresses that haven't received any payments.\n" "4. include_watchonly (bool, optional, default=false) Whether to include watch-only addresses (see 'importaddress').\n" @@ -1319,8 +1319,8 @@ UniValue listreceivedbyaddress(const JSONRPCRequest& request) " \"account\" : \"accountname\", (string) DEPRECATED. The account of the receiving address. The default account is \"\".\n" " \"amount\" : x.xxx, (numeric) The total amount in " + CURRENCY_UNIT + " received by the address\n" " \"confirmations\" : n (numeric) The number of confirmations of the most recent transaction included.\n" - " If 'addlockconf' is true, the minimum number of confirmations is calculated\n" - " including additional " + std::to_string(nInstantSendDepth) + " confirmations for transactions locked via InstantSend\n" + " If 'addlocked' is true, the number of confirmations can be less than\n" + " configured for transactions locked via InstantSend\n" " \"label\" : \"label\", (string) A comment for the address/transaction, if any\n" " \"txids\": [\n" " n, (numeric) The ids of transactions received with the address \n" @@ -1348,11 +1348,11 @@ UniValue listreceivedbyaccount(const JSONRPCRequest& request) if (request.fHelp || request.params.size() > 4) throw std::runtime_error( - "listreceivedbyaccount ( minconf addlockconf include_empty include_watchonly)\n" + "listreceivedbyaccount ( minconf addlocked include_empty include_watchonly)\n" "\nDEPRECATED. List incoming payments grouped by account.\n" "\nArguments:\n" "1. minconf (numeric, optional, default=1) The minimum number of confirmations before payments are included.\n" - "2. addlockconf (bool, optional, default=false) Whether to add " + std::to_string(nInstantSendDepth) + " confirmations to transactions locked via InstantSend.\n" + "2. addlocked (bool, optional, default=false) Whether to include transactions locked via InstantSend.\n" "3. include_empty (bool, optional, default=false) Whether to include accounts that haven't received any payments.\n" "4. include_watchonly (bool, optional, default=false) Whether to include watch-only addresses (see 'importaddress').\n" @@ -1423,7 +1423,7 @@ void ListTransactions(const CWalletTx& wtx, const std::string& strAccount, int n } // Received - if (listReceived.size() > 0 && wtx.GetDepthInMainChain() >= nMinDepth) + if (listReceived.size() > 0 && ((wtx.GetDepthInMainChain() >= nMinDepth) || wtx.IsLockedByInstantSend())) { BOOST_FOREACH(const COutputEntry& r, listReceived) { @@ -1615,11 +1615,11 @@ UniValue listaccounts(const JSONRPCRequest& request) if (request.fHelp || request.params.size() > 3) throw std::runtime_error( - "listaccounts ( minconf addlockconf include_watchonly)\n" + "listaccounts ( minconf addlocked include_watchonly)\n" "\nDEPRECATED. Returns Object that has account names as keys, account balances as values.\n" "\nArguments:\n" "1. minconf (numeric, optional, default=1) Only include transactions with at least this many confirmations\n" - "2. addlockconf (bool, optional, default=false) Whether to add " + std::to_string(nInstantSendDepth) + " confirmations to transactions locked via InstantSend.\n" + "2. addlocked (bool, optional, default=false) Whether to include transactions locked via InstantSend.\n" "3. include_watchonly (bool, optional, default=false) Include balances in watch-only addresses (see 'importaddress')\n" "\nResult:\n" "{ (json object where keys are account names, and values are numeric balances\n" @@ -1642,7 +1642,7 @@ UniValue listaccounts(const JSONRPCRequest& request) int nMinDepth = 1; if (request.params.size() > 0) nMinDepth = request.params[0].get_int(); - bool fAddLockConf = (request.params.size() > 1 && request.params[1].get_bool()); + bool fAddLocked = (request.params.size() > 1 && request.params[1].get_bool()); isminefilter includeWatchonly = ISMINE_SPENDABLE; if(request.params.size() > 2) if(request.params[2].get_bool()) @@ -1661,14 +1661,14 @@ UniValue listaccounts(const JSONRPCRequest& request) std::string strSentAccount; std::list listReceived; std::list listSent; - int nDepth = wtx.GetDepthInMainChain(fAddLockConf); + int nDepth = wtx.GetDepthInMainChain(); if (wtx.GetBlocksToMaturity() > 0 || nDepth < 0) continue; wtx.GetAmounts(listReceived, listSent, nFee, strSentAccount, includeWatchonly); mapAccountBalances[strSentAccount] -= nFee; BOOST_FOREACH(const COutputEntry& s, listSent) mapAccountBalances[strSentAccount] -= s.amount; - if (nDepth >= nMinDepth) + if ((nDepth >= nMinDepth) || (fAddLocked && wtx.IsLockedByInstantSend())) { BOOST_FOREACH(const COutputEntry& r, listReceived) if (pwalletMain->mapAddressBook.count(r.destination)) @@ -1784,7 +1784,7 @@ UniValue listsinceblock(const JSONRPCRequest& request) { CWalletTx tx = (*it).second; - if (depth == -1 || tx.GetDepthInMainChain(false) < depth) + if (depth == -1 || tx.GetDepthInMainChain() < depth) ListTransactions(tx, "*", 0, true, transactions, filter); } @@ -2856,11 +2856,11 @@ static const CRPCCommand commands[] = { "wallet", "getaccountaddress", &getaccountaddress, true, {"account"} }, { "wallet", "getaccount", &getaccount, true, {"address"} }, { "wallet", "getaddressesbyaccount", &getaddressesbyaccount, true, {"account"} }, - { "wallet", "getbalance", &getbalance, false, {"account","minconf","addlockconf","include_watchonly"} }, + { "wallet", "getbalance", &getbalance, false, {"account","minconf","addlocked","include_watchonly"} }, { "wallet", "getnewaddress", &getnewaddress, true, {"account"} }, { "wallet", "getrawchangeaddress", &getrawchangeaddress, true, {} }, - { "wallet", "getreceivedbyaccount", &getreceivedbyaccount, false, {"account","minconf","addlockconf"} }, - { "wallet", "getreceivedbyaddress", &getreceivedbyaddress, false, {"address","minconf","addlockconf"} }, + { "wallet", "getreceivedbyaccount", &getreceivedbyaccount, false, {"account","minconf","addlocked"} }, + { "wallet", "getreceivedbyaddress", &getreceivedbyaddress, false, {"address","minconf","addlocked"} }, { "wallet", "gettransaction", &gettransaction, false, {"txid","include_watchonly"} }, { "wallet", "getunconfirmedbalance", &getunconfirmedbalance, false, {} }, { "wallet", "getwalletinfo", &getwalletinfo, false, {} }, @@ -2871,19 +2871,19 @@ static const CRPCCommand commands[] = { "wallet", "importprunedfunds", &importprunedfunds, true, {"rawtransaction","txoutproof"} }, { "wallet", "importpubkey", &importpubkey, true, {"pubkey","label","rescan"} }, { "wallet", "keypoolrefill", &keypoolrefill, true, {"newsize"} }, - { "wallet", "listaccounts", &listaccounts, false, {"minconf","addlockconf","include_watchonly"} }, + { "wallet", "listaccounts", &listaccounts, false, {"minconf","addlocked","include_watchonly"} }, { "wallet", "listaddressgroupings", &listaddressgroupings, false, {} }, { "wallet", "listaddressbalances", &listaddressbalances, false, {"minamount"} }, { "wallet", "listlockunspent", &listlockunspent, false, {} }, - { "wallet", "listreceivedbyaccount", &listreceivedbyaccount, false, {"minconf","addlockconf","include_empty","include_watchonly"} }, - { "wallet", "listreceivedbyaddress", &listreceivedbyaddress, false, {"minconf","addlockconf","include_empty","include_watchonly"} }, + { "wallet", "listreceivedbyaccount", &listreceivedbyaccount, false, {"minconf","addlocked","include_empty","include_watchonly"} }, + { "wallet", "listreceivedbyaddress", &listreceivedbyaddress, false, {"minconf","addlocked","include_empty","include_watchonly"} }, { "wallet", "listsinceblock", &listsinceblock, false, {"blockhash","target_confirmations","include_watchonly"} }, { "wallet", "listtransactions", &listtransactions, false, {"account","count","skip","include_watchonly"} }, { "wallet", "listunspent", &listunspent, false, {"minconf","maxconf","addresses","include_unsafe"} }, { "wallet", "lockunspent", &lockunspent, true, {"unlock","transactions"} }, { "wallet", "move", &movecmd, false, {"fromaccount","toaccount","amount","minconf","comment"} }, - { "wallet", "sendfrom", &sendfrom, false, {"fromaccount","toaddress","amount","minconf","addlockconf","comment","comment_to"} }, - { "wallet", "sendmany", &sendmany, false, {"fromaccount","amounts","minconf","addlockconf","comment","subtractfeefrom"} }, + { "wallet", "sendfrom", &sendfrom, false, {"fromaccount","toaddress","amount","minconf","addlocked","comment","comment_to"} }, + { "wallet", "sendmany", &sendmany, false, {"fromaccount","amounts","minconf","addlocked","comment","subtractfeefrom"} }, { "wallet", "sendtoaddress", &sendtoaddress, false, {"address","amount","comment","comment_to","subtractfeefromamount"} }, { "wallet", "setaccount", &setaccount, true, {"address","account"} }, { "wallet", "settxfee", &settxfee, true, {"amount"} }, diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 2260fc5da9c3..6ae8b8b2499b 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -1259,7 +1259,7 @@ bool CWallet::AbandonTransaction(const uint256& hashTx) // Can't mark abandoned if confirmed or in mempool assert(mapWallet.count(hashTx)); CWalletTx& origtx = mapWallet[hashTx]; - if (origtx.GetDepthInMainChain() > 0 || origtx.InMempool()) { + if (origtx.GetDepthInMainChain() > 0 || origtx.InMempool() || origtx.IsLockedByInstantSend()) { return false; } @@ -1945,7 +1945,7 @@ void CWallet::ReacceptWalletTransactions() int nDepth = wtx.GetDepthInMainChain(); - if (!wtx.IsCoinBase() && (nDepth == 0 && !wtx.isAbandoned())) { + if (!wtx.IsCoinBase() && (nDepth == 0 && !wtx.IsLockedByInstantSend() && !wtx.isAbandoned())) { mapSorted.insert(std::make_pair(wtx.nOrderPos, &wtx)); } } @@ -2194,7 +2194,7 @@ CAmount CWalletTx::GetDenominatedCredit(bool unconfirmed, bool fUseCache) const if (IsCoinBase() && GetBlocksToMaturity() > 0) return 0; - int nDepth = GetDepthInMainChain(false); + int nDepth = GetDepthInMainChain(); if(nDepth < 0) return 0; bool isUnconfirmed = IsTrusted() && nDepth == 0; @@ -2258,6 +2258,8 @@ bool CWalletTx::IsTrusted() const return true; if (nDepth < 0) return false; + if (IsLockedByInstantSend()) + return true; if (!bSpendZeroConfChange || !IsFromMe(ISMINE_ALL)) // using wtx's cached debit return false; @@ -2501,7 +2503,7 @@ CAmount CWallet::GetUnconfirmedBalance() const for (std::map::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) { const CWalletTx* pcoin = &(*it).second; - if (!pcoin->IsTrusted() && pcoin->GetDepthInMainChain() == 0 && pcoin->InMempool()) + if (!pcoin->IsTrusted() && pcoin->GetDepthInMainChain() == 0 && !pcoin->IsLockedByInstantSend() && pcoin->InMempool()) nTotal += pcoin->GetAvailableCredit(); } } @@ -2546,7 +2548,7 @@ CAmount CWallet::GetUnconfirmedWatchOnlyBalance() const for (std::map::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) { const CWalletTx* pcoin = &(*it).second; - if (!pcoin->IsTrusted() && pcoin->GetDepthInMainChain() == 0 && pcoin->InMempool()) + if (!pcoin->IsTrusted() && pcoin->GetDepthInMainChain() == 0 && !pcoin->IsLockedByInstantSend() && pcoin->InMempool()) nTotal += pcoin->GetAvailableWatchOnlyCredit(); } } @@ -2589,7 +2591,7 @@ void CWallet::AvailableCoins(std::vector& vCoins, bool fOnlyConfirmed, if (pcoin->IsCoinBase() && pcoin->GetBlocksToMaturity() > 0) continue; - int nDepth = pcoin->GetDepthInMainChain(false); + int nDepth = pcoin->GetDepthInMainChain(); // do not use IX for inputs that have less then nInstantSendConfirmationsRequired blockchain confirmations if (fUseInstantSend && nDepth < nInstantSendConfirmationsRequired) continue; @@ -3277,7 +3279,7 @@ int CWallet::CountInputsWithAmount(CAmount nInputAmount) { const CWalletTx* pcoin = &(*it).second; if (pcoin->IsTrusted()){ - int nDepth = pcoin->GetDepthInMainChain(false); + int nDepth = pcoin->GetDepthInMainChain(); for (unsigned int i = 0; i < pcoin->tx->vout.size(); i++) { COutput out = COutput(pcoin, i, nDepth, true, true); @@ -4315,7 +4317,7 @@ std::map CWallet::GetAddressBalances() continue; int nDepth = pcoin->GetDepthInMainChain(); - if (nDepth < (pcoin->IsFromMe(ISMINE_ALL) ? 0 : 1)) + if ((nDepth < (pcoin->IsFromMe(ISMINE_ALL) ? 0 : 1)) && !pcoin->IsLockedByInstantSend()) continue; for (unsigned int i = 0; i < pcoin->tx->vout.size(); i++) @@ -4431,13 +4433,13 @@ std::set< std::set > CWallet::GetAddressGroupings() return ret; } -CAmount CWallet::GetAccountBalance(const std::string& strAccount, int nMinDepth, const isminefilter& filter, bool fAddLockConf) +CAmount CWallet::GetAccountBalance(const std::string& strAccount, int nMinDepth, const isminefilter& filter, bool fAddLocked) { CWalletDB walletdb(strWalletFile); - return GetAccountBalance(walletdb, strAccount, nMinDepth, filter, fAddLockConf); + return GetAccountBalance(walletdb, strAccount, nMinDepth, filter, fAddLocked); } -CAmount CWallet::GetAccountBalance(CWalletDB& walletdb, const std::string& strAccount, int nMinDepth, const isminefilter& filter, bool fAddLockConf) +CAmount CWallet::GetAccountBalance(CWalletDB& walletdb, const std::string& strAccount, int nMinDepth, const isminefilter& filter, bool fAddLocked) { CAmount nBalance = 0; @@ -4445,13 +4447,13 @@ CAmount CWallet::GetAccountBalance(CWalletDB& walletdb, const std::string& strAc for (std::map::iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) { const CWalletTx& wtx = (*it).second; - if (!CheckFinalTx(wtx) || wtx.GetBlocksToMaturity() > 0 || wtx.GetDepthInMainChain(fAddLockConf) < 0) + if (!CheckFinalTx(wtx) || wtx.GetBlocksToMaturity() > 0 || wtx.GetDepthInMainChain() < 0) continue; CAmount nReceived, nSent, nFee; wtx.GetAccountAmounts(strAccount, nReceived, nSent, nFee, filter); - if (nReceived != 0 && wtx.GetDepthInMainChain(fAddLockConf) >= nMinDepth) + if (nReceived != 0 && ((wtx.GetDepthInMainChain() >= nMinDepth) || (fAddLocked && wtx.IsLockedByInstantSend()))) nBalance += nReceived; nBalance -= nSent + nFee; } @@ -5349,7 +5351,7 @@ void CMerkleTx::SetMerkleBranch(const CBlockIndex* pindex, int posInBlock) nIndex = posInBlock; } -int CMerkleTx::GetDepthInMainChain(const CBlockIndex* &pindexRet, bool enableIX) const +int CMerkleTx::GetDepthInMainChain(const CBlockIndex* &pindexRet) const { int nResult; @@ -5376,12 +5378,14 @@ int CMerkleTx::GetDepthInMainChain(const CBlockIndex* &pindexRet, bool enableIX) } } - if(enableIX && nResult < 6 && instantsend.IsLockedInstantSendTransaction(GetHash())) - return nInstantSendDepth + nResult; - return nResult; } +bool CMerkleTx::IsLockedByInstantSend() const +{ + return instantsend.IsLockedInstantSendTransaction(GetHash()); +} + int CMerkleTx::GetBlocksToMaturity() const { if (!IsCoinBase()) diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index ee7b9376c147..3f443332f685 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -271,9 +271,10 @@ class CMerkleTx * 0 : in memory pool, waiting to be included in a block * >=1 : this many blocks deep in the main chain */ - int GetDepthInMainChain(const CBlockIndex* &pindexRet, bool enableIX = true) const; - int GetDepthInMainChain(bool enableIX = true) const { const CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet, enableIX); } + int GetDepthInMainChain(const CBlockIndex* &pindexRet) const; + int GetDepthInMainChain() const { const CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); } bool IsInMainChain() const { const CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet) > 0; } + bool IsLockedByInstantSend() const; int GetBlocksToMaturity() const; /** Pass this transaction to the mempool. Fails if absolute fee exceeds absurd fee. */ bool AcceptToMemoryPool(const CAmount& nAbsurdFee, CValidationState& state); @@ -977,8 +978,8 @@ class CWallet : public CCryptoKeyStore, public CValidationInterface std::set< std::set > GetAddressGroupings(); std::map GetAddressBalances(); - CAmount GetAccountBalance(const std::string& strAccount, int nMinDepth, const isminefilter& filter, bool fAddLockConf); - CAmount GetAccountBalance(CWalletDB& walletdb, const std::string& strAccount, int nMinDepth, const isminefilter& filter, bool fAddLockConf); + CAmount GetAccountBalance(const std::string& strAccount, int nMinDepth, const isminefilter& filter, bool fAddLocked); + CAmount GetAccountBalance(CWalletDB& walletdb, const std::string& strAccount, int nMinDepth, const isminefilter& filter, bool fAddLocked); std::set GetAccountAddresses(const std::string& strAccount) const; isminetype IsMine(const CTxIn& txin) const; From 6bcd868de743141ec7df7b0fce00eaf79ebf7f44 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sun, 29 Jul 2018 09:39:37 +0300 Subject: [PATCH 032/400] Fix lockedByInstantSend initialization (#2197) --- src/qt/transactionrecord.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/transactionrecord.h b/src/qt/transactionrecord.h index 9e6bfc377884..95027928a7ff 100644 --- a/src/qt/transactionrecord.h +++ b/src/qt/transactionrecord.h @@ -20,7 +20,7 @@ class TransactionStatus { public: TransactionStatus(): - countsForBalance(false), sortKey(""), + countsForBalance(false), lockedByInstantSend(false), sortKey(""), matures_in(0), status(Offline), depth(0), open_for(0), cur_num_blocks(-1) { } From d4d11476aa47c964abccd6ee0c47690cddcae8e9 Mon Sep 17 00:00:00 2001 From: strophy <32928115+strophy@users.noreply.github.com> Date: Sat, 4 Aug 2018 21:38:57 +0800 Subject: [PATCH 033/400] Fix typo and grammar in PS error message (#2199) * Fix typo * Grammar fix --- src/qt/coincontroldialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/coincontroldialog.cpp b/src/qt/coincontroldialog.cpp index afec817dea2d..df2611d46224 100644 --- a/src/qt/coincontroldialog.cpp +++ b/src/qt/coincontroldialog.cpp @@ -436,7 +436,7 @@ void CoinControlDialog::viewItemChanged(QTreeWidgetItem* item, int column) int nRounds = pwalletMain->GetRealOutpointPrivateSendRounds(outpt); if (coinControl->fUsePrivateSend && nRounds < privateSendClient.nPrivateSendRounds) { QMessageBox::warning(this, windowTitle(), - tr("Non-anonymized input selected. PrivateSend will be disabled.

If you still want to use PrivateSend, please deselect all non-nonymized inputs first and then check PrivateSend checkbox again."), + tr("Non-anonymized input selected. PrivateSend will be disabled.

If you still want to use PrivateSend, please deselect all non-anonymized inputs first and then check the PrivateSend checkbox again."), QMessageBox::Ok, QMessageBox::Ok); coinControl->fUsePrivateSend = false; } From c4ee2c89ef3be28388211cd661f0bd04e691e3d4 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sat, 4 Aug 2018 16:39:15 +0300 Subject: [PATCH 034/400] Fix mnsync in regtest (#2202) --- src/masternode-sync.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/masternode-sync.cpp b/src/masternode-sync.cpp index d78bc11f2575..7b421cb6c13a 100644 --- a/src/masternode-sync.cpp +++ b/src/masternode-sync.cpp @@ -184,22 +184,21 @@ void CMasternodeSync::ProcessTick(CConnman& connman) // QUICK MODE (REGTEST ONLY!) if(Params().NetworkIDString() == CBaseChainParams::REGTEST) { - if(nRequestedMasternodeAttempt <= 2) { + if (nRequestedMasternodeAssets == MASTERNODE_SYNC_WAITING) { connman.PushMessage(pnode, msgMaker.Make(NetMsgType::GETSPORKS)); //get current network sporks - } else if(nRequestedMasternodeAttempt < 4) { + } else if (nRequestedMasternodeAssets == MASTERNODE_SYNC_LIST) { mnodeman.DsegUpdate(pnode, connman); - } else if(nRequestedMasternodeAttempt < 6) { + } else if (nRequestedMasternodeAssets == MASTERNODE_SYNC_MNW) { //sync payment votes if(pnode->nVersion == 70208) { connman.PushMessage(pnode, msgMaker.Make(NetMsgType::MASTERNODEPAYMENTSYNC, mnpayments.GetStorageLimit())); //sync payment votes } else { connman.PushMessage(pnode, msgMaker.Make(NetMsgType::MASTERNODEPAYMENTSYNC)); //sync payment votes } + } else if (nRequestedMasternodeAssets == MASTERNODE_SYNC_GOVERNANCE) { SendGovernanceSyncRequest(pnode, connman); - } else { - nRequestedMasternodeAssets = MASTERNODE_SYNC_FINISHED; } - nRequestedMasternodeAttempt++; + SwitchToNextAsset(connman); connman.ReleaseNodeVector(vNodesCopy); return; } From 4cd969e3d2908f36c9f5ec192e0462fd75e6d1ee Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sat, 11 Aug 2018 01:28:30 +0300 Subject: [PATCH 035/400] Add `previousbits` field to `getblocktemplate` output (#2201) * Add `previousbits` field to `getblocktemplate` output * add comment to nPrevBits --- src/miner.cpp | 1 + src/miner.h | 1 + src/rpc/mining.cpp | 2 ++ 3 files changed, 4 insertions(+) diff --git a/src/miner.cpp b/src/miner.cpp index 0290dedbca18..82f1df413cb5 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -182,6 +182,7 @@ std::unique_ptr BlockAssembler::CreateNewBlock(const CScript& sc UpdateTime(pblock, chainparams.GetConsensus(), pindexPrev); pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, chainparams.GetConsensus()); pblock->nNonce = 0; + pblocktemplate->nPrevBits = pindexPrev->nBits; pblocktemplate->vTxSigOps[0] = GetLegacySigOpCount(*pblock->vtx[0]); CValidationState state; diff --git a/src/miner.h b/src/miner.h index 7770e95ba0cf..427635057c41 100644 --- a/src/miner.h +++ b/src/miner.h @@ -30,6 +30,7 @@ struct CBlockTemplate CBlock block; std::vector vTxFees; std::vector vTxSigOps; + uint32_t nPrevBits; // nBits of previous block (for subsidy calculation) CTxOut txoutMasternode; // masternode payment std::vector voutSuperblock; // superblock payment }; diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp index 723fc698f8a5..9e4a029010ff 100644 --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -385,6 +385,7 @@ UniValue getblocktemplate(const JSONRPCRequest& request) " \"sizelimit\" : n, (numeric) limit of block size\n" " \"curtime\" : ttt, (numeric) current timestamp in seconds since epoch (Jan 1 1970 GMT)\n" " \"bits\" : \"xxxxxxxx\", (string) compressed target of next block\n" + " \"previousbits\" : \"xxxxxxxx\", (string) compressed target of current highest block\n" " \"height\" : n (numeric) The height of the next block\n" " \"masternode\" : { (json object) required masternode payee that must be included in the next block\n" " \"payee\" : \"xxxx\", (string) payee address\n" @@ -696,6 +697,7 @@ UniValue getblocktemplate(const JSONRPCRequest& request) result.push_back(Pair("sizelimit", (int64_t)MaxBlockSize(fDIP0001ActiveAtTip))); result.push_back(Pair("curtime", pblock->GetBlockTime())); result.push_back(Pair("bits", strprintf("%08x", pblock->nBits))); + result.push_back(Pair("previousbits", strprintf("%08x", pblocktemplate->nPrevBits))); result.push_back(Pair("height", (int64_t)(pindexPrev->nHeight+1))); UniValue masternodeObj(UniValue::VOBJ); From 589a77013fc694fe918d3447a08322c3b80d8fe3 Mon Sep 17 00:00:00 2001 From: strophy <32928115+strophy@users.noreply.github.com> Date: Sat, 11 Aug 2018 06:29:02 +0800 Subject: [PATCH 036/400] Correction to release date for 0.12.0 (#2205) Dash 0.12.0 went through several releases for testnet, so the first public release for mainnet was 0.12.0.44 on 15 August 2015. https://www.dash.org/forum/threads/v12-release.5888/ https://github.com/dashpay/dash/tags?after=v0.12.0.48 --- doc/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/release-notes.md b/doc/release-notes.md index a44a8789e2e0..faf879084f50 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -126,7 +126,7 @@ These release are considered obsolete. Old release notes can be found here: - [v0.12.2.2](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.12.2.2.md) released Dec/17/2017 - [v0.12.2](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.12.2.md) released Nov/08/2017 - [v0.12.1](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.12.1.md) released Feb/06/2017 -- [v0.12.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.12.0.md) released Jun/15/2015 +- [v0.12.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.12.0.md) released Aug/15/2015 - [v0.11.2](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.11.2.md) released Mar/04/2015 - [v0.11.1](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.11.1.md) released Feb/10/2015 - [v0.11.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.11.0.md) released Jan/15/2015 From c4c6107839db242777e6d24d23d7a1145f15964c Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Sat, 11 Aug 2018 00:29:28 +0200 Subject: [PATCH 037/400] Use C++14 standard when building (#2209) We have upgraded CI to use a recent compiler already and thus can also increase the C++ standard now. After this, we'll also have to update Gitian build to work with C++14 as well, but this is going to happen in separate commits/PRs. --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 5687cc66fbab..89b19aabe9f1 100644 --- a/configure.ac +++ b/configure.ac @@ -54,8 +54,8 @@ case $host in lt_cv_deplibs_check_method="pass_all" ;; esac -dnl Require C++11 compiler (no GNU extensions) -AX_CXX_COMPILE_STDCXX([11], [noext], [mandatory], [nodefault]) +dnl Require C++14 compiler (no GNU extensions) +AX_CXX_COMPILE_STDCXX([14], [noext], [mandatory], [nodefault]) dnl Check if -latomic is required for CHECK_ATOMIC From 566fa5ec3b12651d769ba4a72f3ae67ac5ac70f6 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Sat, 11 Aug 2018 00:30:55 +0200 Subject: [PATCH 038/400] Add support for "help command subCommand" (#2210) --- src/rpc/server.cpp | 17 ++++++++++++----- src/rpc/server.h | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp index bf4f30ea8582..9d8b47a429ef 100644 --- a/src/rpc/server.cpp +++ b/src/rpc/server.cpp @@ -176,7 +176,7 @@ std::vector ParseHexO(const UniValue& o, std::string strKey) * Note: This interface may still be subject to change. */ -std::string CRPCTable::help(const std::string& strCommand) const +std::string CRPCTable::help(const std::string& strCommand, const std::string& strSubCommand) const { std::string strRet; std::string category; @@ -200,6 +200,10 @@ std::string CRPCTable::help(const std::string& strCommand) const { JSONRPCRequest jreq; jreq.fHelp = true; + if (!strSubCommand.empty()) { + jreq.params.setArray(); + jreq.params.push_back(strSubCommand); + } rpcfn_type pfn = pcmd->actor; if (setDone.insert(pfn).second) (*pfn)(jreq); @@ -234,21 +238,24 @@ std::string CRPCTable::help(const std::string& strCommand) const UniValue help(const JSONRPCRequest& jsonRequest) { - if (jsonRequest.fHelp || jsonRequest.params.size() > 1) + if (jsonRequest.fHelp || jsonRequest.params.size() > 2) throw std::runtime_error( - "help ( \"command\" )\n" + "help ( \"command\" ) (\"subCommand\")\n" "\nList all commands, or get help for a specified command.\n" "\nArguments:\n" "1. \"command\" (string, optional) The command to get help on\n" + "2. \"subCommand\" (string, optional) The subcommand to get help on. Please not that not all subcommands support this at the moment\n" "\nResult:\n" "\"text\" (string) The help text\n" ); - std::string strCommand; + std::string strCommand, strSubCommand; if (jsonRequest.params.size() > 0) strCommand = jsonRequest.params[0].get_str(); + if (jsonRequest.params.size() > 1) + strSubCommand = jsonRequest.params[1].get_str(); - return tableRPC.help(strCommand); + return tableRPC.help(strCommand, strSubCommand); } diff --git a/src/rpc/server.h b/src/rpc/server.h index fe293a94bfe5..a1080477d274 100644 --- a/src/rpc/server.h +++ b/src/rpc/server.h @@ -152,7 +152,7 @@ class CRPCTable public: CRPCTable(); const CRPCCommand* operator[](const std::string& name) const; - std::string help(const std::string& name) const; + std::string help(const std::string& strCommand, const std::string& strSubCommand) const; /** * Execute a method. From 106bab1ae13406d0e3bcea423be18d7edb0de26b Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Sat, 11 Aug 2018 00:33:56 +0200 Subject: [PATCH 039/400] Add new ParseXXX methods to easily parse UniValue values (#2211) --- src/rpc/server.cpp | 48 ++++++++++++++++++++++++++++++++++++++++++++++ src/rpc/server.h | 5 +++++ 2 files changed, 53 insertions(+) diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp index 9d8b47a429ef..d969efdbc20f 100644 --- a/src/rpc/server.cpp +++ b/src/rpc/server.cpp @@ -24,6 +24,7 @@ #include #include // for to_upper() +#include #include // for unique_ptr #include @@ -172,6 +173,53 @@ std::vector ParseHexO(const UniValue& o, std::string strKey) return ParseHexV(find_value(o, strKey), strKey); } +int32_t ParseInt32V(const UniValue& v, const std::string &strName) +{ + std::string strNum = v.getValStr(); + int32_t num; + if (!ParseInt32(strNum, &num)) + throw JSONRPCError(RPC_INVALID_PARAMETER, strName+" must be a 32bit integer (not '"+strNum+"')"); + return num; +} + +int64_t ParseInt64V(const UniValue& v, const std::string &strName) +{ + std::string strNum = v.getValStr(); + int64_t num; + if (!ParseInt64(strNum, &num)) + throw JSONRPCError(RPC_INVALID_PARAMETER, strName+" must be a 64bit integer (not '"+strNum+"')"); + return num; +} + +double ParseDoubleV(const UniValue& v, const std::string &strName) +{ + std::string strNum = v.getValStr(); + double num; + if (!ParseDouble(strNum, &num)) + throw JSONRPCError(RPC_INVALID_PARAMETER, strName+" must be a be number (not '"+strNum+"')"); + return num; +} + +bool ParseBoolV(const UniValue& v, const std::string &strName) +{ + std::string strBool; + if (v.isBool()) + return v.get_bool(); + else if (v.isNum()) + strBool = itostr(v.get_int()); + else if (v.isStr()) + strBool = v.get_str(); + + std::transform(strBool.begin(), strBool.end(), strBool.begin(), ::tolower); + + if (strBool == "true" || strBool == "yes" || strBool == "1") { + return true; + } else if (strBool == "false" || strBool == "no" || strBool == "0") { + return false; + } + throw JSONRPCError(RPC_INVALID_PARAMETER, strName+" must be true, false, yes, no, 1 or 0 (not '"+strBool+"')"); +} + /** * Note: This interface may still be subject to change. */ diff --git a/src/rpc/server.h b/src/rpc/server.h index a1080477d274..62fb1f8b7f64 100644 --- a/src/rpc/server.h +++ b/src/rpc/server.h @@ -187,6 +187,11 @@ extern uint256 ParseHashO(const UniValue& o, std::string strKey); extern std::vector ParseHexV(const UniValue& v, std::string strName); extern std::vector ParseHexO(const UniValue& o, std::string strKey); +extern int32_t ParseInt32V(const UniValue& v, const std::string &strName); +extern int64_t ParseInt64V(const UniValue& v, const std::string &strName); +extern double ParseDoubleV(const UniValue& v, const std::string &strName); +extern bool ParseBoolV(const UniValue& v, const std::string &strName); + extern int64_t nWalletUnlockTime; extern CAmount AmountFromValue(const UniValue& value); extern UniValue ValueFromAmount(const CAmount& amount); From 075ca0903f0cffdd58e84f946862040fb3ca0d97 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Sat, 11 Aug 2018 00:34:28 +0200 Subject: [PATCH 040/400] Protect CSporkManager with critical section (#2213) --- src/spork.cpp | 32 +++++++++++++++++++++----------- src/spork.h | 1 + 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/spork.cpp b/src/spork.cpp index 4ecdddc8d1c0..bc86c396f66e 100644 --- a/src/spork.cpp +++ b/src/spork.cpp @@ -46,16 +46,18 @@ void CSporkManager::ProcessSpork(CNode* pfrom, const std::string& strCommand, CD if(!chainActive.Tip()) return; strLogMsg = strprintf("SPORK -- hash: %s id: %d value: %10d bestHeight: %d peer=%d", hash.ToString(), spork.nSporkID, spork.nValue, chainActive.Height(), pfrom->id); } - - if(mapSporksActive.count(spork.nSporkID)) { - if (mapSporksActive[spork.nSporkID].nTimeSigned >= spork.nTimeSigned) { - LogPrint("spork", "%s seen\n", strLogMsg); - return; + { + LOCK(cs); // make sure to not lock this together with cs_main + if (mapSporksActive.count(spork.nSporkID)) { + if (mapSporksActive[spork.nSporkID].nTimeSigned >= spork.nTimeSigned) { + LogPrint("spork", "%s seen\n", strLogMsg); + return; + } else { + LogPrintf("%s updated\n", strLogMsg); + } } else { - LogPrintf("%s updated\n", strLogMsg); + LogPrintf("%s new\n", strLogMsg); } - } else { - LogPrintf("%s new\n", strLogMsg); } if(!spork.CheckSignature(sporkPubKeyID)) { @@ -65,14 +67,18 @@ void CSporkManager::ProcessSpork(CNode* pfrom, const std::string& strCommand, CD return; } - mapSporks[hash] = spork; - mapSporksActive[spork.nSporkID] = spork; + { + LOCK(cs); // make sure to not lock this together with cs_main + mapSporks[hash] = spork; + mapSporksActive[spork.nSporkID] = spork; + } spork.Relay(connman); //does a task if needed ExecuteSpork(spork.nSporkID, spork.nValue); } else if (strCommand == NetMsgType::GETSPORKS) { + LOCK(cs); // make sure to not lock this together with cs_main for (const auto& pair : mapSporksActive) { connman.PushMessage(pfrom, CNetMsgMaker(pfrom->GetSendVersion()).Make(NetMsgType::SPORK, pair.second)); } @@ -111,11 +117,11 @@ void CSporkManager::ExecuteSpork(int nSporkID, int nValue) bool CSporkManager::UpdateSpork(int nSporkID, int64_t nValue, CConnman& connman) { - CSporkMessage spork = CSporkMessage(nSporkID, nValue, GetAdjustedTime()); if(spork.Sign(sporkPrivKey)) { spork.Relay(connman); + LOCK(cs); mapSporks[spork.GetHash()] = spork; mapSporksActive[nSporkID] = spork; return true; @@ -127,6 +133,7 @@ bool CSporkManager::UpdateSpork(int nSporkID, int64_t nValue, CConnman& connman) // grab the spork, otherwise say it's off bool CSporkManager::IsSporkActive(int nSporkID) { + LOCK(cs); int64_t r = -1; if(mapSporksActive.count(nSporkID)){ @@ -144,6 +151,7 @@ bool CSporkManager::IsSporkActive(int nSporkID) // grab the value of the spork on the network, or the default int64_t CSporkManager::GetSporkValue(int nSporkID) { + LOCK(cs); if (mapSporksActive.count(nSporkID)) return mapSporksActive[nSporkID].nValue; @@ -190,6 +198,7 @@ std::string CSporkManager::GetSporkNameByID(int nSporkID) } bool CSporkManager::SetSporkAddress(const std::string& strAddress) { + LOCK(cs); CBitcoinAddress address(strAddress); if (!address.IsValid() || !address.GetKeyID(sporkPubKeyID)) { LogPrintf("CSporkManager::SetSporkAddress -- Failed to parse spork address\n"); @@ -214,6 +223,7 @@ bool CSporkManager::SetPrivKey(const std::string& strPrivKey) CSporkMessage spork; if (spork.Sign(key)) { + LOCK(cs); // Test signing successful, proceed LogPrintf("CSporkManager::SetPrivKey -- Successfully initialized as spork signer\n"); diff --git a/src/spork.h b/src/spork.h index 0c491b3bd611..a627ef35e049 100644 --- a/src/spork.h +++ b/src/spork.h @@ -86,6 +86,7 @@ class CSporkMessage class CSporkManager { private: + CCriticalSection cs; std::vector vchSig; std::map mapSporksActive; From a959f60aa7343198ec1b428ce2b5823d863879f4 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Sat, 11 Aug 2018 00:35:52 +0200 Subject: [PATCH 041/400] De-duplicate "gobject vote-alias" and "gobject "vote-many" code (#2217) Use same code for both vote modes --- src/rpc/governance.cpp | 137 ++++------------------------------------- 1 file changed, 11 insertions(+), 126 deletions(-) diff --git a/src/rpc/governance.cpp b/src/rpc/governance.cpp index a6b1ebaed5d0..c4cd91e33218 100644 --- a/src/rpc/governance.cpp +++ b/src/rpc/governance.cpp @@ -399,10 +399,12 @@ UniValue gobject(const JSONRPCRequest& request) return returnObj; } - if(strCommand == "vote-many") + if(strCommand == "vote-many" || strCommand == "vote-alias") { - if(request.params.size() != 4) + if(strCommand == "vote-many" && request.params.size() != 4) throw JSONRPCError(RPC_INVALID_PARAMETER, "Correct usage is 'gobject vote-many [funding|valid|delete] [yes|no|abstain]'"); + else if(strCommand == "vote-alias" && request.params.size() != 5) + throw JSONRPCError(RPC_INVALID_PARAMETER, "Correct usage is 'gobject vote-alias [funding|valid|delete] [yes|no|abstain] '"); uint256 hash; std::string strVote; @@ -411,6 +413,10 @@ UniValue gobject(const JSONRPCRequest& request) std::string strVoteSignal = request.params[2].get_str(); std::string strVoteOutcome = request.params[3].get_str(); + std::string strAlias; + if (strCommand == "vote-alias") { + strAlias = request.params[4].get_str(); + } vote_signal_enum_t eVoteSignal = CGovernanceVoting::ConvertVoteSignal(strVoteSignal); if(eVoteSignal == VOTE_SIGNAL_NONE) { @@ -430,6 +436,9 @@ UniValue gobject(const JSONRPCRequest& request) UniValue resultsObj(UniValue::VOBJ); for (const auto& mne : masternodeConfig.getEntries()) { + // skip masternode if using "vote-alias" and it's the wrong masternode + if(strCommand == "vote-alias" && strAlias != mne.getAlias()) continue; + std::string strError; std::vector vchMasterNodeSignature; std::string strMasterNodeSignMessage; @@ -500,130 +509,6 @@ UniValue gobject(const JSONRPCRequest& request) return returnObj; } - - // MASTERNODES CAN VOTE ON GOVERNANCE OBJECTS ON THE NETWORK FOR VARIOUS SIGNALS AND OUTCOMES - if(strCommand == "vote-alias") - { - if(request.params.size() != 5) - throw JSONRPCError(RPC_INVALID_PARAMETER, "Correct usage is 'gobject vote-alias [funding|valid|delete] [yes|no|abstain] '"); - - uint256 hash; - std::string strVote; - - // COLLECT NEEDED PARAMETRS FROM USER - - hash = ParseHashV(request.params[1], "Object hash"); - std::string strVoteSignal = request.params[2].get_str(); - std::string strVoteOutcome = request.params[3].get_str(); - std::string strAlias = request.params[4].get_str(); - - // CONVERT NAMED SIGNAL/ACTION AND CONVERT - - vote_signal_enum_t eVoteSignal = CGovernanceVoting::ConvertVoteSignal(strVoteSignal); - if(eVoteSignal == VOTE_SIGNAL_NONE) { - throw JSONRPCError(RPC_INVALID_PARAMETER, - "Invalid vote signal. Please using one of the following: " - "(funding|valid|delete|endorsed)"); - } - - vote_outcome_enum_t eVoteOutcome = CGovernanceVoting::ConvertVoteOutcome(strVoteOutcome); - if(eVoteOutcome == VOTE_OUTCOME_NONE) { - throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid vote outcome. Please use one of the following: 'yes', 'no' or 'abstain'"); - } - - // EXECUTE VOTE FOR EACH MASTERNODE, COUNT SUCCESSES VS FAILURES - - int nSuccessful = 0; - int nFailed = 0; - - UniValue resultsObj(UniValue::VOBJ); - - for (const auto& mne : masternodeConfig.getEntries()) - { - // IF WE HAVE A SPECIFIC NODE REQUESTED TO VOTE, DO THAT - if(strAlias != mne.getAlias()) continue; - - // INIT OUR NEEDED VARIABLES TO EXECUTE THE VOTE - std::string strError; - std::vector vchMasterNodeSignature; - std::string strMasterNodeSignMessage; - - CPubKey pubKeyCollateralAddress; - CKey keyCollateralAddress; - CPubKey pubKeyMasternode; - CKey keyMasternode; - - // SETUP THE SIGNING KEY FROM MASTERNODE.CONF ENTRY - - UniValue statusObj(UniValue::VOBJ); - - if(!CMessageSigner::GetKeysFromSecret(mne.getPrivKey(), keyMasternode, pubKeyMasternode)) { - nFailed++; - statusObj.push_back(Pair("result", "failed")); - statusObj.push_back(Pair("errorMessage", strprintf("Invalid masternode key %s.", mne.getPrivKey()))); - resultsObj.push_back(Pair(mne.getAlias(), statusObj)); - continue; - } - - // SEARCH FOR THIS MASTERNODE ON THE NETWORK, THE NODE MUST BE ACTIVE TO VOTE - - uint256 nTxHash; - nTxHash.SetHex(mne.getTxHash()); - - int nOutputIndex = 0; - if(!ParseInt32(mne.getOutputIndex(), &nOutputIndex)) { - continue; - } - - COutPoint outpoint(nTxHash, nOutputIndex); - - CMasternode mn; - bool fMnFound = mnodeman.Get(outpoint, mn); - - if(!fMnFound) { - nFailed++; - statusObj.push_back(Pair("result", "failed")); - statusObj.push_back(Pair("errorMessage", "Masternode must be publicly available on network to vote. Masternode not found.")); - resultsObj.push_back(Pair(mne.getAlias(), statusObj)); - continue; - } - - // CREATE NEW GOVERNANCE OBJECT VOTE WITH OUTCOME/SIGNAL - - CGovernanceVote vote(outpoint, hash, eVoteSignal, eVoteOutcome); - if(!vote.Sign(keyMasternode, pubKeyMasternode)) { - nFailed++; - statusObj.push_back(Pair("result", "failed")); - statusObj.push_back(Pair("errorMessage", "Failure to sign.")); - resultsObj.push_back(Pair(mne.getAlias(), statusObj)); - continue; - } - - // UPDATE LOCAL DATABASE WITH NEW OBJECT SETTINGS - - CGovernanceException exception; - if(governance.ProcessVoteAndRelay(vote, exception, *g_connman)) { - nSuccessful++; - statusObj.push_back(Pair("result", "success")); - } - else { - nFailed++; - statusObj.push_back(Pair("result", "failed")); - statusObj.push_back(Pair("errorMessage", exception.GetMessage())); - } - - resultsObj.push_back(Pair(mne.getAlias(), statusObj)); - } - - // REPORT STATS TO THE USER - - UniValue returnObj(UniValue::VOBJ); - returnObj.push_back(Pair("overall", strprintf("Voted successfully %d time(s) and failed %d time(s).", nSuccessful, nFailed))); - returnObj.push_back(Pair("detail", resultsObj)); - - return returnObj; - } - // USERS CAN QUERY THE SYSTEM FOR A LIST OF VARIOUS GOVERNANCE ITEMS if(strCommand == "list" || strCommand == "diff") { From 2d4e18537c33146dc6fbcaa659f41218b799b5b0 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Sat, 11 Aug 2018 00:36:17 +0200 Subject: [PATCH 042/400] Some useful commits from the DIP3 PR in regard to integration tests (#2218) * Allow changing budget parameters for regtest * Lift some limitations for local addresses for masternodes in regtest Needed to make masternodes works in regtest mode * Add "masternode check" RPC to force invocation of CheckAndRemove Useful in integration tests where MN lists must be predictable --- src/activemasternode.cpp | 30 +++++++++++++++++++----------- src/chainparams.cpp | 12 ++++++++++++ src/chainparams.h | 5 +++++ src/init.cpp | 25 +++++++++++++++++++++++++ src/rpc/masternode.cpp | 23 ++++++++++++++++++++++- 5 files changed, 83 insertions(+), 12 deletions(-) diff --git a/src/activemasternode.cpp b/src/activemasternode.cpp index 726acfa0ea1d..7b262d6bb22c 100644 --- a/src/activemasternode.cpp +++ b/src/activemasternode.cpp @@ -8,6 +8,7 @@ #include "masternodeman.h" #include "netbase.h" #include "protocol.h" +#include "netbase.h" // Keep track of the active Masternode CActiveMasternode activeMasternode; @@ -159,6 +160,12 @@ void CActiveMasternode::ManageStateInitial(CConnman& connman) } } + if (!fFoundLocal && Params().NetworkIDString() == CBaseChainParams::REGTEST) { + if (Lookup("127.0.0.1", activeMasternode.service, GetListenPort(), false)) { + fFoundLocal = true; + } + } + if(!fFoundLocal) { nState = ACTIVE_MASTERNODE_NOT_CAPABLE; strNotCapableReason = "Can't detect valid external address. Please consider using the externalip configuration option if problem persists. Make sure to use IPv4 address only."; @@ -181,19 +188,20 @@ void CActiveMasternode::ManageStateInitial(CConnman& connman) return; } - // Check socket connectivity - LogPrintf("CActiveMasternode::ManageStateInitial -- Checking inbound connection to '%s'\n", service.ToString()); - SOCKET hSocket; - bool fConnected = ConnectSocket(service, hSocket, nConnectTimeout) && IsSelectableSocket(hSocket); - CloseSocket(hSocket); + if(Params().NetworkIDString() != CBaseChainParams::REGTEST) { + // Check socket connectivity + LogPrintf("CActiveMasternode::ManageStateInitial -- Checking inbound connection to '%s'\n", service.ToString()); + SOCKET hSocket; + bool fConnected = ConnectSocket(service, hSocket, nConnectTimeout) && IsSelectableSocket(hSocket); + CloseSocket(hSocket); - if (!fConnected) { - nState = ACTIVE_MASTERNODE_NOT_CAPABLE; - strNotCapableReason = "Could not connect to " + service.ToString(); - LogPrintf("CActiveMasternode::ManageStateInitial -- %s: %s\n", GetStateString(), strNotCapableReason); - return; + if (!fConnected) { + nState = ACTIVE_MASTERNODE_NOT_CAPABLE; + strNotCapableReason = "Could not connect to " + service.ToString(); + LogPrintf("CActiveMasternode::ManageStateInitial -- %s: %s\n", GetStateString(), strNotCapableReason); + return; + } } - // Default to REMOTE eType = MASTERNODE_REMOTE; diff --git a/src/chainparams.cpp b/src/chainparams.cpp index f98388947532..c605d7d60d0b 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -639,6 +639,13 @@ class CRegTestParams : public CChainParams { consensus.vDeployments[d].nStartTime = nStartTime; consensus.vDeployments[d].nTimeout = nTimeout; } + + void UpdateBudgetParameters(int nMasternodePaymentsStartBlock, int nBudgetPaymentsStartBlock, int nSuperblockStartBlock) + { + consensus.nMasternodePaymentsStartBlock = nMasternodePaymentsStartBlock; + consensus.nBudgetPaymentsStartBlock = nBudgetPaymentsStartBlock; + consensus.nSuperblockStartBlock = nSuperblockStartBlock; + } }; static CRegTestParams regTestParams; @@ -678,3 +685,8 @@ void UpdateRegtestBIP9Parameters(Consensus::DeploymentPos d, int64_t nStartTime, { regTestParams.UpdateBIP9Parameters(d, nStartTime, nTimeout); } + +void UpdateRegtestBudgetParameters(int nMasternodePaymentsStartBlock, int nBudgetPaymentsStartBlock, int nSuperblockStartBlock) +{ + regTestParams.UpdateBudgetParameters(nMasternodePaymentsStartBlock, nBudgetPaymentsStartBlock, nSuperblockStartBlock); +} diff --git a/src/chainparams.h b/src/chainparams.h index a0e0b07b3b0c..fa67c9b73a94 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -141,4 +141,9 @@ void SelectParams(const std::string& chain); */ void UpdateRegtestBIP9Parameters(Consensus::DeploymentPos d, int64_t nStartTime, int64_t nTimeout); +/** + * Allows modifying the budget regtest parameters. + */ +void UpdateRegtestBudgetParameters(int nMasternodePaymentsStartBlock, int nBudgetPaymentsStartBlock, int nSuperblockStartBlock); + #endif // BITCOIN_CHAINPARAMS_H diff --git a/src/init.cpp b/src/init.cpp index cc6f38b7fc99..b6430790e7dd 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1277,6 +1277,31 @@ bool AppInitParameterInteraction() } } + if (IsArgSet("-budgetparams")) { + // Allow overriding budget parameters for testing + if (!chainparams.MineBlocksOnDemand()) { + return InitError("Budget parameters may only be overridden on regtest."); + } + + std::string strBudgetParams = GetArg("-budgetparams", ""); + std::vector vBudgetParams; + boost::split(vBudgetParams, strBudgetParams, boost::is_any_of(":")); + if (vBudgetParams.size() != 3) { + return InitError("Budget parameters malformed, expecting masternodePaymentsStartBlock:budgetPaymentsStartBlock:superblockStartBlock"); + } + int nMasternodePaymentsStartBlock, nBudgetPaymentsStartBlock, nSuperblockStartBlock; + if (!ParseInt32(vBudgetParams[0], &nMasternodePaymentsStartBlock)) { + return InitError(strprintf("Invalid nMasternodePaymentsStartBlock (%s)", vBudgetParams[0])); + } + if (!ParseInt32(vBudgetParams[1], &nBudgetPaymentsStartBlock)) { + return InitError(strprintf("Invalid nBudgetPaymentsStartBlock (%s)", vBudgetParams[1])); + } + if (!ParseInt32(vBudgetParams[2], &nSuperblockStartBlock)) { + return InitError(strprintf("Invalid nSuperblockStartBlock (%s)", vBudgetParams[2])); + } + UpdateRegtestBudgetParameters(nMasternodePaymentsStartBlock, nBudgetPaymentsStartBlock, nSuperblockStartBlock); + } + return true; } diff --git a/src/rpc/masternode.cpp b/src/rpc/masternode.cpp index d6dd81c50810..6508df0d95ee 100644 --- a/src/rpc/masternode.cpp +++ b/src/rpc/masternode.cpp @@ -135,13 +135,14 @@ UniValue masternode(const JSONRPCRequest& request) #endif // ENABLE_WALLET strCommand != "list" && strCommand != "list-conf" && strCommand != "count" && strCommand != "debug" && strCommand != "current" && strCommand != "winner" && strCommand != "winners" && strCommand != "genkey" && - strCommand != "connect" && strCommand != "status")) + strCommand != "connect" && strCommand != "status" && strCommand != "check")) throw std::runtime_error( "masternode \"command\"...\n" "Set of commands to execute masternode related actions\n" "\nArguments:\n" "1. \"command\" (string or set of strings, required) The command to execute\n" "\nAvailable commands:\n" + " check - Force check all masternodes and remove invalid ones\n" " count - Get information about number of masternodes (DEPRECATED options: 'total', 'ps', 'enabled', 'qualify', 'all')\n" " current - Print info on current masternode winner to be paid the next block (calculated locally)\n" " genkey - Generate new masternodeprivkey\n" @@ -477,6 +478,26 @@ UniValue masternode(const JSONRPCRequest& request) return obj; } + if (strCommand == "check") { + int countBeforeCheck = mnodeman.CountMasternodes(); + int countEnabledBeforeCheck = mnodeman.CountEnabled(); + + mnodeman.CheckAndRemove(*g_connman); + + int countAfterCheck = mnodeman.CountMasternodes(); + int countEnabledAfterCheck = mnodeman.CountEnabled(); + int removedCount = std::max(0, countBeforeCheck - countAfterCheck); + int removedEnabledCount = std::max(0, countEnabledBeforeCheck - countEnabledAfterCheck); + + UniValue obj(UniValue::VOBJ); + obj.push_back(Pair("removedTotalCount", removedCount)); + obj.push_back(Pair("removedEnabledCount", removedEnabledCount)); + obj.push_back(Pair("totalCount", countAfterCheck)); + obj.push_back(Pair("enabledCount", countEnabledAfterCheck)); + + return obj; + } + return NullUniValue; } From 633879cd2856f332819dff82bd3dfa9a9eaebba3 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Sat, 11 Aug 2018 00:36:36 +0200 Subject: [PATCH 043/400] Only use version 1 and 2 transactions for sighash_tests (#2219) Also regenerated sighash.json with the help of PRINT_SIGHASH_JSON --- src/test/data/sighash.json | 1000 ++++++++++++++++++------------------ src/test/sighash_tests.cpp | 2 +- 2 files changed, 501 insertions(+), 501 deletions(-) diff --git a/src/test/data/sighash.json b/src/test/data/sighash.json index d66a56ac35bd..6e1f740ff0e4 100644 --- a/src/test/data/sighash.json +++ b/src/test/data/sighash.json @@ -1,503 +1,503 @@ [ ["raw_transaction, script, input_index, hashType, signature_hash (result)"], - ["907c2bc503ade11cc3b04eb2918b6f547b0630ab569273824748c87ea14b0696526c66ba740200000004ab65ababfd1f9bdd4ef073c7afc4ae00da8a66f429c917a0081ad1e1dabce28d373eab81d8628de802000000096aab5253ab52000052ad042b5f25efb33beec9f3364e8a9139e8439d9d7e26529c3c30b6c3fd89f8684cfd68ea0200000009ab53526500636a52ab599ac2fe02a526ed040000000008535300516352515164370e010000000003006300ab2ec229", "", 2, 1864164639, "31af167a6cf3f9d5f6875caa4d31704ceb0eba078d132b78dab52c3b8997317e"], - ["a0aa3126041621a6dea5b800141aa696daf28408959dfb2df96095db9fa425ad3f427f2f6103000000015360290e9c6063fa26912c2e7fb6a0ad80f1c5fea1771d42f12976092e7a85a4229fdb6e890000000001abc109f6e47688ac0e4682988785744602b8c87228fcef0695085edf19088af1a9db126e93000000000665516aac536affffffff8fe53e0806e12dfd05d67ac68f4768fdbe23fc48ace22a5aa8ba04c96d58e2750300000009ac51abac63ab5153650524aa680455ce7b000000000000499e50030000000008636a00ac526563ac5051ee030000000003abacabd2b6fe000000000003516563910fb6b5", "65", 0, -1391424484, "48d6a1bd2cd9eec54eb866fc71209418a950402b5d7e52363bfb75c98e141175"], - ["6e7e9d4b04ce17afa1e8546b627bb8d89a6a7fefd9d892ec8a192d79c2ceafc01694a6a7e7030000000953ac6a51006353636a33bced1544f797f08ceed02f108da22cd24c9e7809a446c61eb3895914508ac91f07053a01000000055163ab516affffffff11dc54eee8f9e4ff0bcf6b1a1a35b1cd10d63389571375501af7444073bcec3c02000000046aab53514a821f0ce3956e235f71e4c69d91abe1e93fb703bd33039ac567249ed339bf0ba0883ef300000000090063ab65000065ac654bec3cc504bcf499020000000005ab6a52abac64eb060100000000076a6a5351650053bbbc130100000000056a6aab53abd6e1380100000000026a51c4e509b8", "acab655151", 0, 479279909, "2a3d95b09237b72034b23f2d2bb29fa32a58ab5c6aa72f6aafdfa178ab1dd01c"], - ["73107cbd025c22ebc8c3e0a47b2a760739216a528de8d4dab5d45cbeb3051cebae73b01ca10200000007ab6353656a636affffffffe26816dffc670841e6a6c8c61c586da401df1261a330a6c6b3dd9f9a0789bc9e000000000800ac6552ac6aac51ffffffff0174a8f0010000000004ac52515100000000", "5163ac63635151ac", 1, 1190874345, "06e328de263a87b09beabe222a21627a6ea5c7f560030da31610c4611f4a46bc"], - ["e93bbf6902be872933cb987fc26ba0f914fcfc2f6ce555258554dd9939d12032a8536c8802030000000453ac5353eabb6451e074e6fef9de211347d6a45900ea5aaf2636ef7967f565dce66fa451805c5cd10000000003525253ffffffff047dc3e6020000000007516565ac656aabec9eea010000000001633e46e600000000000015080a030000000001ab00000000", "5300ac6a53ab6a", 1, -886562767, "f03aa4fc5f97e826323d0daa03343ebf8a34ed67a1ce18631f8b88e5c992e798"], - ["50818f4c01b464538b1e7e7f5ae4ed96ad23c68c830e78da9a845bc19b5c3b0b20bb82e5e9030000000763526a63655352ffffffff023b3f9c040000000008630051516a6a5163a83caf01000000000553ab65510000000000", "6aac", 0, 946795545, "746306f322de2b4b58ffe7faae83f6a72433c22f88062cdde881d4dd8a5a4e2d"], - ["a93e93440250f97012d466a6cc24839f572def241c814fe6ae94442cf58ea33eb0fdd9bcc1030000000600636a0065acffffffff5dee3a6e7e5ad6310dea3e5b3ddda1a56bf8de7d3b75889fc024b5e233ec10f80300000007ac53635253ab53ffffffff0160468b04000000000800526a5300ac526a00000000", "ac00636a53", 1, 1773442520, "5c9d3a2ce9365bb72cfabbaa4579c843bb8abf200944612cf8ae4b56a908bcbd"], - ["ce7d371f0476dda8b811d4bf3b64d5f86204725deeaa3937861869d5b2766ea7d17c57e40b0100000003535265ffffffff7e7e9188f76c34a46d0bbe856bde5cb32f089a07a70ea96e15e92abb37e479a10100000006ab6552ab655225bcab06d1c2896709f364b1e372814d842c9c671356a1aa5ca4e060462c65ae55acc02d0000000006abac0063ac5281b33e332f96beebdbc6a379ebe6aea36af115c067461eb99d22ba1afbf59462b59ae0bd0200000004ab635365be15c23801724a1704000000000965006a65ac00000052ca555572", "53ab530051ab", 1, 2030598449, "c336b2f7d3702fbbdeffc014d106c69e3413c7c71e436ba7562d8a7a2871f181"], - ["d3b7421e011f4de0f1cea9ba7458bf3486bee722519efab711a963fa8c100970cf7488b7bb0200000003525352dcd61b300148be5d05000000000000000000", "535251536aac536a", 0, -1960128125, "29aa6d2d752d3310eba20442770ad345b7f6a35f96161ede5f07b33e92053e2a"], - ["04bac8c5033460235919a9c63c42b2db884c7c8f2ed8fcd69ff683a0a2cccd9796346a04050200000003655351fcad3a2c5a7cbadeb4ec7acc9836c3f5c3e776e5c566220f7f965cf194f8ef98efb5e3530200000007526a006552526526a2f55ba5f69699ece76692552b399ba908301907c5763d28a15b08581b23179cb01eac03000000075363ab6a516351073942c2025aa98a05000000000765006aabac65abd7ffa6030000000004516a655200000000", "53ac6365ac526a", 1, 764174870, "bf5fdc314ded2372a0ad078568d76c5064bf2affbde0764c335009e56634481b"], - ["c363a70c01ab174230bbe4afe0c3efa2d7f2feaf179431359adedccf30d1f69efe0c86ed390200000002ab51558648fe0231318b04000000000151662170000000000008ac5300006a63acac00000000", "", 0, 2146479410, "191ab180b0d753763671717d051f138d4866b7cb0d1d4811472e64de595d2c70"], - ["8d437a7304d8772210a923fd81187c425fc28c17a5052571501db05c7e89b11448b36618cd02000000026a6340fec14ad2c9298fde1477f1e8325e5747b61b7e2ff2a549f3d132689560ab6c45dd43c3010000000963ac00ac000051516a447ed907a7efffebeb103988bf5f947fc688aab2c6a7914f48238cf92c337fad4a79348102000000085352ac526a5152517436edf2d80e3ef06725227c970a816b25d0b58d2cd3c187a7af2cea66d6b27ba69bf33a0300000007000063ab526553f3f0d6140386815d030000000003ab6300de138f00000000000900525153515265abac1f87040300000000036aac6500000000", "51", 3, -315779667, "b6632ac53578a741ae8c36d8b69e79f39b89913a2c781cdf1bf47a8c29d997a5"], - ["fd878840031e82fdbe1ad1d745d1185622b0060ac56638290ec4f66b1beef4450817114a2c0000000009516a63ab53650051abffffffff37b7a10322b5418bfd64fb09cd8a27ddf57731aeb1f1f920ffde7cb2dfb6cdb70300000008536a5365ac53515369ecc034f1594690dbe189094dc816d6d57ea75917de764cbf8eccce4632cbabe7e116cd0100000003515352ffffffff035777fc000000000003515200abe9140300000000050063005165bed6d10200000000076300536363ab65195e9110", "635265", 0, 1729787658, "6e3735d37a4b28c45919543aabcb732e7a3e1874db5315abb7cc6b143d62ff10"], - ["f40a750702af06efff3ea68e5d56e42bc41cdb8b6065c98f1221fe04a325a898cb61f3d7ee030000000363acacffffffffb5788174aef79788716f96af779d7959147a0c2e0e5bfb6c2dba2df5b4b97894030000000965510065535163ac6affffffff0445e6fd0200000000096aac536365526a526aa6546b000000000008acab656a6552535141a0fd010000000000c897ea030000000008526500ab526a6a631b39dba3", "00abab5163ac", 1, -1778064747, "d76d0fc0abfa72d646df888bce08db957e627f72962647016eeae5a8412354cf"], - ["a63bc673049c75211aa2c09ecc38e360eaa571435fedd2af1116b5c1fa3d0629c269ecccbf0000000008ac65ab516352ac52ffffffffbf1a76fdda7f451a5f0baff0f9ccd0fe9136444c094bb8c544b1af0fa2774b06010000000463535253ffffffff13d6b7c3ddceef255d680d87181e100864eeb11a5bb6a3528cb0d70d7ee2bbbc02000000056a0052abab951241809623313b198bb520645c15ec96bfcc74a2b0f3db7ad61d455cc32db04afc5cc702000000016309c9ae25014d9473020000000004abab6aac3bb1e803", "", 3, -232881718, "6e48f3da3a4ac07eb4043a232df9f84e110485d7c7669dd114f679c27d15b97e"], - ["4c565efe04e7d32bac03ae358d63140c1cfe95de15e30c5b84f31bb0b65bb542d637f49e0f010000000551abab536348ae32b31c7d3132030a510a1b1aacf7b7c3f19ce8dc49944ef93e5fa5fe2d356b4a73a00100000009abac635163ac00ab514c8bc57b6b844e04555c0a4f4fb426df139475cd2396ae418bc7015820e852f711519bc202000000086a00510000abac52488ff4aec72cbcfcc98759c58e20a8d2d9725aa4a80f83964e69bc4e793a4ff25cd75dc701000000086a52ac6aac5351532ec6b10802463e0200000000000553005265523e08680100000000002f39a6b0", "", 3, 70712784, "c6076b6a45e6fcfba14d3df47a34f6aadbacfba107e95621d8d7c9c0e40518ed"], - ["1233d5e703403b3b8b4dae84510ddfc126b4838dcb47d3b23df815c0b3a07b55bf3098110e010000000163c5c55528041f480f40cf68a8762d6ed3efe2bd402795d5233e5d94bf5ddee71665144898030000000965525165655151656affffffff6381667e78bb74d0880625993bec0ea3bd41396f2bcccc3cc097b240e5e92d6a01000000096363acac6a63536365ffffffff04610ad60200000000065251ab65ab52e90d680200000000046351516ae30e98010000000008abab52520063656a671856010000000004ac6aac514c84e383", "6aabab636300", 1, -114996813, "aeb8c5a62e8a0b572c28f2029db32854c0b614dbecef0eaa726abebb42eebb8d"], - ["0c69702103b25ceaed43122cc2672de84a3b9aa49872f2a5bb458e19a52f8cc75973abb9f102000000055365656aacffffffff3ffb1cf0f76d9e3397de0942038c856b0ebbea355dc9d8f2b06036e19044b0450100000000ffffffff4b7793f4169617c54b734f2cd905ed65f1ce3d396ecd15b6c426a677186ca0620200000008655263526551006a181a25b703240cce0100000000046352ab53dee22903000000000865526a6a516a51005e121602000000000852ab52ababac655200000000", "6a516aab63", 1, -2040012771, "a6e6cb69f409ec14e10dd476f39167c29e586e99bfac93a37ed2c230fcc1dbbe"], - ["fd22692802db8ae6ab095aeae3867305a954278f7c076c542f0344b2591789e7e33e4d29f4020000000151ffffffffb9409129cfed9d3226f3b6bab7a2c83f99f48d039100eeb5796f00903b0e5e5e0100000006656552ac63abd226abac0403e649000000000007abab51ac5100ac8035f10000000000095165006a63526a52510d42db030000000007635365ac6a63ab24ef5901000000000453ab6a0000000000", "536a52516aac6a", 1, 309309168, "7ca0f75e6530ec9f80d031fc3513ca4ecd67f20cb38b4dacc6a1d825c3cdbfdb"], - ["a43f85f701ffa54a3cc57177510f3ea28ecb6db0d4431fc79171cad708a6054f6e5b4f89170000000008ac6a006a536551652bebeaa2013e779c05000000000665ac5363635100000000", "ac", 0, 2028978692, "58294f0d7f2e68fe1fd30c01764fe1619bcc7961d68968944a0e263af6550437"], - ["c2b0b99001acfecf7da736de0ffaef8134a9676811602a6299ba5a2563a23bb09e8cbedf9300000000026300ffffffff042997c50300000000045252536a272437030000000007655353ab6363ac663752030000000002ab6a6d5c900000000000066a6a5265abab00000000", "52ac525163515251", 0, -894181723, "8b300032a1915a4ac05cea2f7d44c26f2a08d109a71602636f15866563eaafdc"], - ["82f9f10304c17a9d954cf3380db817814a8c738d2c811f0412284b2c791ec75515f38c4f8c020000000265ab5729ca7db1b79abee66c8a757221f29280d0681355cb522149525f36da760548dbd7080a0100000001510b477bd9ce9ad5bb81c0306273a3a7d051e053f04ecf3a1dbeda543e20601a5755c0cfae030000000451ac656affffffff71141a04134f6c292c2e0d415e6705dfd8dcee892b0d0807828d5aeb7d11f5ef0300000001520b6c6dc802a6f3dd0000000000056aab515163bfb6800300000000015300000000", "", 3, -635779440, "d55ed1e6c53510f2608716c12132a11fb5e662ec67421a513c074537eeccc34b"], - ["8edcf5a1014b604e53f0d12fe143cf4284f86dc79a634a9f17d7e9f8725f7beb95e8ffcd2403000000046aabac52ffffffff01c402b5040000000005ab6a63525100000000", "6351525251acabab6a", 0, 1520147826, "2765bbdcd3ebb8b1a316c04656b28d637f80bffbe9b040661481d3dc83eea6d6"], - ["2074bad5011847f14df5ea7b4afd80cd56b02b99634893c6e3d5aaad41ca7c8ee8e5098df003000000026a6affffffff018ad59700000000000900ac656a526551635300000000", "65635265", 0, -1804671183, "663c999a52288c9999bff36c9da2f8b78d5c61b8347538f76c164ccba9868d0a"], - ["7100b11302e554d4ef249ee416e7510a485e43b2ba4b8812d8fe5529fe33ea75f36d392c4403000000020000ffffffff3d01a37e075e9a7715a657ae1bdf1e44b46e236ad16fd2f4c74eb9bf370368810000000007636553ac536365ffffffff01db696a0400000000065200ac656aac00000000", "63005151", 0, -1210499507, "b9c3aee8515a4a3b439de1ffc9c156824bda12cb75bfe5bc863164e8fd31bd7a"], - ["02c1017802091d1cb08fec512db7b012fe4220d57a5f15f9e7676358b012786e1209bcff950100000004acab6352ffffffff799bc282724a970a6fea1828984d0aeb0f16b67776fa213cbdc4838a2f1961a3010000000951516a536552ab6aabffffffff016c7b4b03000000000865abac5253ac5352b70195ad", "65655200516a", 0, -241626954, "be567cb47170b34ff81c66c1142cb9d27f9b6898a384d6dfc4fce16b75b6cb14"], - ["cb3178520136cd294568b83bb2520f78fecc507898f4a2db2674560d72fd69b9858f75b3b502000000066aac00515100ffffffff03ab005a01000000000563526363006e3836030000000001abfbda3200000000000665ab0065006500000000", "ab516a0063006a5300", 0, 1182109299, "2149e79c3f4513da4e4378608e497dcfdfc7f27c21a826868f728abd2b8a637a"], - ["18a4b0c004702cf0e39686ac98aab78ad788308f1d484b1ddfe70dc1997148ba0e28515c310300000000ffffffff05275a52a23c59da91129093364e275da5616c4070d8a05b96df5a2080ef259500000000096aac51656a6aac53ab66e64966b3b36a07dd2bb40242dd4a3743d3026e7e1e0d9e9e18f11d068464b989661321030000000265ac383339c4fae63379cafb63b0bab2eca70e1f5fc7d857eb5c88ccd6c0465093924bba8b2a000000000300636ab5e0545402bc2c4c010000000000cd41c002000000000000000000", "abac635253656a00", 3, 2052372230, "32db877b6b1ca556c9e859442329406f0f8246706522369839979a9f7a235a32"], - ["1d9c5df20139904c582285e1ea63dec934251c0f9cf5c47e86abfb2b394ebc57417a81f67c010000000353515222ba722504800d3402000000000353656a3c0b4a0200000000000fb8d20500000000076300ab005200516462f30400000000015200000000", "ab65", 0, -210854112, "edf73e2396694e58f6b619f68595b0c1cdcb56a9b3147845b6d6afdb5a80b736"], - ["4504cb1904c7a4acf375ddae431a74de72d5436efc73312cf8e9921f431267ea6852f9714a01000000066a656a656553a2fbd587c098b3a1c5bd1d6480f730a0d6d9b537966e20efc0e352d971576d0f87df0d6d01000000016321aeec3c4dcc819f1290edb463a737118f39ab5765800547522708c425306ebfca3f396603000000055300ac656a1d09281d05bfac57b5eb17eb3fa81ffcedfbcd3a917f1be0985c944d473d2c34d245eb350300000007656a51525152ac263078d9032f470f0500000000066aac00000052e12da60200000000003488410200000000076365006300ab539981e432", "52536a52526a", 1, -31909119, "f0a2deee7fd8a3a9fad6927e763ded11c940ee47e9e6d410f94fda5001f82e0c"], - ["14bc7c3e03322ec0f1311f4327e93059c996275302554473104f3f7b46ca179bfac9ef753503000000016affffffff9d405eaeffa1ca54d9a05441a296e5cc3a3e32bb8307afaf167f7b57190b07e00300000008abab51ab5263abab45533aa242c61bca90dd15d46079a0ab0841d85df67b29ba87f2393cd764a6997c372b55030000000452005263ffffffff0250f40e02000000000651516a0063630e95ab0000000000046a5151ac00000000", "6a65005151", 0, -1460947095, "aa418d096929394c9147be8818d8c9dafe6d105945ab9cd7ec682df537b5dd79"], - ["2b3bd0dd04a1832f893bf49a776cd567ec4b43945934f4786b615d6cb850dfc0349b33301a000000000565ac000051cf80c670f6ddafab63411adb4d91a69c11d9ac588898cbfb4cb16061821cc104325c895103000000025163ffffffffa9e2d7506d2d7d53b882bd377bbcc941f7a0f23fd15d2edbef3cd9df8a4c39d10200000009ac63006a52526a5265ffffffff44c099cdf10b10ce87d4b38658d002fd6ea17ae4a970053c05401d86d6e75f99000000000963ab53526a5252ab63ffffffff035af69c01000000000100ba9b8b0400000000004cead10500000000026a520b77d667", "ab52abac526553", 3, -1955078165, "eb9ceecc3b401224cb79a44d23aa8f428e29f1405daf69b4e01910b848ef1523"], - ["35df11f004a48ba439aba878fe9df20cc935b4a761c262b1b707e6f2b33e2bb7565cd68b130000000000ffffffffb2a2f99abf64163bb57ca900500b863f40c02632dfd9ea2590854c5fb4811da90200000006ac006363636affffffffaf9d89b2a8d2670ca37c8f7c140600b81259f2e037cb4590578ec6e37af8bf200000000005abac6a655270a4751eb551f058a93301ffeda2e252b6614a1fdd0e283e1d9fe53c96c5bbaafaac57b8030000000153ffffffff020d9f3b02000000000100ed7008030000000004abac000000000000", "abac", 3, 593793071, "88fdee1c2d4aeead71d62396e28dc4d00e5a23498eea66844b9f5d26d1f21042"], - ["a08ff466049fb7619e25502ec22fedfb229eaa1fe275aa0b5a23154b318441bf547989d0510000000005ab5363636affffffff2b0e335cb5383886751cdbd993dc0720817745a6b1c9b8ab3d15547fc9aafd03000000000965656a536a52656a532b53d10584c290d3ac1ab74ab0a19201a4a039cb59dc58719821c024f6bf2eb26322b33f010000000965ac6aac0053ab6353ffffffff048decba6ebbd2db81e416e39dde1f821ba69329725e702bcdea20c5cc0ecc6402000000086363ab5351ac6551466e377b0468c0fa00000000000651ab53ac6a513461c6010000000008636a636365535100eeb3dc010000000006526a52ac516a43f362010000000005000063536500000000", "0063516a", 1, -1158911348, "f6a1ecb50bd7c2594ebecea5a1aa23c905087553e40486dade793c2f127fdfae"], - ["5ac2f17d03bc902e2bac2469907ec7d01a62b5729340bc58c343b7145b66e6b97d434b30fa000000000163ffffffff44028aa674192caa0d0b4ebfeb969c284cb16b80c312d096efd80c6c6b094cca000000000763acabac516a52ffffffff10c809106e04b10f9b43085855521270fb48ab579266e7474657c6c625062d2d030000000351636595a0a97004a1b69603000000000465ab005352ad68010000000008636a5263acac5100da7105010000000002acab90325200000000000000000000", "6a6aab516a63526353", 2, 1518400956, "f7efb74b1dcc49d316b49c632301bc46f98d333c427e55338be60c7ef0d953be"], - ["aeb2e11902dc3770c218b97f0b1960d6ee70459ecb6a95eff3f05295dc1ef4a0884f10ba460300000005516352526393e9b1b3e6ae834102d699ddd3845a1e159aa7cf7635edb5c02003f7830fee3788b795f20100000009ab006a526553ac006ad8809c570469290e0400000000050000abab00b10fd5040000000008ab655263abac53ab630b180300000000009d9993040000000002516300000000", "5351ababac6a65", 0, 1084852870, "f2286001af0b0170cbdad92693d0a5ebaa8262a4a9d66e002f6d79a8c94026d1"], - ["9860ca9a0294ff4812534def8c3a3e3db35b817e1a2ddb7f0bf673f70eab71bb79e90a2f3100000000086a636551acac5165ffffffffed4d6d3cd9ff9b2d490e0c089739121161a1445844c3e204296816ab06e0a83702000000035100ac88d0db5201c3b59a050000000005ac6a0051ab00000000", "535263ab006a526aab", 1, -962088116, "30df2473e1403e2b8e637e576825f785528d998af127d501556e5f7f5ed89a2a"], - ["4ddaa680026ec4d8060640304b86823f1ac760c260cef81d85bd847952863d629a3002b54b0200000008526365636a656aab65457861fc6c24bdc760c8b2e906b6656edaf9ed22b5f50e1fb29ec076ceadd9e8ebcb6b000000000152ffffffff033ff04f00000000000551526a00657a1d900300000000002153af040000000003006a6300000000", "ab526a53acabab", 0, 1055317633, "7f21b62267ed52462e371a917eb3542569a4049b9dfca2de3c75872b39510b26"], - ["01e76dcd02ad54cbc8c71d68eaf3fa7c883b65d74217b30ba81f1f5144ef80b706c0dc82ca000000000352ab6a078ec18bcd0514825feced2e8b8ea1ccb34429fae41c70cc0b73a2799e85603613c6870002000000086363ab6365536a53ffffffff043acea90000000000016ad20e1803000000000100fa00830200000000056352515351e864ee00000000000865535253ab6a6551d0c46672", "6a6365abacab", 0, -1420559003, "8af0b4cbdbc011be848edf4dbd2cde96f0578d662cfebc42252495387114224a"], - ["fa00b26402670b97906203434aa967ce1559d9bd097d56dbe760469e6032e7ab61accb54160100000006635163630052fffffffffe0d3f4f0f808fd9cfb162e9f0c004601acf725cd7ea5683bbdc9a9a433ef15a0200000005ab52536563d09c7bef049040f305000000000153a7c7b9020000000004ac63ab52847a2503000000000553ab00655390ed80010000000005006553ab52860671d4", "536565ab52", 0, 799022412, "40ed8e7bbbd893e15f3cce210ae02c97669818de5946ca37eefc7541116e2c78"], - ["cb5c06dc01b022ee6105ba410f0eb12b9ce5b5aa185b28532492d839a10cef33d06134b91b010000000153ffffffff02cec0530400000000005e1e4504000000000865656551acacac6a00000000", "ab53", 0, -1514251329, "136beb95459fe6b126cd6cefd54eb5d971524b0e883e41a292a78f78015cb8d5"], - ["f10a0356031cd569d652dbca8e7a4d36c8da33cdff428d003338602b7764fe2c96c505175b010000000465ac516affffffffbb54563c71136fa944ee20452d78dc87073ac2365ba07e638dce29a5d179da600000000003635152ffffffff9a411d8e2d421b1e6085540ee2809901e590940bbb41532fa38bd7a16b68cc350100000007535251635365636195df1603b61c45010000000002ab65bf6a310400000000026352fcbba10200000000016aa30b7ff0", "5351", 0, 1552495929, "9eb8adf2caecb4bf9ac59d7f46bd20e83258472db2f569ee91aba4cf5ee78e29"], - ["c3325c9b012f659466626ca8f3c61dfd36f34670abc054476b7516a1839ec43cd0870aa0c0000000000753525265005351e7e3f04b0112650500000000000363ac6300000000", "acac", 0, -68961433, "5ca70e727d91b1a42b78488af2ed551642c32d3de4712a51679f60f1456a8647"], - ["2333e54c044370a8af16b9750ac949b151522ea6029bacc9a34261599549581c7b4e5ece470000000007510052006563abffffffff80630fc0155c750ce20d0ca4a3d0c8e8d83b014a5b40f0b0be0dd4c63ac28126020000000465000000ffffffff1b5f1433d38cdc494093bb1d62d84b10abbdae57e3d04e82e600857ab3b1dc990300000003515100b76564be13e4890a908ea7508afdad92ec1b200a9a67939fadce6eb7a29eb4550a0a28cb0300000001acffffffff02926c930300000000016373800201000000000153d27ee740", "ab6365ab516a53", 3, 598653797, "2be27a686eb7940dd32c44ff3a97c1b28feb7ab9c5c0b1593b2d762361cfc2db"], - ["b500ca48011ec57c2e5252e5da6432089130603245ffbafb0e4c5ffe6090feb629207eeb0e010000000652ab6a636aab8302c9d2042b44f40500000000015278c05a050000000004ac5251524be080020000000007636aac63ac5252c93a9a04000000000965ab6553636aab5352d91f9ddb", "52005100", 0, -2024394677, "49c8a6940a461cc7225637f1e512cdd174c99f96ec05935a59637ededc77124c"], - ["f52ff64b02ee91adb01f3936cc42e41e1672778962b68cf013293d649536b519bc3271dd2c00000000020065afee11313784849a7c15f44a61cd5fd51ccfcdae707e5896d131b082dc9322a19e12858501000000036aac654e8ca882022deb7c020000000006006a515352abd3defc0000000000016300000000", "63520063", 0, 1130989496, "7f208df9a5507e98c62cebc5c1e2445eb632e95527594929b9577b53363e96f6"], - ["ab7d6f36027a7adc36a5cf7528fe4fb5d94b2c96803a4b38a83a675d7806dda62b380df86a0000000003000000ffffffff5bc00131e29e22057c04be854794b4877dda42e416a7a24706b802ff9da521b20000000007ac6a0065ac52ac957cf45501b9f06501000000000500ac6363ab25f1110b", "00526500536a635253", 0, 911316637, "5fa09d43c8aef6f6fa01c383a69a5a61a609cd06e37dce35a39dc9eae3ddfe6c"], - ["f940888f023dce6360263c850372eb145b864228fdbbb4c1186174fa83aab890ff38f8c9a90300000000ffffffff01e80ccdb081e7bbae1c776531adcbfb77f2e5a7d0e5d0d0e2e6c8758470e85f00000000020053ffffffff03b49088050000000004656a52ab428bd604000000000951630065ab63ac636a0cbacf0400000000070063ac5265ac53d6e16604", "ac63", 0, 39900215, "713ddeeefcfe04929e7b6593c792a4efbae88d2b5280d1f0835d2214eddcbad6"], - ["530ecd0b01ec302d97ef6f1b5a6420b9a239714013e20d39aa3789d191ef623fc215aa8b940200000005ac5351ab6a3823ab8202572eaa04000000000752ab6a51526563fd8a270100000000036a006581a798f0", "525153656a0063", 0, 1784562684, "fe42f73a8742676e640698222b1bd6b9c338ff1ccd766d3d88d7d3c6c6ac987e"], - ["5d781d9303acfcce964f50865ddfddab527ea971aee91234c88e184979985c00b4de15204b0100000003ab6352a009c8ab01f93c8ef2447386c434b4498538f061845862c3f9d5751ad0fce52af442b3a902000000045165ababb909c66b5a3e7c81b3c45396b944be13b8aacfc0204f3f3c105a66fa8fa6402f1b5efddb01000000096a65ac636aacab656ac3c677c402b79fa4050000000004006aab5133e35802000000000751ab635163ab0078c2e025", "6aac51636a6a005265", 0, -882306874, "551ce975d58647f10adefb3e529d9bf9cda34751627ec45e690f135ef0034b95"], - ["25ee54ef0187387564bb86e0af96baec54289ca8d15e81a507a2ed6668dc92683111dfb7a50100000004005263634cecf17d0429aa4d000000000007636a6aabab5263daa75601000000000251ab4df70a01000000000151980a890400000000065253ac6a006377fd24e3", "65ab", 0, 797877378, "069f38fd5d47abff46f04ee3ae27db03275e9aa4737fa0d2f5394779f9654845"], - ["a9c57b1a018551bcbc781b256642532bbc09967f1cbe30a227d352a19365d219d3f11649a3030000000451655352b140942203182894030000000006ab00ac6aab654add350400000000003d379505000000000553abacac00e1739d36", "5363", 0, -1069721025, "6da32416deb45a0d720a1dbe6d357886eabc44029dd5db74d50feaffbe763245"], - ["05c4fb94040f5119dc0b10aa9df054871ed23c98c890f1e931a98ffb0683dac45e98619fdc0200000007acab6a525263513e7495651c9794c4d60da835d303eb4ee6e871f8292f6ad0b32e85ef08c9dc7aa4e03c9c010000000500ab52acacfffffffffee953259cf14ced323fe8d567e4c57ba331021a1ef5ac2fa90f7789340d7c550100000007ac6aacac6a6a53ffffffff08d9dc820d00f18998af247319f9de5c0bbd52a475ea587f16101af3afab7c210100000003535363569bca7c0468e34f00000000000863536353ac51ac6584e319010000000006650052ab6a533debea030000000003ac0053ee7070020000000006ac52005253ac00000000", "6351005253", 2, 1386916157, "76c4013c40bfa1481badd9d342b6d4b8118de5ab497995fafbf73144469e5ff0"], - ["c95ab19104b63986d7303f4363ca8f5d2fa87c21e3c5d462b99f1ebcb7c402fc012f5034780000000009006aac63ac65655265ffffffffbe91afa68af40a8700fd579c86d4b706c24e47f7379dad6133de389f815ef7f501000000046aac00abffffffff1520db0d81be4c631878494668d258369f30b8f2b7a71e257764e9a27f24b48701000000076a515100535300b0a989e1164db9499845bac01d07a3a7d6d2c2a76e4c04abe68f808b6e2ef5068ce6540e0100000009ac53636a63ab65656affffffff0309aac6050000000005ab6563656a6067e8020000000003ac536aec91c8030000000009655251ab65ac6a53acc7a45bc5", "63526a65abac", 1, 512079270, "fb7eca81d816354b6aedec8cafc721d5b107336657acafd0d246049556f9e04b"], - ["ca66ae10049533c2b39f1449791bd6d3f039efe0a121ab7339d39ef05d6dcb200ec3fb2b3b020000000465006a53ffffffff534b8f97f15cc7fb4f4cea9bf798472dc93135cd5b809e4ca7fe4617a61895980100000000ddd83c1dc96f640929dd5e6f1151dab1aa669128591f153310d3993e562cc7725b6ae3d903000000046a52536582f8ccddb8086d8550f09128029e1782c3f2624419abdeaf74ecb24889cc45ac1a64492a0100000002516a4867b41502ee6ccf03000000000752acacab52ab6a4b7ba80000000000075151ab0052536300000000", "6553", 2, -62969257, "8085e904164ab9a8c20f58f0d387f6adb3df85532e11662c03b53c3df8c943cb"], - ["ba646d0b0453999f0c70cb0430d4cab0e2120457bb9128ed002b6e9500e9c7f8d7baa20abe0200000001652a4e42935b21db02b56bf6f08ef4be5adb13c38bc6a0c3187ed7f6197607ba6a2c47bc8a03000000040052516affffffffa55c3cbfc19b1667594ac8681ba5d159514b623d08ed4697f56ce8fcd9ca5b0b00000000096a6a5263ac655263ab66728c2720fdeabdfdf8d9fb2bfe88b295d3b87590e26a1e456bad5991964165f888c03a0200000006630051ac00acffffffff0176fafe0100000000070063acac65515200000000", "63", 1, 2002322280, "9db4e320208185ee70edb4764ee195deca00ba46412d5527d9700c1cf1c3d057"], - ["2ddb8f84039f983b45f64a7a79b74ff939e3b598b38f436def7edd57282d0803c7ef34968d02000000026a537eb00c4187de96e6e397c05f11915270bcc383959877868ba93bac417d9f6ed9f627a7930300000004516551abffffffffacc12f1bb67be3ae9f1d43e55fda8b885340a0df1175392a8bbd9f959ad3605003000000025163ffffffff02ff0f4700000000000070bd99040000000003ac53abf8440b42", "", 2, -393923011, "0133f1a161363b71dfb3a90065c7128c56bd0028b558b610142df79e055ab5c7"], - ["b21fc15403b4bdaa994204444b59323a7b8714dd471bd7f975a4e4b7b48787e720cbd1f5f00000000000ffffffff311533001cb85c98c1d58de0a5fbf27684a69af850d52e22197b0dc941bc6ca9030000000765ab6363ab5351a8ae2c2c7141ece9a4ff75c43b7ea9d94ec79b7e28f63e015ac584d984a526a73fe1e04e0100000007526352536a5365ffffffff02a0a9ea030000000002ab52cfc4f300000000000465525253e8e0f342", "000000", 1, 1305253970, "d1df1f4bba2484cff8a816012bb6ec91c693e8ca69fe85255e0031711081c46a"], - ["d1704d6601acf710b19fa753e307cfcee2735eada0d982b5df768573df690f460281aad12d0000000007656300005100acffffffff0232205505000000000351ab632ca1bc0300000000016300000000", "ac65ab65ab51", 0, 165179664, "40b4f03c68288bdc996011b0f0ddb4b48dc3be6762db7388bdc826113266cd6c"], - ["d2f6c096025cc909952c2400bd83ac3d532bfa8a1f8f3e73c69b1fd7b8913379793f3ce92202000000076a00ab6a53516ade5332d81d58b22ed47b2a249ab3a2cb3a6ce9a6b5a6810e18e3e1283c1a1b3bd73e3ab00300000002acabffffffff01a9b2d40500000000056352abab00dc4b7f69", "ab0065", 0, -78019184, "2ef025e907f0fa454a2b48a4f3b81346ba2b252769b5c35d742d0c8985e0bf5e"], - ["3e6db1a1019444dba461247224ad5933c997256d15c5d37ade3d700506a0ba0a57824930d7010000000852ab6500ab00ac00ffffffff03389242020000000001aba8465a0200000000086a6a636a5100ab52394e6003000000000953ac51526351000053d21d9800", "abababacab53ab65", 0, 1643661850, "1f8a3aca573a609f4aea0c69522a82fcb4e15835449da24a05886ddc601f4f6a"], - ["f821a042036ad43634d29913b77c0fc87b4af593ac86e9a816a9d83fd18dfcfc84e1e1d57102000000076a63ac52006351ffffffffbcdaf490fc75086109e2f832c8985716b3a624a422cf9412fe6227c10585d21203000000095252abab5352ac526affffffff2efed01a4b73ad46c7f7bc7fa3bc480f8e32d741252f389eaca889a2e9d2007e000000000353ac53ffffffff032ac8b3020000000009636300000063516300d3d9f2040000000006510065ac656aafa5de0000000000066352ab5300ac9042b57d", "525365", 1, 667065611, "0d17a92c8d5041ba09b506ddf9fd48993be389d000aad54f9cc2a44fcc70426b"], - ["58e3f0f704a186ef55d3919061459910df5406a9121f375e7502f3be872a449c3f2bb058380100000000f0e858da3ac57b6c973f889ad879ffb2bd645e91b774006dfa366c74e2794aafc8bbc871010000000751ac65516a515131a68f120fd88ca08687ceb4800e1e3fbfea7533d34c84fef70cc5a96b648d580369526d000000000600ac00515363f6191d5b3e460fa541a30a6e83345dedfa3ed31ad8574d46d7bbecd3c9074e6ba5287c24020000000151e3e19d6604162602010000000004005100ac71e17101000000000065b5e90300000000040053ab53f6b7d101000000000200ac00000000", "6563ab", 1, -669018604, "8221d5dfb75fc301a80e919e158e0b1d1e86ffb08870a326c89408d9bc17346b"], - ["efec1cce044a676c1a3d973f810edb5a9706eb4cf888a240f2b5fb08636bd2db482327cf500000000005ab51656a52ffffffff46ef019d7c03d9456e5134eb0a7b5408d274bd8e33e83df44fab94101f7c5b650200000009ac5100006353630051407aadf6f5aaffbd318fdbbc9cae4bd883e67d524df06bb006ce2f7c7e2725744afb76960100000005536aab53acec0d64eae09e2fa1a7c4960354230d51146cf6dc45ee8a51f489e20508a785cbe6ca86fc000000000651536a516300ffffffff014ef598020000000006636aac655265a6ae1b75", "53516a5363526563ab", 2, -1823982010, "13e8b5ab4e5b2ceeff0045c625e19898bda2d39fd7af682e2d1521303cfe1154"], - ["3c436c2501442a5b700cbc0622ee5143b34b1b8021ea7bbc29e4154ab1f5bdfb3dff9d640501000000086aab5251ac5252acffffffff0170b9a20300000000066aab6351525114b13791", "63acabab52ab51ac65", 0, -2140612788, "87ddf1f9acb6640448e955bd1968f738b4b3e073983af7b83394ab7557f5cd61"], - ["d62f183e037e0d52dcf73f9b31f70554bce4f693d36d17552d0e217041e01f15ad3840c838000000000963acac6a6a6a63ab63ffffffffabdfb395b6b4e63e02a763830f536fc09a35ff8a0cf604021c3c751fe4c88f4d0300000006ab63ab65ac53aa4d30de95a2327bccf9039fb1ad976f84e0b4a0936d82e67eafebc108993f1e57d8ae39000000000165ffffffff04364ad30500000000036a005179fd84010000000007ab636aac6363519b9023030000000008510065006563ac6acd2a4a02000000000000000000", "52", 1, 595020383, "da8405db28726dc4e0f82b61b2bfd82b1baa436b4e59300305cc3b090b157504"], - ["44c200a5021238de8de7d80e7cce905606001524e21c8d8627e279335554ca886454d692e6000000000500acac52abbb8d1dc876abb1f514e96b21c6e83f429c66accd961860dc3aed5071e153e556e6cf076d02000000056553526a51870a928d0360a580040000000004516a535290e1e302000000000851ab6a00510065acdd7fc5040000000007515363ab65636abb1ec182", "6363", 0, -785766894, "ed53cc766cf7cb8071cec9752460763b504b2183442328c5a9761eb005c69501"], - ["d682d52d034e9b062544e5f8c60f860c18f029df8b47716cabb6c1b4a4b310a0705e754556020000000400656a0016eeb88eef6924fed207fba7ddd321ff3d84f09902ff958c815a2bf2bb692eb52032c4d803000000076365ac516a520099788831f8c8eb2552389839cfb81a9dc55ecd25367acad4e03cfbb06530f8cccf82802701000000085253655300656a53ffffffff02d543200500000000056a510052ac03978b05000000000700ac51525363acfdc4f784", "", 2, -696035135, "e1a256854099907050cfee7778f2018082e735a1f1a3d91437584850a74c87bb"], - ["e8c0dec5026575ddf31343c20aeeca8770afb33d4e562aa8ee52eeda6b88806fdfd4fe0a97030000000953acabab65ab516552ffffffffdde122c2c3e9708874286465f8105f43019e837746686f442666629088a970e0010000000153ffffffff01f98eee0100000000025251fe87379a", "63", 1, 633826334, "abe441209165d25bc6d8368f2e7e7dc21019056719fef1ace45542aa2ef282e2"], - ["b288c331011c17569293c1e6448e33a64205fc9dc6e35bc756a1ac8b97d18e912ea88dc0770200000007635300ac6aacabfc3c890903a3ccf8040000000004656500ac9c65c9040000000009ab6a6aabab65abac63ac5f7702000000000365005200000000", "526a63", 0, 1574937329, "0dd1bd5c25533bf5f268aa316ce40f97452cca2061f0b126a59094ca5b65f7a0"], - ["fc0a092003cb275fa9a25a72cf85d69c19e4590bfde36c2b91cd2c9c56385f51cc545530210000000004ab530063ffffffff729b006eb6d14d6e5e32b1c376acf1c62830a5d9246da38dbdb4db9f51fd1c74020000000463636500ffffffff0ae695c6d12ab7dcb8d3d4b547b03f178c7268765d1de9af8523d244e3836b12030000000151ffffffff0115c1e20100000000066a6aabac6a6a1ff59aec", "ab0053ac", 0, 931831026, "73fe22099c826c34a74edf45591f5d7b3a888c8178cd08facdfd96a9a681261c"], - ["0fcae7e004a71a4a7c8f66e9450c0c1785268679f5f1a2ee0fb3e72413d70a9049ecff75de020000000452005251ffffffff99c8363c4b95e7ec13b8c017d7bb6e80f7c04b1187d6072961e1c2479b1dc0320200000000ffffffff7cf03b3d66ab53ed740a70c5c392b84f780fff5472aee82971ac3bfeeb09b2df0200000006ab5265636a0058e4fe9257d7c7c7e82ff187757c6eadc14cceb6664dba2de03a018095fd3006682a5b9600000000056353536a636de26b2303ff76de010000000001acdc0a2e020000000001ab0a53ed020000000007530063ab51510088417307", "ac6aacab5165535253", 2, -902160694, "eea96a48ee572aea33d75d0587ce954fcfb425531a7da39df26ef9a6635201be"], - ["612701500414271138e30a46b7a5d95c70c78cc45bf8e40491dac23a6a1b65a51af04e6b94020000000451655153ffffffffeb72dc0e49b2fad3075c19e1e6e4b387f1365dca43d510f6a02136318ddecb7f0200000003536352e115ffc4f9bae25ef5baf534a890d18106fb07055c4d7ec9553ba89ed1ac2101724e507303000000080063006563acabac2ff07f69a080cf61a9d19f868239e6a4817c0eeb6a4f33fe254045d8af2bca289a8695de0300000000430736c404d317840500000000086a00abac5351ab65306e0503000000000963ab0051536aabab6a6c8aca01000000000565516351ab5dcf960100000000016a00000000", "ab", 2, -604581431, "5ec805e74ee934aa815ca5f763425785ae390282d46b5f6ea076b6ad6255a842"], - ["6b68ba00023bb4f446365ea04d68d48539aae66f5b04e31e6b38b594d2723ab82d44512460000000000200acffffffff5dfc6febb484fff69c9eeb7c7eb972e91b6d949295571b8235b1da8955f3137b020000000851ac6352516a535325828c8a03365da801000000000800636aabac6551ab0f594d03000000000963ac536365ac63636a45329e010000000005abac53526a00000000", "005151", 0, 1317038910, "42f5ba6f5fe1e00e652a08c46715871dc4b40d89d9799fd7c0ea758f86eab6a7"], - ["aff5850c0168a67296cc790c1b04a9ed9ad1ba0469263a9432fcb53676d1bb4e0eea8ea1410100000005ac65526a537d5fcb1d01d9c26d0200000000065265ab5153acc0617ca1", "51ab650063", 0, 1712981774, "8449d5247071325e5f8edcc93cb9666c0fecabb130ce0e5bef050575488477eb"], - ["e6d6b9d8042c27aec99af8c12b6c1f7a80453e2252c02515e1f391da185df0874e133696b50300000006ac5165650065ffffffff6a4b60a5bfe7af72b198eaa3cde2e02aa5fa36bdf5f24ebce79f6ecb51f3b554000000000652656aababac2ec4c5a6cebf86866b1fcc4c5bd5f4b19785a8eea2cdfe58851febf87feacf6f355324a80100000001537100145149ac1e287cef62f6f5343579189fad849dd33f25c25bfca841cb696f10c5a34503000000046a636a63df9d7c4c018d96e20100000000015100000000", "53ab", 1, -1924777542, "f98f95d0c5ec3ac3e699d81f6c440d2e7843eab15393eb023bc5a62835d6dcea"], - ["046ac25e030a344116489cc48025659a363da60bc36b3a8784df137a93b9afeab91a04c1ed020000000951ab0000526a65ac51ffffffff6c094a03869fde55b9a8c4942a9906683f0a96e2d3e5a03c73614ea3223b2c29020000000500ab636a6affffffff3da7aa5ecef9071600866267674b54af1740c5aeb88a290c459caa257a2683cb0000000004ab6565ab7e2a1b900301b916030000000005abac63656308f4ed03000000000852ab53ac63ac51ac73d620020000000003ab00008deb1285", "6a", 2, 1299505108, "f79e6b776e2592bad45ca328c54abf14050c241d8f822d982c36ea890fd45757"], - ["bd515acd0130b0ac47c2d87f8d65953ec7d657af8d96af584fc13323d0c182a2e5f9a96573000000000652ac51acac65ffffffff0467aade000000000003655363dc577d050000000006515252ab5300137f60030000000007535163530065004cdc860500000000036a5265241bf53e", "acab", 0, 621090621, "771d4d87f1591a13d77e51858c16d78f1956712fe09a46ff1abcabbc1e7af711"], - ["ff1ae37103397245ac0fa1c115b079fa20930757f5b6623db3579cb7663313c2dc4a3ffdb300000000076353656a000053ffffffff83c59e38e5ad91216ee1a312d15b4267bae2dd2e57d1a3fd5c2f0f809eeb5d46010000000800abab6a6a53ab51ffffffff9d5e706c032c1e0ca75915f8c6686f64ec995ebcd2539508b7dd8abc3e4d7d2a01000000006b2bdcda02a8fe070500000000045253000019e31d04000000000700ab63acab526a00000000", "53656aab6a525251", 0, 881938872, "726bb88cdf3af2f7603a31f33d2612562306d08972a4412a55dbbc0e3363721c"], - ["ff5400dd02fec5beb9a396e1cbedc82bedae09ed44bae60ba9bef2ff375a6858212478844b03000000025253ffffffff01e46c203577a79d1172db715e9cc6316b9cfc59b5e5e4d9199fef201c6f9f0f000000000900ab6552656a5165acffffffff02e8ce62040000000002515312ce3e00000000000251513f119316", "", 0, 1541581667, "1e0da47eedbbb381b0e0debbb76e128d042e02e65b11125e17fd127305fc65cd"], - ["28e3daa603c03626ad91ffd0ff927a126e28d29db5012588b829a06a652ea4a8a5732407030200000004ab6552acffffffff8e643146d3d0568fc2ad854fd7864d43f6f16b84e395db82b739f6f5c84d97b40000000004515165526b01c2dc1469db0198bd884e95d8f29056c48d7e74ff9fd37a9dec53e44b8769a6c99c030200000009ab006a516a53630065eea8738901002398000000000007ac5363516a51abeaef12f5", "52ab52515253ab", 2, 1687390463, "55591346aec652980885a558cc5fc2e3f8d21cbd09f314a798e5a7ead5113ea6"], - ["b54bf5ac043b62e97817abb892892269231b9b220ba08bc8dbc570937cd1ea7cdc13d9676c010000000451ab5365a10adb7b35189e1e8c00b86250f769319668189b7993d6bdac012800f1749150415b2deb0200000003655300ffffffff60b9f4fb9a7e17069fd00416d421f804e2ef2f2c67de4ca04e0241b9f9c1cc5d0200000003ab6aacfffffffff048168461cce1d40601b42fbc5c4f904ace0d35654b7cc1937ccf53fe78505a0100000008526563525265abacffffffff01dbf4e6040000000007acac656553636500000000", "63", 2, 882302077, "f5b38b0f06e246e47ce622e5ee27d5512c509f8ac0e39651b3389815eff2ab93"], - ["ebf628b30360bab3fa4f47ce9e0dcbe9ceaf6675350e638baff0c2c197b2419f8e4fb17e16000000000452516365ac4d909a79be207c6e5fb44fbe348acc42fc7fe7ef1d0baa0e4771a3c4a6efdd7e2c118b0100000003acacacffffffffa6166e9101f03975721a3067f1636cc390d72617be72e5c3c4f73057004ee0ee010000000863636a6a516a5252c1b1e82102d8d54500000000000153324c900400000000015308384913", "0063516a51", 1, -1658428367, "eb2d8dea38e9175d4d33df41f4087c6fea038a71572e3bad1ea166353bf22184"], - ["d6a8500303f1507b1221a91adb6462fb62d741b3052e5e7684ea7cd061a5fc0b0e93549fa50100000004acab65acfffffffffdec79bf7e139c428c7cfd4b35435ae94336367c7b5e1f8e9826fcb0ebaaaea30300000000ffffffffd115fdc00713d52c35ea92805414bd57d1e59d0e6d3b79a77ee18a3228278ada020000000453005151ffffffff040231510300000000085100ac6a6a000063c6041c0400000000080000536a6563acac138a0b04000000000263abd25fbe03000000000900656a00656aac510000000000", "ac526aac6a00", 1, -2007972591, "13d12a51598b34851e7066cd93ab8c5212d60c6ed2dae09d91672c10ccd7f87c"], - ["658cb1c1049564e728291a56fa79987a4ed3146775fce078bd2e875d1a5ca83baf6166a82302000000056a656351ab2170e7d0826cbdb45fda0457ca7689745fd70541e2137bb4f52e7b432dcfe2112807bd720300000007006a0052536351ffffffff8715ca2977696abf86d433d5c920ef26974f50e9f4a20c584fecbb68e530af5101000000009e49d864155bf1d3c757186d29f3388fd89c7f55cc4d9158b4cf74ca27a35a1dd93f945502000000096a535353ac656351510d29fa870230b809040000000006ab6a6a526a633b41da050000000004ab6a6a65ed63bf62", "52acabac", 2, -1774073281, "53ab197fa7e27b8a3f99ff48305e67081eb90e95d89d7e92d80cee25a03a6689"], - ["e92492cc01aec4e62df67ea3bc645e2e3f603645b3c5b353e4ae967b562d23d6e043badecd0100000003acab65ffffffff02c7e5ea040000000002ab52e1e584010000000005536365515195d16047", "6551", 0, -424930556, "93c34627f526d73f4bea044392d1a99776b4409f7d3d835f23b03c358f5a61c2"], - ["02e242db04be2d8ced9179957e98cee395d4767966f71448dd084426844cbc6d15f2182e85030000000200650c8ffce3db9de9c3f9cdb9104c7cb26647a7531ad1ebf7591c259a9c9985503be50f8de30000000007ac6a51636a6353ffffffffa2e33e7ff06fd6469987ddf8a626853dbf30c01719efb259ae768f051f803cd30300000000fffffffffd69d8aead941683ca0b1ee235d09eade960e0b1df3cd99f850afc0af1b73e070300000001ab60bb602a011659670100000000076363526300acac00000000", "6353ab515251", 3, 1451100552, "bbc9069b8615f3a52ac8a77359098dcc6c1ba88c8372d5d5fe080b99eb781e55"], - ["b28d5f5e015a7f24d5f9e7b04a83cd07277d452e898f78b50aae45393dfb87f94a26ef57720200000008ababac630053ac52ffffffff046475ed040000000008ab5100526363ac65c9834a04000000000251abae26b30100000000040000ac65ceefb900000000000000000000", "ac6551ac6a536553", 0, -1756558188, "5848d93491044d7f21884eef7a244fe7d38886f8ae60df49ce0dfb2a342cd51a"], - ["efb8b09801f647553b91922a5874f8e4bb2ed8ddb3536ed2d2ed0698fac5e0e3a298012391030000000952ac005263ac52006affffffff04cdfa0f050000000007ac53ab51abac65b68d1b02000000000553ab65ac00d057d50000000000016a9e1fda010000000007ac63ac536552ac00000000", "6aac", 0, 1947322973, "603a9b61cd30fcea43ef0a5c18b88ca372690b971b379ee9e01909c336280511"], - ["68a59fb901c21946797e7d07a4a3ea86978ce43df0479860d7116ac514ba955460bae78fff0000000001abffffffff03979be80100000000036553639300bc040000000008006552006a656565cfa78d0000000000076552acab63ab5100000000", "ab65ab", 0, 995583673, "3b320dd47f2702452a49a1288bdc74a19a4b849b132b6cad9a1d945d87dfbb23"], - ["67761f2a014a16f3940dcb14a22ba5dc057fcffdcd2cf6150b01d516be00ef55ef7eb07a830100000004636a6a51ffffffff01af67bd050000000008526553526300510000000000", "6a00", 0, 1570943676, "079fa62e9d9d7654da8b74b065da3154f3e63c315f25751b4d896733a1d67807"], - ["e20fe96302496eb436eee98cd5a32e1c49f2a379ceb71ada8a48c5382df7c8cd88bdc47ced03000000016556aa0e180660925a841b457aed0aae47fca2a92fa1d7afeda647abf67198a3902a7c80dd00000000085152ac636a535265bd18335e01803c810100000000046500ac52f371025e", "6363ab", 1, -651254218, "2921a0e5e3ba83c57ba57c25569380c17986bf34c366ec216d4188d5ba8b0b47"], - ["4e1bd9fa011fe7aa14eee8e78f27c9fde5127f99f53d86bc67bdab23ca8901054ee8a8b6eb0300000009ac535153006a6a0063ffffffff044233670500000000000a667205000000000652ab636a51abe5bf35030000000003535351d579e505000000000700630065ab51ac3419ac30", "52abac52", 0, -1807563680, "4aae6648f856994bed252d319932d78db55da50d32b9008216d5366b44bfdf8a"], - ["ec02fbee03120d02fde12574649660c441b40d330439183430c6feb404064d4f507e704f3c0100000000ffffffffe108d99c7a4e5f75cc35c05debb615d52fac6e3240a6964a29c1704d98017fb60200000002ab63fffffffff726ec890038977adfc9dadbeaf5e486d5fcb65dc23acff0dd90b61b8e2773410000000002ac65e9dace55010f881b010000000005ac00ab650000000000", "51ac525152ac6552", 2, -1564046020, "3f988922d8cd11c7adff1a83ce9499019e5ab5f424752d8d361cf1762e04269b"], - ["23dbdcc1039c99bf11938d8e3ccec53b60c6c1d10c8eb6c31197d62c6c4e2af17f52115c3a0300000008636352000063ababffffffff17823880e1df93e63ad98c29bfac12e36efd60254346cac9d3f8ada020afc0620300000003ab63631c26f002ac66e86cd22a25e3ed3cb39d982f47c5118f03253054842daadc88a6c41a2e1500000000096a00ab636a53635163195314de015570fd0100000000096a5263acab5200005300000000", "ababac6a6553", 1, 11586329, "bd36a50e0e0a4ecbf2709e68daef41eddc1c0c9769efaee57910e99c0a1d1343"], - ["33b03bf00222c7ca35c2f8870bbdef2a543b70677e413ce50494ac9b22ea673287b6aa55c50000000005ab00006a52ee4d97b527eb0b427e4514ea4a76c81e68c34900a23838d3e57d0edb5410e62eeb8c92b6000000000553ac6aacac42e59e170326245c000000000009656553536aab516aabb1a10603000000000852ab52ab6a516500cc89c802000000000763ac6a63ac516300000000", "", 0, 557416556, "41bead1b073e1e9fee065dd612a617ca0689e8f9d3fed9d0acfa97398ebb404c"], - ["813eda1103ac8159850b4524ef65e4644e0fc30efe57a5db0c0365a30446d518d9b9aa8fdd0000000003656565c2f1e89448b374b8f12055557927d5b33339c52228f7108228149920e0b77ef0bcd69da60000000006abac00ab63ab82cdb7978d28630c5e1dc630f332c4245581f787936f0b1e84d38d33892141974c75b4750300000004ac53ab65ffffffff0137edfb02000000000000000000", "0063", 1, -1948560575, "71dfcd2eb7f2e6473aed47b16a6d5fcbd0af22813d892e9765023151e07771ec"], - ["9e45d9aa0248c16dbd7f435e8c54ae1ad086de50c7b25795a704f3d8e45e1886386c653fbf01000000025352fb4a1acefdd27747b60d1fb79b96d14fb88770c75e0da941b7803a513e6d4c908c6445c7010000000163ffffffff014069a8010000000001520a794fb3", "51ac005363", 1, -719113284, "0d31a221c69bd322ef7193dd7359ddfefec9e0a1521d4a8740326d46e44a5d6a"], - ["36e42018044652286b19a90e5dd4f8d9f361d0760d080c5c5add1970296ff0f1de630233c8010000000200ac39260c7606017d2246ee14ddb7611586178067e6a4be38e788e33f39a3a95a55a13a6775010000000352ac638bea784f7c2354ed02ea0b93f0240cdfb91796fa77649beee6f7027caa70778b091deee700000000066a65ac656363ffffffff4d9d77ab676d711267ef65363f2d192e1bd55d3cd37f2280a34c72e8b4c559d700000000056a006aab00001764e1020d30220100000000085252516aacab0053472097040000000009635353ab6a636a5100a56407a1", "006a536551ab53ab", 0, 827296034, "daec2af5622bbe220c762da77bab14dc75e7d28aa1ade9b7f100798f7f0fd97a"], - ["5e06159a02762b5f3a5edcdfc91fd88c3bff08b202e69eb5ba74743e9f4291c4059ab008200000000001ac348f5446bb069ef977f89dbe925795d59fb5d98562679bafd61f5f5f3150c3559582992d0000000008ab5165515353abac762fc67703847ec6010000000000e200cf040000000002abaca64b86010000000008520000515363acabb82b491b", "ab53525352ab6a", 0, -61819505, "75a7db0df41485a28bf6a77a37ca15fa8eccc95b5d6014a731fd8adb9ada0f12"], - ["a1948872013b543d6d902ccdeead231c585195214ccf5d39f136023855958436a43266911501000000086aac006a6a6a51514951c9b2038a538a04000000000452526563c0f345050000000007526a5252ac526af9be8e03000000000752acac51ab006306198db2", "ab6353", 0, -326384076, "ced7ef84aad4097e1eb96310e0d1c8e512cfcb392a01d9010713459b23bc0cf4"], - ["c3efabba03cb656f154d1e159aa4a1a4bf9423a50454ebcef07bc3c42a35fb8ad84014864d0000000000d1cc73d260980775650caa272e9103dc6408bdacaddada6b9c67c88ceba6abaa9caa2f7d020000000553536a5265ffffffff9f946e8176d9b11ff854b76efcca0a4c236d29b69fb645ba29d406480427438e01000000066a0065005300ffffffff040419c0010000000003ab6a63cdb5b6010000000009006300ab5352656a63f9fe5e050000000004acac5352611b980100000000086a00acac00006a512d7f0c40", "0053", 0, -59089911, "c503001c16fbff82a99a18d88fe18720af63656fccd8511bca1c3d0d69bd7fc0"], - ["efb55c2e04b21a0c25e0e29f6586be9ef09f2008389e5257ebf2f5251051cdc6a79fce2dac020000000351006affffffffaba73e5b6e6c62048ba5676d18c33ccbcb59866470bb7911ccafb2238cfd493802000000026563ffffffffe62d7cb8658a6eca8a8babeb0f1f4fa535b62f5fc0ec70eb0111174e72bbec5e0300000009abababac516365526affffffffbf568789e681032d3e3be761642f25e46c20322fa80346c1146cb47ac999cf1b0300000000b3dbd55902528828010000000001ab0aac7b0100000000015300000000", "acac52", 3, 1638140535, "e84444d91580da41c8a7dcf6d32229bb106f1be0c811b2292967ead5a96ce9d4"], - ["91d3b21903629209b877b3e1aef09cd59aca6a5a0db9b83e6b3472aceec3bc2109e64ab85a0200000003530065ffffffffca5f92de2f1b7d8478b8261eaf32e5656b9eabbc58dcb2345912e9079a33c4cd010000000700ab65ab00536ad530611da41bbd51a389788c46678a265fe85737b8d317a83a8ff7a839debd18892ae5c80300000007ab6aac65ab51008b86c501038b8a9a05000000000263525b3f7a040000000007ab535353ab00abd4e3ff04000000000665ac51ab65630b7b656f", "6551525151516a00", 2, 499657927, "ef4bd7622eb7b2bbbbdc48663c1bc90e01d5bde90ff4cb946596f781eb420a0c"], - ["5d5c41ad0317aa7e40a513f5141ad5fc6e17d3916eebee4ddb400ddab596175b41a111ead20100000005536a5265acffffffff900ecb5e355c5c9f278c2c6ea15ac1558b041738e4bffe5ae06a9346d66d5b2b00000000080000ab636a65ab6affffffff99f4e08305fa5bd8e38fb9ca18b73f7a33c61ff7b3c68e696b30a04fea87f3ca000000000163d3d1760d019fc13a00000000000000000000", "ab53acabab6aac6a52", 2, 1007461922, "4012f5ff2f1238a0eb84854074670b4703238ebc15bfcdcd47ffa8498105fcd9"], - ["ceecfa6c02b7e3345445b82226b15b7a097563fa7d15f3b0c979232b138124b62c0be007890200000009abac51536a63525253ffffffffbae481ccb4f15d94db5ec0d8854c24c1cc8642bd0c6300ede98a91ca13a4539a0200000001ac50b0813d023110f5020000000006acabac526563e2b0d0040000000009656aac0063516a536300000000", "0063526500", 0, -1862053821, "e1600e6df8a6160a79ac32aa40bb4644daa88b5f76c0d7d13bf003327223f70c"], - ["ae62d5fd0380c4083a26642159f51af24bf55dc69008e6b7769442b6a69a603edd980a33000000000005ab5100ab53ffffffff49d048324d899d4b8ed5e739d604f5806a1104fede4cb9f92cc825a7fa7b4bfe0200000005536a000053ffffffff42e5cea5673c650881d0b4005fa4550fd86de5f21509c4564a379a0b7252ac0e0000000007530000526a53525f26a68a03bfacc3010000000000e2496f000000000009ab5253acac52636563b11cc600000000000700510065526a6a00000000", "abab", 1, -1600104856, "05cf0ec9c61f1a15f651a0b3c5c221aa543553ce6c804593f43bb5c50bb91ffb"], - ["f06f64af04fdcb830464b5efdb3d5ee25869b0744005375481d7b9d7136a0eb8828ad1f0240200000003516563fffffffffd3ba192dabe9c4eb634a1e3079fca4f072ee5ceb4b57deb6ade5527053a92c5000000000165ffffffff39f43401a36ba13a5c6dd7f1190e793933ae32ee3bf3e7bfb967be51e681af760300000009650000536552636a528e34f50b21183952cad945a83d4d56294b55258183e1627d6e8fb3beb8457ec36cadb0630000000005abab530052334a7128014bbfd10100000000085352ab006a63656afc424a7c", "53650051635253ac00", 2, 313255000, "d309da5afd91b7afa257cfd62df3ca9df036b6a9f4b38f5697d1daa1f587312b"], - ["6dfd2f98046b08e7e2ef5fff153e00545faf7076699012993c7a30cb1a50ec528281a9022f030000000152ffffffff1f535e4851920b968e6c437d84d6ecf586984ebddb7d5db6ae035bd02ba222a8010000000651006a53ab51605072acb3e17939fa0737bc3ee43bc393b4acd58451fc4ffeeedc06df9fc649828822d5010000000253525a4955221715f27788d302382112cf60719be9ae159c51f394519bd5f7e70a4f9816c7020200000009526a6a51636aab656a36d3a5ff0445548e0100000000086a6a00516a52655167030b050000000004ac6a63525cfda8030000000000e158200000000000010000000000", "535263ac6a65515153", 3, 585774166, "72b7da10704c3ca7d1deb60c31b718ee12c70dc9dfb9ae3461edce50789fe2ba"], - ["187eafed01389a45e75e9dda526d3acbbd41e6414936b3356473d1f9793d161603efdb45670100000002ab00ffffffff04371c8202000000000563630063523b3bde02000000000753516563006300e9e765010000000005516aac656a373f9805000000000665525352acab08d46763", "ab", 0, 122457992, "393aa6c758e0eed15fa4af6d9e2d7c63f49057246dbb92b4268ec24fc87301ca"], - ["7d50b977035d50411d814d296da9f7965ddc56f3250961ca5ba805cadd0454e7c521e31b0300000000003d0416c2cf115a397bacf615339f0e54f6c35ffec95aa009284d38390bdde1595cc7aa7c0100000005ab52ac5365ffffffff4232c6e796544d5ac848c9dc8d25cfa74e32e847a5fc74c74d8f38ca51188562030000000653ac51006a51ffffffff016bd8bb00000000000465ab5253163526f3", "51ab526a00005353", 1, -1311316785, "60b7544319b42e4159976c35c32c2644f0adf42eff13be1dc2f726fc0b6bb492"], - ["2a45cd1001bf642a2315d4a427eddcc1e2b0209b1c6abd2db81a800c5f1af32812de42032702000000050051525200ffffffff032177db050000000005530051abac49186f000000000004ab6aab00645c0000000000000765655263acabac00000000", "6a65", 0, -1774715722, "6a9ac3f7da4c7735fbc91f728b52ecbd602233208f96ac5592656074a5db118a"], - ["479358c202427f3c8d19e2ea3def6d6d3ef2281b4a93cd76214f0c7d8f040aa042fe19f71f0300000001abffffffffa2709be556cf6ecaa5ef530df9e4d056d0ed57ce96de55a5b1f369fa40d4e74a020000000700006a51635365c426be3f02af578505000000000363ab63fd8f590500000000065153abac53632dfb14b3", "520063ab51", 1, -763226778, "cfe147982afacde044ce66008cbc5b1e9f0fd9b8ed52b59fc7c0fecf95a39b0e"], - ["76179a8e03bec40747ad65ab0f8a21bc0d125b5c3c17ad5565556d5cb03ade7c83b4f32d98030000000151ffffffff99b900504e0c02b97a65e24f3ad8435dfa54e3c368f4e654803b756d011d24150200000003ac5353617a04ac61bb6cf697cfa4726657ba35ed0031432da8c0ffb252a190278830f9bd54f0320100000006656551005153c8e8fc8803677c77020000000007ac6553535253ac70f442030000000001535be0f20200000000026300bf46cb3a", "6aab52", 1, -58495673, "35e94b3776a6729d20aa2f3ddeeb06d3aad1c14cc4cde52fd21a4efc212ea16c"], - ["75ae53c2042f7546223ce5d5f9e00a968ddc68d52e8932ef2013fa40ce4e8c6ed0b6195cde01000000056563ac630079da0452c20697382e3dba6f4fc300da5f52e95a9dca379bb792907db872ba751b8024ee0300000009655151536500005163ffffffffe091b6d43f51ff00eff0ccfbc99b72d3aff208e0f44b44dfa5e1c7322cfc0c5f01000000075200005363ab63ffffffff7e96c3b83443260ac5cfd18258574fbc4225c630d3950df812bf51dceaeb0f9103000000065365655165639a6bf70b01b3e14305000000000563530063ac00000000", "6300ab00ac", 2, 982422189, "ee4ea49d2aae0dbba05f0b9785172da54408eb1ec67d36759ff7ed25bfc28766"], - ["1cdfa01e01e1b8078e9c2b0ca5082249bd18fdb8b629ead659adedf9a0dd5a04031871ba120200000008525351536565ab6affffffff011e28430200000000076a5363636aac52b2febd4a", "abacac63656300", 0, 387396350, "299dcaac2bdaa627eba0dfd74767ee6c6f27c9200b49da8ff6270b1041669e7e"], - ["cc28c1810113dfa6f0fcd9c7d9c9a30fb6f1d774356abeb527a8651f24f4e6b25cf763c4e00300000003ab636affffffff02dfc6050000000000080053636351ab0052afd56903000000000453ab5265f6c90d99", "006551abacacac", 0, 1299280838, "a4c0773204ab418a939e23f493bd4b3e817375d133d307609e9782f2cc38dbcf"], - ["ca816e7802cd43d66b9374cd9bf99a8da09402d69c688d8dcc5283ace8f147e1672b757e020200000005516aabab5240fb06c95c922342279fcd88ba6cd915933e320d7becac03192e0941e0345b79223e89570300000004005151ac353ecb5d0264dfbd010000000005ac6aacababd5d70001000000000752ac53ac6a5151ec257f71", "63ac", 1, 774695685, "cc180c4f797c16a639962e7aec58ec4b209853d842010e4d090895b22e7a7863"], - ["b42b955303942fedd7dc77bbd9040aa0de858afa100f399d63c7f167b7986d6c2377f66a7403000000066aac00525100ffffffff0577d04b64880425a3174055f94191031ad6b4ca6f34f6da9be7c3411d8b51fc000000000300526a6391e1cf0f22e45ef1c44298523b516b3e1249df153590f592fcb5c5fc432dc66f3b57cb03000000046a6aac65ffffffff0393a6c9000000000004516a65aca674ac0400000000046a525352c82c370000000000030053538e577f89", "", 1, -1237094944, "566953eb806d40a9fb684d46c1bf8c69dea86273424d562bd407b9461c8509af"], - ["92c9fe210201e781b72554a0ed5e22507fb02434ddbaa69aff6e74ea8bad656071f1923f3f02000000056a63ac6a514470cef985ba83dcb8eee2044807bedbf0d983ae21286421506ae276142359c8c6a34d68020000000863ac63525265006aa796dd0102ca3f9d05000000000800abab52ab535353cd5c83010000000007ac00525252005322ac75ee", "5165", 0, 97879971, "6e6307cef4f3a9b386f751a6f40acebab12a0e7e17171d2989293cbec7fd45c2"], - ["ccca1d5b01e40fe2c6b3ee24c660252134601dab785b8f55bd6201ffaf2fddc7b3e2192325030000000365535100496d4703b4b66603000000000665535253ac633013240000000000015212d2a502000000000951abac636353636a5337b82426", "0052", 0, -1691630172, "577bf2b3520b40aef44899a20d37833f1cded6b167e4d648fc5abe203e43b649"], - ["bc1a7a3c01691e2d0c4266136f12e391422f93655c71831d90935fbda7e840e50770c61da20000000008635253abac516353ffffffff031f32aa020000000003636563786dbc0200000000003e950f00000000000563516a655184b8a1de", "51536a", 0, -1627072905, "730bc25699b46703d7718fd5f5c34c4b5f00f594a9968ddc247fa7d5175124ed"], - ["076d209e02d904a6c40713c7225d23e7c25d4133c3c3477828f98c7d6dbd68744023dbb66b030000000753ab00536565acffffffff10975f1b8db8861ca94c8cc7c7cff086ddcd83e10b5fffd4fc8f2bdb03f9463c0100000000ffffffff029dff76010000000006526365530051a3be6004000000000000000000", "515253ac65acacac", 1, -1207502445, "66c488603b2bc53f0d22994a1f0f66fb2958203102eba30fe1d37b27a55de7a5"], - ["690fd1f80476db1f9eebe91317f2f130a60cbc1f4feadd9d6474d438e9cb7f91e4994600af0300000004ab536a63a15ce9fa6622d0c4171d895b42bff884dc6e8a7452f827fdc68a29c3c88e6fdee364eaf50000000002ab52ffffffff022dc39d3c0956b24d7f410b1e387859e7a72955f45d6ffb1e884d77888d18fe0300000005ac6a63656afffffffff10b06bce1800f5c49153d24748fdefb0bf514c12863247d1042d56018c3e25c03000000086a63ac6365536a52ffffffff031f162f0500000000060000655265abffbcd40500000000045151ac001a9c8c05000000000652ac53656a6300000000", "ac51ab63acac", 0, -67986012, "051c0df7ac688c2c930808dabde1f50300aea115f2bb3334f4753d5169b51e46"], - ["49ac2af00216c0307a29e83aa5de19770e6b20845de329290bd69cf0e0db7aed61ae41b39002000000035163ac8b2558ef84635bfc59635150e90b61fc753d34acfd10d97531043053e229cd720133cd95000000000463516a51ffffffff02458471040000000008abab636a51ac0065545aa80000000000096a6553516a5263ac6a00000000", "51526300ab5363", 1, 1449668540, "ddfd902bba312a06197810da96a0ddccb595f96670b28ded7dba88d8cd0469b8"], - ["fa4d868b024b010bd5dce46576c2fb489aa60bb797dac3c72a4836f49812c5c564c258414f03000000007a9b3a585e05027bdd89edbadf3c85ac61f8c3a04c773fa746517ae600ff1a9d6b6c02fb0200000004515163abffffffff01b17d020500000000046a65520000000000", "536565ab65635363", 0, -1718953372, "96c2b32f0a00a5925db7ba72d0b5d39922f30ea0f7443b22bc1b734808513c47"], - ["cac6382d0462375e83b67c7a86c922b569a7473bfced67f17afd96c3cd2d896cf113febf9e0300000003006a53ffffffffaa4913b7eae6821487dd3ca43a514e94dcbbf350f8cc4cafff9c1a88720711b800000000096a6a525300acac6353ffffffff184fc4109c34ea27014cc2c1536ef7ed1821951797a7141ddacdd6e429fae6ff01000000055251655200ffffffff9e7b79b4e6836e290d7b489ead931cba65d1030ccc06f20bd4ca46a40195b33c030000000008f6bc8304a09a2704000000000563655353511dbc73050000000000cf34c500000000000091f76e0000000000085200ab00005100abd07208cb", "0063656a", 2, -1488731031, "bf078519fa87b79f40abc38f1831731422722c59f88d86775535f209cb41b9b1"], - ["1711146502c1a0b82eaa7893976fefe0fb758c3f0e560447cef6e1bde11e42de91a125f71c030000000015bd8c04703b4030496c7461482481f290c623be3e76ad23d57a955807c9e851aaaa20270300000000d04abaf20326dcb7030000000001632225350400000000075263ac00520063dddad9020000000000af23d148", "52520053510063", 0, 1852122830, "e33d5ee08c0f3c130a44d7ce29606450271b676f4a80c52ab9ffab00cecf67f8"], - ["8d5b124d0231fbfc640c706ddb1d57bb49a18ba8ca0e1101e32c7e6e65a0d4c7971d93ea360100000008acabac0000abac65ffffffff8fe0fd7696597b845c079c3e7b87d4a44110c445a330d70342a5501955e17dd70100000004ab525363ef22e8a90346629f030000000009516a00ac63acac51657bd57b05000000000200acfd4288050000000009acab5352ab00ab636300000000", "53ac526553ab65", 0, 1253152975, "8b57a7c3170c6c02dd14ae1d392ce3d828197b20e9145c89c1cfd5de050e1562"], - ["38146dc502c7430e92b6708e9e107b61cd38e5e773d9395e5c8ad8986e7e4c03ee1c1e1e760100000000c8962ce2ac1bb3b1285c0b9ba07f4d2e5ce87c738c42ac0548cd8cec1100e6928cd6b0b6010000000763ab636aab52527cccefbd04e5f6f8020000000006006aabacac65ab2c4a00000000000351635209a6f40100000000026aacce57dc040000000008ab5353ab516a516a00000000", "ab", 0, -1205978252, "3cb5b030e7da0b60ccce5b4a7f3793e6ca56f03e3799fe2d6c3cc22d6d841dcb"], - ["22d81c740469695a6a83a9a4824f77ecff8804d020df23713990afce2b72591ed7de98500502000000065352526a6a6affffffff90dc85e118379b1005d7bbc7d2b8b0bab104dad7eaa49ff5bead892f17d8c3ba010000000665656300ab51ffffffff965193879e1d5628b52005d8560a35a2ba57a7f19201a4045b7cbab85133311d0200000003ac005348af21a13f9b4e0ad90ed20bf84e4740c8a9d7129632590349afc03799414b76fd6e826200000000025353ffffffff04a0d40d04000000000060702700000000000652655151516ad31f1502000000000365ac0069a1ac0500000000095100655300ab53525100000000", "51636a52ac", 0, -1644680765, "add7f5da27262f13da6a1e2cc2feafdc809bd66a67fb8ae2a6f5e6be95373b6f"], - ["a27dcbc801e3475174a183586082e0914c314bc9d79d1570f29b54591e5e0dff07fbb45a7f0000000004ac53ab51ffffffff027347f5020000000005535351ab63d0e5c9030000000009ac65ab6a63515200ab7cd632ed", "ac63636553", 0, -686435306, "883a6ea3b2cc53fe8a803c229106366ca14d25ffbab9fef8367340f65b201da6"], - ["b123ed2204410d4e8aaaa8cdb95234ca86dad9ff77fb4ae0fd4c06ebed36794f0215ede0040100000002ac63ffffffff3b58b81b19b90d8f402701389b238c3a84ff9ba9aeea298bbf15b41a6766d27a01000000056a6553ab00151824d401786153b819831fb15926ff1944ea7b03d884935a8bde01ed069d5fd80220310200000000ffffffffa9c9d246f1eb8b7b382a9032b55567e9a93f86c77f4e32c092aa1738f7f756c30100000002ab65ffffffff011a2b48000000000000ed44d1fb", "630051ab63", 2, -1118263883, "b5dab912bcabedff5f63f6dd395fc2cf030d83eb4dd28214baba68a45b4bfff0"], - ["1339051503e196f730955c5a39acd6ed28dec89b4dadc3f7c79b203b344511270e5747fa9900000000045151636affffffff378c6090e08a3895cedf1d25453bbe955a274657172491fd2887ed5c9aceca7b0100000000ffffffffcf7cc3c36ddf9d4749edfa9cefed496d2f86e870deb814bfcd3b5637a5496461030000000451006300ffffffff04dcf3fa010000000008526a63005263acabb41d84040000000004abac5153800eff020000000005656a535365106c5e00000000000000000000", "abac5300", 2, 2013719928, "7fc74de39ce6ca46ca25d760d3cec7bb21fd14f7efe1c443b5aa294f2cb5f546"], - ["0728c606014c1fd6005ccf878196ba71a54e86cc8c53d6db500c3cc0ac369a26fac6fcbc210000000005ab53ac5365ba9668290182d7870100000000066a000053655100000000", "65", 0, 1789961588, "ab6baa6da3b2bc853868d166f8996ad31d63ef981179f9104f49968fd61c8427"], - ["a1134397034bf4067b6c81c581e2b73fb63835a08819ba24e4e92df73074bf773c94577df7000000000465525251ffffffff8b6608feaa3c1f35f49c6330a769716fa01c5c6f6e0cdc2eb10dfc99bbc21e77010000000952656aac005352655180a0bda4bc72002c2ea8262e26e03391536ec36867258cab968a6fd6ec7523b64fa1d8c001000000056a53ac6353ffffffff04dbeeed05000000000553650052abcd5d0e01000000000463abab51104b2e0500000000066aac53ac5165283ca7010000000004535252ab00000000", "ab515151516552ab", 1, -324598676, "91178482112f94d1c8e929de443e4b9c893e18682998d393ca9ca77950412586"], - ["bcdafbae04aa18eb75855aeb1f5124f30044741351b33794254a80070940cb10552fa4fa8e0300000001acd0423fe6e3f3f88ae606f2e8cfab7a5ef87caa2a8f0401765ff9a47d718afcfb40c0099b0000000008ac6565ab53ac6aac645308009d680202d600e492b31ee0ab77c7c5883ebad5065f1ce87e4dfe6453e54023a0010000000151ffffffffb9d818b14245899e1d440152827c95268a676f14c3389fc47f5a11a7b38b1bde03000000026300ffffffff03cda22102000000000751ac535263005100a4d20400000000045200536ac8bef405000000000700ab51ab6563ac00000000", "6553516a526aab", 1, -2111409753, "5e1849e7368cf4f042718586d9bd831d61479b775bab97aba9f450042bd9876a"], - ["ed3bb93802ddbd08cb030ef60a2247f715a0226de390c9c1a81d52e83f8674879065b5f87d0300000003ab6552ffffffff04d2c5e60a21fb6da8de20bf206db43b720e2a24ce26779bca25584c3f765d1e0200000008ab656a6aacab00ab6e946ded025a811d04000000000951abac6352ac00ab5143cfa3030000000005635200636a00000000", "5352ac650065535300", 1, -668727133, "e9995065e1fddef72a796eef5274de62012249660dc9d233a4f24e02a2979c87"], - ["59f4629d030fa5d115c33e8d55a79ea3cba8c209821f979ed0e285299a9c72a73c5bba00150200000002636affffffffd8aca2176df3f7a96d0dc4ee3d24e6cecde1582323eec2ebef9a11f8162f17ac0000000007ab6565acab6553ffffffffeebc10af4f99c7a21cbc1d1074bd9f0ee032482a71800f44f26ee67491208e0403000000065352ac656351ffffffff0434e955040000000004ab515152caf2b305000000000365ac007b1473030000000003ab530033da970500000000060051536a5253bb08ab51", "", 2, 396340944, "0e9c47973ef2c292b2252c623f465bbb92046fe0b893eebf4e1c9e02cb01c397"], - ["286e3eb7043902bae5173ac3b39b44c5950bc363f474386a50b98c7bdab26f98dc83449c4a020000000752ac6a00510051ffffffff4339cd6a07f5a5a2cb5815e5845da70300f5c7833788363bf7fe67595d3225520100000000fffffffff9c2dd8b06ad910365ffdee1a966f124378a2b8021065c8764f6138bb1e951380200000005ab5153ac6affffffff0370202aba7a68df85436ea7c945139513384ef391fa33d16020420b8ad40e9a000000000900ab5165526353abacffffffff020c1907000000000004abac526a1b490b040000000000df1528f7", "5353ab", 3, -1407529517, "32154c09174a9906183abf26538c39e78468344ca0848bbd0785e24a3565d932"], - ["2e245cf80179e2e95cd1b34995c2aff49fe4519cd7cee93ad7587f7f7e8105fc2dff206cd30200000009006a63516a6553ab52350435a201d5ed2d02000000000352ab6558552c89", "00ab53", 0, -233917810, "4605ae5fd3d50f9c45d37db7118a81a9ef6eb475d2333f59df5d3e216f150d49"], - ["33a98004029d262f951881b20a8d746c8c707ea802cd2c8b02a33b7e907c58699f97e42be80100000007ac53536552abacdee04cc01d205fd8a3687fdf265b064d42ab38046d76c736aad8865ca210824b7c622ecf02000000070065006a536a6affffffff01431c5d010000000000270d48ee", "", 1, 921554116, "ff9d7394002f3f196ea25472ea6c46f753bd879a7244795157bb7235c9322902"], - ["aac18f2b02b144ed481557c53f2146ae523f24fcde40f3445ab0193b6b276c315dc2894d2300000000075165650000636a233526947dbffc76aec7db1e1baa6868ad4799c76e14794dcbaaec9e713a83967f6a65170200000005abac6551ab27d518be01b652a30000000000015300000000", "52ac5353", 1, 1559377136, "59fc2959bb7bb24576cc8a237961ed95bbb900679d94da6567734c4390cb6ef5"], - ["5ab79881033555b65fe58c928883f70ce7057426fbdd5c67d7260da0fe8b1b9e6a2674cb850300000009ac516aac6aac006a6affffffffa5be9223b43c2b1a4d120b5c5b6ec0484f637952a3252181d0f8e813e76e11580200000000e4b5ceb8118cb77215bbeedc9a076a4d087bb9cd1473ea32368b71daeeeacc451ec209010000000005acac5153aced7dc34e02bc5d11030000000005ac5363006a54185803000000000552ab00636a00000000", "5100", 1, 1927062711, "e9f53d531c12cce1c50abed4ac521a372b4449b6a12f9327c80020df6bff66c0"], - ["6c2c8fac0124b0b7d4b610c3c5b91dee32b7c927ac71abdf2d008990ca1ac40de0dfd530660300000006ababac5253656bd7eada01d847ec000000000004ac52006af4232ec8", "6a6a6a0051", 0, -340809707, "fb51eb9d7e47d32ff2086205214f90c7c139e08c257a64829ae4d2b301071c6a"], - ["6e3880af031735a0059c0bb5180574a7dcc88e522c8b56746d130f8d45a52184045f96793e0100000008acabac6a526a6553fffffffffe05f14cdef7d12a9169ec0fd37524b5fcd3295f73f48ca35a36e671da4a2f560000000008006a526a6351ab63ffffffffdfbd869ac9e472640a84caf28bdd82e8c6797f42d03b99817a705a24fde2736600000000010090a090a503db956b04000000000952ac53ab6a536a63ab358390010000000009656a5200525153ac65353ee204000000000763530052526aaba6ad83fb", "535151ab6300", 2, 222014018, "57a34ddeb1bf36d28c7294dda0432e9228a9c9e5cc5c692db98b6ed2e218d825"], - ["8df1cd19027db4240718dcaf70cdee33b26ea3dece49ae6917331a028c85c5a1fb7ee3e475020000000865ab6a00510063636157988bc84d8d55a8ba93cdea001b9bf9d0fa65b5db42be6084b5b1e1556f3602f65d4d0100000005ac00ab0052206c852902b2fb54030000000008ac5252536aacac5378c4a5050000000007acabac535163532784439e", "acab6a", 0, 1105620132, "edb7c74223d1f10f9b3b9c1db8064bc487321ff7bb346f287c6bc2fad83682de"], - ["0e803682024f79337b25c98f276d412bc27e56a300aa422c42994004790cee213008ff1b8303000000080051ac65ac655165f421a331892b19a44c9f88413d057fea03c3c4a6c7de4911fe6fe79cf2e9b3b10184b1910200000005525163630096cb1c670398277204000000000253acf7d5d502000000000963536a6a636a5363ab381092020000000002ac6a911ccf32", "6565", 1, -1492094009, "f0672638a0e568a919e9d8a9cbd7c0189a3e132940beeb52f111a89dcc2daa2c"], - ["7d71669d03022f9dd90edac323cde9e56354c6804c6b8e687e9ae699f46805aafb8bcaa636000000000253abffffffff698a5fdd3d7f2b8b000c68333e4dd58fa8045b3e2f689b889beeb3156cecdb490300000009525353abab0051acabc53f0aa821cdd69b473ec6e6cf45cf9b38996e1c8f52c27878a01ec8bb02e8cb31ad24e500000000055353ab0052ffffffff0447a23401000000000565ab53ab5133aaa0030000000006515163656563057d110300000000056a6aacac52cf13b5000000000003526a5100000000", "6a6a51", 1, -1349253507, "722efdd69a7d51d3d77bed0ac5544502da67e475ea5857cd5af6bdf640a69945"], - ["9ff618e60136f8e6bb7eabaaac7d6e2535f5fba95854be6d2726f986eaa9537cb283c701ff02000000026a65ffffffff012d1c0905000000000865ab00ac6a516a652f9ad240", "51515253635351ac", 0, 1571304387, "659cd3203095d4a8672646add7d77831a1926fc5b66128801979939383695a79"], - ["9fbd43ac025e1462ecd10b1a9182a8e0c542f6d1089322a41822ab94361e214ed7e1dfdd8a020000000263519d0437581538e8e0b6aea765beff5b4f3a4a202fca6e5d19b34c141078c6688f71ba5b8e0100000003ac6552ffffffff02077774050000000009655153655263acab6a0ae4e10100000000035152524c97136b", "635152ab", 0, 1969622955, "d82d4ccd9b67810f26a378ad9592eb7a30935cbbd27e859b00981aefd0a72e08"], - ["0117c92004314b84ed228fc11e2999e657f953b6de3b233331b5f0d0cf40d5cc149b93c7b30300000005515263516a083e8af1bd540e54bf5b309d36ba80ed361d77bbf4a1805c7aa73667ad9df4f97e2da410020000000600ab6351ab524d04f2179455e794b2fcb3d214670001c885f0802e4b5e015ed13a917514a7618f5f332203000000086a536aab51000063ecf029e65a4a009a5d67796c9f1eb358b0d4bd2620c8ad7330fb98f5a802ab92d0038b1002000000036a6551a184a88804b04490000000000009ab6a5152535165526a33d1ab020000000001518e92320000000000002913df04000000000952abac6353525353ac8b19bfdf", "000051ab0000", 0, 489433059, "8eebac87e60da524bbccaf285a44043e2c9232868dda6c6271a53c153e7f3a55"], - ["e7f5482903f98f0299e0984b361efb2fddcd9979869102281e705d3001a9d283fe9f3f3a1e02000000025365ffffffffcc5c7fe82feebad32a22715fc30bc584efc9cd9cadd57e5bc4b6a265547e676e0000000001ab579d21235bc2281e08bf5e7f8f64d3afb552839b9aa5c77cf762ba2366fffd7ebb74e49400000000055263ab63633df82cf40100982e05000000000453ac535300000000", "acacab", 2, -1362931214, "046de666545330e50d53083eb78c9336416902f9b96c77cc8d8e543da6dfc7e4"], - ["09adb2e90175ca0e816326ae2dce7750c1b27941b16f6278023dbc294632ab97977852a09d030000000465ab006affffffff027739cf0100000000075151ab63ac65ab8a5bb601000000000653ac5151520011313cdc", "ac", 0, -76831756, "478ee06501b4965b40bdba6cbaad9b779b38555a970912bb791b86b7191c54bc"], - ["f973867602e30f857855cd0364b5bbb894c049f44abbfd661d7ae5dbfeaafca89fac8959c20100000005ab52536a51ffffffffbeceb68a4715f99ba50e131884d8d20f4a179313691150adf0ebf29d05f8770303000000066352ab00ac63ffffffff021fddb90000000000036a656322a177000000000008526500ac5100acac84839083", "52acab53ac", 0, 1407879325, "db0329439490efc64b7104d6d009b03fbc6fac597cf54fd786fbbb5fd73b92b4"], - ["fd22ebaa03bd588ad16795bea7d4aa7f7d48df163d75ea3afebe7017ce2f350f6a0c1cb0bb00000000086aabac5153526363ffffffff488e0bb22e26a565d77ba07178d17d8f85702630ee665ec35d152fa05af3bda10200000004515163abffffffffeb21035849e85ad84b2805e1069a91bb36c425dc9c212d9bae50a95b6bfde1200300000001ab5df262fd02b69848040000000008ab6363636a6363ace23bf2010000000007655263635253534348c1da", "006353526563516a00", 0, -1491036196, "92364ba3c7a85d4e88885b8cb9b520dd81fc29e9d2b750d0790690e9c1246673"], - ["130b462d01dd49fac019dc4442d0fb54eaa6b1c2d1ad0197590b7df26969a67abd7f3fbb4f0100000008ac65abac53ab6563ffffffff0345f825000000000004ac53acac9d5816020000000002ababeff8e90500000000086aab006552ac6a53a892dc55", "ab0065ac530052", 0, 944483412, "1f4209fd4ce7f13d175fdd522474ae9b34776fe11a5f17a27d0796c77a2a7a9d"], - ["f8e50c2604609be2a95f6d0f31553081f4e1a49a0a30777fe51eb1c596c1a9a92c053cf28c0300000009656a51ac5252630052fffffffff792ed0132ae2bd2f11d4a2aab9d0c4fbdf9a66d9ae2dc4108afccdc14d2b1700100000007ab6a6563ac636a7bfb2fa116122b539dd6a2ab089f88f3bc5923e5050c8262c112ff9ce0a3cd51c6e3e84f02000000066551ac5352650d5e687ddf4cc9a497087cabecf74d236aa4fc3081c3f67b6d323cba795e10e7a171b725000000000852635351ab635100ffffffff02df5409020000000008ac6a53acab5151004156990200000000045163655200000000", "ac53abac65005300", 0, -173065000, "b596f206d7eba22b7e2d1b7a4f4cf69c7c541b6c84dcc943f84e19a99a923310"], - ["18020dd1017f149eec65b2ec23300d8df0a7dd64fc8558b36907723c03cd1ba672bbb0f51d0300000005ab65ab6a63ffffffff037cd7ae000000000009ab516a65005352ac65f1e4360400000000056353530053f118f0040000000009536363ab006500abac00000000", "63ab51acab52ac", 0, -550412404, "e19b796c14a0373674968e342f2741d8b51092a5f8409e9bff7dcd52e56fcbcb"], - ["b04154610363fdade55ceb6942d5e5a723323863b48a0cb04fdcf56210717955763f56b08d0300000009ac526a525151635151ffffffff93a176e76151a9eabdd7af00ef2af72f9e7af5ecb0aa4d45d00618f394cdd03c030000000074d818b332ebe05dc24c44d776cf9d275c61f471cc01efce12fd5a16464157f1842c65cb00000000066a0000ac6352d3c4134f01d8a1c0030000000005520000005200000000", "5200656a656351", 2, -9757957, "6e3e5ba77f760b6b5b5557b13043f1262418f3dd2ce7f0298b012811fc8ad5bc"], - ["9794b3ce033df7b1e32db62d2f0906b589eacdacf5743963dc2255b6b9a6cba211fadd0d41020000000600ab00650065ffffffffaae00687a6a4131152bbcaafedfaed461c86754b0bde39e2bef720e6d1860a0302000000070065516aac6552ffffffff50e4ef784d6230df7486e972e8918d919f005025bc2d9aacba130f58bed7056703000000075265ab52656a52ffffffff02c6f1a9000000000006005251006363cf450c040000000008abab63510053abac00000000", "ac0063ababab515353", 1, 2063905082, "fad092fc98f17c2c20e10ba9a8eb44cc2bcc964b006f4da45cb9ceb249c69698"], - ["94533db7015e70e8df715066efa69dbb9c3a42ff733367c18c22ff070392f988f3b93920820000000006535363636300ce4dac3e03169af80300000000080065ac6a53ac65ac39c050020000000006abacab6aacac708a02050000000005ac5251520000000000", "6553", 0, -360458507, "5418cf059b5f15774836edd93571e0eed3855ba67b2b08c99dccab69dc87d3e9"], - ["c8597ada04f59836f06c224a2640b79f3a8a7b41ef3efa2602592ddda38e7597da6c639fee0300000009005251635351acabacffffffff4c518f347ee694884b9d4072c9e916b1a1f0a7fc74a1c90c63fdf8e5a185b6ae02000000007113af55afb41af7518ea6146786c7c726641c68c8829a52925e8d4afd07d8945f68e7230300000008ab00ab65ab650063ffffffffc28e46d7598312c420e11dfaae12add68b4d85adb182ae5b28f8340185394b63000000000165ffffffff04dbabb7010000000000ee2f6000000000000852ab6500ab6a51acb62a27000000000009ac53515300ac006a6345fb7505000000000752516a0051636a00000000", "", 3, 15199787, "0d66003aff5bf78cf492ecbc8fd40c92891acd58d0a271be9062e035897f317e"], - ["1a28c4f702c8efaad96d879b38ec65c5283b5c084b819ad7db1c086e85e32446c7818dc7a90300000008656351536a525165fa78cef86c982f1aac9c5eb8b707aee8366f74574c8f42ef240599c955ef4401cf578be30200000002ab518893292204c430eb0100000000016503138a0300000000040053abac60e0eb010000000005525200ab63567c2d030000000004abab52006cf81e85", "ab51525152", 1, 2118315905, "4e4c9a781f626b59b1d3ad8f2c488eb6dee8bb19b9bc138bf0dc33e7799210d4"], - ["c6c7a87003f772bcae9f3a0ac5e499000b68703e1804b9ddc3e73099663564d53ddc4e1c6e01000000076a536a6aac63636e3102122f4c30056ef8711a6bf11f641ddfa6984c25ac38c3b3e286e74e839198a80a34010000000165867195cd425821dfa2f279cb1390029834c06f018b1e6af73823c867bf3a0524d1d6923b0300000005acab53ab65ffffffff02fa4c49010000000008ab656a0052650053e001100400000000008836d972", "ac526351acab", 1, 978122815, "a869c18a0edf563d6e5eddd5d5ae8686f41d07f394f95c9feb8b7e52761531ca"], - ["0ea580ac04c9495ab6af3b8d59108bb4194fcb9af90b3511c83f7bb046d87aedbf8423218e02000000085152acac006363ab9063d7dc25704e0caa5edde1c6f2dd137ded379ff597e055b2977b9c559b07a7134fcef2000000000200aca89e50181f86e9854ae3b453f239e2847cf67300fff802707c8e3867ae421df69274449402000000056365abababffffffff47a4760c881a4d7e51c69b69977707bd2fb3bcdc300f0efc61f5840e1ac72cee0000000000ffffffff0460179a020000000004ab53ab52a5250c0500000000096565acac6365ab52ab6c281e02000000000952635100ac006563654e55070400000000046552526500000000", "ab526563acac53ab", 2, 1426964167, "b1c50d58b753e8f6c7513752158e9802cf0a729ebe432b99acc0fe5d9b4e9980"], - ["c33028b301d5093e1e8397270d75a0b009b2a6509a01861061ab022ca122a6ba935b8513320200000000ffffffff013bcf5a0500000000015200000000", "", 0, -513413204, "6b1459536f51482f5dbf42d7e561896557461e1e3b6bf67871e2b51faae2832c"], - ["43b2727901a7dd06dd2abf690a1ccedc0b0739cb551200796669d9a25f24f71d8d101379f50300000000ffffffff0418e031040000000000863d770000000000085352ac526563ac5174929e040000000004ac65ac00ec31ac0100000000066a51ababab5300000000", "65", 0, -492874289, "154ff7a9f0875edcfb9f8657a0b98dd9600fabee3c43eb88af37cf99286d516c"], - ["4763ed4401c3e6ab204bed280528e84d5288f9cac5fb8a2e7bd699c7b98d4df4ac0c40e55303000000066a6aacab5165ffffffff015b57f80400000000046a63535100000000", "ac51abab53", 0, -592611747, "849033a2321b5755e56ef4527ae6f51e30e3bca50149d5707368479723d744f8"], - ["d24f647b02f71708a880e6819a1dc929c1a50b16447e158f8ff62f9ccd644e0ca3c592593702000000050053536a00ffffffff67868cd5414b6ca792030b18d649de5450a456407242b296d936bcf3db79e07b02000000005af6319c016022f50100000000036a516300000000", "6aab526353516a6a", 0, 1350782301, "8556fe52d1d0782361dc28baaf8774b13f3ce5ed486ae0f124b665111e08e3e3"], - ["fe6ddf3a02657e42a7496ef170b4a8caf245b925b91c7840fd28e4a22c03cb459cb498b8d603000000065263656a650071ce6bf8d905106f9f1faf6488164f3decac65bf3c5afe1dcee20e6bc3cb6d052561985a030000000163295b117601343dbb0000000000026563dba521df", "", 1, -1696179931, "d9684685c99ce48f398fb467a91a1a59629a850c429046fb3071f1fa9a5fe816"], - ["c61523ef0129bb3952533cbf22ed797fa2088f307837dd0be1849f20decf709cf98c6f032f03000000026563c0f1d378044338310400000000066363516a5165a14fcb0400000000095163536a6a00ab53657271d60200000000001d953f0500000000010000000000", "53516353005153", 0, 1141615707, "7e975a72db5adaa3c48d525d9c28ac11cf116d0f8b16ce08f735ad75a80aec66"], - ["ba3dac6c0182562b0a26d475fe1e36315f0913b6869bdad0ecf21f1339a5fcbccd32056c840200000000ffffffff04300351050000000000220ed405000000000851abac636565ac53dbbd19020000000007636363ac6a52acbb005a0500000000016abd0c78a8", "63006a635151005352", 0, 1359658828, "47bc8ab070273e1f4a0789c37b45569a6e16f3f3092d1ce94dddc3c34a28f9f4"], - ["ac27e7f5025fc877d1d99f7fc18dd4cadbafa50e34e1676748cc89c202f93abf36ed46362101000000036300abffffffff958cd5381962b765e14d87fc9524d751e4752dd66471f973ed38b9d562e525620100000003006500ffffffff02b67120050000000004ac51516adc330c0300000000015200000000", "656352", 1, 15049991, "f3374253d64ac264055bdbcc32e27426416bd595b7c7915936c70f839e504010"], - ["edb30140029182b80c8c3255b888f7c7f061c4174d1db45879dca98c9aab8c8fed647a6ffc03000000086a53510052ab6300ffffffff82f65f261db62d517362c886c429c8fbbea250bcaad93356be6f86ba573e9d930100000000ffffffff04daaf150400000000016a86d1300100000000096a6353535252ac5165d4ddaf000000000002abab5f1c6201000000000000000000", "ab6a6a00ac", 0, -2058017816, "8d7794703dad18e2e40d83f3e65269834bb293e2d2b8525932d6921884b8f368"], - ["7e50207303146d1f7ad62843ae8017737a698498d4b9118c7a89bb02e8370307fa4fada41d000000000753006300005152b7afefc85674b1104ba33ef2bf37c6ed26316badbc0b4aa6cb8b00722da4f82ff3555a6c020000000900ac656363ac51ac52ffffffff93fab89973bd322c5d7ad7e2b929315453e5f7ada3072a36d8e33ca8bebee6e0020000000300acab930da52b04384b04000000000004650052ac435e380200000000076a6a515263ab6aa9494705000000000600ab6a525252af8ba90100000000096565acab526353536a279b17ad", "acac005263536aac63", 1, -34754133, "4e6357da0057fb7ff79da2cc0f20c5df27ff8b2f8af4c1709e6530459f7972b0"], - ["c05764f40244fb4ebe4c54f2c5298c7c798aa90e62c29709acca0b4c2c6ec08430b26167440100000008acab6a6565005253ffffffffc02c2418f398318e7f34a3cf669d034eef2111ea95b9f0978b01493293293a870100000000e563e2e00238ee8d040000000002acab03fb060200000000076500ac656a516aa37f5534", "52ab6a0065", 1, -2033176648, "83deef4a698b62a79d4877dd9afebc3011a5275dbe06e89567e9ef84e8a4ee19"], - ["5a59e0b9040654a3596d6dab8146462363cd6549898c26e2476b1f6ae42915f73fd9aedfda00000000036363abffffffff9ac9e9ca90be0187be2214251ff08ba118e6bf5e2fd1ba55229d24e50a510d53010000000165ffffffff41d42d799ac4104644969937522873c0834cc2fcdab7cdbecd84d213c0e96fd60000000000ffffffffd838db2c1a4f30e2eaa7876ef778470f8729fcf258ad228b388df2488709f8410300000000fdf2ace002ceb6d903000000000265654c1310040000000003ac00657e91c0ec", "536a63ac", 0, 82144555, "98ccde2dc14d14f5d8b1eeea5364bd18fc84560fec2fcea8de4d88b49c00695e"], - ["156ebc8202065d0b114984ee98c097600c75c859bfee13af75dc93f57c313a877efb09f230010000000463536a51ffffffff81114e8a697be3ead948b43b5005770dd87ffb1d5ccd4089fa6c8b33d3029e9c03000000066a5251656351ffffffff01a87f140000000000050000ac51ac00000000", "00", 0, -362221092, "a903c84d8c5e71134d1ab6dc1e21ac307c4c1a32c90c90f556f257b8a0ec1bf5"], - ["15e37793023c7cbf46e073428908fce0331e49550f2a42b92468827852693f0532a01c29f70200000007005353636351acffffffff38426d9cec036f00eb56ec1dcd193647e56a7577278417b8a86a78ac53199bc403000000056353006a53ffffffff04a25ce103000000000900ab5365656a526a63c8eff7030000000004526353537ab6db0200000000016a11a3fa02000000000651acacab526500000000", "53ac6aab6a6551", 0, 1117532791, "83c68b3c5a89260ce16ce8b4dbf02e1f573c532d9a72f5ea57ab419fa2630214"], - ["f7a09f10027250fc1b70398fb5c6bffd2be9718d3da727e841a73596fdd63810c9e4520a6a010000000963ac516a636a65acac1d2e2c57ab28d311edc4f858c1663972eebc3bbc93ed774801227fda65020a7ec1965f780200000005ac5252516a8299fddc01dcbf7200000000000463ac6551960fda03", "65acab51", 1, 2017321737, "9c5fa02abfd34d0f9dec32bf3edb1089fca70016debdb41f4f54affcb13a2a2a"], - ["6d97a9a5029220e04f4ccc342d8394c751282c328bf1c132167fc05551d4ca4da4795f6d4e02000000076a0052ab525165ffffffff9516a205e555fa2a16b73e6db6c223a9e759a7e09c9a149a8f376c0a7233fa1b0100000007acab51ab63ac6affffffff04868aed04000000000652ac65ac536a396edf01000000000044386c0000000000076aab5363655200894d48010000000001ab8ebefc23", "6351526aac51", 1, 1943666485, "f0bd4ca8e97203b9b4e86bc24bdc8a1a726db5e99b91000a14519dc83fc55c29"], - ["8e3fddfb028d9e566dfdda251cd874cd3ce72e9dde837f95343e90bd2a93fe21c5daeb5eed01000000045151525140517dc818181f1e7564b8b1013fd68a2f9a56bd89469686367a0e72c06be435cf99db750000000003635251ffffffff01c051780300000000096552ababac6a65acab099766eb", "5163ab6a52ababab51", 1, 1296295812, "5509eba029cc11d7dd2808b8c9eb47a19022b8d8b7778893459bbc19ab7ea820"], - ["a603f37b02a35e5f25aae73d0adc0b4b479e68a734cf722723fd4e0267a26644c36faefdab0200000000ffffffff43374ad26838bf733f8302585b0f9c22e5b8179888030de9bdda180160d770650200000001004c7309ce01379099040000000005526552536500000000", "abababab005153", 0, 1409936559, "4ca73da4fcd5f1b10da07998706ffe16408aa5dff7cec40b52081a6514e3827e"], - ["9eeedaa8034471a3a0e3165620d1743237986f060c4434f095c226114dcb4b4ec78274729f03000000086a5365510052ac6afb505af3736e347e3f299a58b1b968fce0d78f7457f4eab69240cbc40872fd61b5bf8b120200000002ac52df8247cf979b95a4c97ecb8edf26b3833f967020cd2fb25146a70e60f82c9ee4b14e88b103000000008459e2fa0125cbcd05000000000000000000", "52ab5352006353516a", 0, -1832576682, "fb018ae54206fdd20c83ae5873ec82b8e320a27ed0d0662db09cda8a071f9852"], - ["05921d7c048cf26f76c1219d0237c226454c2a713c18bf152acc83c8b0647a94b13477c07f0300000003ac526afffffffff2f494453afa0cabffd1ba0a626c56f90681087a5c1bd81d6adeb89184b27b7402000000036a6352ffffffff0ad10e2d3ce355481d1b215030820da411d3f571c3f15e8daf22fe15342fed04000000000095f29f7b93ff814a9836f54dc6852ec414e9c4e16a506636715f569151559100ccfec1d100000000055263656a53ffffffff04f4ffef010000000008ac6a6aabacabab6a0e6689040000000006ab536a5352abe364d005000000000965536363655251ab53807e00010000000004526aab63f18003e3", "6363ac51", 3, -375891099, "001b0b176f0451dfe2d9787b42097ceb62c70d324e925ead4c58b09eebdf7f67"], - ["b9b44d9f04b9f15e787d7704e6797d51bc46382190c36d8845ec68dfd63ee64cf7a467b21e00000000096aac00530052ab636aba1bcb110a80c5cbe073f12c739e3b20836aa217a4507648d133a8eedd3f02cb55c132b203000000076a000063526352b1c288e3a9ff1f2da603f230b32ef7c0d402bdcf652545e2322ac01d725d75f5024048ad0100000000ffffffffffd882d963be559569c94febc0ef241801d09dc69527c9490210f098ed8203c700000000056a006300ab9109298d01719d9a0300000000066a52ab006365d7894c5b", "ac6351650063636a", 3, -622355349, "ac87b1b93a6baab6b2c6624f10e8ebf6849b0378ef9660a3329073e8f5553c8d"], - ["ff60473b02574f46d3e49814c484081d1adb9b15367ba8487291fc6714fd6e3383d5b335f001000000026a6ae0b82da3dc77e5030db23d77b58c3c20fa0b70aa7d341a0f95f3f72912165d751afd57230300000008ac536563516a6363ffffffff04f86c0200000000000553acab636ab13111000000000003510065f0d3f305000000000951ab516a65516aabab730a3a010000000002515200000000", "ac6a", 1, 1895032314, "0767e09bba8cd66d55915677a1c781acd5054f530d5cf6de2d34320d6c467d80"], - ["f218026204f4f4fc3d3bd0eada07c57b88570d544a0436ae9f8b753792c0c239810bb30fbc0200000002536affffffff8a468928d6ec4cc10aa0f73047697970e99fa64ae8a3b4dca7551deb0b639149010000000851ab520052650051ffffffffa98dc5df357289c9f6873d0f5afcb5b030d629e8f23aa082cf06ec9a95f3b0cf0000000000ffffffffea2c2850c5107705fd380d6f29b03f533482fd036db88739122aac9eff04e0aa010000000365536a03bd37db034ac4c4020000000007515152655200ac33b27705000000000151efb71e0000000000007b65425b", "515151", 3, -1772252043, "de35c84a58f2458c33f564b9e58bc57c3e028d629f961ad1b3c10ee020166e5a"], - ["48e7d42103b260b27577b70530d1ac2fed2551e9dd607cbcf66dca34bb8c03862cf8f5fd5401000000075151526aacab00ffffffff1e3d3b841552f7c6a83ee379d9d66636836673ce0b0eda95af8f2d2523c91813030000000665acac006365ffffffff388b3c386cd8c9ef67c83f3eaddc79f1ff910342602c9152ffe8003bce51b28b0100000008636363006a636a52ffffffff04b8f67703000000000852005353ac6552520cef720200000000085151ab6352ab00ab5096d6030000000005516a005100662582020000000001ac6c137280", "6a65", 1, 1513618429, "e2fa3e1976aed82c0987ab30d4542da2cb1cffc2f73be13480132da8c8558d5c"], - ["91ebc4cf01bc1e068d958d72ee6e954b196f1d85b3faf75a521b88a78021c543a06e056279000000000265ab7c12df0503832121030000000000cc41a6010000000005ab5263516540a951050000000006ab63ab65acac00000000", "526a0065636a6a6aac", 0, -614046478, "7de4ba875b2e584a7b658818c112e51ee5e86226f5a80e5f6b15528c86400573"], - ["3cd4474201be7a6c25403bf00ca62e2aa8f8f4f700154e1bb4d18c66f7bb7f9b975649f0dc0100000006535151535153ffffffff01febbeb000000000006005151006aac00000000", "", 0, -1674687131, "6b77ca70cc452cc89acb83b69857cda98efbfc221688fe816ef4cb4faf152f86"], - ["92fc95f00307a6b3e2572e228011b9c9ed41e58ddbaefe3b139343dbfb3b34182e9fcdc3f50200000002acab847bf1935fde8bcfe41c7dd99683289292770e7f163ad09deff0e0665ed473cd2b56b0f40300000006516551ab6351294dab312dd87b9327ce2e95eb44b712cfae0e50fda15b07816c8282e8365b643390eaab01000000026aacffffffff016e0b6b040000000001ac00000000", "650065acac005300", 2, -1885164012, "bd7d26bb3a98fc8c90c972500618bf894cb1b4fe37bf5481ff60eef439d3b970"], - ["4db591ab018adcef5f4f3f2060e41f7829ce3a07ea41d681e8cb70a0e37685561e4767ac3b0000000005000052acabd280e63601ae6ef20000000000036a636326c908f7", "ac6a51526300630052", 0, 862877446, "355ccaf30697c9c5b966e619a554d3323d7494c3ea280a9b0dfb73f953f5c1cb"], - ["503fd5ef029e1beb7b242d10032ac2768f9a1aca0b0faffe51cec24770664ec707ef7ede4f01000000045253ac53375e350cc77741b8e96eb1ce2d3ca91858c052e5f5830a0193200ae2a45b413dda31541f0000000003516553ffffffff0175a5ba0500000000015200000000", "6aab65510053ab65", 1, 1603081205, "353ca9619ccb0210ae18b24d0e57efa7abf8e58fa6f7102738e51e8e72c9f0c4"], - ["c80abebd042cfec3f5c1958ee6970d2b4586e0abec8305e1d99eb9ee69ecc6c2cbd76374380000000007ac53006300ac510acee933b44817db79320df8094af039fd82111c7726da3b33269d3820123694d849ee5001000000056a65ab526562699bea8530dc916f5d61f0babea709dac578774e8a4dcd9c640ec3aceb6cb2443f24f302000000020063ea780e9e57d1e4245c1e5df19b4582f1bf704049c5654f426d783069bcc039f2d8fa659f030000000851ab53635200006a8d00de0b03654e8500000000000463ab635178ebbb0400000000055100636aab239f1d030000000006ab006300536500000000", "6565ac515100", 3, 1460851377, "b35bb1b72d02fab866ed6bbbea9726ab32d968d33a776686df3ac16aa445871e"], - ["0337b2d5043eb6949a76d6632b8bb393efc7fe26130d7409ef248576708e2d7f9d0ced9d3102000000075352636a5163007034384dfa200f52160690fea6ce6c82a475c0ef1caf5c9e5a39f8f9ddc1c8297a5aa0eb02000000026a51ffffffff38e536298799631550f793357795d432fb2d4231f4effa183c4e2f61a816bcf0030000000463ac5300706f1cd3454344e521fde05b59b96e875c8295294da5d81d6cc7efcfe8128f150aa54d6503000000008f4a98c704c1561600000000000072cfa6000000000000e43def01000000000100cf31cc0500000000066365526a6500cbaa8e2e", "", 3, 2029506437, "7615b4a7b3be865633a31e346bc3db0bcc410502c8358a65b8127089d81b01f8"], - ["59f6cffd034733f4616a20fe19ea6aaf6abddb30b408a3a6bd86cd343ab6fe90dc58300cc90200000000ffffffffc835430a04c3882066abe7deeb0fa1fdaef035d3233460c67d9eabdb05e95e5a02000000080065ac535353ab00ffffffff4b9a043e89ad1b4a129c8777b0e8d87a014a0ab6a3d03e131c27337bbdcb43b402000000066a5100abac6ad9e9bf62014bb118010000000001526cbe484f", "ab526352ab65", 0, 2103515652, "4f2ccf981598639bec57f885b4c3d8ea8db445ea6e61cfd45789c69374862e5e"], - ["cbc79b10020b15d605680a24ee11d8098ad94ae5203cb6b0589e432832e20c27b72a926af20300000006ab65516a53acbb854f3146e55c508ece25fa3d99dbfde641a58ed88c051a8a51f3dacdffb1afb827814b02000000026352c43e6ef30302410a020000000000ff4bd90100000000065100ab63000008aa8e0400000000095265526565ac5365abc52c8a77", "53526aac0051", 0, 202662340, "984efe0d8d12e43827b9e4b27e97b3777ece930fd1f589d616c6f9b71dab710e"], - ["7c07419202fa756d29288c57b5c2b83f3c847a807f4a9a651a3f6cd6c46034ae0aa3a7446b0200000004ab6a6365ffffffff9da83cf4219bb96c76f2d77d5df31c1411a421171d9b59ec02e5c1218f29935403000000008c13879002f8b1ac0400000000086a63536a636553653c584f02000000000000000000", "abac53ab656363", 1, -1038419525, "4a74f365a161bc6c9bddd249cbd70f5dadbe3de70ef4bd745dcb6ee1cd299fbd"], - ["351cbb57021346e076d2a2889d491e9bfa28c54388c91b46ee8695874ad9aa576f1241874d0200000008ab6563525300516affffffffe13e61b8880b8cd52be4a59e00f9723a4722ea58013ec579f5b3693b9e115b1100000000096363abac5252635351ffffffff027fee02040000000008ab6a5200ab006a65b85f130200000000086a52630053ab52ab00000000", "ab6aab65", 1, 586415826, "08bbb746a596991ab7f53a76e19acad087f19cf3e1db54054aab403c43682d09"], - ["a8252ea903f1e8ff953adb16c1d1455a5036222c6ea98207fc21818f0ece2e1fac310f9a0100000000095163ac635363ac0000be6619e9fffcde50a0413078821283ce3340b3993ad00b59950bae7a9f931a9b0a3a035f010000000463005300b8b0583fbd6049a1715e7adacf770162811989f2be20af33f5f60f26eba653dc26b024a00000000006525351636552ffffffff046d2acc030000000002636a9a2d430500000000080065005165ab53abecf63204000000000052b9ed050000000008acacac53ab65656500000000", "65ab53635253636a51", 2, 1442639059, "8ca11838775822f9a5beee57bdb352f4ee548f122de4a5ca61c21b01a1d50325"], - ["2f1a425c0471a5239068c4f38f9df135b1d24bf52d730d4461144b97ea637504495aec360801000000055300515365c71801dd1f49f376dd134a9f523e0b4ae611a4bb122d8b26de66d95203f181d09037974300000000025152ffffffff9bdcea7bc72b6e5262e242c94851e3a5bf8f314b3e5de0e389fc9e5b3eadac030000000009525265655151005153ffffffffdbb53ce99b5a2320a4e6e2d13b01e88ed885a0957d222e508e9ec8e4f83496cb0200000007635200abac63ac04c96237020cc5490100000000080000516a51ac6553074a360200000000025152225520ca", "6551ab65ac65516a", 1, -489869549, "9bc5bb772c553831fb40abe466074e59a469154679c7dee042b8ea3001c20393"], - ["ef3acfd4024defb48def411b8f8ba2dc408dc9ee97a4e8bde4d6cb8e10280f29c98a6e8e9103000000035100513d5389e3d67e075469dfd9f204a7d16175653a149bd7851619610d7ca6eece85a516b2df0300000005516aac6552ca678bdf02f477f003000000000057e45b0300000000055252525252af35c20a", "5165ac53ab", 1, -1900839569, "78eb6b24365ac1edc386aa4ffd15772f601059581c8776c34f92f8a7763c9ccf"], - ["ff4468dc0108475fc8d4959a9562879ce4ab4867a419664bf6e065f17ae25043e6016c70480100000000ffffffff02133c6f0400000000000bd0a8020000000004006a520035afa4f6", "51ac65ab", 0, -537664660, "f6da59b9deac63e83728850ac791de61f5dfcaeed384ebcbb20e44afcd8c8910"], - ["4e8594d803b1d0a26911a2bcdd46d7cbc987b7095a763885b1a97ca9cbb747d32c5ab9aa91030000000353ac53a0cc4b215e07f1d648b6eeb5cdbe9fa32b07400aa773b9696f582cebfd9930ade067b2b200000000060065abab6500fc99833216b8e27a02defd9be47fafae4e4a97f52a9d2a210d08148d2a4e5d02730bcd460100000004516351ac37ce3ae1033baa55040000000006006a636a63acc63c990400000000025265eb1919030000000005656a6a516a00000000", "", 1, -75217178, "04c5ee48514cd033b82a28e336c4d051074f477ef2675ce0ce4bafe565ee9049"], - ["a88830a7023f13ed19ab14fd757358eb6af10d6520f9a54923a6d613ac4f2c11e249cda8aa030000000851630065abababacffffffff8f5fe0bc04a33504c4b47e3991d25118947a0261a9fa520356731eeabd561dd3020000000363ababffffffff038404bd010000000008ab5153516aab6a63d33a5601000000000263004642dc020000000009655152acac636352004be6f3af", "5253536565006aab6a", 0, 1174417836, "2e42ead953c9f4f81b72c27557e6dc7d48c37ff2f5c46c1dbe9778fb0d79f5b2"], - ["44e1a2b4010762af23d2027864c784e34ef322b6e24c70308a28c8f2157d90d17b99cd94a401000000085163656565006300ffffffff0198233d020000000002000000000000", "52525153656365", 0, 1119696980, "d9096de94d70c6337da6202e6e588166f31bff5d51bb5adc9468594559d65695"], - ["44ca65b901259245abd50a745037b17eb51d9ce1f41aa7056b4888285f48c6f26cb97b7a25020000000552636363abffffffff047820350400000000040053acab14f3e603000000000652635100ab630ce66c03000000000001bdc704000000000765650065ac51ac3e886381", "51", 0, -263340864, "ed5622ac642d11f90e68c0feea6a2fe36d880ecae6b8c0d89c4ea4b3d162bd90"], - ["cfa147d2017fe84122122b4dda2f0d6318e59e60a7207a2d00737b5d89694d480a2c26324b0000000006006351526552ffffffff0456b5b804000000000800516aab525363ab166633000000000004655363ab254c0e02000000000952ab6a6a00ab525151097c1b020000000009656a52ac6300530065ad0d6e50", "6a535165ac6a536500", 0, -574683184, "f926d4036eac7f019a2b0b65356c4ee2fe50e089dd7a70f1843a9f7bc6997b35"], - ["91c5d5f6022fea6f230cc4ae446ce040d8313071c5ac1749c82982cc1988c94cb1738aa48503000000016a19e204f30cb45dd29e68ff4ae160da037e5fc93538e21a11b92d9dd51cf0b5efacba4dd70000000005656a6aac51ffffffff03db126905000000000953006a53ab6563636a36a273030000000006656a52656552b03ede00000000000352516500000000", "530052526a00", 1, 1437328441, "255c125b60ee85f4718b2972174c83588ee214958c3627f51f13b5fb56c8c317"], - ["03f20dc202c886907b607e278731ebc5d7373c348c8c66cac167560f19b341b782dfb634cb03000000076a51ac6aab63abea3e8de7adb9f599c9caba95aa3fa852e947fc88ed97ee50e0a0ec0d14d164f44c0115c10100000004ab5153516fdd679e0414edbd000000000005ac636a53512021f2040000000007006a0051536a52c73db2050000000005525265ac5369046e000000000003ab006a1ef7bd1e", "52656a", 0, 1360223035, "5a0a05e32ce4cd0558aabd5d79cd5fcbffa95c07137506e875a9afcba4bef5a2"], - ["d9611140036881b61e01627078512bc3378386e1d4761f959d480fdb9d9710bebddba2079d020000000763536aab5153ab819271b41e228f5b04daa1d4e72c8e1955230accd790640b81783cfc165116a9f535a74c000000000163ffffffffa2e7bb9a28e810624c251ff5ba6b0f07a356ac082048cf9f39ec036bba3d431a02000000076a000000ac65acffffffff01678a820000000000085363515153ac635100000000", "535353", 2, -82213851, "52b9e0778206af68998cbc4ebdaad5a9469e04d0a0a6cef251abfdbb74e2f031"], - ["98b3a0bf034233afdcf0df9d46ac65be84ef839e58ee9fa59f32daaa7d684b6bdac30081c60200000007636351acabababffffffffc71cf82ded4d1593e5825618dc1d5752ae30560ecfaa07f192731d68ea768d0f0100000006650052636563f3a2888deb5ddd161430177ce298242c1a86844619bc60ca2590d98243b5385bc52a5b8f00000000095365acacab520052ac50d4722801c3b8a60300000000035165517e563b65", "51", 1, -168940690, "b6b684e2d2ecec8a8dce4ed3fc1147f8b2e45732444222aa8f52d860c2a27a9d"], - ["97be4f7702dc20b087a1fdd533c7de762a3f2867a8f439bddf0dcec9a374dfd0276f9c55cc0300000000cdfb1dbe6582499569127bda6ca4aaff02c132dc73e15dcd91d73da77e92a32a13d1a0ba0200000002ab51ffffffff048cfbe202000000000900516351515363ac535128ce0100000000076aac5365ab6aabc84e8302000000000863536a53ab6a6552f051230500000000066aac535153510848d813", "ac51", 0, 229541474, "e5da9a416ea883be1f8b8b2d178463633f19de3fa82ae25d44ffb531e35bdbc8"], - ["085b6e04040b5bff81e29b646f0ed4a45e05890a8d32780c49d09643e69cdccb5bd81357670100000001abffffffffa5c981fe758307648e783217e3b4349e31a557602225e237f62b636ec26df1a80300000004650052ab4792e1da2930cc90822a8d2a0a91ea343317bce5356b6aa8aae6c3956076aa33a5351a9c0300000004abac5265e27ddbcd472a2f13325cc6be40049d53f3e266ac082172f17f6df817db1936d9ff48c02b000000000152ffffffff021aa7670500000000085353635163ab51ac14d584000000000001aca4d136cc", "6a525300536352536a", 0, -1398925877, "41ecca1e8152ec55074f4c39f8f2a7204dda48e9ec1e7f99d5e7e4044d159d43"], - ["eec32fff03c6a18b12cd7b60b7bdc2dd74a08977e53fdd756000af221228fe736bd9c42d870100000007005353ac515265ffffffff037929791a188e9980e8b9cc154ad1b0d05fb322932501698195ab5b219488fc02000000070063510065ab6a0bfc176aa7e84f771ea3d45a6b9c24887ceea715a0ff10ede63db8f089e97d927075b4f1000000000551abab63abffffffff02eb933c000000000000262c420000000000036563632549c2b6", "6352", 2, 1480445874, "ff8a4016dfdd918f53a45d3a1f62b12c407cd147d68ca5c92b7520e12c353ff5"], - ["98ea7eac0313d9fb03573fb2b8e718180c70ce647bebcf49b97a8403837a2556cb8c9377f30000000004ac53ac65ffffffff8caac77a5e52f0d8213ef6ce998bedbb50cfdf108954771031c0e0cd2a78423900000000010066e99a44937ebb37015be3693761078ad5c73aa73ec623ac7300b45375cc8eef36087eb80000000007515352acac5100ffffffff0114a51b02000000000000000000", "6aacab", 0, 243527074, "bad77967f98941af4dd52a8517d5ad1e32307c0d511e15461e86465e1b8b5273"], - ["3ab70f4604e8fc7f9de395ec3e4c3de0d560212e84a63f8d75333b604237aa52a10da17196000000000763526a6553ac63a25de6fd66563d71471716fe59087be0dde98e969e2b359282cf11f82f14b00f1c0ac70f02000000050052516aacdffed6bb6889a13e46956f4b8af20752f10185838fd4654e3191bf49579c961f5597c36c0100000005ac636363abc3a1785bae5b8a1b4be5d0cbfadc240b4f7acaa7dfed6a66e852835df5eb9ac3c553766801000000036a65630733b7530218569602000000000952006a6a6a51acab52777f06030000000007ac0063530052abc08267c9", "000000536aac0000", 1, 1919096509, "df1c87cf3ba70e754d19618a39fdbd2970def0c1bfc4576260cba5f025b87532"], - ["bdb6b4d704af0b7234ced671c04ba57421aba7ead0a117d925d7ebd6ca078ec6e7b93eea6600000000026565ffffffff3270f5ad8f46495d69b9d71d4ab0238cbf86cc4908927fbb70a71fa3043108e6010000000700516a65655152ffffffff6085a0fdc03ae8567d0562c584e8bfe13a1bd1094c518690ebcb2b7c6ce5f04502000000095251530052536a53aba576a37f2c516aad9911f687fe83d0ae7983686b6269b4dd54701cb5ce9ec91f0e6828390300000000ffffffff04cc76cc020000000002656a01ffb702000000000253ab534610040000000009acab006565516a00521f55f5040000000000389dfee9", "6a525165", 0, 1336204763, "71c294523c48fd7747eebefbf3ca06e25db7b36bff6d95b41c522fecb264a919"], - ["54258edd017d22b274fbf0317555aaf11318affef5a5f0ae45a43d9ca4aa652c6e85f8a040010000000953ac65ab5251656500ffffffff03321d450000000000085265526a51526a529ede8b030000000003635151ce6065020000000001534c56ec1b", "acac", 0, 2094130012, "110d90fea9470dfe6c5048f45c3af5e8cc0cb77dd58fd13d338268e1c24b1ccc"], - ["ce0d322e04f0ffc7774218b251530a7b64ebefca55c90db3d0624c0ff4b3f03f918e8cf6f60300000003656500ffffffff9cce943872da8d8af29022d0b6321af5fefc004a281d07b598b95f6dcc07b1830200000007abab515351acab8d926410e69d76b7e584aad1470a97b14b9c879c8b43f9a9238e52a2c2fefc2001c56af8010000000400ab5253cd2cd1fe192ce3a93b5478af82fa250c27064df82ba416dfb0debf4f0eb307a746b6928901000000096500abacac6a0063514214524502947efc0200000000035251652c40340100000000096a6aab52000052656a5231c54c", "51", 2, -2090320538, "0322ca570446869ec7ec6ad66d9838cff95405002d474c0d3c17708c7ee039c6"], - ["47ac54940313430712ebb32004679d3a512242c2b33d549bf5bbc8420ec1fd0850ed50eb6d0300000009536aac6a65acacab51ffffffffb843e44266ce2462f92e6bff54316661048c8c17ecb092cb493b39bfca9117850000000001519ab348c05e74ebc3f67423724a3371dd99e3bceb4f098f8860148f48ad70000313c4c223000000000653006565656512c2d8dc033f3c97010000000002636aa993aa010000000006526365ab526ab7cf560300000000076a0065ac6a526500000000", "005352535300ab6a", 2, 59531991, "8b5b3d00d9c658f062fe6c5298e54b1fe4ed3a3eab2a87af4f3119edc47b1691"], - ["233cd90b043916fc41eb870c64543f0111fb31f3c486dc72457689dea58f75c16ae59e9eb2000000000500536a6a6affffffff9ae30de76be7cd57fb81220fce78d74a13b2dbcad4d023f3cadb3c9a0e45a3ce000000000965ac6353ac5165515130834512dfb293f87cb1879d8d1b20ebad9d7d3d5c3e399a291ce86a3b4d30e4e32368a9020000000453005165ffffffff26d84ae93eb58c81158c9b3c3cbc24a84614d731094f38d0eea8686dec02824d0300000005636a65abacf02c784001a0bd5d03000000000900655351ab65ac516a416ef503", "", 1, -295106477, "b79f31c289e95d9dadec48ebf88e27c1d920661e50d090e422957f90ff94cb6e"], - ["9200e26b03ff36bc4bf908143de5f97d4d02358db642bd5a8541e6ff709c420d1482d471b70000000008abab65536a636553ffffffff61ba6d15f5453b5079fb494af4c48de713a0c3e7f6454d7450074a2a80cb6d880300000007ac6a00ab5165515dfb7574fbce822892c2acb5d978188b1d65f969e4fe874b08db4c791d176113272a5cc10100000000ffffffff0420958d000000000009ac63516a0063516353dd885505000000000465ac00007b79e901000000000066d8bf010000000005525252006a00000000", "ac5152", 0, 2089531339, "89ec7fab7cfe7d8d7d96956613c49dc48bf295269cfb4ea44f7333d88c170e62"], - ["45f335ba01ce2073a8b0273884eb5b48f56df474fc3dff310d9706a8ac7202cf5ac188272103000000025363ffffffff049d859502000000000365ab6a8e98b1030000000002ac51f3a80603000000000752535151ac00000306e30300000000020051b58b2b3a", "", 0, 1899564574, "78e01310a228f645c23a2ad0acbb8d91cedff4ecdf7ca997662c6031eb702b11"], - ["d8f652a6043b4faeada05e14b81756cd6920cfcf332e97f4086961d49232ad6ffb6bc6c097000000000453526563ffffffff1ea4d60e5e91193fbbc1a476c8785a79a4c11ec5e5d6c9950c668ceacfe07a15020000000352ab51fffffffffe029a374595c4edd382875a8dd3f20b9820abb3e93f877b622598d11d0b09e503000000095351000052ac515152ffffffff9d65fea491b979699ceb13caf2479cd42a354bd674ded3925e760758e85a756803000000046365acabffffffff0169001d00000000000651636a65656300000000", "ab0063630000ac", 3, 1050965951, "4cc85cbc2863ee7dbce15490d8ca2c5ded61998257b9eeaff968fe38e9f009ae"], - ["718662be026e1dcf672869ac658fd0c87d6835cfbb34bd854c44e577d5708a7faecda96e260300000004526a636a489493073353b678549adc7640281b9cbcb225037f84007c57e55b874366bb7b0fa03bdc00000000095165ababac65ac00008ab7f2a802eaa53d000000000007acac516aac526ae92f380100000000056aac00536500000000", "ab00", 1, 43296088, "2d642ceee910abff0af2116af75b2e117ffb7469b2f19ad8fef08f558416d8f7"], - ["94083c840288d40a6983faca876d452f7c52a07de9268ad892e70a81e150d602a773c175ad03000000007ec3637d7e1103e2e7e0c61896cbbf8d7e205b2ecc93dd0d6d7527d39cdbf6d335789f660300000000ffffffff019e1f7b03000000000800ac0051acac0053539cb363", "", 1, -183614058, "a17b66d6bb427f42653d08207a22b02353dd19ccf2c7de6a9a3a2bdb7c49c9e7"], - ["30e0d4d20493d0cd0e640b757c9c47a823120e012b3b64c9c1890f9a087ae4f2001ca22a61010000000152f8f05468303b8fcfaad1fb60534a08fe90daa79bff51675472528ebe1438b6f60e7f60c10100000009526aab6551ac510053ffffffffaaab73957ea2133e32329795221ed44548a0d3a54d1cf9c96827e7cffd1706df0200000009ab00526a005265526affffffffd19a6fe54352015bf170119742821696f64083b5f14fb5c7d1b5a721a3d7786801000000085265abababac53abffffffff020f39bd030000000004ab6aac52049f6c050000000004ab52516aba5b4c60", "6a6365516a6a655253", 0, -624256405, "8e221a6c4bf81ca0d8a0464562674dcd14a76a32a4b7baf99450dd9195d411e6"], - ["f9c69d940276ec00f65f9fe08120fc89385d7350388508fd80f4a6ba2b5d4597a9e21c884f010000000663ab63ababab15473ae6d82c744c07fc876ecd53bd0f3018b2dbedad77d757d5bdf3811b23d294e8c0170000000001abafababe00157ede2050000000006ac6a5263635300000000", "ab53", 1, 606547088, "714d8b14699835b26b2f94c58b6ea4c53da3f7adf0c62ea9966b1e1758272c47"], - ["5c0ac112032d6885b7a9071d3c5f493aa16c610a4a57228b2491258c38de8302014276e8be030000000300ab6a17468315215262ad5c7393bb5e0c5a6429fd1911f78f6f72dafbbbb78f3149a5073e24740300000003ac5100ffffffff33c7a14a062bdea1be3c9c8e973f54ade53fe4a69dcb5ab019df5f3345050be00100000008ac63655163526aab428defc0033ec36203000000000765516365536a00ae55b2000000000002ab53f4c0080400000000095265516a536563536a00000000", "6a005151006a", 2, 272749594, "91082410630337a5d89ff19145097090f25d4a20bdd657b4b953927b2f62c73b"], - ["e3683329026720010b08d4bec0faa244f159ae10aa582252dd0f3f80046a4e145207d54d31000000000852acac52656aacac3aaf2a5017438ad6adfa3f9d05f53ebed9ceb1b10d809d507bcf75e0604254a8259fc29c020000000653526552ab51f926e52c04b44918030000000000f7679c0100000000090000525152005365539e3f48050000000009516500ab635363ab008396c905000000000253650591024f", "6a6365", 0, 908746924, "458aec3b5089a585b6bad9f99fd37a2b443dc5a2eefac2b7e8c5b06705efc9db"], - ["48c4afb204204209e1df6805f0697edaa42c0450bbbd767941fe125b9bc40614d63d757e2203000000066a5363005152dc8b6a605a6d1088e631af3c94b8164e36e61445e2c60130292d81dabd30d15f54b355a802000000036a6353ffffffff1d05dcec4f3dedcfd02c042ce5d230587ee92cb22b52b1e59863f3717df2362f0300000005536552ac52ffffffffd4d71c4f0a7d53ba47bb0289ca79b1e33d4c569c1e951dd611fc9c9c1ca8bc6c030000000865536a65ab51abacffffffff042f9aa905000000000753655153656351ab93d8010000000002655337440e0300000000005d4c690000000000015278587acb", "ab006565526a51", 0, 1502064227, "bbed77ff0f808aa8abd946ba9e7ec1ddb003a969fa223dee0af779643cb841a9"], - ["00b20fd104dd59705b84d67441019fa26c4c3dec5fd3b50eca1aa549e750ef9ddb774dcabe000000000651ac656aac65ffffffff52d4246f2db568fc9eea143e4d260c698a319f0d0670f84c9c83341204fde48b0200000000ffffffffb8aeabb85d3bcbc67b132f1fd815b451ea12dcf7fc169c1bc2e2cf433eb6777a03000000086a51ac6aab6563acd510d209f413da2cf036a31b0def1e4dcd8115abf2e511afbcccb5ddf41d9702f28c52900100000006ac52ab6a0065ffffffff039c8276000000000008ab53655200656a52401561010000000003acab0082b7160100000000035100ab00000000", "535265", 1, -947367579, "3212c6d6dd8d9d3b2ac959dec11f4638ccde9be6ed5d36955769294e23343da0"], - ["455131860220abbaa72015519090a666faf137a0febce7edd49da1eada41feab1505a0028b02000000036365ab453ead4225724eb69beb590f2ec56a7693a608871e0ab0c34f5e96157f90e0a96148f3c502000000085251ab51535163acffffffff022d1249040000000009abac00acac6565630088b310040000000000e3920e59", "5152ab6a52ac5152", 0, 294375737, "c40fd7dfa72321ac79516502500478d09a35cc22cc264d652c7d18b14400b739"], - ["624d28cb02c8747915e9af2b13c79b417eb34d2fa2a73547897770ace08c6dd9de528848d3030000000651ab63abab533c69d3f9b75b6ef8ed2df50c2210fd0bf4e889c42477d58682f711cbaece1a626194bb85030000000765acab53ac5353ffffffff018cc280040000000009abacabac52636352ac6859409e", "ac51ac", 1, 1005144875, "919144aada50db8675b7f9a6849c9d263b86450570293a03c245bd1e3095e292"], - ["8f28471d02f7d41b2e70e9b4c804f2d90d23fb24d53426fa746bcdcfffea864925bdeabe3e0200000001acffffffff76d1d35d04db0e64d65810c808fe40168f8d1f2143902a1cc551034fd193be0e0000000001acffffffff048a5565000000000005005151516afafb610400000000045263ac53648bb30500000000086363516a6a5165513245de01000000000000000000", "6a0053510053", 1, -1525137460, "305fc8ff5dc04ebd9b6448b03c9a3d945a11567206c8d5214666b30ec6d0d6cc"], - ["10ec50d7046b8b40e4222a3c6449490ebe41513aad2eca7848284a08f3069f3352c2a9954f0000000009526aac656352acac53ffffffff0d979f236155aa972472d43ee6f8ce22a2d052c740f10b59211454ff22cb7fd00200000007acacacab63ab53ffffffffbbf97ebde8969b35725b2e240092a986a2cbfd58de48c4475fe077bdd493a20c010000000663ab5365ababffffffff4600722d33b8dba300d3ad037bcfc6038b1db8abfe8008a15a1de2da2264007302000000035351ac6dbdafaf020d0ccf04000000000663ab6a51ab6ae06e5e0200000000036aabab00000000", "", 0, -1658960232, "2420dd722e229eccafae8508e7b8d75c6920bfdb3b5bac7cb8e23419480637c2"], - ["fef98b7101bf99277b08a6eff17d08f3fcb862e20e13138a77d66fba55d54f26304143e5360100000006515365abab00ffffffff04265965030000000004655252ace2c775010000000001002b23b4040000000007516a5153ab53ac456a7a00000000000753ab525251acacba521291", "526aacacab00abab53", 0, -1614097109, "4370d05c07e231d6515c7e454a4e401000b99329d22ed7def323976fa1d2eeb5"], - ["34a2b8830253661b373b519546552a2c3bff7414ea0060df183b1052683d78d8f54e842442000000000152ffffffffd961a8e34cf374151058dfcddc86509b33832bc57267c63489f69ff01199697c0300000002abacba856cfb01b17c2f050000000008515365ac53ab000000000000", "5263ab656a", 1, -2104480987, "2f9993e0a84a6ca560d6d1cc2b63ffe7fd71236d9cfe7d809491cef62bbfad84"], - ["43559290038f32fda86580dd8a4bc4422db88dd22a626b8bd4f10f1c9dd325c8dc49bf479f01000000026351ffffffff401339530e1ed3ffe996578a17c3ec9d6fccb0723dd63e7b3f39e2c44b976b7b0300000006ab6a65656a51ffffffff6fb9ba041c96b886482009f56c09c22e7b0d33091f2ac5418d05708951816ce7000000000551ac525100ffffffff020921e40500000000035365533986f40500000000016a00000000", "52ac51", 0, 1769771809, "02040283ef2291d8e1f79bb71bdabe7c1546c40d7ed615c375643000a8b9600d"], - ["6878a6bd02e7e1c8082d5e3ee1b746cfebfac9e8b97e61caa9e0759d8a8ecb3743e36a30de0100000002ab532a911b0f12b73e0071f5d50b6bdaf783f4b9a6ce90ec0cad9eecca27d5abae188241ddec0200000001651c7758d803f7457b0500000000036551515f4e90000000000001007022080200000000035365acc86b6946", "6351ab", 0, -1929374995, "f24be499c58295f3a07f5f1c6e5084496ae160450bd61fdb2934e615289448f1"], - ["35b6fc06047ebad04783a5167ab5fc9878a00c4eb5e7d70ef297c33d5abd5137a2dea9912402000000036aacacffffffff21dc291763419a584bdb3ed4f6f8c60b218aaa5b99784e4ba8acfec04993e50c03000000046a00ac6affffffff69e04d77e4b662a82db71a68dd72ef0af48ca5bebdcb40f5edf0caf591bb41020200000000b5db78a16d93f5f24d7d932f93a29bb4b784febd0cbb1943f90216dc80bba15a0567684b000000000853ab52ab5100006a1be2208a02f6bdc103000000000265ab8550ea04000000000365636a00000000", "", 0, -1114114836, "1c8655969b241e717b841526f87e6bd68b2329905ba3fc9e9f72526c0b3ea20c"], - ["bebb90c302bf91fd4501d33555a5fc5f2e1be281d9b7743680979b65c3c919108cc2f517510100000003abab00ffffffff969c30053f1276550532d0aa33cfe80ca63758cd215b740448a9c08a84826f3303000000056565ab5153ffffffff04bf6f2a04000000000565ab5265ab903e760100000000026a6a7103fa020000000006526553525365b05b2c000000000006ab000000535300000000", "51510053ab63635153", 1, 1081291172, "94338cd47a4639be30a71e21a7103cee4c99ef7297e0edd56aaf57a068b004de"], - ["af48319f031b4eeb4319714a285f44244f283cbff30dcb9275b06f2348ccd0d7f015b54f8500000000066363ac65ac6affffffff2560a9817ebbc738ad01d0c9b9cf657b8f9179b1a7f073eb0b67517409d108180200000005ac6365ab52ffffffff0bdd67cd4ecae96249a2e2a96db1490ee645f042fd9d5579de945e22b799f4d003000000086552ab515153ab00cf187c8202e51abf0300000000066552006a00abadf37d000000000004ac6a535100000000", "63ab65", 1, -1855554446, "60caf46a7625f303c04706cec515a44b68ec319ee92273acb566cca4f66861c1"], - ["f35befbc03faf8c25cc4bc0b92f6239f477e663b44b83065c9cb7cf231243032cf367ce3130000000005ab65526a517c4c334149a9c9edc39e29276a4b3ffbbab337de7908ea6f88af331228bd90086a6900ba020000000151279d19950d2fe81979b72ce3a33c6d82ebb92f9a2e164b6471ac857f3bbd3c0ea213b542010000000953ab51635363520065052657c20300a9ba04000000000452636a6a0516ea020000000008535253656365ababcfdd3f01000000000865ac516aac00530000000000", "", 2, -99793521, "c834a5485e68dc13edb6c79948784712122440d7fa5bbaa5cd2fc3d4dac8185d"], - ["d3da18520216601acf885414538ce2fb4d910997eeb91582cac42eb6982c9381589587794f0300000000fffffffff1b1c9880356852e10cf41c02e928748dd8fae2e988be4e1c4cb32d0bfaea6f7000000000465ab6aabffffffff02fb0d69050000000002ababeda8580500000000085163526565ac52522b913c95", "ac", 1, -1247973017, "99b32b5679d91e0f9cdd6737afeb07459806e5acd7630c6a3b9ab5d550d0c003"], - ["8218eb740229c695c252e3630fc6257c42624f974bc856b7af8208df643a6c520ef681bfd00000000002510066f30f270a09b2b420e274c14d07430008e7886ec621ba45665057120afce58befca96010300000004525153ab84c380a9015d96100000000000076a5300acac526500000000", "ac005263", 0, -1855679695, "5071f8acf96aea41c7518bd1b5b6bbe16258b529df0c03f9e374b83c66b742c6"], - ["1123e7010240310013c74e5def60d8e14dd67aedff5a57d07a24abc84d933483431b8cf8ea0300000003530051fc6775ff1a23c627a2e605dd2560e84e27f4208300071e90f4589e762ad9c9fe8d0da95e020000000465655200ffffffff04251598030000000004ab65ab639d28d90400000000096563636aacac525153474df801000000000851525165ac51006a75e23b040000000000e5bd3a4a", "6363636565", 0, -467124448, "9cb0dd04e9fe287b112e94a1647590d27e8b164ca13c4fe70c610fd13f82c2fd"], - ["fd92fe1003083c5179f97e77bf7d71975788138147adbdb283306802e261c0aee080fa22630200000000860c643ba9a1816b9badf36077b4554d11720e284e395a1121bc45279e148b2064c65e49020000000651ab6a53636a2c713088d20f4bc4001264d972cce05b9fe004dc33376ad24d0d013e417b91a5f1b6734e000000000100ffffffff02e3064c0500000000066552006a5165b86e8705000000000665ab65ab53522052eadb", "00ab53525265", 0, 776203277, "47207b48777727532f62e09afcd4104ea6687e723c7657c30504fa2081331cc8"], - ["d1b6a703038f14d41fcc5cc45455faa135a5322be4bf0f5cbcd526578fc270a236cacb853f0200000001abffffffff135aeff902fa38f202ccf5bd34437ff89c9dc57a028b62447a0a38579383e8ef0000000000ffffffffadf398d2c818d0b90bc474f540c3618a4a643482eeab73d36101987e2ec0335900000000004bd3323504e69fc10000000000055151535251790ada02000000000563ab6aab521337a704000000000963ac63abacac52656a1e9862010000000007656500ac51ab6a8f4ee672", "ab5251656565ac63", 2, 82008394, "b8f3d255549909c07588ecba10a02e55a2d6f2206d831af9da1a7dae64cfbc8b"], - ["81dadaa7011556683db3fe95262f4fdb20391b7e75b7ffcee51b176af64d83c06f85545d620200000005ab5151ab52ffffffff044805ef0300000000065353516352639702c802000000000900516351515252ab5270db08040000000009ac516aab526553abac4aabc90500000000096365ab0052636a525100000000", "6565ab6a5152", 0, -2126294159, "ad01ec9d6dbae325ec3a8e1fd98e2d03b1188378210efef093dd8b0b0ef3f19d"], - ["3b937e05032b8895d2f4945cb7e3679be2fbd15311e2414f4184706dbfc0558cf7de7b4d000000000001638b91a12668a3c3ce349788c961c26aa893c862f1e630f18d80e7843686b6e1e6fc396310000000000852635353ab65ac51eeb09dd1c9605391258ee6f74b9ae17b5e8c2ef010dc721c5433dcdc6e93a1593e3b6d1700000000085365ac6553526351ffffffff0308b18e04000000000253acb6dd00040000000008536aac5153ac516ab0a88201000000000500ac006500804e3ff2", "", 0, 416167343, "595a3c02254564634e8085283ec4ea7c23808da97ce9c5da7aecd7b553e7fd7f"], - ["a48f27ca047997470da74c8ee086ddad82f36d9c22e790bd6f8603ee6e27ad4d3174ea875403000000095153ac636aab6aacabffffffffefc936294e468d2c9a99e09909ba599978a8c0891ad47dc00ba424761627cef202000000056a51630053ffffffff304cae7ed2d3dbb4f2fbd679da442aed06221ffda9aee460a28ceec5a9399f4e0200000000f5bddf82c9c25fc29c5729274c1ff0b43934303e5f595ce86316fc66ad263b96ca46ab8d0100000003536500d7cf226b0146b00c04000000000200ac5c2014ce", "515100636563", 0, 1991799059, "9c051a7092fe17fa62b1720bc2c4cb2ffc1527d9fb0b006d2e142bb8fe07bf3c"], - ["180cd53101c5074cf0b7f089d139e837fe49932791f73fa2342bd823c6df6a2f72fe6dba1303000000076a6a63ac53acabffffffff03853bc1020000000007ac526a6a6a6a003c4a8903000000000453515163a0fbbd030000000005ab656a5253253d64cf", "ac65", 0, -1548453970, "4d8efb3b99b9064d2f6be33b194a903ffabb9d0e7baa97a48fcec038072aac06"], - ["c21ec8b60376c47e057f2c71caa90269888d0ffd5c46a471649144a920d0b409e56f190b700000000008acac6a526a536365ffffffff5d315d9da8bf643a9ba11299450b1f87272e6030fdb0c8adc04e6c1bfc87de9a0000000000ea43a9a142e5830c96b0ce827663af36b23b0277244658f8f606e95384574b91750b8e940000000007516a63ac0063acffffffff023c61be0400000000055165ab5263313cc8020000000006006a53526551ed8c3d56", "6a", 1, 1160627414, "a638cc17fd91f4b1e77877e8d82448c84b2a4e100df1373f779de7ad32695112"], - ["128cd90f04b66a4cbc78bf48748f6eec0f08d5193ee8d0a6f2e8d3e5f138ed12c2c87d01a301000000085200ab6aac00ab00ffffffff09fc88bb1851e3dfb3d30179c38e15aeb1b39929c7c74f6acd071994ed4806490300000000e7fc5ea12ec56f56c0d758ecf4bb88aa95f3b08176b336db3b9bec2f6e27336dce28adbe030000000400530051fffffffffd6ff1adcf1fbe0d883451ee46904f1b7e8820243d395559b2d4ee8190a6e891000000000080fb1ae702f85b400000000000035200ab8d9651010000000006ab6a52536aab00000000", "ab", 1, 1667598199, "c10ccc9db8a92d7d4b133a2980782dab9d9d1d633d0dde9f9612ada57771fd89"], - ["da9695a403493d3511c10e1fe1286f954db0366b7667c91ef18ae4578056c1bf752114ac5901000000035351519788d91dd1f9c62dc005d80ea54eb13f7131ca5aace3d5d29f9b58ccc5fbc9a27e779950010000000453ac6a00ffffffffe2556ff29ebe83eb42a32c7a8d93bc598043578f491b5935805a33608538845a030000000252ab65d21b3b018f26c4030000000006acab51535352e1cbcb10", "006565ab52", 2, -1550927794, "0ca673a1ee66f9625ceb9ab278ebef772c113c188112b02824570c17fdf48194"], - ["b240517501334021240427adb0b413433641555424f6d24647211e3e6bfbb22a8045cbda2f000000000071bac8630112717802000000000000000000", "6a5165abac52656551", 0, 1790414254, "2c8be597620d95abd88f9c1cf4967c1ae3ca2309f3afec8928058c9598660e9e"], - ["96bac43903044a199b4b3efeeec5d196ee23fb05495541fa2cd6fb6405a9432d1723363660010000000151ffffffffe6ce2b66ce1488918a3e880bebb0e750123f007c7bcbac8fcd67ce75cb6fbae80300000000ffffffff9c0955aa07f506455834895c0c56be5a095398f47c62a3d431fe125b161d666a0200000005520000abac7ffdbc540216f2f004000000000165a26dce010000000001ab00000000", "5151ab656a656a6a63", 0, -707123065, "26b22e18d5d9081fde9631594a4f7c49069ed2e429f3d08caf9d834f685ccab2"], - ["b8fd394001ed255f49ad491fecc990b7f38688e9c837ccbc7714ddbbf5404f42524e68c18f0000000007ab6353535363ab081e15ee02706f7d050000000008515200535351526364c7ec040000000005636a53acac9206cbe1", "655352ac", 0, -1251578838, "8e0697d8cd8a9ccea837fd798cc6c5ed29f6fbd1892ee9bcb6c944772778af19"], - ["e42a76740264677829e30ed610864160c7f97232c16528fe5610fc08814b21c34eefcea69d010000000653006a6a0052ffffffff647046cf44f217d040e6a8ff3f295312ab4dd5a0df231c66968ad1c6d8f4428000000000025352ffffffff0199a7f900000000000000000000", "655263006a005163", 1, 1122505713, "7cda43f1ff9191c646c56a4e29b1a8c6cb3f7b331da6883ef2f0480a515d0861"], - ["0f034f32027a8e094119443aa9cfe11737c6d7dda9a52b839bc073dcc0235b847b28e0fab60200000006ac53ac536a63eee63447dfdad80476994b68706e916df1bd9d7cb4f3a4f6b14369de84564bea2e8688bd030000000565636a65acf8434663020b35fe01000000000800abab655163acabb3d6a103000000000353acab345eeda0", "526a51ac63ab51", 1, 66020215, "4435e62ff6531ac73529aac9cf878a7219e0b6e6cac79af8487c5355d1ad6d43"], - ["a2dfa4690214c1ab25331815a5128f143219de51a47abdc7ce2d367e683eeb93960a31af9f010000000363636affffffff8be0628abb1861b078fcc19c236bc4cc726fa49068b88ad170adb2a97862e7460200000004ac655363ffffffff0441f11103000000000153dbab0c000000000009ab53ac5365526aab63abbb95050000000004ab52516a29a029040000000003ac526a00000000", "6a52ac63", 1, -1302210567, "913060c7454e6c80f5ba3835454b54db2188e37dc4ce72a16b37d11a430b3d23"], - ["9dbc591f04521670af83fb3bb591c5d4da99206f5d38e020289f7db95414390dddbbeb56680100000004ac5100acffffffffb6a40b5e29d5e459f8e72d39f800089529f0889006cad3d734011991da8ef09d0100000009526a5100acab536a515fc427436df97cc51dc8497642ffc868857ee245314d28b356bd70adba671bd6071301fc0000000000ffffffff487efde2f620566a9b017b2e6e6d42525e4070f73a602f85c6dfd58304518db30000000005516353006a8d8090180244904a0200000000046a65656ab1e9c203000000000451ab63aba06a5449", "", 0, -1414953913, "bae189eb3d64aedbc28a6c28f6c0ccbd58472caaf0cf45a5aabae3e031dd1fea"], - ["1345fb2c04bb21a35ae33a3f9f295bece34650308a9d8984a989dfe4c977790b0c21ff9a7f0000000006ac52ac6a0053ffffffff7baee9e8717d81d375a43b691e91579be53875350dfe23ba0058ea950029fcb7020000000753ab53ab63ab52ffffffff684b6b3828dfb4c8a92043b49b8cb15dd3a7c98b978da1d314dce5b9570dadd202000000086353ab6a5200ac63d1a8647bf667ceb2eae7ec75569ca249fbfd5d1b582acfbd7e1fcf5886121fca699c011d0100000003ac006affffffff049b1eb00300000000001e46dc0100000000080065ab6a6a630065ca95b40300000000030051520c8499010000000006ab6aac526a6500000000", "53526aac636300", 2, 1809978100, "cfeaa36790bc398783d4ca45e6354e1ea52ee74e005df7f9ebd10a680e9607bf"], - ["7d75dc8f011e5f9f7313ba6aedef8dbe10d0a471aca88bbfc0c4a448ce424a2c5580cda1560300000003ab5152ffffffff01997f8e0200000000096552ac6a65656563530d93bbcc", "00656a6563", 0, 1414485913, "ec91eda1149f75bffb97612569a78855498c5d5386d473752a2c81454f297fa7"], - ["1459179504b69f01c066e8ade5e124c748ae5652566b34ed673eea38568c483a5a4c4836ca0100000008ac5352006563656affffffff5d4e037880ab1975ce95ea378d2874dcd49d5e01e1cdbfae3343a01f383fa35800000000095251ac52ac6aac6500ffffffff7de3ae7d97373b7f2aeb4c55137b5e947b2d5fb325e892530cb589bc4f92abd503000000086563ac53ab520052ffffffffb4db36a32d6e543ef49f4bafde46053cb85b2a6c4f0e19fa0860d9083901a1190300000003ab51531bbcfe5504a6dbda040000000008536a5365abac6500d660c80300000000096565abab6a53536a6a54e84e010000000003acac52df2ccf0500000000025351220c857e", "", 2, 1879181631, "3aad18a209fab8db44954eb55fd3cc7689b5ec9c77373a4d5f4dae8f7ae58d14"], - ["d98b777f04b1b3f4de16b07a05c31d79965579d0edda05600c118908d7cf642c9cd670093f020000000953005351ac65ab5363a268caad6733b7d1718008997f249e1375eb3ab9fe68ab0fe170d8e745ea24f54ce67f9b00000000066500516a5151ffffffff7ef8040dfcc86a0651f5907e8bfd1017c940f51cf8d57e3d3fe78d57e40b1e610200000003535263ffffffff39846cfed4babc098ff465256ba3820c30d710581316afcb67cd31c623b703360300000001acffffffff03d405120100000000056300006a5201a73d050000000004ab636a6a294c8c000000000006ac65536553ac00000000", "63525351abac", 1, 2018694761, "86970af23c89b72a4f9d6281e46b9ef5220816bed71ebf1ae20df53f38fe16ff"], - ["cabb1b06045a895e6dcfc0c1e971e94130c46feace286759f69a16d298c8b0f6fd0afef8f20300000004ac006352ffffffffa299f5edac903072bfb7d29b663c1dd1345c2a33546a508ba5cf17aab911234602000000056a65515365ffffffff89a20dc2ee0524b361231092a070ace03343b162e7162479c96b757739c8394a0300000002abab92ec524daf73fabee63f95c1b79fa8b84e92d0e8bac57295e1d0adc55dc7af5534ebea410200000001534d70e79b04674f6f00000000000600abacab53517d60cc0200000000035265ab96c51d040000000004ac6300ac62a787050000000008006a516563ab63639e2e7ff7", "6551ac6351ac", 3, 1942663262, "d0c4a780e4e0bc22e2f231e23f01c9d536b09f6e5be51c123d218e906ec518be"], - ["8b96d7a30132f6005b5bd33ea82aa325e2bcb441f46f63b5fca159ac7094499f380f6b7e2e00000000076aacabac6300acffffffff0158056700000000000465005100c319e6d0", "52006a", 0, -1100733473, "fb4bd26a91b5cf225dd3f170eb09bad0eac314bc1e74503cc2a3f376833f183e"], - ["112191b7013cfbe18a175eaf09af7a43cbac2c396f3695bbe050e1e5f4250603056d60910e02000000001c8a5bba03738a22010000000005525352656a77a149010000000002510003b52302000000000351ac52722be8e6", "65ac6565", 0, -1847972737, "8e795aeef18f510d117dfa2b9f4a2bd2e2847a343205276cedd2ba14548fd63f"], - ["ce6e1a9e04b4c746318424705ea69517e5e0343357d131ad55d071562d0b6ebfedafd6cb840100000003656553ffffffff67bd2fa78e2f52d9f8900c58b84c27ef9d7679f67a0a6f78645ce61b883fb8de000000000100d699a56b9861d99be2838e8504884af4d30b909b1911639dd0c5ad47c557a0773155d4d303000000046a5151abffffffff9fdb84b77c326921a8266854f7bbd5a71305b54385e747fe41af8a397e78b7fa010000000863acac6a51ab00ac0d2e9b9d049b8173010000000007ac53526a650063ba9b7e010000000008526a00525263acac0ab3fd030000000000ea8a0303000000000200aca61a97b9", "", 1, -1276952681, "b6ed4a3721be3c3c7305a5128c9d418efa58e419580cec0d83f133a93e3a22c5"], - ["a7721d94021652d90c79aaf5022d98219337d50f836382403ed313adb1116ba507ac28b0b0010000000551ac6300ab89e6d64a7aa81fb9595368f04d1b36d7020e7adf5807535c80d015f994cce29554fe869b01000000065353ab636500ffffffff024944c90100000000046300635369df9f01000000000000000000", "656a536551ab", 0, -1740151687, "935892c6f02948f3b08bcd463b6acb769b02c1912be4450126768b055e8f183a"], - ["2f7353dd02e395b0a4d16da0f7472db618857cd3de5b9e2789232952a9b154d249102245fd030000000151617fd88f103280b85b0a198198e438e7cab1a4c92ba58409709997cc7a65a619eb9eec3c0200000003636aabffffffff0397481c0200000000045300636a0dc97803000000000009d389030000000003ac6a53134007bb", "0000536552526a", 0, -1912746174, "30c4cd4bd6b291f7e9489cc4b4440a083f93a7664ea1f93e77a9597dab8ded9c"], - ["7d95473604fd5267d0e1bb8c9b8be06d7e83ff18ad597e7a568a0aa033fa5b4e1e2b6f1007020000000465006a6affffffffaee008503bfc5708bd557c7e78d2eab4878216a9f19daa87555f175490c40aaf000000000263abffffffffabd74f0cff6e7ceb9acc2ee25e65af1abcebb50c08306e6c78fa8171c37613dd010000000552acacababffffffff54a3069393f7930fa1b331cdff0cb945ec21c11d4605d8eedba1d3e094c6ae1f01000000026300ffffffff0182edeb050000000009526353ab5153530065a247e8cd", "51516aab00", 2, -426210430, "2707ca714af09494bb4cf0794abe33c6cba5f29891d619e76070269d1fa8e690"], - ["221d4718023d9ca9fe1af178dbfce02b2b369bf823ea3f43f00891b7fef98e215c06b94fdd000000000951005153ab000051acffffffffb1c7ad1c64b7441bf5e70cd0f6eb4ec96821d67fc4997d9e6dfdceadecd36dde01000000070051536a635153ffffffff04e883cd00000000000851ab536553ab0052bbb2f70400000000002f1b2e03000000000165259fcb00000000000010dbde99", "ab", 1, 665721280, "4abce77432a86dfe608e7c1646c18b5253a373392ff962e288e3ab96bba1ba1d"], - ["6f66c0b3013e6ae6aabae9382a4326df31c981eac169b6bc4f746edaa7fc1f8c796ef4e374000000000665ab6aabac6affffffff0191c8d6030000000002525300000000", "6a5352516a635352ab", 0, -1299629906, "48411efeb133c6b7fec4e7bdbe613f827093cb06ea0dbcc2ffcfde3a9ac4356c"], - ["89e7928c04363cb520eff4465251fd8e41550cbd0d2cdf18c456a0be3d634382abcfd4a2130200000006ac516a6a656355042a796061ed72db52ae47d1607b1ceef6ca6aea3b7eea48e7e02429f382b378c4e51901000000085351ab6352ab5252ffffffff53631cbda79b40183000d6ede011c778f70147dc6fa1aed3395d4ce9f7a8e69701000000096a6553ab52516a52abad0de418d80afe059aab5da73237e0beb60af4ac490c3394c12d66665d1bac13bdf29aa8000000000153f2b59ab6027a33eb040000000007005351ac5100ac88b941030000000003ab0052e1e8a143", "63656a", 0, 1258533326, "b575a04b0bb56e38bbf26e1a396a76b99fb09db01527651673a073a75f0a7a34"], - ["ca356e2004bea08ec2dd2df203dc275765dc3f6073f55c46513a588a7abcc4cbde2ff011c7020000000553525100003aefec4860ef5d6c1c6be93e13bd2d2a40c6fb7361694136a7620b020ecbaca9413bcd2a030000000965ac00536352535100ace4289e00e97caaea741f2b89c1143060011a1f93090dc230bee3f05e34fbd8d8b6c399010000000365526affffffff48fc444238bda7a757cb6a98cb89fb44338829d3e24e46a60a36d4e24ba05d9002000000026a53ffffffff03d70b440200000000056a6a526aac853c97010000000002515335552202000000000351635300000000", "0052", 3, -528192467, "fc93cc056c70d5e033933d730965f36ad81ef64f1762e57f0bc5506c5b507e24"], - ["82d4fa65017958d53e562fac073df233ab154bd0cf6e5a18f57f4badea8200b217975e31030200000004636aab51ac0891a204227cc9050000000006635200655365bfef8802000000000865650051635252acfc2d09050000000006ab65ac51516380195e030000000007ac52525352510063d50572", "53", 0, -713567171, "e095003ca82af89738c1863f0f5488ec56a96fb81ea7df334f9344fcb1d0cf40"], - ["75f6949503e0e47dd70426ef32002d6cdb564a45abedc1575425a18a8828bf385fa8e808e600000000036aabab82f9fd14e9647d7a1b5284e6c55169c8bd228a7ea335987cef0195841e83da45ec28aa2e0300000002516350dc6fe239d150efdb1b51aa288fe85f9b9f741c72956c11d9dcd176889963d699abd63f0000000001ab429a63f502777d20010000000007abac52ac516a53d081d9020000000003acac630c3cc3a8", "535152516551510000", 1, 973814968, "c6ec1b7cb5c16a1bfd8a3790db227d2acc836300534564252b57bd66acf95092"], - ["24f24cd90132b2162f938f1c22d3ca5e7daa83515883f31a61a5177aebf99d7db6bdfc398c010000000163ffffffff01d5562d0100000000016300000000", "5265ac5165ac5252ab", 0, 1055129103, "5eeb03e03806cd7bfd44bbba69c30f84c2c5120df9e68cd8facc605fcfbc9693"], - ["5ff2cac201423064a4d87a96b88f1669b33adddc6fa9acdc840c0d8a243671e0e6de49a5b00300000005ac6353655353b91db50180db5a03000000000663535151006a047a3aff", "52ab51ab5365005163", 0, -1336626596, "b8db8d57fe40ab3a99cf2f8ed57da7a65050fcc1d34d4280e25faf10108d3110"], - ["10011f150220ad76a50ccc7bb1a015eda0ff987e64cd447f84b0afb8dc3060bdae5b36a6900200000000ffffffff1e92dd814dfafa830187bc8e5b9258de2445ec07b02c420ee5181d0b203bb334000000000565ab536a65ffffffff0124e65401000000000800ab636553ab53ac00000000", "53abab0051", 0, 440222748, "c6675bf229737e005b5c8ffa6f81d9e2c4396840921b6151316f67c4315a4270"], - ["8b95ec900456648d820a9b8df1d8f816db647df8a8dc9f6e7151ebf6079d90ee3f6861352a02000000085200ab00ac535151ffffffff039b10b845f961225ac0bcaac4f5fe1991029a051aa3d06a3811b5762977a67403000000035252abffffffff8559d65f40d5e261f45aec8aad3d2c56c6114b22b26f7ee54a06f0881be3a7f5010000000765635252536363ffffffff38f8b003b50f6412feb2322b06b270197f81ad69c36af02ca5008b94eee5f650020000000165ffffffff01ae2b00010000000001638eb153a2", "0053ab5300ac53", 2, 1266056769, "205f3653f0142b35ce3ef39625442efebae98cde8cbf0516b97b51073bb0479f"], - ["babbb7ea01ab5d584727cb44393b17cf66521606dc81e25d85273be0d57bad43e8f6b6d43501000000036a656aba83a68803fb0f4a000000000005536353ab633fcfe4020000000009ac00acab6351006a65182a0c03000000000453ac5363bee74f44", "536a6a6a6365ac51ab", 0, -799187625, "3275e98dca37243b977525a07b5d8e369d6c3bdc08cb948029a635547d0d1a4e"], - ["e86a24bc03e4fae784cdf81b24d120348cb5e52d937cd9055402fdba7e43281e482e77a1c100000000046363006affffffffa5447e9bdcdab22bd20d88b19795d4c8fb263fbbf7ce8f4f9a85f865953a6325020000000663ac53535253ffffffff9f8b693bc84e0101fc73748e0513a8cecdc264270d8a4ee1a1b6717607ee1eaa00000000026a513417bf980158d82c020000000009005253005351acac5200000000", "6353516365536a6a", 2, -563792735, "508129278ef07b43112ac32faf00170ad38a500eed97615a860fd58baaad174b"], - ["53bd749603798ed78798ef0f1861b498fc61dcee2ee0f2b37cddb115b118e73bc6a5a47a0201000000096a63656a6aab6a000007ff674a0d74f8b4be9d2e8e654840e99d533263adbdd0cf083fa1d5dd38e44d2d163d900100000007abab5251ac6a51c8b6b63f744a9b9273ccfdd47ceb05d3be6400c1ed0f7283d32b34a7f4f0889cccf06be30000000009516a52636551ab516a9ac1fe63030c677e05000000000027bc610000000000086565636a635100526e2dc60200000000015300000000", "6552536a515351ab", 1, -1617066878, "fe516df92299e995b8e6489be824c6839543071ec5e9286060b2600935bf1f20"], - ["691bf9fc028ca3099020b79184e70039cf53b3c7b3fe695d661fd62d7b433e65feda2150610000000003ac63abffffffff2c814c15b142bc944192bddccb90a392cd05b968b599c1d8cd99a55a28a243fd0100000009ab5300526a5200abac98516a5803dfd3540500000000046552ac522838120100000000040053ab6a4409a903000000000665636a5300658759621b", "65ac5165ab", 0, -359941441, "d582c442e0ecc400c7ba33a56c93ad9c8cfd45af820350a13623594b793486f0"], - ["536bc5e60232eb60954587667d6bcdd19a49048d67a027383cc0c2a29a48b960dc38c5a0370300000005ac636300abffffffff8f1cfc102f39b1c9348a2195d496e602c77d9f57e0769dabde7eaaedf9c69e250100000006acabab6a6351ffffffff0432f56f0400000000046a5365517fd54b0400000000035265539484e4050000000003536a5376dc25020000000008ac536aab6aab536ab978e686", "ac0051006a006a006a", 0, -273074082, "f151f1ec305f698d9fdce18ea292b145a58d931f1518cf2a4c83484d9a429638"], - ["74606eba01c2f98b86c29ba5a32dc7a7807c2abe6ed8d89435b3da875d87c12ae05329e6070200000003510052ffffffff02a1e2c4020000000006516563526a63c68bae04000000000952ab6363ab00006363fe19ae4f", "63ababacac5365", 0, 112323400, "d1b1d79001b4a0324962607b739972d6f39c1493c4500ce814fd3bd72d32a5a0"], - ["2ed805e20399e52b5bcc9dc075dad5cf19049ff5d7f3de1a77aee9288e59c5f4986751483f020000000165ffffffff967531a5726e7a653a9db75bd3d5208fa3e2c5e6cd5970c4d3aba84eb644c72c0300000000ffffffffd79030d20c65e5f8d3c55b5692e5bdaa2ae78cfa1935a0282efb97515feac43f030000000400006365261ab88c02bdf66a000000000003ab6351d6ad8b000000000005525152abac00000000", "630053ab5265", 0, 2072814938, "1d25d16d84d5793be1ad5cda2de9c9cf70e04a66c3dae618f1a7ca4026198e7f"], - ["fab796ee03f737f07669160d1f1c8bf0800041157e3ac7961fea33a293f976d79ce49c02ab0200000003ac5252eb097ea1a6d1a7ae9dace338505ba559e579a1ee98a2e9ad96f30696d6337adcda5a85f403000000096500abab656a6a656396d5d41a9b11f571d91e4242ddc0cf2420eca796ad4882ef1251e84e42b930398ec69dd80100000005526551ac6a8e5d0de804f763bb0400000000015288271a010000000001acf2bf2905000000000300ab51c9641500000000000952655363636365ac5100000000", "00ac536552", 0, -1854521113, "f3bbab70b759fe6cfae1bf349ce10716dbc64f6e9b32916904be4386eb461f1f"], - ["f2b539a401e4e8402869d5e1502dbc3156dbce93583f516a4947b333260d5af1a34810c6a00200000003525363ffffffff01d305e2000000000005acab535200a265fe77", "", 0, -1435650456, "41617b27321a830c712638dbb156dae23d4ef181c7a06728ccbf3153ec53d7dd"], - ["9f10b1d8033aee81ac04d84ceee0c03416a784d1017a2af8f8a34d2f56b767aea28ff88c8f02000000025352ffffffff748cb29843bea8e9c44ed5ff258df1faf55fbb9146870b8d76454786c4549de100000000016a5ba089417305424d05112c0ca445bc7107339083e7da15e430050d578f034ec0c589223b0200000007abac53ac6565abffffffff025a4ecd010000000006636563ab65ab40d2700000000000056a6553526333fa296c", "", 0, -395044364, "20fd0eee5b5716d6cbc0ddf852614b686e7a1534693570809f6719b6fcb0a626"], - ["ab81755f02b325cbd2377acd416374806aa51482f9cc5c3b72991e64f459a25d0ddb52e66703000000036a00ab8727056d48c00cc6e6222be6608c721bc2b1e69d0ffbadd51d131f05ec54bcd83003aac5000000000003f2cdb60454630e020000000007526aac63000000e9e25c040000000003516a0088c97e0000000000076a535265655263771b5805000000000851ab00ac6565515100000000", "5151ab00ac", 0, -230931127, "ba0a2c987fcdd74b6915f6462f62c3f126a0750aa70048f7aa20f70726e6a20b"], - ["7a17e0ef0378dab4c601240639139335da3b7d684600fa682f59b7346ef39386fe9abd69350000000004ac5252ab807f26fb3249326813e18260a603b9ad66f41f05eaa8146f66bcca452162a502aac4aa8b02000000026a534ea460faa7e3d7854ec6c70d7e797025697b547ec500b2c09c873b4d5517767d3f3720660300000000ffffffff01b12e7a02000000000900ab006aab65656a63991c03e2", "6aab6a", 1, -1577994103, "62cd3413d9d819fb7355336365cf8a2a997f7436cc050a7143972044343b3281"], - ["ff2ecc09041b4cf5abb7b760e910b775268abee2792c7f21cc5301dd3fecc1b4233ee70a2c0200000009acac5300006a51526affffffffeb39c195a5426afff38379fc85369771e4933587218ef4968f3f05c51d6b7c92000000000165453a5f039b8dbef7c1ffdc70ac383b481f72f99f52b0b3a5903c825c45cfa5d2c0642cd50200000001654b5038e6c49daea8c0a9ac8611cfe904fc206dad03a41fb4e5b1d6d85b1ecad73ecd4c0102000000096a51000053ab656565bdb5548302cc719200000000000452655265214a3603000000000300ab6a00000000", "52516a006a63", 1, -2113289251, "37ed6fae36fcb3360c69cac8b359daa62230fc1419b2cf992a32d8f3e079dcff"], - ["70a8577804e553e462a859375957db68cfdf724d68caeacf08995e80d7fa93db7ebc04519d02000000045352ab53619f4f2a428109c5fcf9fee634a2ab92f4a09dc01a5015e8ecb3fc0d9279c4a77fb27e900000000006ab6a51006a6affffffff3ed1a0a0d03f25c5e8d279bb5d931b7eb7e99c8203306a6c310db113419a69ad010000000565516300abffffffff6bf668d4ff5005ef73a1b0c51f32e8235e67ab31fe019bf131e1382050b39a630000000004536a6563ffffffff02faf0bb00000000000163cf2b4b05000000000752ac635363acac15ab369f", "ac", 0, -1175809030, "1c9d6816c20865849078f9777544b5ddf37c8620fe7bd1618e4b72fb72dddca1"], - ["a3604e5304caa5a6ba3c257c20b45dcd468f2c732a8ca59016e77b6476ac741ce8b16ca8360200000004acac6553ffffffff695e7006495517e0b79bd4770f955040610e74d35f01e41c9932ab8ccfa3b55d0300000007ac5253515365acffffffff6153120efc5d73cd959d72566fc829a4eb00b3ef1a5bd3559677fb5aae116e38000000000400abab52c29e7abd06ff98372a3a06227386609adc7665a602e511cadcb06377cc6ac0b8f63d4fdb03000000055100acabacffffffff04209073050000000009ab5163ac525253ab6514462e05000000000952abacab636300656a20672c0400000000025153b276990000000000056565ab6a5300000000", "5351", 0, 1460890590, "249c4513a49076c6618aabf736dfd5ae2172be4311844a62cf313950b4ba94be"], - ["c6a72ed403313b7d027f6864e705ec6b5fa52eb99169f8ea7cd884f5cdb830a150cebade870100000009ac63ab516565ab6a51ffffffff398d5838735ff43c390ca418593dbe43f3445ba69394a6d665b5dc3b4769b5d700000000075265acab515365ffffffff7ee5616a1ee105fd18189806a477300e2a9cf836bf8035464e8192a0d785eea3030000000700ac6a51516a52ffffffff018075fd0000000000015100000000", "005251acac5252", 2, -656067295, "2cc1c7514fdc512fd45ca7ba4f7be8a9fe6d3318328bc1a61ae6e7675047e654"], - ["93c12cc30270fc4370c960665b8f774e07942a627c83e58e860e38bd6b0aa2cb7a2c1e060901000000036300abffffffff4d9b618035f9175f564837f733a2b108c0f462f28818093372eec070d9f0a5440300000001acffffffff039c2137020000000001525500990100000000055265ab636a07980e0300000000005ba0e9d1", "656a5100", 1, 18954182, "6beca0e0388f824ca33bf3589087a3c8ad0857f9fe7b7609ae3704bef0eb83e2"], - ["97bddc63015f1767619d56598ad0eb5c7e9f880b24a928fea1e040e95429c930c1dc653bdb0100000008ac53acac00005152aaa94eb90235ed10040000000000287bdd0400000000016a8077673a", "acac6a536352655252", 0, -813649781, "5990b139451847343c9bb89cdba0e6daee6850b60e5b7ea505b04efba15f5d92"], - ["cc3c9dd303637839fb727270261d8e9ddb8a21b7f6cbdcf07015ba1e5cf01dc3c3a327745d0300000000d2d7804fe20a9fca9659a0e49f258800304580499e8753046276062f69dbbde85d17cd2201000000096352536a520000acabffffffffbc75dfa9b5f81f3552e4143e08f485dfb97ae6187330e6cd6752de6c21bdfd21030000000600ab53650063ffffffff0313d0140400000000096565515253526aacac167f0a040000000008acab00535263536a9a52f8030000000006abab5151ab63f75b66f2", "6a635353636a65ac65", 1, 377286607, "dbc7935d718328d23d73f8a6dc4f53a267b8d4d9816d0091f33823bd1f0233e9"], - ["236f91b702b8ffea3b890700b6f91af713480769dda5a085ae219c8737ebae90ff25915a3203000000056300ac6300811a6a10230f12c9faa28dae5be2ebe93f37c06a79e76214feba49bb017fb25305ff84eb020000000100ffffffff041e351703000000000351ac004ff53e050000000003ab53636c1460010000000000cb55f701000000000651520051ab0000000000", "acac636a6aac5300", 0, 406448919, "793a3d3c37f6494fab79ff10c16702de002f63e34be25dd8561f424b0ea938c4"], - ["22e10d2003ab4ea9849a2801921113583b7c35c3710ff49a6003489395789a7cfb1e6051900100000006526a65535151ffffffff82f21e249ec60db33831d33b9ead0d56f6496db64337dcb7f1c3327c47729c4a020000000253abffffffff138f098f0e6a4cf51dc3e7a3b749f487d1ebde71b73b731d1d02ad1180ac7b8c02000000036563acda215011027a9484020000000007635165530000ac4bf6cb0400000000066aacabab65ab3ce3f32c", "ab0052ab", 2, 1136359457, "b5bd080bbcb8cd652f440484311d7a3cb6a973cd48f03c5c00fd6beb52dfc061"], - ["c47d5ad60485cb2f7a825587b95ea665a593769191382852f3514a486d7a7a11d220b62c54000000000663655253acab8c3cf32b0285b040e50dcf6987ddf7c385b3665048ad2f9317b9e0c5ba0405d8fde4129b00000000095251ab00ac65635300ffffffff549fe963ee410d6435bb2ed3042a7c294d0c7382a83edefba8582a2064af3265000000000152fffffffff7737a85e0e94c2d19cd1cde47328ece04b3e33cd60f24a8a345da7f2a96a6d0000000000865ab6a0051656aab28ff30d5049613ea020000000005ac51000063f06df1050000000008ac63516aabac5153afef5901000000000700656500655253688bc00000000000086aab5352526a53521ff1d5ff", "51ac52", 2, -1296011911, "0c1fd44476ff28bf603ad4f306e8b6c7f0135a441dc3194a6f227cb54598642a"], - ["0b43f122032f182366541e7ee18562eb5f39bc7a8e5e0d3c398f7e306e551cdef773941918030000000863006351ac51acabffffffffae586660c8ff43355b685dfa8676a370799865fbc4b641c5a962f0849a13d8250100000005abab63acabffffffff0b2b6b800d8e77807cf130de6286b237717957658443674df047a2ab18e413860100000008ab6aac655200ab63ffffffff04f1dbca03000000000800635253ab656a52a6eefd0300000000036365655d8ca90200000000005a0d530400000000015300000000", "65ac65acac", 0, 351448685, "86f26e23822afd1bdfc9fff92840fc1e60089f12f54439e3ab9e5167d0361dcf"], - ["4b0ecc0c03ba35700d2a30a71f28e432ff6ac7e357533b49f4e97cf28f1071119ad6b97f3e0300000008acab516363ac63acffffffffcd6a2019d99b5c2d639ddca0b1aa5ea7c1326a071255ea226960bd88f45ca57d00000000085253655363005353ffffffffba257635191c9f216de3277be548cb5a2313114cb1a4c563b03b4ef6c0f4f7040300000001abda542edf0495cdc40100000000026353c049e903000000000752516a53ab65512b0f9304000000000963ab516aac65516552fa9ece050000000009acab6500005152530000000000", "65ab51525352510052", 1, -1355414590, "3cd85f84aae6d702436f3f9b8980adcc1f8f202e957759540a27da0a32fc6c87"], - ["adaac0a803f66811346271c733036d6e0d45e15a9b602092e2e04ad93564f196e7f020b088000000000600526a636a00700ec3f9db07a3a6ce910bf318c7ec87a876e1f2a3366cc69f20cde09203b99c1cb9d15800000000050000ac636a4d0de554ebe95c6cc14faf5ff6361d1deba9474b8b0fd3b93c011cd96aec783abb3f36830200000005ab65005251ffffffff0464eb10050000000007520000ab6a65ab1beaa80300000000005a2f31050000000006526aab65ac52ba7db10000000000045251ab6a0cfb46e7", "ab0051ac52636a", 1, -184733716, "961ff413850336d3987c550404fc1d923266ca36cc9ffee7113edb3a9fea7f30"], - ["af1c4ab301ec462f76ee69ba419b1b2557b7ded639f3442a3522d4f9170b2d6859765c3df402000000016affffffff01a5ca6c000000000008ab52536aab00005300000000", "6a6351", 0, 110304602, "e88ed2eea9143f2517b15c03db00767eb01a5ce12193b99b964a35700607e5f4"], - ["0bfd34210451c92cdfa02125a62ba365448e11ff1db3fb8bc84f1c7e5615da40233a8cd368010000000252ac9a070cd88dec5cf9aed1eab10d19529720e12c52d3a21b92c6fdb589d056908e43ea910e0200000009ac516a52656a6a5165ffffffffc3edcca8d2f61f34a5296c405c5f6bc58276416c720c956ff277f1fb81541ddd00000000030063abffffffff811247905cdfc973d179c03014c01e37d44e78f087233444dfdce1d1389d97c302000000065163000063ab1724a26e02ca37c902000000000851ab53525352ac529012a90100000000085200525253535353fa32575b", "5352ac6351", 1, -1087700448, "b8f1e1f35e3e1368bd17008c756e59cced216b3c699bcd7bebdb5b6c8eec4697"], - ["2c84c0640487a4a695751d3e4be48019dbaea85a6e854f796881697383ea455347d2b2769001000000055265526500ffffffff6aac176d8aa00778d496a7231eeb7d3334f20c512d3db1683276402100d98de5030000000700536a5263526ac1ee9ceb171c0c984ebaf12c234fd1487fbf3b3d73aa0756907f26837efba78d1bed33200300000001ab4d9e8ec0bed837cb929bbed76ee848959cec59de44bd7667b7631a744f880d5c71a20cfd0100000007005363515300abffffffff023753fb0000000000036565532d3873050000000009005152ab6a63acab5200000000", "ab650053ab", 0, -877941183, "c49af297dffe2d80deddf10ceea84b99f8554bd2d55bbdc34e449728c31f0835"], - ["1f7e4b1b045d3efa6cd7a11d7873a8bab886c19bd11fcb6712f0948f2db3a7be76ff76c8f100000000095265ab6a0065ac5363ffffffffdaafcfa6029336c997680a541725190f09a6f6da21e54560eca4b5b8ae987da1000000000952ac52acac52515165ffffffff825a38d3b1e5bb4d10f33653ab3ab6882c7abdaec74460257d1528ce7be3f98e0100000007526a006a656a63c14adc8f04953a5d3d3f89237f38b857dd357713896d36215f7e8b77b11d98ea3cdc93df02000000015212484f6104bfafae0300000000025263a2b0120000000000056563ab00516c4d2605000000000653ac6500655301cc93030000000002acab14643b1f", "63acac53ab", 0, 333824258, "18da6ceb011cd36f15ad7dd6c55ef07e6f6ed48881ce3bb31416d3c290d9a0e9"], - ["467a3e7602e6d1a7a531106791845ec3908a29b833598e41f610ef83d02a7da3a1900bf2960000000005ab6a636353ffffffff031db6dac6f0bafafe723b9199420217ad2c94221b6880654f2b35114f44b1df010000000965ab52636a63ac6352ffffffff02b3b95c0100000000026300703216030000000001ab3261c0aa", "6a", 0, 2110869267, "3078b1d1a7713c6d101c64afe35adfae0977a5ab4c7e07a0b170b041258adbf2"], - ["8713bc4f01b411149d575ebae575f5dd7e456198d61d238695df459dd9b86c4e3b2734b62e0300000004abac6363ffffffff03b58049050000000002ac653c714c04000000000953656a005151526a527b5a9e03000000000652ac5100525300000000", "52", 0, -647281251, "0e0bed1bf2ff255aef6e5c587f879ae0be6222ab33bd75ee365ec6fbb8acbe38"], - ["f2ba8a8701b9c401efe3dd0695d655e20532b90ac0142768cee4a3bb0a89646758f544aa8102000000036a52527899f4e4040c6f0b030000000008636565ab530051ab52b60c000000000009515200ab630053ac53a49c5f040000000008ab53ab516300ab63fa27340300000000015100000000", "ac63abab5251", 0, -1328936437, "ab61497afd39e61fe06bc5677326919716f9b20083c9f3417dcea905090e0411"], - ["b5a7df6102107beded33ae7f1dec0531d4829dff7477260925aa2cba54119b7a07d92d5a1d02000000046a516a52803b625c334c1d2107a326538a3db92c6c6ae3f7c3516cd90a09b619ec6f58d10e77bd6703000000056563006a63ffffffff0117484b03000000000853acab52526a65abc1b548a1", "ac006a525100", 0, 2074359913, "680336db57347d8183b8898cd27a83f1ba5884155aeae5ce20b4840b75e12871"], - ["278cb16204b9dadf400266106392c4aa9df01ba03af988c8139dae4c1818ac009f13fc5f1a00000000065200ac656a52ffffffffd006bbebd8cbd7bdead24cddc9badfcc6bc0c2e63c037e5c29aa858f5d0f3e7d01000000046a0051acffffffffbc62a5f57e58da0b67956003ae81ac97cb4cbd1d694c914fc41515c008c4d8fd020000000165e329c844bcc16164be64b64a81cbf4ffd41ed2934e0daa0040ccb8365bab0b2a9e401c180300000003ab52abffffffff02588460030000000000a25a12030000000005535100005300000000", "6553ab6a5300acab51", 3, 989407546, "1c29f110576f4a3b257f67454d99dfc0dee62ef5517ca702848ce4bd2ea1a1d7"], - ["49eb2178020a04fca08612c34959fd41447319c190fb7ffed9f71c235aa77bec28703aa1820200000003ac6353abaff326071f07ec6b77fb651af06e8e8bd171068ec96b52ed584de1d71437fed186aecf0300000001acffffffff03da3dbe02000000000652ac63ac6aab8f3b680400000000096a536a65636a53516a5175470100000000016500000000", "6a536365", 0, 1283691249, "c670219a93234929f662ecb9aa148a85a2d281e83f4e53d10509461cdea47979"], - ["0f96cea9019b4b3233c0485d5b1bad770c246fe8d4a58fb24c3b7dfdb3b0fd90ea4e8e947f0300000006006a5163515303571e1e01906956030000000005ab635353abadc0fbbe", "acac", 0, -1491469027, "716a8180e417228f769dcb49e0491e3fda63badf3d5ea0ceeac7970d483dd7e2"], - ["9a7d858604577171f5fe3f3fd3e5e039c4b0a06717a5381e9977d80e9f53e025e0f16d2877020000000752636565536353ffffffff5862bd028e8276e63f044be1dddcbb8d0c3fa097678308abf2b0f45104a93dbd0100000001531200667ba8fdd3b28e98a35da73d3ddfe51e210303d8eb580f923de988ee632d77793892030000000752526363526563ffffffffe9744eb44db2658f120847c77f47786d268c302120d269e6004455aa3ea5f5e20200000009ab6300636aab656551ffffffff03c61a3c020000000009ab516a6aab6aab53ab737f1a05000000000853acabab655365ab92a4a00400000000016367edf6c8", "535352ab", 3, 659348595, "d36ee79fc80db2e63e05cdc50357d186181b40ae20e3720878284228a13ee8b3"], - ["148e68480196eb52529af8e83e14127cbfdbd4a174e60a86ac2d86eac9665f46f4447cf7aa01000000045200ac538f8f871401cf240c0300000000065252ab52656a5266cf61", "", 0, -344314825, "eacc47c5a53734d6ae3aedbc6a7c0a75a1565310851b29ef0342dc4745ceb607"], - ["e2bc29d4013660631ba14ecf75c60ec5e9bed7237524d8c10f66d0675daa66d1492cb834530200000004ac510065e42d0c9e04f2b26c01000000000951525152acac65ababa35b7504000000000953ac6aac00650053ab94688c0400000000056365526553a1bced0300000000016a00000000", "65ab0063655353", 0, -888431789, "59a34b3ed3a1cce0b104de8f7d733f2d386ffc7445efae67680cd90bc915f7e0"], - ["0c8a70d70494dca6ab05b2bc941b5b431c43a292bd8f2f02eab5e240a408ca73a676044a4103000000056a51ab006affffffff84496004e54836c035821f14439149f22e1db834f315b24588ba2f031511926c0100000000ffffffffbbc5e70ed1c3060ba1bfe99c1656a3158a7307c3ce8eb362ec32c668596d2bd30000000009636563635351abab00b039344c6fc4f9bec24322e45407af271b2d3dfec5f259ee2fc7227bc5285e22b3be85b40100000009ac00ab53abac6a5352e5ddfcff02d50231020000000005006a51536ab086d9020000000006ababac51ac6a00000000", "abab636565acac6a", 3, 241546088, "643a7b4c8d832e14d5c10762e74ec84f2c3f7ed96c03053157f1bed226614911"], - ["f98f79cf0274b745e1d6f36da7cbe205a79132a7ad462bdc434cfb1dcd62a6977c3d2a5dbc010000000553516a5365ffffffff4f89f485b53cdad7fb80cc1b7e314b9735b9383bc92c1248bb0e5c6173a55c0d010000000353655293f9b014045ad96d02000000000963ac526a53ac636365f4c27904000000000952536563635152526a2788f0030000000002516aff5add01000000000863530051655351abd04716ba", "ab6552536a53", 1, -2128899945, "56d29f5e300ddfed2cd8dcce5d79826e193981d0b70dc7487772c8a0b3b8d7b1"], - ["6c7913f902aa3f5f939dd1615114ce961beda7c1e0dd195be36a2f0d9d047c28ac62738c3a020000000453abac00ffffffff477bf2c5b5c6733881447ac1ecaff3a6f80d7016eee3513f382ad7f554015b970100000007ab6563acab5152ffffffff04e58fe1040000000009ab00526aabab526553e59790010000000002ab525a834b03000000000035fdaf0200000000086551ac65515200ab00000000", "63ac53", 1, 1285478169, "1536da582a0b6de017862445e91ba14181bd6bf953f4de2f46b040d351a747c9"], - ["4624aa9204584f06a8a325c84e3b108cafb97a387af62dc9eab9afd85ae5e2c71e593a3b690200000003636a005eb2b44eabbaeca6257c442fea00107c80e32e8715a1293cc164a42e62ce14fea146220c020000000090b9ee38106e3310037bfc519fd209bdbd21c588522a0e96df5fba4e979392bc993bfe9f01000000086363636a635353ab6f1907d218ef6f3c729d9200e23c1dbff2df58b8b1282c6717b26cf760ee4c880d23f4d100000000086a516a536a525163ffffffff01d6f162050000000000ebbab208", "525365ab0053", 1, -1515409325, "6cf9cd409b7185b1f118171f0a34217af5b612ea54195ea186505b667c19337f"], - ["16562fc503f1cf9113987040c408bfd4523f1512da699a2ca6ba122dc65677a4c9bf7763830000000003636552ffffffff1ec1fab5ff099d1c8e6b068156f4e39b5543286bab53c6d61e2582d1e07c96cf02000000045163656affffffffd0ef40003524d54c08cb4d13a5ee61c84fbb28cde9eca7a6d11ba3a9335d8c620100000007635153536a6300fbb84fc2012003a601000000000363ab6a00000000", "63636a006a6aab", 0, -1310262675, "1efbf3d37a92bc03d9eb950b792f307e95504f7c4998f668aa250707ebb752ac"], - ["531665d701f86bacbdb881c317ef60d9cd1baeffb2475e57d3b282cd9225e2a3bf9cbe0ded01000000086300ac515263acabffffffff0453a8500100000000086353acab516a6565e5e9200500000000026a52a44caa00000000000453ac000065e41b0500000000076500ac0065526ab4476f4d", "006563006aab00636a", 0, 1770013777, "0898b26dd3ca08632a5131fa48eb55b44386d0c5070c24d6e329673d5e3693b8"], - ["0f1227a20140655a3da36e413b9b5d108a866f6f147eb4940f032f5a89854eae6d7c3a91600100000009525363515153515253e37a79480161ab61020000000001ab00000000", "ab65005200", 0, -1996383599, "979782dc3f36d908d37d7e4046a38d306b4b08ddc60a5eba355fe3d6da1b29a9"], - ["063ff6eb01aff98d0d2a6db224475010edb634c2f3b46257084676adeb84165a4ff8558d7601000000066353006a5165deb3262c042d109c0000000000076363ab52ac005200b9c4050000000007516300ac510063cfffc800000000000200639e815501000000000700526a52ac6365ac7b07b8", "656552abac6500", 0, -1559847112, "674a4bcb04247f8dc98780f1792cac86b8aee41a800fc1e6f5032f6e1dccde65"], - ["3320f6730132f830c4681d0cae542188e4177cad5d526fae84565c60ceb5c0118e844f90bd030000000163ffffffff0257ec5a040000000005525251ac6538344d000000000002515200000000", "5352656a53ac516a65", 0, 788050308, "3afacaca0ef6be9d39e71d7b1b118994f99e4ea5973c9107ca687d28d8eba485"], - ["c13aa4b702eedd7cde09d0416e649a890d40e675aa9b5b6d6912686e20e9b9e10dbd40abb1000000000863ab6353515351ac11d24dc4cc22ded7cdbc13edd3f87bd4b226eda3e4408853a57bcd1becf2df2a1671fd1600000000045165516affffffff01baea300100000000076aab52ab53005300000000", "0065", 0, -1195908377, "241a23e7b1982d5f78917ed97a8678087acbbffe7f624b81df78a5fe5e41e754"], - ["d9a6f20e019dd1b5fae897fb472843903f9c3c2293a0ffb59cff2b413bae6eceab574aaf9d030000000663ab006a515102f54939032df5100100000000056a51ab65530ec28f010000000004ac5100007e874905000000000651005265ac6a00000000", "abacab63acacabab", 0, 271463254, "1326a46f4c21e7619f30a992719a905aa1632aaf481a57e1cbd7d7c22139b41e"], - ["157c81bf0490432b3fcb3f9a5b79e5f91f67f05efb89fa1c8740a3fe7e9bdc18d7cb6acd2203000000026351ffffffff912e48e72bbcf8a540b693cf8b028e532a950e6e63a28801f6eaad1afcc52ad00000000000b1a4b170a2b9e60e0cad88a0085137309f6807d25d5afb5c1e1d32aa10ba1cdf7df596dd0000000009525165656a51ab65ab3674fba32a76fe09b273618d5f14124465933f4190ba4e0fd09d838daafc6223b31642ac00000000086a53536551ac6565ffffffff01fe9fb6030000000008ab51656a5165636a00000000", "ab00ab6a6551", 3, -64357617, "1ddaab7f973551d71f16bd70c4c4edbf7225e64e784a6da0ee7f7a9fe4f12a0b"], - ["a2692fff03b2387f5bacd5640c86ba7df574a0ee9ed7f66f22c73cccaef3907eae791cbd230200000004536363abffffffff4d9fe7e5b375de88ba48925d9b2005447a69ea2e00495a96eafb2f144ad475b40000000008000053000052636537259bee3cedd3dcc07c8f423739690c590dc195274a7d398fa196af37f3e9b4a1413f810000000006ac63acac52abffffffff04c65fe60200000000075151536365ab657236fc020000000009005263ab00656a6a5195b8b6030000000007ac5165636aac6a7d7b66010000000002acab00000000", "51", 2, -826546582, "925037c7dc7625f3f12dc83904755a37016560de8e1cdd153c88270a7201cf15"], - ["2c5b003201b88654ac2d02ff6762446cb5a4af77586f05e65ee5d54680cea13291efcf930d0100000005ab536a006a37423d2504100367000000000004536a515335149800000000000152166aeb03000000000452510063226c8e03000000000000000000", "635251", 0, 1060344799, "7e058ca5dd07640e4aae7dea731cfb7d7fef1bfd0d6d7b6ce109d041f4ca2a31"], - ["f981b9e104acb93b9a7e2375080f3ea0e7a94ce54cd8fb25c57992fa8042bdf4378572859f0100000002630008604febba7e4837da77084d5d1b81965e0ea0deb6d61278b6be8627b0d9a2ecd7aeb06a0300000005ac5353536a42af3ef15ce7a2cd60482fc0d191c4236e66b4b48c9018d7dbe4db820f5925aad0e8b52a0300000008ab0063510052516301863715efc8608bf69c0343f18fb81a8b0c720898a3563eca8fe630736c0440a179129d03000000086aac6a52ac6a63ac44fec4c00408320a03000000000062c21c030000000007ac6a655263006553835f0100000000015303cd60000000000005535263536558b596e0", "00", 0, -2140385880, "49870a961263354c9baf108c6979b28261f99b374e97605baa532d9fa3848797"], - ["e7416df901269b7af14a13d9d0507709b3cd751f586ce9d5da8d16a121e1bd481f5a086e1103000000056aab005200ffffffff01aa269c040000000006acac6a6a5263ee718de6", "ab525363", 0, 1309186551, "eea7d2212bda2d408fff146f9ae5e85e6b640a93b9362622bb9d5e6e36798389"], - ["402a815902193073625ab13d876190d1bbb72aecb0ea733c3330f2a4c2fe6146f322d8843a0300000008656aab0000535363fffffffff9dccdec5d8509d9297d26dfcb1e789cf02236c77dc4b90ebccbf94d1b5821150300000001510bf1f96a03c5c145000000000002ac6ae11b1c0100000000055163516a5239c8a600000000000365636300000000", "63536aacab", 0, -1811424955, "0090803a20102a778ab967a74532faee13e03b702083b090b1497bc2267ee2fe"], - ["c4b702e502f1a54f235224f0e6de961d2e53b506ab45b9a40805d1dacd35148f0acf24ca5e00000000085200ac65ac53acabf34ba6099135658460de9d9b433b84a8562032723635baf21ca1db561dce1c13a06f4407000000000851ac006a63516aabffffffff02a853a603000000000163d17a67030000000005ab63006a5200000000", "ac5363515153", 1, 480734903, "5c46f7ac3d6460af0da28468fcc5b3c87f2b9093d0f837954b7c8174b4d7b6e7"], - ["9b83f78704f492b9b353a3faad8d93f688e885030c274856e4037818848b99e490afef27770200000000ffffffff36b60675a5888c0ef4d9e11744ecd90d9fe9e6d8abb4cff5666c898fdce98d9e00000000056aab656352596370fca7a7c139752971e169a1af3e67d7656fc4fc7fd3b98408e607c2f2c836c9f27c030000000653ac51ab6300a0761de7e158947f401b3595b7dc0fe7b75fa9c833d13f1af57b9206e4012de0c41b8124030000000953656a53ab53510052242e5f5601bf83b301000000000465516a6300000000", "63515200ac656365", 3, -150879312, "9cf05990421ea853782e4a2c67118e03434629e7d52ab3f1d55c37cf7d72cdc4"], - ["f492a9da04f80b679708c01224f68203d5ea2668b1f442ebba16b1aa4301d2fe5b4e2568f3010000000953005351525263ab65ffffffff93b34c3f37d4a66df255b514419105b56d7d60c24bf395415eda3d3d8aa5cd0101000000020065ffffffff9dba34dabdc4f1643b372b6b77fdf2b482b33ed425914bb4b1a61e4fad33cf390000000002ab52ffffffffbbf3dc82f397ef3ee902c5146c8a80d9a1344fa6e38b7abce0f157be7adaefae0000000009515351005365006a51ffffffff021359ba010000000000403fea0200000000095200ac6353abac635300000000", "00ac51acacac", 0, -2115078404, "fd44fc98639ca32c927929196fc3f3594578f4c4bd248156a25c04a65bf3a9f3"], - ["2f73e0b304f154d3a00fde2fdd40e791295e28d6cb76af9c0fd8547acf3771a02e3a92ba37030000000852ac6351ab6565639aa95467b065cec61b6e7dc4d6192b5536a7c569315fb43f470078b31ed22a55dab8265f02000000080065636a6aab6a53ffffffff9e3addbff52b2aaf9fe49c67017395198a9b71f0aa668c5cb354d06c295a691a0100000000ffffffff45c2b4019abaf05c5e484df982a4a07459204d1343a6ee5badade358141f8f990300000007ac516a6aacac6308655cd601f3bc2f0000000000015200000000", "", 0, -2082053939, "9a95e692e1f78efd3e46bb98f178a1e3a0ef60bd0301d9f064c0e5703dc879c2"], - ["5a60b9b503553f3c099f775db56af3456330f1e44e67355c4ab290d22764b9144a7b5f959003000000030052acbd63e0564decc8659aa53868be48c1bfcda0a8c9857b0db32a217bc8b46d9e7323fe9649020000000553ac6551abd0ecf806211db989bead96c09c7f3ec5f73c1411d3329d47d12f9e46678f09bac0dc383e0200000000ffffffff01494bb202000000000500516551ac00000000", "ac", 0, 1169947809, "62a36c6e8da037202fa8aeae03e533665376d5a4e0a854fc4624a75ec52e4eb1"], - ["7e98d353045569c52347ca0ff2fdba608829e744f61eb779ffdb5830aae0e6d6857ab2690e03000000075365acab656352ffffffffa890dd37818776d12da8dca53d02d243ef23b4535c67016f4c58103eed85360f030000000093dbacdc25ca65d2951e047d6102c4a7da5e37f3d5e3c8b87c29b489360725dcd117ee2003000000056a6300ac53c7e99fa1dc2b8b51733034e6555f6d6de47dbbf1026effac7db80cb2080678687380dc1e02000000075352005263516affffffff04423272040000000008ab6353ab65510051e0f53b0500000000086300516552635152f74a5f04000000000853acab0053ab52ab0e8e5f00000000000951ac5363516a6aabab00000000", "6a5163ab52", 3, 890006103, "476868cecd1763c91dade98f17defa42d31049547df45acffa1cc5ae5c3d75d6"], - ["e3649aa40405e6ffe377dbb1bbbb672a40d8424c430fa6512c6165273a2b9b6afa9949ec430200000007630052ab655153a365f62f2792fa90c784efe3f0981134d72aac0b1e1578097132c7f0406671457c332b84020000000353ab6ad780f40cf51be22bb4ff755434779c7f1def4999e4f289d2bd23d142f36b66fbe5cfbb4b01000000076a5252abac52ab1430ffdc67127c9c0fc97dcd4b578dab64f4fb9550d2b59d599773962077a563e8b6732c02000000016affffffff04cb2687000000000002ab636e320904000000000252acf70e9401000000000100dc3393050000000006ab0063536aacbc231765", "65520053", 3, -2016196547, "f64f805f0ff7f237359fa6b0e58085f3c766d1859003332223444fd29144112a"], - ["1d033569040700441686672832b531ab55db89b50dc1f9fc00fb72218b652da9dcfbc83be901000000066551ac526a632b390f9ad068e5fdee6563e88e2a8e4e09763c861072713dc069893dc6bbc9db3f00e26502000000096a5363526565525252ffffffff8a36bdd0aaf38f6707592d203e14476ca9f259021e487135c7e8324244057ed90300000000ed3fb2a3dfd4d46b5f3603fe0148653911988457bd0ed7f742b07c452f5476c228ff9f600200000007526aac00525152ffffffff04b88e48030000000000c753d602000000000853510000006553518fda2603000000000853ac52acac5263534839f1030000000006ac006aacac5300000000", "516553635300ab0052", 1, 2075958316, "c2cefaec2293134acbcf6d2a8bf2b3eb42e4ec04ee8f8bf30ff23e65680677c1"], - ["4c4be7540344050e3044f0f1d628039a334a7c1f7b4573469cfea46101d6888bb6161fe9710200000000ffffffffac85a4fdad641d8e28523f78cf5b0f4dc74e6c5d903c10b358dd13a5a1fd8a06000000000163e0ae75d05616b72467b691dc207fe2e65ea35e2eadb7e06ea442b2adb9715f212c0924f10200000000ffffffff0194ddfe02000000000265ac00000000", "00006500", 1, -479922562, "d66924d49f03a6960d3ca479f3415d638c45889ce9ab05e25b65ac260b51d634"], - ["202c18eb012bc0a987e69e205aea63f0f0c089f96dd8f0e9fcde199f2f37892b1d4e6da90302000000055352ac6565ffffffff0257e5450100000000025300ad257203000000000000000000", "520052ac6a005265", 0, 168054797, "502967a6f999f7ee25610a443caf8653dda288e6d644a77537bcc115a8a29894"], - ["32fa0b0804e6ea101e137665a041cc2350b794e59bf42d9b09088b01cde806ec1bbea077df0200000008515153650000006506a11c55904258fa418e57b88b12724b81153260d3f4c9f080439789a391ab147aabb0fa0000000007000052ac51ab510986f2a15c0d5e05d20dc876dd2dafa435276d53da7b47c393f20900e55f163b97ce0b800000000008ab526a520065636a8087df7d4d9c985fb42308fb09dce704650719140aa6050e8955fa5d2ea46b464a333f870000000009636300636a6565006affffffff01994a0d040000000002536500000000", "516563530065", 2, -163068286, "f58637277d2bc42e18358dc55f7e87e7043f5e33f4ce1fc974e715ef0d3d1c2a"], - ["ae23424d040cd884ebfb9a815d8f17176980ab8015285e03fdde899449f4ae71e04275e9a80100000007ab006553530053ffffffff018e06db6af519dadc5280c07791c0fd33251500955e43fe4ac747a4df5c54df020000000251ac330e977c0fec6149a1768e0d312fdb53ed9953a3737d7b5d06aad4d86e9970346a4feeb5030000000951ab51ac6563ab526a67cabc431ee3d8111224d5ecdbb7d717aa8fe82ce4a63842c9bd1aa848f111910e5ae1eb0100000004ac515300bfb7e0d7048acddc030000000009636a5253636a655363a3428e040000000001525b99c6050000000004655265ab717e6e020000000000d99011eb", "ac6a6a516565", 1, -716251549, "b098eb9aff1bbd375c70a0cbb9497882ab51f3abfebbf4e1f8d74c0739dc7717"], - ["030f44fc01b4a9267335a95677bd190c1c12655e64df74addc53b753641259af1a54146baa020000000152e004b56c04ba11780300000000026a53f125f001000000000251acd2cc7c03000000000763536563655363c9b9e50500000000015200000000", "ac", 0, -1351818298, "19dd32190ed2a37be22f0224a9b55b91e37290577c6c346d36d32774db0219a3"], - ["c05f448f02817740b30652c5681a3b128322f9dc97d166bd4402d39c37c0b14506d8adb5890300000003536353ffffffffa188b430357055ba291c648f951cd2f9b28a2e76353bef391b71a889ba68d5fc02000000056565526a6affffffff02745f73010000000001ab3ec34c0400000000036aac5200000000", "516551510053", 0, -267877178, "3a1c6742d4c374f061b1ebe330b1e169a113a19792a1fdde979b53e094cc4a3c"], - ["163ba45703dd8c2c5a1c1f8b806afdc710a2a8fc40c0138e2d83e329e0e02a9b6c837ff6b8000000000700655151ab6a522b48b8f134eb1a7e6f5a6fa319ce9d11b36327ba427b7d65ead3b4a6a69f85cda8bbcd22030000000563656552acffffffffdbcf4955232bd11eef0cc6954f3f6279675b2956b9bcc24f08c360894027a60201000000066500006500abffffffff04d0ce9d0200000000008380650000000000015233f360040000000003006aabedcf0801000000000000000000", "000065006500ac", 0, 216965323, "9afe3f4978df6a86e9a8ebd62ef6a9d48a2203f02629349f1864ef2b8b92fd55"], - ["07f7f5530453a12ad0c7eb8fbc3f140c7ab6818144d67d2d8752600ca5d9a9358e2dff87d4000000000663526aab526a9e599c379d455e2da36d0cde88d931a863a3e97e01e93b9edb65856f3d958dc08b92b720000000000165bbc8d66dae3b1b170a6e2457f5b161465cb8706e0e6ffc6af55deb918365f14c5f40d4890100000000a7bd77c069ee4b48638e2363fcf2a86b02bea022047bd9fcb16d2b94ad068308d19b31cb00000000066aab5300ab529672aa8f01dbd8a205000000000663536353006a02e99901", "ac006351006a63ab63", 1, 119789359, "6629a1e75c6ae8f4f9d5f734246b6a71682a5ea57246040ef0584f6b97916175"], - ["fe647f950311bf8f3a4d90afd7517df306e04a344d2b2a2fea368935faf11fa6882505890d0000000005ab5100516affffffff43c140947d9778718919c49c0535667fc6cc727f5876851cb8f7b6460710c7f60100000000ffffffffce4aa5d90d7ab93cbec2e9626a435afcf2a68dd693c15b0e1ece81a9fcbe025e0300000000ffffffff02f34806020000000002515262e54403000000000965635151ac655363636de5ce24", "6a005100ac516351", 2, 989643518, "818a7ceaf963f52b5c48a7f01681ac6653c26b63a9f491856f090d9d60f2ffe3"], - ["a1050f8604d0f9d2feefcdb5051ae0052f38e21bf39daf583fd0c3900faa3eab5d431c0bbe030000000653536a005151683d27e5c6e0da8f22125823f32d5d98477d8098ef36263b9694d61d4d85d3f2ac02b7570200000007000052005165abffffffff0cad981542bcb54a87d9400aa63e514c7c6fab7158c2b1fb37821ea755eb162a0200000000b94feb5100e5ef3bf8ed8d43356c8a8d5ac6c7e80d7ff6040f4f0aa19abbe783f4f461240200000007636500000052655686fd70042be3ad02000000000465ab636a15680b000000000004acac53511277c705000000000452635252d27a0102000000000000000000", "6a6aacab65655251", 1, -982144648, "dfcf484111801989eb6df8dc2bafb944d7365ffeb36a575a08f3270d3ef24c9f"], - ["cef7316804c3e77fe67fc6207a1ea6ae6eb06b3bf1b3a4010a45ae5c7ad677bb8a4ebd16d90200000009ac536a5152ac5263005301ab8a0da2b3e0654d31a30264f9356ba1851c820a403be2948d35cafc7f9fe67a06960300000006526a63636a53ffffffffbada0d85465199fa4232c6e4222df790470c5b7afd54704595a48eedd7a4916b030000000865ab63ac006a006ab28dba4ad55e58b5375053f78b8cdf4879f723ea4068aed3dd4138766cb4d80aab0aff3d0300000003ac6a00ffffffff010f5dd6010000000006ab006aab51ab00000000", "", 1, 889284257, "d0f32a6db43378af84b063a6706d614e2d647031cf066997c48c04de3b493a94"], - ["7b3ff28004ba3c7590ed6e36f45453ebb3f16636fe716acb2418bb2963df596a50ed954d2e03000000065251515265abffffffff706ee16e32e22179400c9841013971645dabf63a3a6d2d5feb42f83aa468983e030000000653ac51ac5152ffffffffa03a16e5e5de65dfa848b9a64ee8bf8656cc1f96b06a15d35bd5f3d32629876e020000000043c1a3965448b3b46f0f0689f1368f3b2981208a368ec5c30defb35595ef9cf95ffd10e902000000036aac65253a5bbe042e907204000000000800006565656352634203b4020000000002656336b3b7010000000001ab7a063f0100000000026500a233cb76", "006551636a53ac5251", 1, -1144216171, "68c7bd717b399b1ee33a6562a916825a2fed3019cdf4920418bb72ffd7403c8c"], - ["d5c1b16f0248c60a3ddccf7ebd1b3f260360bbdf2230577d1c236891a1993725e262e1b6cb000000000363636affffffff0a32362cfe68d25b243a015fc9aa172ea9c6b087c9e231474bb01824fd6bd8bc0300000005ab52ab516affffffff0420d9a70200000000045152656a45765d0000000000055252536a5277bad100000000000252ab3f3f3803000000000463acac5200000000", "52636a52ab65", 1, 1305123906, "978dc178ecd03d403b048213d904653979d11c51730381c96c4208e3ea24243a"], - ["1be8ee5604a9937ebecffc832155d9ba7860d0ca451eaced58ca3688945a31d93420c27c460100000006abac5300535288b65458af2f17cbbf7c5fbcdcfb334ffd84c1510d5500dc7d25a43c36679b702e850f7c0200000003005300ffffffff7c237281cb859653eb5bb0a66dbb7aeb2ac11d99ba9ed0f12c766a8ae2a2157203000000086aabac526365acabfffffffff09d3d6639849f442a6a52ad10a5d0e4cb1f4a6b22a98a8f442f60280c9e5be80200000007ab00ab6565ab52ffffffff0398fe83030000000005526aababacbdd6ec010000000005535252ab6a82c1e6040000000001652b71c40c", "6563526353656351", 2, -853634888, "0d936cceda2f56c7bb87d90a7b508f6208577014ff280910a710580357df25f3"], - ["9e0f99c504fbca858c209c6d9371ddd78985be1ab52845db0720af9ae5e2664d352f5037d4010000000552ac53636affffffff0e0ce866bc3f5b0a49748f597c18fa47a2483b8a94cef1d7295d9a5d36d31ae7030000000663515263ac635bb5d1698325164cdd3f7f3f7831635a3588f26d47cc30bf0fefd56cd87dc4e84f162ab702000000036a6365ffffffff85c2b1a61de4bcbd1d5332d5f59f338dd5e8accbc466fd860f96eef1f54c28ec030000000165ffffffff04f5cabd010000000007000052ac526563c18f1502000000000465510051dc9157050000000008655363ac525253ac506bb600000000000865656a53ab63006a00000000", "006a6a0052", 0, 1186324483, "2f9b7348600336512686e7271c53015d1cb096ab1a5e0bce49acd35bceb42bc8"], - ["11ce51f90164b4b54b9278f0337d95c50d16f6828fcb641df9c7a041a2b274aa70b1250f2b0000000008ab6a6a65006551524c9fe7f604af44be050000000005525365006521f79a0300000000015306bb4e04000000000265ac99611a05000000000765acab656500006dc866d0", "", 0, -1710478768, "cfa4b7573559b3b199478880c8013fa713ca81ca8754a3fd68a6d7ee6147dc5a"], - ["86bc233e02ba3c647e356558e7252481a7769491fb46e883dd547a4ce9898fc9a1ca1b77790000000006ab5351abab51f0c1d09c37696d5c7c257788f5dff5583f4700687bcb7d4acfb48521dc953659e325fa390300000003acac5280f29523027225af03000000000963abac0065ab65acab7e59d90400000000016549dac846", "53006aac52acac", 0, 711159875, "880330ccde00991503ea598a6dfd81135c6cda9d317820352781417f89134d85"], - ["beac155d03a853bf18cd5c490bb2a245b3b2a501a3ce5967945b0bf388fec2ba9f04c03d68030000000012fe96283aec4d3aafed8f888b0f1534bd903f9cd1af86a7e64006a2fa0d2d30711af770010000000163ffffffffd963a19d19a292104b9021c535d3e302925543fb3b5ed39fb2124ee23a9db00302000000056500ac63acffffffff01ad67f503000000000300ac5189f78db2", "53536a636500", 2, 748992863, "bde3dd0575164d7ece3b5783ce0783ffddb7df98f178fe6468683230314f285a"], - ["81dab34a039c9e225ba8ef421ec8e0e9d46b5172e892058a9ade579fe0eb239f7d9c97d45b0300000009ac65655351ab526363ffffffff10c0faaf7f597fc8b00bbc67c3fd4c6b70ca6b22718d15946bf6b032e62dae570000000005536a00ab6a02cddec3acf985bbe62c96fccf17012a87026ed63fc6756fa39e286eb4c2dd79b59d37400300000002516affffffff04f18b8d03000000000753abab5152636564411c02000000000400ab6300e965750300000000001bd2cf02000000000565ab526aab00000000", "006551ab", 0, -1488174485, "a3d65a8cd0c1eea8558d01396b929520a2221c29d9f25f29035b8abae874447f"], - ["489ebbf10478e260ba88c0168bd7509a651b36aaee983e400c7063da39c93bf28100011f280100000004abab63ab2fc856f05f59b257a4445253e0d91b6dffe32302d520ac8e7f6f2467f7f6b4b65f2f59e903000000096353abacab6351656affffffff0122d9480db6c45a2c6fd68b7bc57246edffbf6330c39ccd36aa3aa45ec108fc030000000265ab9a7e78a69aadd6b030b12602dff0739bbc346b466c7c0129b34f50ae1f61e634e11e9f3d0000000006516a53525100ffffffff011271070000000000086563ab6353536352c4dd0e2c", "", 0, -293358504, "4eba3055bc2b58765593ec6e11775cea4b6493d8f785e28d01e2d5470ea71575"], - ["6911195d04f449e8eade3bc49fd09b6fb4b7b7ec86529918b8593a9f6c34c2f2d301ec378b000000000263ab49162266af054643505b572c24ff6f8e4c920e601b23b3c42095881857d00caf56b28acd030000000565525200ac3ac4d24cb59ee8cfec0950312dcdcc14d1b360ab343e834004a5628d629642422f3c5acc02000000035100accf99b663e3c74787aba1272129a34130668a877cc6516bfb7574af9fa6d07f9b4197303400000000085351ab5152635252ffffffff042b3c95000000000000ff92330200000000046a5252ab884a2402000000000853530065520063000d78be03000000000953abab52ab53ac65aba72cb34b", "6a", 2, -637739405, "6b80d74eb0e7ee59d14f06f30ba7d72a48d3a8ff2d68d3b99e770dec23e9284f"], - ["746347cf03faa548f4c0b9d2bd96504d2e780292730f690bf0475b188493fb67ca58dcca4f0000000002005336e3521bfb94c254058e852a32fc4cf50d99f9cc7215f7c632b251922104f638aa0b9d080100000008656aac5351635251ffffffff4da22a678bb5bb3ad1a29f97f6f7e5b5de11bb80bcf2f7bb96b67b9f1ac44d09030000000365ababffffffff036f02b30000000000076353ab6aac63ac50b72a050000000002acaba8abf804000000000663006a6a6353797eb999", "acac5100", 1, -1484493812, "164c32a263f357e385bd744619b91c3f9e3ce6c256d6a827d6defcbdff38fa75"], - ["e17149010239dd33f847bf1f57896db60e955117d8cf013e7553fae6baa9acd3d0f1412ad90200000006516500516500cb7b32a8a67d58dddfb6ceb5897e75ef1c1ff812d8cd73875856487826dec4a4e2d2422a0100000004ac525365196dbb69039229270400000000070000535351636a8b7596020000000006ab51ac52655131e99d040000000003516551ee437f5c", "ac656a53", 1, 1102662601, "8858bb47a042243f369f27d9ab4a9cd6216adeac1c1ac413ed0890e46f23d3f3"], - ["144971940223597a2d1dec49c7d4ec557e4f4bd207428618bafa3c96c411752d494249e1fb0100000004526a5151ffffffff340a545b1080d4f7e2225ff1c9831f283a7d4ca4d3d0a29d12e07d86d6826f7f0200000003006553ffffffff03c36965000000000000dfa9af00000000000451636aac7f7d140300000000016300000000", "", 1, -108117779, "c84fcaf9d779df736a26cc3cabd04d0e61150d4d5472dd5358d6626e610be57f"], - ["b11b6752044e650b9c4744fb9c930819227d2ac4040d8c91a133080e090b042a142e93906e0000000003650053ffffffff6b9ce7e29550d3c1676b702e5e1537567354b002c8b7bb3d3535e63ad03b50ea01000000055100516300fffffffffcf7b252fea3ad5a108af3640a9bc2cd724a7a3ce22a760fba95496e88e2f2e801000000036a00ac7c58df5efba193d33d9549547f6ca839f93e14fa0e111f780c28c60cc938f785b363941b000000000863ab51516552ac5265e51fcd0308e9830400000000036a00abab72190300000000016a63d0710000000000050051ab6a6300000000", "53005165ac51ab65", 0, 229563932, "e562579d1a2b10d1c5e45c06513456002a6bec157d7eb42511d30b118103c052"], - ["2aee6b9a02172a8288e02fac654520c9dd9ab93cf514d73163701f4788b4caeeb9297d2e250300000004ab6363008fb36695528d7482710ea2926412f877a3b20acae31e9d3091406bfa6b62ebf9d9d2a6470100000009535165536a63520065ffffffff03f7b560050000000003acab6a9a8338050000000000206ce90000000000056552516a5100000000", "5252", 1, -1102319963, "fa4676c374ae3a417124b4c970d1ed3319dc3ac91fb36efca1aa9ed981a8aa1b"], - ["9554595203ad5d687f34474685425c1919e3d2cd05cf2dac89d5f33cd3963e5bb43f8706480100000000ffffffff9de2539c2fe3000d59afbd376cb46cefa8bd01dbc43938ff6089b63d68acdc2b02000000096553655251536a6500fffffffff9695e4016cd4dfeb5f7dadf00968e6a409ef048f81922cec231efed4ac78f5d010000000763abab6a5365006caaf0070162cc640200000000045163ab5100000000", "", 0, -1105256289, "e8e10ed162b1a43bfd23bd06b74a6c2f138b8dc1ab094ffb2fa11d5b22869bee"], - ["04f51f2a0484cba53d63de1cb0efdcb222999cdf2dd9d19b3542a896ca96e23a643dfc45f00200000007acac53510063002b091fd0bfc0cfb386edf7b9e694f1927d7a3cf4e1d2ce937c1e01610313729ef6419ae7030000000165a3372a913c59b8b3da458335dc1714805c0db98992fd0d93f16a7f28c55dc747fe66a5b503000000095351ab65ab52536351ffffffff5650b318b3e236802a4e41ed9bc0a19c32b7aa3f9b2cda1178f84499963a0cde000000000165ffffffff0383954f04000000000553ac536363a8fc90030000000000a2e315000000000005acab00ab5100000000", "0053", 2, -1424653648, "a5bc0356f56b2b41a2314ec05bee7b91ef57f1074bcd2efc4da442222269d1a3"], - ["5e4fab42024a27f0544fe11abc781f46596f75086730be9d16ce948b04cc36f86db7ad50fd01000000026a00613330f4916285b5305cc2d3de6f0293946aa6362fc087727e5203e558c676b314ef8dd401000000001af590d202ba496f040000000001009e3c9604000000000351ac51943d64d3", "51acabab5100ab52", 1, -129301207, "556c3f90aa81f9b4df5b92a23399fe6432cf8fecf7bba66fd8fdb0246440036c"], - ["a115284704b88b45a5f060af429a3a8eab10b26b7c15ed421258f5320fa22f4882817d6c2b0300000003005300ffffffff4162f4d738e973e5d26991452769b2e1be4b2b5b7e8cbeab79b9cf9df2882c040000000006636aac63ac5194abc8aa22f8ddc8a7ab102a58e39671683d1891799d19bd1308d24ea6d365e571172f1e030000000700515352515153ffffffff4da7ad75ce6d8541acbb0226e9818a1784e9c97c54b7d1ff82f791df1c6578f60000000000ffffffff01b1f265040000000009ab0051ac656a516a5300000000", "51abab6352535265", 0, -1269106800, "0ef7b6e87c782fa33fe109aab157a2d9cddc4472864f629510a1c92fa1fe7fc1"], - ["f3f771ae02939752bfe309d6c652c0d271b7cab14107e98032f269d92b2a8c8853ab057da8010000000563ab6a6365670c305c38f458e30a7c0ab45ee9abd9a8dc03bae1860f965ffced879cb2e5d0bb156821020000000153ffffffff025dc619050000000002ac51ec0d250100000000076a5200636a6363333aecd8", "650053ac515100ab", 1, 1812404608, "a7aa34bf8a5644f03c6dd8801f9b15ba2e07e07256dbf1e02dad59f0d3e17ea9"], - ["fd3e267203ae7d6d3975e738ca84f12540229bb237dd228d5f688e9d5ba53fce4302b0334d01000000026353ffffffff602a3ab75af7aa951d93093e345ef0037a2863f3f580a9b1a575fffe68e677450300000000239e476d1e8f81e8b6313880d8a49b27c1b00af467f29756e76f675f084a5676539636ab030000000765ab6351acac52d9217747044d773204000000000752ac51526353acc33e45050000000005516500005115d889040000000004ab5163510cbbbd0200000000016500000000", "65ac526aac6a53ab52", 2, -886179388, "bc46f3f83058ddf5bebd9e1f2c117a673847c4dc5e31cfb24bac91adf30877cf"], - ["f380ae23033646af5dfc186f6599098015139e961919aea28502ea2d69474413d94a555ea2000000000853635265abacac5314da394b99b07733341ddba9e86022637be3b76492992fb0f58f23c915098979250a96620300000003ab6300ffffffff4bb6d1c0a0d84eac7f770d3ad0fdc5369ae42a21bbe4c06e0b5060d5990776220300000000ffffffff0486fd70020000000007ac6500635252acf3fd72010000000005656a6a6551212de90500000000096365006a63635153000fa33100000000000600535151656300000000", "ab52", 2, -740890152, "f804fc4d81f039009ed1f2cccb5c91da797543f235ac71b214c20e763a6d86d7"], - ["5c45d09801bb4d8e7679d857b86b97697472d514f8b76d862460e7421e8617b15a2df217c6010000000863acacab6565006affffffff01156dbc03000000000952ac63516551ac6aac00000000", "6aabac", 0, 1310125891, "270445ab77258ced2e5e22a6d0d8c36ac7c30fff9beefa4b3e981867b03fa0ad"], - ["4ecc6bde030ca0f83c0ed3d4b777f94c0c88708c6c933fe1df6874f296d425cac95355c23d0000000006ac6a51536a52f286a0969d6170e20f2a8000193807f5bc556770e9d82341ef8e17b0035eace89c76edd50200000007ac65525100656affffffff5bade6e462fac1927f078d69d3a981f5b4c1e59311a38efcb9a910aa436afaa80000000007ac6a006352ab52ffffffff0331e58902000000000763ac53636352abb8b3ca000000000001637a1d26040000000009535263ac6a5352ab655ae34a39", "6a65ab", 2, 2142728517, "4a3415eb1677ae4e0c939644a4cfd5dc6299780b55cd0dc735967057b6b1526a"], - ["a59484b501eb50114be0fc79e72ab9bc9f4a5f7acdf274a56d6b68684eb68cf8b07ec5d1c2000000000765abab00ab00639e09aa940141e3530200000000046500ac6500000000", "00516565ab", 0, -1561622405, "d60bbadd2cc0674100baa08d0e0493ee4248f0304b3eb778da942041f503a896"], - ["53dc1a88046531c7b57a35f4d9adf101d068bf8d63fbbedaf4741dba8bc5e92c8725def571030000000453655251fcdf116a226b3ec240739c4c7493800e4edfe67275234e371a227721eac43d3d9ecaf1b50300000003ac0052ffffffff2c9279ffeea4718d167e9499bd067600715c14484e373ef93ae4a31d2f5671ab0000000009516553ac636a6a65001977752eeba95a8f16b88c571a459c2f2a204e23d48cc7090e4f4cc35846ca7fc0a455ce00000000055165ac0063188143f80205972902000000000765ac63ac516353c7b6a50000000000036a510000000000", "655351536a", 0, 103806788, "b276584d3514e5b4e058167c41dc02915b9d97f6795936a51f40e894ed8508bc"], - ["53f8959f01ddb36afdcd20167edcbb75a63d18654fdcf10bc0004c761ab450fe236d79cb2702000000065151650063653435003a033a5e34050000000009ac52516a630000516ab86db3030000000002006344ac090500000000046363ab00f3644537", "5263abab63ac656353", 0, -218513553, "f1f2a489682e42a6fc20025dfc89584d17f150b2d7ae3ddedd2bf43d5e24f37f"], - ["5a06cb4602dcfc85f49b8d14513f33c48f67146f2ee44959bbca092788e6823b2719f3160b0200000001ab3c013f2518035b9ea635f9a1c74ec1a3fb7496a160f46aae2e09bfc5cd5111a0f20969e003000000015158c89ab7049f20d6010000000008ac6a52abac53515349765e00000000000300ab638292630100000000045351ab0086da09010000000006656a6365525300000000", "526a63", 1, 1502936586, "bdfaff8a4e775379c5dc26e024968efa805f923de53fa8272dd53ec582afa0c5"], - ["ca9d84fa0129011e1bf27d7cb71819650b59fb292b053d625c6f02b0339249b498ff7fd4b601000000025352ffffffff032173a0040000000008525253abab5152639473bb030000000009005153526a53535151d085bd0000000000086a5365ab5165655300000000", "005152ac51", 0, 580353445, "c629d93b02037f40aa110e46d903edb34107f64806aa0c418d435926feef68b8"], - ["e3cdbfb4014d90ae6a4401e85f7ac717adc2c035858bf6ff48979dd399d155bce1f150daea0300000002ac51a67a0d39017f6c71040000000005535200535200000000", "", 0, -1899950911, "c1c7df8206e661d593f6455db1d61a364a249407f88e99ecad05346e495b38d7"], - ["b2b6b9ab0283d9d73eeae3d847f41439cd88279c166aa805e44f8243adeb3b09e584efb1df00000000026300ffffffff7dfe653bd67ca094f8dab51007c6adaced09de2af745e175b9714ca1f5c68d050000000003ac6500aa8e596903fd3f3204000000000553ac6a6a533a2e210500000000075253acabab526392d0ee020000000008520065635200ab5200000000", "65acacac65005365", 0, 28298553, "39c2aaa2496212b3ab120ab7d7f37c5e852bfe38d20f5226413a2268663eeae8"], - ["f30c5c3d01a6edb9e10fafaf7e85db14e7fec558b9dca4a80b05d7c3a2944d282c5018f4680200000003005263ffffffff04aac3530300000000026551bc2419010000000009005163acab6a5100658e7085050000000000c5e4ec050000000007656a6a635365ab2d8e8882", "abac53ab005251ac52", 0, -490287546, "877e347ec7487497769e2581142276d1a8d813b652e4483cf9cc993d16354417"], - ["4314339e01de40faabcb1b970245a7f19eedbc17c507dac86cf986c2973715035cf95736ae0200000007abababababab65bde67b900151510b04000000000853ac00655200535300000000", "52", 0, 399070095, "47585dc25469d04ff3a60939d0a03779e3e81a411bf0ca18b91bb925ebd30718"], - ["2d4cf4e9031b3e175b2ff18cd933151379d9cfac4713d8bd0e63b70bd4a92277aa7af901ab000000000565515353abffffffff557666c7f3be9cdecdad44c3df206eb63a2da4ed1f159d21193882a9f0340081020000000963ab53ab5252ac63abffffffff8a8c897bdb87e93886aad5ded9d82a13101d5476554386373646ca5e23612e450300000009006a526552abab6a635ac03fc00198bb02040000000009525100526a6563636a1d052834", "ab52ac00acac6a", 0, -1469882480, "09ed6563a454814ab7e3b4c28d56d8751162b77df1825b37ba66c6147750b2a3"], - ["f063171b03e1830fdc1d685a30a377537363ccafdc68b42bf2e3acb908dac61ee24b37595c020000000765ac5100ab6aacf447bc8e037b89d6cadd62d960cc442d5ced901d188867b5122b42a862929ce45e7b628d010000000253aba009a1ba42b00f1490b0b857052820976c675f335491cda838fb7934d5eea0257684a2a202000000001e83cf2401a7f777030000000008ab6553526a53526a00000000", "", 2, 1984790332, "c19caada8e71535e29a86fa29cfd9b74a0c7412003fc722a121005e461e01636"], - ["cf7bdc250249e22cbe23baf6b648328d31773ea0e771b3b76a48b4748d7fbd390e88a004d30000000003ac536a4ab8cce0e097136c90b2037f231b7fde2063017facd40ed4e5896da7ad00e9c71dd70ae600000000096a0063516352525365ffffffff01b71e3e00000000000300536a00000000", "", 1, 546970113, "6a815ba155270af102322c882f26d22da11c5330a751f520807936b320b9af5d"], - ["ac7a125a0269d35f5dbdab9948c48674616e7507413cd10e1acebeaf85b369cd8c88301b7c030000000963656aac6a530053abffffffffed94c39a582e1a46ce4c6bffda2ccdb16cda485f3a0d94b06206066da12aecfe010000000752abab63536363ef71dcfb02ee07fa0400000000016a6908c802000000000751656a6551abac688c2c2d", "6a6351526551", 0, 858400684, "552ff97d7924f51cda6d1b94be53483153ef725cc0a3a107adbef220c753f9a6"], - ["3a1f454a03a4591e46cf1f7605a3a130b631bf4dfd81bd2443dc4fac1e0a224e74112884fe0000000005516aac6a53a87e78b55548601ffc941f91d75eab263aa79cd498c88c37fdf275a64feff89fc1710efe03000000016a39d7ef6f2a52c00378b4f8f8301853b61c54792c0f1c4e2cd18a08cb97a7668caa008d970200000002656affffffff017642b20100000000096a63535253abac6a6528271998", "51", 2, 1459585400, "e9a7f21fc2d38be7be47095fbc8f1bf8923660aa4d71df6d797ae0ba5ca4d5b0"], - ["f59366cc0114c2a18e6bd1347ed9470f2522284e9e835dd5c5f7ef243639ebea95d9b232b6020000000153474b62eb045c00170500000000096352ab516352ab5200038a520400000000086aab5253656a63005b968904000000000963536353ac0053635387106002000000000000000000", "ab52526300ab51", 0, 1834116153, "cdf51f6e3a9dc2be5a59ea4c00f5aac1e1426a5202c325e6cf2567d07d8d8de4"], - ["6269e0fa0173e76e89657ca495913f1b86af5b8f1c1586bcd6c960aede9bc759718dfd5044000000000352ac530e2c7bd90219849b000000000007ab00ab6a53006319f281000000000007ab00515165ac5200000000", "6a", 0, -2039568300, "62094f98234a05bf1b9c7078c5275ed085656856fb5bdfd1b48090e86b53dd85"], - ["eb2bc00604815b9ced1c604960d54beea4a3a74b5c0035d4a8b6bfec5d0c9108f143c0e99a0000000000ffffffff22645b6e8da5f11d90e5130fd0a0df8cf79829b2647957471d881c2372c527d8010000000263acffffffff1179dbaf17404109f706ae27ad7ba61e860346f63f0c81cb235d2b05d14f2c1003000000025300264cb23aaffdc4d6fa8ec0bb94eff3a2e50a83418a8e9473a16aaa4ef8b855625ed77ef40100000003ac51acf8414ad404dd328901000000000652526500006ab6261c000000000002526a72a4c9020000000006ac526500656586d2e7000000000006656aac00ac5279cd8908", "51", 1, -399279379, "d37532e7b2b8e7db5c7c534197600397ebcc15a750e3af07a3e2d2e4f84b024f"], - ["dc9fe6a8038b84209bbdae5d848e8c040433237f415437592907aa798bf30d9dbbddf0ff85010000000153ffffffff23269a7ea29fcf788db483b8d4c4b35669e582608644259e950ce152b0fa6e050000000003acababffffffff65de94857897ae9ea3aa0b938ba6e5adf374d48469922d2b36dbb83d3b8c8261010000000452ac5200ffffffff02856e9b0300000000026a51980c8e02000000000365ab63d2648db4", "00ab0051ac526565", 2, 1562581941, "5cef9d8e18a2d5a70448f17b465d411a19dab78f0ddf1672ffd518b188f52433"], - ["eba8b0de04ac276293c272d0d3636e81400b1aaa60db5f11561480592f99e6f6fa13ad387002000000070053acab536563bebb23d66fd17d98271b182019864a90e60a54f5a615e40b643a54f8408fa8512cfac927030000000963ac6a6aabac65ababffffffff890a72192bc01255058314f376bab1dc72b5fea104c154a15d6faee75dfa5dba020000000100592b3559b0085387ac7575c05b29b1f35d9a2c26a0c27903cc0f43e7e6e37d5a60d8305a030000000252abffffffff0126518f05000000000000000000", "005300635252635351", 1, 664344756, "26dc2cba4bd5334e5c0b3a520b44cc1640c6b923d10e576062f1197171724097"], - ["91bd040802c92f6fe97411b159df2cd60fb9571764b001f31657f2d616964637605875c2a901000000055263006a65ffffffff3651df372645f50cf4e32fdf6e61c766e912e16335db2b40c5d52fe89eefe7cd00000000040065ab65ffffffff03ca8625030000000009ab51ac63530052ab52c6bf14020000000006ab00ab52005167d270000000000007ab53525351636a00000000", "5151ab63005252ac", 1, 1983087664, "3e5aa0200248d8d86ede3b315ca1b857018b89184a4bd023bd88ab12e499f6e1"], - ["185cda1a01ecf7a8a8c28466725b60431545fc7a3367ab68e34d486e8ea85ee3128e0d8384000000000465ac63abec88b7bb031c56eb04000000000965636a51005252006a7c78d5040000000007acac63abac51ac3024a40500000000086300526a51abac51464c0e8c", "0065535265515352", 0, 1594558917, "b5280b9610c0625a65b36a8c2402a95019a7bbb9dd3de77f7c3cb1d82c3263ba"], - ["a9531f07034091668b65fea8b1a79700d586ac9e2f42ca0455a26abe41f9e1805d009a0f5702000000096365516365ac5263ab3619bac643a9e28ee47855118cf80c3a74531cdf198835d206d0fe41804e325a4f9f105e03000000016a58e3ab0d46375d98994daf0fa7c600d2bb4669e726fca0e3a3f21ea0d9e777396740328f0100000008636a5363ab526a538d3ea7700304cb66030000000007515163ab52ab510184030500000000085353636565ac0051d9cff402000000000751ab52ab5352abf0e36254", "ab5353ac5365acab", 2, 1633101834, "04c9ef72f33668ca449c0415becf62cc0b8e0c75f9c8813852d42a58acf107c8"], - ["6b5ecc7903fe0ba37ea551df92a59e12bad0a3065846ba69179a8f4a741a2b4fcf679aac810200000004535263529a3d343293b99ab425e7ef8529549d84f480bcd92472bab972ea380a302128ae14dfcd0200000000025163ffffffff24636e4545cab9bf87009119b7fc3ec4d5ee9e206b90f35d1df8a563b6cd097a010000000852abac53005153abc64467860406e832020000000009526300006a53ac6352ac1395010000000002ac53b117f300000000000863655351acab00651edf02030000000008ab51ac6353535252628ef71d", "ab63ab6a52ac526563", 2, -1559697626, "8f07ece7d65e509f1e0780584ef8d271c1c61a13b10335d5faafc7afc8b5b8ec"], - ["92c9fb780138abc472e589d5b59489303f234acc838ca66ffcdf0164517a8679bb622a4267020000000153468e373d04de03fa020000000009ac006a5265ab5163006af649050000000007515153006a00658ceb59030000000001ac36afa0020000000009ab53006351ab51000000000000", "6a", 0, 2059357502, "e2358dfb51831ee81d7b0bc602a65287d6cd2dbfacf55106e2bf597e22a4b573"], - ["6f62138301436f33a00b84a26a0457ccbfc0f82403288b9cbae39986b34357cb2ff9b889b302000000045253655335a7ff6701bac9960400000000086552ab656352635200000000", "6aac51", 0, 1444414211, "502a2435fd02898d2ff3ab08a3c19078414b32ec9b73d64a944834efc9dae10c"], - ["9981143a040a88c2484ac3abe053849e72d04862120f424f373753161997dd40505dcb4783030000000700536365536565a2e10da3f4b1c1ad049d97b33f0ae0ea48c5d7c30cc8810e144ad93be97789706a5ead180100000003636a00ffffffffbdcbac84c4bcc87f03d0ad83fbe13b369d7e42ddb3aecf40870a37e814ad8bb5010000000963536a5100636a53abffffffff883609905a80e34202101544f69b58a0b4576fb7391e12a769f890eef90ffb72020000000651656352526affffffff04243660000000000004ab5352534a9ce001000000000863656363ab6a53652df19d030000000003ac65acedc51700000000000000000000", "ac6300acac", 2, 293672388, "7ba99b289c04718a7283f150d831175ed6303081e191a0608ea81f78926c5bdf"], - ["a2bb630b01989bc5d643f2da4fb9b55c0cdf846ba06d1dbe372893024dbbe5b9b8a1900af802000000055265ac63aca7a68d2f04916c74010000000003abac007077f0040000000001007d4127010000000005ac516aac000f31e8030000000000571079c9", "65ab0051ac", 0, -1103627693, "92d53b4390262e6b288e8a32e0cfc36cd5adfdfabfe96c7bfd4a19d65e233761"], - ["49f7d0b6037bba276e910ad3cd74966c7b3bc197ffbcfefd6108d6587006947e97789835ea0300000008526a52006a650053ffffffff8d7b6c07cd10f4c4010eac7946f61aff7fb5f3920bdf3467e939e58a1d4100ab03000000076aac63ac535351ffffffff8f48c3ba2d52ad67fbcdc90d8778f3c8a3894e3c35b9730562d7176b81af23c80100000003ab5265ffffffff0301e3ef0300000000046a525353e899ac0500000000075153ab6a65abac259bea0400000000007b739972", "53516aacac6aac", 1, 955403557, "5d366a7f4346ae18aeb7c9fc4dab5af71173184aa20ed22fcb4ea8511ad25449"], - ["58a4fed801fbd8d92db9dfcb2e26b6ff10b120204243fee954d7dcb3b4b9b53380e7bb8fb60100000003006351ffffffff02a0795b050000000006536351ac6aac2718d00200000000075151acabac515354d21ba1", "005363515351", 0, -1322430665, "bbee941bbad950424bf40e3623457db47f60ed29deaa43c99dec702317cb3326"], - ["32765a0b02e455793d9ce530e9f6a44bcbc612e893a875b5da61d822dc56d8245166c398b403000000085353abac6300006a6bdee2a78d0d0b6a5ea666eed70b9bfea99d1d612ba3878f615c4da10d4a521cba27155002000000035363abffffffff043cd42401000000000551656a53653685320100000000030000511881bc0500000000065165abab636a20169f010000000007acab656aac63acdb0706a8", "65ac53ab53", 0, 1936499176, "5c5a9c3a5de7dc7a82bc171c9d3505913b8bcc450bc8b2d11772c1a1d781210b"], - ["17fad0d303da0d764fedf9f2887a91ea625331b28704940f41e39adf3903d8e75683ef6d46020000000151ffffffffff376eea4e880bcf0f03d33999104aafed2b3daf4907950bb06496af6b51720a020000000900636a63525253525196521684f3b08497bad2c660b00b43a6a517edc58217876eb5e478aa3b5fda0f29ee1bea00000000046aacab6affffffff03dde8e2050000000007ac5365ac51516a14772e000000000005630000abacbbb360010000000006ab5251ab656a50f180f0", "0053", 0, -1043701251, "a3bdf8771c8990971bff9b4e7d59b7829b067ed0b8d3ac1ec203429811384668"], - ["236c32850300045e292c84ede2b9ab5733ba08315a2bb09ab234c4b4e8894808edbdac0d3b020000000653635363abacffffffffd3f696bb31fdd18a72f3fc2bb9ae54b416a253fc37c1a0f0180b52d35bad49440100000004650053abffffffffa85c75a2406d82a93b12e555b66641c1896a4e83ae41ef1038218311e38ace060200000006abab006a51ac104b5e6701e2842c04000000000800630051ac0000ab00000000", "ab63ac6a516a", 1, -1709887524, "8c29ea8ef60c5a927fccdba8ea385db6b6b84d98e891db45f5d4ee3148d3f5a7"], - ["b78d5fd601345f3100af494cdf447e7d4076179f940035b0ebe8962587d4d0c9c6c9fc34ee0300000003516a6affffffff03dc5c890100000000085353ac53ac6a52534ac941040000000007ac63656a51ab51d4266b0100000000036aacac70731f2d", "005351ab0053", 0, -1789071265, "d5f1c1cb35956a5711d67bfb4cedbc67e77c089b912d688ad440ff735adb390d"], - ["5a2257df03554550b774e677f348939b37f8e765a212e566ce6b60b4ea8fed4c9504b7f7d1000000000653655265ab5258b67bb931df15b041177cf9599b0604160b79e30f3d7a594e7826bae2c29700f6d8f8f40300000005515300ac6a159cf8808a41f504eb5c2e0e8a9279f3801a5b5d7bc6a70515fbf1c5edc875bb4c9ffac500000000050063510052ffffffff0422a90105000000000965006a650000516a006417d2020000000006526363ab00524d969d0100000000035153acc4f077040000000005ac5200636500000000", "6a52", 1, -1482463464, "37b794b05d0687c9b93d5917ab068f6b2f0e38406ff04e7154d104fc1fb14cdc"], - ["e0032ad601269154b3fa72d3888a3151da0aed32fb2e1a15b3ae7bee57c3ddcffff76a1321010000000100110d93ae03f5bd080100000000075263516a6551002871e60100000000046a005252eaa753040000000004ab6aab526e325c71", "630052", 0, -1857873018, "ea117348e94de86381bb8ad1c7f93b8c623f0272104341701bb54e6cb433596c"], - ["014b2a5304d46764817aca180dca50f5ab25f2e0d5749f21bb74a2f8bf6b8b7b3fa8189cb7030000000965ac5165ab6a51ac6360ecd91e8abc7e700a4c36c1a708a494c94bb20cbe695c408543146566ab22be43beae9103000000045163ab00ffffffffffa48066012829629a9ec06ccd4905a05df0e2b745b966f6a269c9c8e13451fc00000000026565ffffffffc40ccadc21e65fe8a4b1e072f4994738ccaf4881ae6fede2a2844d7da4d199ab02000000065152ab536aabffffffff01b6e054030000000004515352ab3e063432", "", 0, 1056459916, "a7aff48f3b8aeb7a4bfe2e6017c80a84168487a69b69e46681e0d0d8e63a84b6"], - ["c4ef04c103c5dde65410fced19bf6a569549ecf01ceb0db4867db11f2a3a3eef0320c9e8e001000000085100536a53516aabffffffff2a0354fa5bd96f1e28835ffe30f52e19bd7d5150c687d255021a6bec03cf4cfd03000000056a006300514900c5b01d3d4ae1b97370ff1155b9dd0510e198d266c356d6168109c54c11b4c283dca00300000002ababffffffff02e19e3003000000000451655351fa5c0003000000000163ef1fc64b", "51636a51ab630065", 1, -1754709177, "0a281172d306b6a32e166e6fb2a2cc52c505c5d60ea448e9ba7029aa0a2211e1"], - ["29083fe00398bd2bb76ceb178f22c51b49b5c029336a51357442ed1bac35b67e1ae6fdf13100000000066a6500acab51ffffffffe4ca45c9dc84fd2c9c47c7281575c2ba4bf33b0b45c7eca8a2a483f9e3ebe4b3010000000200abffffffffdf47ad2b8c263fafb1e3908158b18146357c3a6e0832f718cd464518a219d18303000000096352ac656351ac0052daddfb3b0231c36f00000000000400526a5275c7e0020000000001ab00000000", "acab536aac52", 2, 300802386, "82ebc07b16cff0077e9c1a279373185b3494e39d08fd3194aae6a4a019377509"], - ["1201ab5d04f89f07c0077abd009762e59db4bb0d86048383ba9e1dad2c9c2ad96ef660e6d00200000007ab6a65ac5200652466fa5143ab13d55886b6cdc3d0f226f47ec1c3020c1c6e32602cd3428aceab544ef43e00000000086a6a6a526a6a5263ffffffffd5be0b0be13ab75001243749c839d779716f46687e2e9978bd6c9e2fe457ee48020000000365abab1e1bac0f72005cf638f71a3df2e3bbc0fa35bf00f32d9c7dc9c39a5e8909f7d53170c8ae0200000008ab6a51516363516affffffff02f0a6210500000000036300ac867356010000000009acab65ac6353536a659356d367", "ac53535252", 0, 917543338, "418acc156c2bc76a5d7baa58db29f1b4cf6c266c9222ed167ef5b4d47f0e0f41"], - ["344fa11e01c19c4dd232c77742f0dd0aeb3695f18f76da627628741d0ee362b0ea1fb3a2180200000007635151005100529bab25af01937c1f0500000000055153ab53656e7630af", "6351005163ac51", 0, -629732125, "228ca52a0a376fe0527a61cfa8da6d7baf87486bba92d49dfd3899cac8a1034f"], - ["b2fda1950191358a2b855f5626a0ebc830ab625bea7480f09f9cd3b388102e35c0f303124c030000000565ac65ab53ffffffff03f9c5ec04000000000765ab51516551650e2b9f0500000000045365525284e8f6040000000001ac00000000", "ac51655253", 0, 1433027632, "d2fa7e13c34cecda5105156bd2424c9b84ee0a07162642b0706f83243ff811a8"], - ["a4a6bbd201aa5d882957ac94f2c74d4747ae32d69fdc765add4acc2b68abd1bdb8ee333d6e0300000008516a6552515152abffffffff02c353cb040000000007ac6351ab51536588bd320500000000066552525253ac00000000", "", 0, 1702060459, "499da7d74032388f820645191ac3c8d20f9dba8e8ded7fa3a5401ea2942392a1"], - ["584e8d6c035a6b2f9dac2791b980a485994bf38e876d9dda9b77ad156eee02fa39e19224a60300000003ab636529db326cc8686a339b79ab6b6e82794a18e0aabc19d9ad13f31dee9d7aad8eff38288588020000000452530052ffffffff09a41f07755c16cea1c7e193c765807d18cadddca6ec1c2ed7f5dcdca99e90e80000000001acffffffff01cba62305000000000451ac63acccdf1f67", "ab536a6363", 2, -27393461, "1125645b49202dca2df2d76dae51877387903a096a9d3f66b5ac80e042c95788"], - ["83a583d204d926f2ee587a83dd526cf1e25a44bb668e45370798f91a2907d184f7cddcbbc7030000000700ab6565536a539f71d3776300dffdfa0cdd1c3784c9a1f773e34041ca400193612341a9c42df64e3f550e01000000050052515251ffffffff52dab2034ab0648553a1bb8fc4e924b2c89ed97c18dfc8a63e248b454035564b01000000015139ab54708c7d4d2c2886290f08a5221cf69592a810fd1979d7b63d35c271961e710424fd0300000005ac65ac5251ffffffff01168f7c030000000000a85e5fb0", "6a536353656a00", 0, 179595345, "5350a31ac954a0b49931239d0ecafbf34d035a537fd0c545816b8fdc355e9961"], - ["ffd35d51042f290108fcb6ea49a560ba0a6560f9181da7453a55dfdbdfe672dc800b39e7320200000006630065516a65f2166db2e3827f44457e86dddfd27a8af3a19074e216348daa0204717d61825f198ec0030100000006ab51abab00abffffffffdf41807adb7dff7db9f14d95fd6dc4e65f8402c002d009a3f1ddedf6f4895fc8030000000500ab006a65a5a848345052f860620abd5fcd074195548ce3bd0839fa9ad8642ed80627bf43a0d47dbd010000000765ab006a656a53b38cdd6502a186da05000000000765ab00ab006a53527c0e0100000000085365ab51acacac52534bd1b1", "6a635253ac0000", 0, 1095082149, "3c05473a816621a3613f0e903faa1a1e44891dd40862b029e41fc520776350fa"], - ["6c9a4b98013c8f1cae1b1df9f0f2de518d0c50206a0ab871603ac682155504c0e0ce946f460100000000ffffffff04e9266305000000000753535100ac6aacded39e04000000000365ac6ab93ccd010000000002515397bf3d050000000003ab636300000000", "63520052ac656353", 0, -352633155, "936eff8cdfd771be24124da87c7b24feb48da7cbc2c25fb5ba13d1a23255d902"], - ["e01dc7f0021dc07928906b2946ca3e9ac95f14ad4026887101e2d722c26982c27dc2b59fdb0000000005ac5200516ab5a31ffadcbe74957a5a3f97d7f1475cc6423fc6dbc4f96471bd44c70cc736e7dec0d1ea020000000951636a526a52abac53ffffffff04bc2edd05000000000252ab528c7b02000000000952ac51526500525353324820040000000002005380c713000000000009630065ab00ac525252451bbb48", "53ab65ac", 0, -552384418, "69c0b30f4c630a6c878fde6ea6b74dae94f4eb3bcfbde2dc3649e1a9ada00757"], - ["009046a1023f266d0113556d604931374d7932b4d6a7952d08fbd9c9b87cbd83f4f4c178b4030000000452ac526346e73b438c4516c60edd5488023131f07acb5f9ea1540b3e84de92f4e3c432289781ea4900000000046500655357dfd6da02baef910100000000026a007d101703000000000800516500abacac5100000000", "6aab6553ac", 0, -802456605, "f8757fbb4448ca34e0cd41b997685b37238d331e70316659a9cc9087d116169d"], - ["df76ec0801a3fcf3d18862c5f686b878266dd5083f16cf655facab888b4cb3123b3ce5db7e01000000010010e7ac6a0233c83803000000000365ac51faf14a040000000004ac51655100000000", "6353acab", 0, 15705861, "e7d873aa079a19ec712b269a37d2670f60d8cb334c4f97e2e3fd10eeb8ee5f5e"], - ["828fd3e0031084051ccef9cfdd97fae4d9cc50c0dae36bd22a3ff332881f17e9756c3e288e0200000004ab535363961a2ccccaf0218ec6a16ba0c1d8b5e93cfd025c95b6e72bc629ec0a3f47da7a4c396dad01000000025353ffffffff19ad28747fb32b4caf7b5dbd9b2da5a264bedb6c86d3a4805cd294ae53a86ac40200000009ab53535351ab6551abffffffff04a41650030000000005656aab6aab8331a304000000000700516365ac516a0d2a47010000000007abac516353abacdebc19040000000006ab5300636a6300000000", "51ab52ab53ac52", 0, 1866105980, "311094b4d73e31aefc77e97859ef07ca2f07a7b7e4d7def80c69d3f5d58527e5"], - ["c4b80f850323022205b3e1582f1ed097911a81be593471a8dce93d5c3a7bded92ef6c7c1260100000002006affffffff70294d62f37c3da7c5eae5d67dce6e1b28fedd7316d03f4f48e1829f78a88ae801000000096a5200530000516351f6b7b544f7c39189d3a2106ca58ce4130605328ce7795204be592a90acd81bef517d6f170200000000ffffffff012ab8080000000000075100006365006335454c1e", "53ac6a536aacac", 0, -1124103895, "06277201504e6bf8b8c94136fad81b6e3dadacb9d4a2c21a8e10017bfa929e0e"], - ["8ab69ed50351b47b6e04ac05e12320984a63801716739ed7a940b3429c9c9fed44d3398ad40300000006536a516a52638171ef3a46a2adb8025a4884b453889bc457d63499971307a7e834b0e76eec69c943038a0300000000ffffffff566bb96f94904ed8d43d9d44a4a6301073cef2c011bf5a12a89bedbaa03e4724030000000265acb606affd01edea38050000000008515252516aacac6300000000", "65000000006365ac53", 0, -1338942849, "7912573937824058103cb921a59a7f910a854bf2682f4116a393a2045045a8c3"], - ["2484991e047f1cf3cfe38eab071f915fe86ebd45d111463b315217bf9481daf0e0d10902a402000000006e71a424eb1347ffa638363604c0d5eccbc90447ff371e000bf52fc743ec832851bb564a0100000001abffffffffef7d014fad3ae7927948edbbb3afe247c1bcbe7c4c8f5d6cf97c799696412612020000000851536a5353006a001dfee0d7a0dd46ada63b925709e141863f7338f34f7aebde85d39268ae21b77c3068c01d0000000008535151ab00636563ffffffff018478070200000000095200635365ac52ab5341b08cd3", "", 3, 265623923, "24cb420a53b4f8bb477f7cbb293caabfd2fc47cc400ce37dbbab07f92d3a9575"], - ["54839ef9026f65db30fc9cfcb71f5f84d7bb3c48731ab9d63351a1b3c7bc1e7da22bbd508e0300000000442ad138f170e446d427d1f64040016032f36d8325c3b2f7a4078766bdd8fb106e52e8d20000000003656500ffffffff02219aa101000000000851ababac52ab00659646bd02000000000552acacabac24c394a5", "ac", 0, 906807497, "69264faadcd1a581f7000570a239a0a26b82f2ad40374c5b9c1f58730514de96"], - ["5036d7080434eb4eef93efda86b9131b0b4c6a0c421e1e5feb099a28ff9dd8477728639f77030000000951516aab535152ab5391429be9cce85d9f3d358c5605cf8c3666f034af42740e94d495e28b9aaa1001ba0c87580300000008006552ab00ab006affffffffd838978e10c0c78f1cd0a0830d6815f38cdcc631408649c32a25170099669daa0000000002acab8984227e804ad268b5b367285edcdf102d382d027789250a2c0641892b480c21bf84e3fb0100000000b518041e023d8653010000000001004040fb0100000000080051ac5200636a6300000000", "52ac", 0, 366357656, "bd0e88829afa6bdc1e192bb8b2d9d14db69298a4d81d464cbd34df0302c634c6"], - ["9ad5ccf503fa4facf6a27b538bc910cce83c118d6dfd82f3fb1b8ae364a1aff4dcefabd38f03000000096365655263ac655300807c48130c5937190a996105a69a8eba585e0bd32fadfc57d24029cbed6446d30ebc1f100100000004000053650f0ccfca1356768df7f9210cbf078a53c72e0712736d9a7a238e0115faac0ca383f219d0010000000600ab536552002799982b0221b8280000000000000c41320000000000086552ac6365636a6595f233a3", "6a5152", 2, 553208588, "f99c29a79f1d73d2a69c59abbb5798e987639e36d4c44125d8dc78a94ddcfb13"], - ["669538a204047214ce058aed6a07ca5ad4866c821c41ac1642c7d63ed0054f84677077a84f030000000853abacab6a655353ffffffff70c2a071c115282924e3cb678b13800c1d29b6a028b3c989a598c491bc7c76c5030000000752ac52ac5163ac80420e8a6e43d39af0163271580df6b936237f15de998e9589ec39fe717553d415ac02a4030000000463635153184ad8a5a4e69a8969f71288c331aff3c2b7d1b677d2ebafad47234840454b624bf7ac1d03000000056a63abab63df38c24a02fbc63a040000000002ab535ec3dc050000000002536500000000", "635153", 3, -190399351, "9615541884dfb1feeb08073a6a6aa73ef694bc5076e52187fdf4138a369f94d9"], - ["a7f139e502af5894be88158853b7cbea49ba08417fbbca876ca6614b5a41432be34499987b000000000765635165abac63ffffffff8b8d70e96c7f54eb70da0229b548ced438e1ca2ba5ddd648a027f72277ee1efc0100000001abffffffff044f2c4204000000000165e93f550100000000050000526a6a94550304000000000365536aadc21c0300000000016300000000", "6aacac6363ab5265ac", 1, 2143189425, "6e3f97955490d93d6a107c18d7fe402f1cada79993bb0ff0d096357261b3a724"], - ["3b94438f0366f9f53579a9989b86a95d134256ce271da63ca7cd16f7dd5e4bffa17d35133f010000000100ffffffff1aaad0c721e06ec00d07e61a84fb6dc840b9a968002ce7e142f943f06fd143a10100000008535151ac51ab0053b68b8e9c672daf66041332163e04db3f6048534bd718e1940b3fc3811c4eef5b7a56888b01000000001d58e38c012e38e700000000000852ab53ac6365536a00000000", "ab655352", 1, -935223304, "b3b336de141d4f071313a2207b2a0c7cf54a070dd8d234a511b7f1d13e23b0c4"], - ["e5dca8a20456de0a67e185fa6ea94085ceae478d2c15c73cb931a500db3a1b6735dd1649ec0200000005ab536aabab32d11bbdcb81361202681df06a6b824b12b5cb40bb1a672cf9af8f2a836e4d95b7839327030000000951005365ab65abacabb345085932939eef0c724adef8a57f9e1bf5813852d957c039b6a12d9c2f201ea520fb030000000009ac5352005165acac6a5efc6072f1a421dc7dc714fc6368f6d763a5d76d0278b95fc0503b9268ccfadb48213a2500000000026a53ffffffff039ee1c4020000000009ac5353ab6353535163184018000000000005655265526a9a4a8a050000000001ac00000000", "65ab53ab6a00ab6553", 2, 1902561212, "7928ae8e86c0b0cad1b2c120ea313087437974382ee6d46443ca5ac3f5878b88"], - ["972128b904e7b673517e96e98d80c0c8ceceae76e2f5c126d63da77ffd7893fb53308bb2da0300000006ac6552ab52acffffffff4cac767c797d297c079a93d06dc8569f016b4bf7a7d79b605c526e1d36a40e2202000000095365ab636aac6a6a6a69928d2eddc836133a690cfb72ec2d3115bf50fb3b0d10708fa5d2ebb09b4810c426a1db01000000060052526300001e8e89585da7e77b2dd2e30625887f0660accdf29e53a614d23cf698e6fc8ab03310e87700000000076a520051acac6555231ddb0330ec2d03000000000200abfaf457040000000004ab6a6352bdc42400000000000153d6dd2f04", "", 0, 209234698, "4a92fec1eb03f5bd754ee9bfd70707dc4420cc13737374f4675f48529be518e4"], - ["1fb4085b022c6cfb848f8af7ba3ba8d21bd23ffa9f0bfd181cb68bcaaf2074e66d4974a31602000000090000006a6a6500acab6c12c07d9f3dbd2d93295c3a49e3757119767097e7fd5371f7d1ba9ba32f1a67a5a426f00000000000ffffffff018fd2fc04000000000363ac5100000000", "65ab006a6aab526a", 0, 1431502299, "8b7dd0ff12ca0d8f4dbf9abf0abba00e897c2f6fd3b92c79f5f6a534e0b33b32"], - ["5374f0c603d727f63006078bd6c3dce48bd5d0a4b6ea00a47e5832292d86af258ea0825c260000000009655353636352526a6af2221067297d42a9f8933dfe07f61a574048ff9d3a44a3535cd8eb7de79fb7c45b6f47320200000003ac006affffffff153d917c447d367e75693c5591e0abf4c94bbdd88a98ab8ad7f75bfe69a08c470200000005ac65516365ffffffff037b5b7b000000000001515dc4d904000000000004bb26010000000004536a6aac00000000", "516552516352ac", 2, 328538756, "8bb7a0129eaf4b8fc23e911c531b9b7637a21ab11a246352c6c053ff6e93fcb6"], - ["c441132102cc82101b6f31c1025066ab089f28108c95f18fa67db179610247086350c163bd010000000651525263ab00ffffffff9b8d56b1f16746f075249b215bdb3516cbbe190fef6292c75b1ad8a8988897c3000000000751ab6553abab00ffffffff02f9078b000000000009ab0053ac51ac00ab51c0422105000000000651006563525200000000", "ac51", 0, -197051790, "55acd8293ed0be6792150a3d7ced6c5ccd153ca7daf09cee035c1b0dac92bb96"], - ["ab82ad3b04545bd86b3bb937eb1af304d3ef1a6d1343ed809b4346cafb79b7297c09e1648202000000086351ac5200535353ffffffff95d32795bbaaf5977a81c2128a9ec0b3c7551b9b1c3d952876fcb423b2dfb9e80000000005515363acac47a7d050ec1a603627ce6cd606b3af314fa7964abcc579d92e19c7aba00cf6c3090d6d4601000000056a516551633e794768bfe39277ebc0db18b5afb5f0c8117dde9b4dfd5697e9027210eca76a9be20d63000000000700520063ab6aacffffffff01ec2ddc050000000008ac52ac65ac65ac5100000000", "536300abab", 1, -2070209841, "b362da5634f20be7267de78b545d81773d711b82fe9310f23cd0414a8280801d"], - ["8bff9d170419fa6d556c65fa227a185fe066efc1decf8a1c490bc5cbb9f742d68da2ab7f320100000007ab000053525365a7a43a80ab9593b9e8b6130a7849603b14b5c9397a190008d89d362250c3a2257504eb810200000007acabacac00ab51ee141be418f003e75b127fd3883dbf4e8c3f6cd05ca4afcaac52edd25dd3027ae70a62a00000000008ac52526a5200536affffffffb8058f4e1d7f220a1d1fa17e96d81dfb9a304a2de4e004250c9a576963a586ae0300000005abacac5363b9bc856c039c01d804000000000951656aac53005365acb0724e00000000000565abab63acea7c7a0000000000036a00ac00000000", "6565", 1, -1349282084, "2b822737c2affeefae13451d7c9db22ff98e06490005aba57013f6b9bbc97250"], - ["0e1633b4041c50f656e882a53fde964e7f0c853b0ada0964fc89ae124a2b7ffc5bc97ea6230100000006ac6aacacabacffffffff2e35f4dfcad2d53ea1c8ada8041d13ea6c65880860d96a14835b025f76b1fbd9000000000351515121270867ef6bf63a91adbaf790a43465c61a096acc5a776b8e5215d4e5cd1492e611f761000000000600ac6aab5265ffffffff63b5fc39bcac83ca80ac36124abafc5caee608f9f63a12479b68473bd4bae769000000000965ac52acac5263acabffffffff0163153e020000000008ab005165ab65515300000000", "6a6aac00", 0, -968477862, "20732d5073805419f275c53784e78db45e53332ee618a9fcf60a3417a6e2ca69"], - ["2b052c24022369e956a8d318e38780ef73b487ba6a8f674a56bdb80a9a63634c6110fb5154010000000251acffffffff48fe138fb7fdaa014d67044bc05940f4127e70c113c6744fbd13f8d51d45143e01000000005710db3804e01aa9030000000008acac6a516a5152abfd55aa01000000000751ab510000ac636d6026010000000000b97da9000000000000fddf3b53", "006552", 0, 595461670, "685d67d84755906d67a007a7d4fa311519467b9bdc6a351913246a41e082a29f"], - ["073bc856015245f03b2ea2da62ccedc44ecb99e4250c7042f596bcb23b294c9dc92cfceb6b02000000095163abab52abab636afe292fb303b7c3f001000000000352636af3c49502000000000400ac6a535851850100000000066aac6553ab6500000000", "ab6aab53006aab52", 0, 247114317, "123916c6485cf23bfea95654a8815fbf04ce4d21a3b7f862805c241472906658"], - ["7888b71403f6d522e414d4ca2e12786247acf3e78f1918f6d727d081a79813d129ee8befce0100000009ab516a6353ab6365abffffffff4a882791bf6400fda7a8209fb2c83c6eef51831bdf0f5dacde648859090797ec030000000153ffffffffbb08957d59fa15303b681bad19ccf670d7d913697a2f4f51584bf85fcf91f1f30200000008526565ac52ac63acffffffff0227c0e8050000000001ac361dc801000000000800515165ab00ab0000000000", "656a", 2, 1869281295, "f43378a0b7822ad672773944884e866d7a46579ee34f9afc17b20afc1f6cf197"], - ["cc4dda57047bd0ca6806243a6a4b108f7ced43d8042a1acaa28083c9160911cf47eab910c40200000007526a0000ab6a63e4154e581fcf52567836c9a455e8b41b162a78c85906ccc1c2b2b300b4c69caaaa2ba0230300000008ab5152ac5100ab65ffffffff69696b523ed4bd41ecd4d65b4af73c9cf77edf0e066138712a8e60a04614ea1c0300000004ab6a000016c9045c7df7836e05ac4b2e397e2dd72a5708f4a8bf6d2bc36adc5af3cacefcf074b8b403000000065352ac5252acffffffff01d7e380050000000000cf4e699a", "525163656351", 1, -776533694, "ff18c5bffd086e00917c2234f880034d24e7ea2d1e1933a28973d134ca9e35d2"], - ["b7877f82019c832707a60cf14fba44cfa254d787501fdd676bd58c744f6e951dbba0b3b77f0200000009ac515263ac53525300a5a36e500148f89c0500000000085265ac6a6a65acab00000000", "6563", 0, -1785108415, "cb6e4322955af12eb29613c70e1a00ddbb559c887ba844df0bcdebed736dffbd"], - ["aeb14046045a28cc59f244c2347134d3434faaf980961019a084f7547218785a2bd03916f3000000000165f852e6104304955bda5fa0b75826ee176211acc4a78209816bbb4419feff984377b2352200000000003a94a5032df1e0d60390715b4b188c330e4bb7b995f07cdef11ced9d17ee0f60bb7ffc8e0100000002516513e343a5c1dc1c80cd4561e9dddad22391a2dbf9c8d2b6048e519343ca1925a9c6f0800a020000000665516365ac513180144a0290db27000000000006ab655151ab5138b187010000000007ab5363abac516a9e5cd98a", "53ac", 0, 478591320, "e8d89a302ae626898d4775d103867a8d9e81f4fd387af07212adab99946311ef"], - ["c9270fe004c7911b791a00999d108ce42f9f1b19ec59143f7b7b04a67400888808487bd59103000000066a0052ac6565b905e76687be2dd7723b22c5e8269bc0f2000a332a289cfc40bc0d617cfe3214a61a85a30300000007ac63ac00635251560871209f21eb0268f175b8b4a06edd0b04162a974cf8b5dada43e499a1f22380d35ede0300000000792213fc58b6342cc8100079f9f5f046fb89f2d92cf0a2cb6d07304d32d9da858757037c0000000008abab51636565516affffffff02c72a8b03000000000452acac530dfb9f05000000000096f94307", "5253ab536351", 3, 543688436, "0278adbcc476d135493ae9bdcd7b3c2002df17f2d81c17d631c50c73e546c264"], - ["57a5a04c0278c8c8e243d2df4bb716f81d41ac41e2df153e7096f5682380c4f441888d9d260300000004ab63ab6afdbe4203525dff42a7b1e628fe22bccaa5edbb34d8ab02faff198e085580ea5fcdb0c61b0000000002ac6affffffff03375e6c05000000000663ab516a6a513cb6260400000000007ca328020000000006516a636a52ab94701cc7", "0053ac5152", 0, -550925626, "b7ca991ab2e20d0158168df2d3dd842a57ab4a3b67cca8f45b07c4b7d1d11126"], - ["072b75a504ad2550c2e9a02614bc9b2a2f50b5b553af7b87c0ef07c64ddc8d8934c96d216401000000036aabaca1387242a5bcd21099b016ad6045bed7dce603472757d9822cc5f602caa4ae20414d378b02000000026a63e4ac816734acdc969538d6f70b8ab43a2589f55e0177a4dc471bdd0eb61d59f0f46f6bb801000000065351526aab52d9f2977be76a492c3a7617b7a16dc29a3b0a7618f328c2f7d4fd9bafe760dc427a5066ef000000000465635165ffffffff02c5793600000000000165296820050000000002ac6300000000", "53006a6aac0052ab", 2, 66084636, "437e89bb6f70fd2ed2feef33350b6f6483b891305e574da03e580b3efd81ae13"], - ["7e27c42d0279c1a05eeb9b9faedcc9be0cab6303bde351a19e5cbb26dd0d594b9d74f40d2b020000000200518c8689a08a01e862d5c4dcb294a2331912ff11c13785be7dce3092f154a005624970f84e0200000000500cf5a601e74c1f0000000000076aab52636a6a5200000000", "6500006a5351", 0, 449533391, "535ba819d74770d4d613ee19369001576f98837e18e1777b8246238ff2381dd0"], - ["11414de403d7f6c0135a9df01cb108c1359b8d4e105be50a3dcba5e6be595c8817217490b20000000003005263ffffffff0c6becb9c3ad301c8dcd92f5cbc07c8bed7973573806d1489316fc77a829da03030000000700005253535352ffffffff2346d74ff9e12e5111aa8779a2025981850d4bf788a48de72baa2e321e4bc9ca00000000056352acab63cc585b64045e0385050000000009ab5253ab516aacac00efa9cf0300000000065200635151acbe80330400000000070063635100ab000be159050000000007525300655300ac00000000", "51656a0051ab", 0, 683137826, "d4737f3b58f3e5081b35f36f91acde89dda00a6a09d447e516b523e7a99264d5"], - ["1c6b5f29033fc139338658237a42456123727c8430019ca25bd71c6168a9e35a2bf54538d80100000008536aac52ac6a6a52ffffffff3fb36be74036ff0c940a0247c451d923c65f826793d0ac2bb3f01ecbec8033290100000007ab000051ab6363ffffffff5d9eca0cf711685105bd060bf7a67321eaef95367acffab36ce8dedddd632ee2000000000652ac6a63ac517167319e032d26de040000000003516363dc38fb010000000000b37b00000000000006ab520051ac534baba51f", "636300ababac6563", 0, -2049129935, "3282a2ec6b8c87c9303e6060c17b421687db1bd35fbfa0345b48f2490e15b6cc"], - ["978b9dad0214cfc7ce392d74d9dcc507350dc34007d72e4125861c63071ebf2cc0a6fd4856020000000651ac6a6aab52ffffffff47f20734e3370e733f87a6edab95a7a268ae44db7a8974e255614836b22938720200000008635265ac51516553ffffffff0137b2560100000000035252ac2f3363e9", "006aab6352", 1, 2014249801, "55611a5fb1483bce4c14c33ed15198130e788b72cd8929b2ceef4dd68b1806bf"], - ["442f1c8703ab39876153c241ab3d69f432ba6db4732bea5002be45c8ca10c3a2356fe0e9590300000001accb2b679cab7c58a660cb6d4b3452c21cd7251a1b77a52c300f655f5baeb6fa27ff5b79880300000003005252e5ccf55712bc8ed6179f6726f8a78f3018a7a0391594b7e286ef5ee99efdcde302a102cc0200000009006352526351536a63ffffffff04443f63030000000006536a63ab63651405fb020000000009ac535351525300ab6a9f172b000000000004ab535263ad5c50050000000008656a65ab630000ac00000000", "65636aab006552", 2, 2125838294, "b3ff10f21e71ebc8b25fe058c4074c42f08617e0dcc03f9e75d20539d3242644"], - ["2b3470dd028083910117f86614cdcfb459ee56d876572510be4df24c72e8f58c70d5f5948b03000000066aab65635265da2c3aac9d42c9baafd4b655c2f3efc181784d8cba5418e053482132ee798408ba43ccf90300000000ffffffff047dda4703000000000765516a52ac53009384a603000000000651636a63ab6a8cf57a03000000000352ab6a8cf6a405000000000952636a6a6565525100661e09cb", "ac520063ac6a6a52", 1, 1405647183, "9b360c3310d55c845ef537125662b9fe56840c72136891274e9fedfef56f9bb5"], - ["d74282b501be95d3c19a5d9da3d49c8a88a7049c573f3788f2c42fc6fa594f59715560b9b00000000009655353525265ac52ac9772121f028f8303030000000003510065af5f47040000000007ac516a6551630000000000", "acab53006363ac", 0, -1113209770, "2f482b97178f17286f693796a756f4d7bd2dfcdbecd4142528eec1c7a3e5101a"], - ["3a5644a9010f199f253f858d65782d3caec0ac64c3262b56893022b9796086275c9d4d097b02000000009d168f7603a67b30050000000007ac51536a0053acd9d88a050000000007655363535263ab3cf1f403000000000352ac6a00000000", "005363536565acac6a", 0, -1383947195, "6390ab0963cf611e0cea35a71dc958b494b084e6fd71d22217fdc5524787ade6"], - ["67b3cc43049d13007485a8133b90d94648bcf30e83ba174f5486ab42c9107c69c5530c5e1f0000000003005100ffffffff9870ebb65c14263282ea8d41e4f4f40df16b565c2cf86f1d22a9494cad03a67f01000000016a5a121bee5e359da548e808ae1ad6dfccae7c67cbb8898d811638a1f455a671e822f228ef030000000151c1fcc9f9825f27c0dde27ea709da62a80a2ff9f6b1b86a5874c50d6c37d39ae31fb6c8a0030000000163553b8786020ca74a00000000000665635153ab5275c0760000000000020052e659b05d", "636aab6a6a", 0, -342795451, "f77c3322c97b1681c17b1eba461fa27b07e04c1534e8aaf735a49cab72c7c2e2"], - ["bda1ff6804a3c228b7a12799a4c20917301dd501c67847d35da497533a606701ad31bf9d5e0300000001ac16a6c5d03cf516cd7364e4cbbf5aeccd62f8fd03cb6675883a0636a7daeb650423cb1291010000000500656553ac4a63c30b6a835606909c9efbae1b2597e9db020c5ecfc0642da6dc583fba4e84167539a8020000000865525353515200acffffffff990807720a5803c305b7da08a9f24b92abe343c42ac9e917a84e1f335aad785d00000000026a52ffffffff04981f20030000000001ab8c762200000000000253ab690b9605000000000151ce88b301000000000753526a6a51006500000000", "000052ac52530000", 1, -1809193140, "5299b0fb7fc16f40a5d6b337e71fcd1eb04d2600aefd22c06fe9c71fe0b0ba54"], - ["2ead28ff0243b3ab285e5d1067f0ec8724224402b21b9cef9be962a8b0d153d401be99bbee0000000004ac635153ffffffff6985987b7c1360c9fa8406dd6e0a61141709f0d5195f946da55ed83be4e3895301000000020053ffffffff016503d20500000000085251ac6a65656a6a00000000", "51abab", 1, 1723793403, "67483ee62516be17a2431a163e96fd88a08ff2ce8634a52e42c1bc04e30f3f8a"], - ["db4904e6026b6dd8d898f278c6428a176410d1ffbde75a4fa37cda12263108ccd4ca6137440100000007656a0000515263ffffffff1db7d5005c1c40da0ed17b74cf6b2a6ee2c33c9e0bacda76c0da2017dcac2fc70200000004abab6a53ffffffff0454cf2103000000000153463aef000000000009ab6a630065ab52636387e0ed050000000000e8d16f05000000000352ac63e4521b22", "", 1, 1027042424, "48315a95e49277ab6a2d561ee4626820b7bab919eea372b6bf4e9931ab221d04"], - ["dca31ad10461ead74751e83d9a81dcee08db778d3d79ad9a6d079cfdb93919ac1b0b61871102000000086500525365ab51ac7f7e9aed78e1ef8d213d40a1c50145403d196019985c837ffe83836222fe3e5955e177e70100000006525152525300ffffffff5e98482883cc08a6fe946f674cca479822f0576a43bf4113de9cbf414ca628060100000006ac53516a5253ffffffff07490b0b898198ec16c23b75d606e14fa16aa3107ef9818594f72d5776805ec502000000036a0052ffffffff01932a2803000000000865ab6551ac6a516a2687aa06", "635300ac", 2, -1880362326, "74d6a2fa7866fd8b74b2e34693e2d6fd690410384b7afdcd6461b1ae71d265ce"], - ["e14e1a9f0442ab44dfc5f6d945ad1ff8a376bc966aad5515421e96ddbe49e529614995cafc03000000055165515165fffffffff97582b8290e5a5cfeb2b0f018882dbe1b43f60b7f45e4dd21dbd3a8b0cfca3b0200000000daa267726fe075db282d694b9fee7d6216d17a8c1f00b2229085495c5dc5b260c8f8cd5d000000000363ac6affffffffaab083d22d0465471c896a438c6ac3abf4d383ae79420617a8e0ba8b9baa872b010000000963526563ac5363ababd948b5ce022113440200000000076a636552006a53229017040000000000e6f62ac8", "526353636a65", 3, -485265025, "1bc8ad76f9b7c366c5d052dc479d6a8a2015566d3a42e93ab12f727692c89d65"], - ["720d4693025ca3d347360e219e9bc746ef8f7bc88e8795162e5e2f0b0fc99dc17116fc937100000000046353520045cb1fd79824a100d30b6946eab9b219daea2b0cdca6c86367c0c36af98f19ac64f3575002000000008a1c881003ed16f3050000000008536a63630000abac45e0e704000000000151f6551a05000000000963536565515363abab00000000", "6553ab6a6a510000ab", 1, 1249091393, "a575fa4f59a8e90cd07de012c78fe8f981183bb170b9c50fcc292b8c164cbc3b"], - ["69df842a04c1410bfca10896467ce664cfa31c681a5dac10106b34d4b9d4d6d0dc1eac01c1000000000551536a5165269835ca4ad7268667b16d0a2df154ec81e304290d5ed69e0069b43f8c89e673328005e200000000076a5153006aacabffffffffc9314bd80b176488f3d634360fcba90c3a659e74a52e100ac91d3897072e3509010000000765abac51636363ffffffff0e0768b13f10f0fbd2fa3f68e4b4841809b3b5ba0e53987c3aaffcf09eee12bf0300000008ac535263526a53ac514f4c2402da8fab0400000000001ef15201000000000451526a52d0ec9aca", "525365ac52", 1, 313967049, "a72a760b361af41832d2c667c7488dc9702091918d11e344afc234a4aea3ec44"], - ["adf2340d03af5c589cb5d28c06635ac07dd0757b884d4777ba85a6a7c410408ad5efa8b19001000000045100ab00ffffffff808dc0231c96e6667c04786865727013922bcb7db20739b686f0c17f5ba70e8f0300000000fd2332a654b580881a5e2bfec8313f5aa878ae94312f37441bf2d226e7fc953dcf0c77ab000000000163aa73dc580412f8c2050000000005636aacac63da02d502000000000153e74b52020000000001536b293d030000000009636552ababacab526500000000", "000052ab52ababab", 0, -568651175, "2c45d021db545df7167ac03c9ee56473f2398d9b2b739cf3ff3e074501d324f8"], - ["e4fec9f10378a95199c1dd23c6228732c9de0d7997bf1c83918a5cfd36012476c0c3cba24002000000085165536500ac0000ad08ab93fb49d77d12a7ccdbb596bc5110876451b53a79fdce43104ff1c316ad63501de801000000046a6352ab76af9908463444aeecd32516a04dd5803e02680ed7f16307242a794024d93287595250f4000000000089807279041a82e603000000000200521429100200000000055253636a63f20b940400000000004049ed04000000000500ab5265ab43dfaf7d", "6563526aac", 2, -1923470368, "32f3c012eca9a823bebb9b282240aec40ca65df9f38da43b1dcfa0cac0c0df7e"], - ["4000d3600100b7a3ff5b41ec8d6ccdc8b2775ad034765bad505192f05d1f55d2bc39d0cbe10100000007ab5165ac6a5163ffffffff034949150100000000026a6a92c9f6000000000008ab6553ab6aab635200e697040000000007636a5353525365237ae7d2", "52000063", 0, -880046683, "c76146f68f43037289aaeb2bacf47408cddc0fb326b350eb4f5ef6f0f8564793"], - ["eabc0aa701fe489c0e4e6222d72b52f083166b49d63ad1410fb98caed027b6a71c02ab830c03000000075253ab63530065ffffffff01a5dc0b05000000000253533e820177", "", 0, 954499283, "1d849b92eedb9bf26bd4ced52ce9cb0595164295b0526842ab1096001fcd31b1"], - ["d48d55d304aad0139783b44789a771539d052db565379f668def5084daba0dfd348f7dcf6b00000000006826f59e5ffba0dd0ccbac89c1e2d69a346531d7f995dea2ca6d7e6d9225d81aec257c6003000000096a655200ac656552acffffffffa188ffbd5365cae844c8e0dea6213c4d1b2407274ae287b769ab0bf293e049eb0300000005ac6a6aab51ad1c407c5b116ca8f65ed496b476183f85f072c5f8a0193a4273e2015b1cc288bf03e9e2030000000252abffffffff04076f44040000000006655353abab53be6500050000000003ac65ac3c15040500000000095100ab536353516a52ed3aba04000000000900ac53ab53636aabac00000000", "5253526563acac", 2, -1506108646, "bbee17c8582514744bab5df50012c94b0db4aff5984d2e13a8d09421674404e2"], - ["9746f45b039bfe723258fdb6be77eb85917af808211eb9d43b15475ee0b01253d33fc3bfc502000000065163006a655312b12562dc9c54e11299210266428632a7d0ee31d04dfc7375dcad2da6e9c11947ced0e000000000009074095a5ac4df057554566dd04740c61490e1d3826000ad9d8f777a93373c8dddc4918a00000000025351ffffffff01287564030000000004636a00ab00000000", "52", 2, -1380411075, "84af1623366c4db68d81f452b86346832344734492b9c23fbb89015e516c60b2"], - ["8731b64903d735ba16da64af537eaf487b57d73977f390baac57c7b567cb2770dfa2ef65870100000001635aedd990c42645482340eacb0bfa4a0a9e888057389c728b5b6a8691cdeb1a6a67b45e140200000008ac53526a52516551ffffffff45c4f567c47b8d999916fd49642cbc5d10d43c304b99e32d044d35091679cb860100000003006a51ffffffff0176d6c200000000000000000000", "ab6a65ab53", 2, -1221546710, "ccfdba36d9445f4451fb7cbf0752cc89c23d4fc6fff0f3930d20e116f9db0b95"], - ["f5cfc52f016209ab1385e890c2865a74e93076595d1ca77cbe8fbf2022a2f2061a90fb0f3e010000000253acffffffff027de73f0200000000085252ac510052acac49cd6a020000000000e6c2cb56", "516552535300ab63", 0, -1195302704, "5532717402a2da01a1da912d824964024185ca7e8d4ad1748659dc393a14182b"], - ["df0a32ae01c4672fd1abd0b2623aae0a1a8256028df57e532f9a472d1a9ceb194267b6ee190200000009536a6a51516a525251b545f9e803469a2302000000000465526500810631040000000000441f5b050000000006530051006aaceb183c76", "536a635252ac6a", 0, 1601138113, "9a0435996cc58bdba09643927fe48c1fc908d491a050abbef8daec87f323c58f"], - ["d102d10c028b9c721abb259fe70bc68962f6cae384dabd77477c59cbeb1fb26266e091ba3e0100000002516affffffffe8d7305a74f43e30c772109849f4cd6fb867c7216e6d92e27605e69a0818899700000000026a65ecf82d58027db4620500000000026552c28ed3010000000001ab00000000", "0051ab515365", 1, -131815460, "1d1757a782cb5860302128bcbe9398243124a2f82d671a113f74f8e582c7a182"], - ["cef930ed01c36fcb1d62ceef931bef57098f27a77a4299904cc0cbb44504802d535fb11557010000000153ffffffff02c8657403000000000863ac655253520063d593380400000000046aab536a00000000", "656a0051ab6365ab53", 0, -351313308, "e69dba3efb5c02af2ab1087d0a990678784671f4744d01ca097d71aec14dd8e9"], - ["b1c0b71804dff30812b92eefb533ac77c4b9fdb9ab2f77120a76128d7da43ad70c20bbfb990200000002536392693e6001bc59411aebf15a3dc62a6566ec71a302141b0c730a3ecc8de5d76538b30f55010000000665535252ac514b740c6271fb9fe69fdf82bf98b459a7faa8a3b62f3af34943ad55df4881e0d93d3ce0ac0200000000c4158866eb9fb73da252102d1e64a3ce611b52e873533be43e6883137d0aaa0f63966f060000000001abffffffff04a605b604000000000851006a656a630052f49a0300000000000252515a94e1050000000009abac65ab0052abab00fd8dd002000000000651535163526a2566852d", "ac5363", 0, -1718831517, "b0dc030661783dd9939e4bf1a6dfcba809da2017e1b315a6312e5942d714cf05"], - ["6a270ee404ebc8d137cfd4bb6b92aa3702213a3139a579c1fc6f56fbc7edd9574ef17b13f30100000009ab00ab656565ababacffffffffaa65b1ab6c6d87260d9e27a472edceb7dd212483e72d90f08857abf1dbfd46d10100000000fffffffff93c4c9c84c4dbbe8a912b99a2830cfe3401aebc919041de063d660e585fc9f002000000096aabacab52ac6a53acfa6dcef3f28355a8d98eee53839455445eeee83eecd2c854e784efa53cee699dbfecaebd0100000003ab6a51ffffffff04f7d71b050000000009ac6a536aac6a6365513c37650500000000065265abab6a53fa742002000000000039ed82030000000009516aac635165ab51ab2fdabd17", "ab535252526563", 1, -1326210506, "1dec0d5eb921bf5b2df39c8576e19c38d0c17254a4a0b78ac4b5422bcc426258"], - ["3657e4260304ccdc19936e47bdf058d36167ee3d4eb145c52b224eff04c9eb5d1b4e434dfc0000000001ab58aefe57707c66328d3cceef2e6f56ab6b7465e587410c5f73555a513ace2b232793a74400000000036a006522e69d3a785b61ad41a635d59b3a06b2780a92173f85f8ed428491d0aaa436619baa9c4501000000046351abab2609629902eb7793050000000000a1b967040000000003525353a34d6192", "516a", 0, -1761874713, "0a2ff41f6d155d8d0e37cd9438f3b270df9f9214cda8e95c76d5a239ca189df2"], - ["a0eb6dc402994e493c787b45d1f946d267b09c596c5edde043e620ce3d59e95b2b5b93d43002000000096a5252526aac63ab6555694287a279e29ee491c177a801cd685b8744a2eab83824255a3bcd08fc0e3ea13fb8820000000009abab6365ab52ab0063ffffffff029e424a040000000008acab53ab516a636a23830f0400000000016adf49c1f9", "ac0065ac6500005252", 1, 669294500, "e05e3d383631a7ed1b78210c13c2eb26564e5577db7ddfcea2583c7c014091d4"], - ["6e67c0d3027701ef71082204c85ed63c700ef1400c65efb62ce3580d187fb348376a23e9710200000001655b91369d3155ba916a0bc6fe4f5d94cad461d899bb8aaac3699a755838bfc229d6828920010000000765536353526a52ffffffff04c0c792000000000005650052535372f79e000000000001527fc0ee010000000005ac5300ab65d1b3e902000000000251aba942b278", "6a5151", 0, 1741407676, "e657e2c8ec4ebc769ddd3198a83267b47d4f2a419fc737e813812acefad92ff7"], - ["8f53639901f1d643e01fc631f632b7a16e831d846a0184cdcda289b8fa7767f0c292eb221a00000000046a53abacffffffff037a2daa01000000000553ac6a6a51eac349020000000005ac526552638421b3040000000007006a005100ac63048a1492", "ac65", 0, 1033685559, "da86c260d42a692358f46893d6f91563985d86eeb9ea9e21cd38c2d8ffcfcc4d"], - ["491f99cb01bdfba1aa235e5538dac081fae9ce55f9622de483afe7e65105c2b0db75d360d200000000045251636340b60f0f041421330300000000096351ac000051636553ce2822040000000005516a00ac5180c8e40300000000025100caa8570400000000020000cfdc8da6", "6a5100516aab655365", 0, -953727341, "397c68803b7ce953666830b0221a5e2bcf897aa2ded8e36a6b76c497dcb1a2e1"], - ["b3cad3a7041c2c17d90a2cd994f6c37307753fa3635e9ef05ab8b1ff121ca11239a0902e700300000009ab635300006aac5163ffffffffcec91722c7468156dce4664f3c783afef147f0e6f80739c83b5f09d5a09a57040200000004516a6552ffffffff969d1c6daf8ef53a70b7cdf1b4102fb3240055a8eaeaed2489617cd84cfd56cf020000000352ab53ffffffff46598b6579494a77b593681c33422a99559b9993d77ca2fa97833508b0c169f80200000009655300655365516351ffffffff04d7ddf800000000000853536a65ac6351ab09f3420300000000056aab65abac33589d04000000000952656a65655151acac944d6f0400000000006a8004ba", "005165", 1, 1035865506, "fe1dc9e8554deecf8f50c417c670b839cc9d650722ebaaf36572418756075d58"], - ["e1cfd73b0125add9e9d699f5a45dca458355af175a7bd4486ebef28f1928d87864384d02df02000000036a0051ffffffff0357df030100000000036a5365777e2d04000000000763ab6a00005265f434a601000000000351655100000000", "ab53ab", 0, -1936500914, "950f4b4f72ccdf8a6a0f381265d6c8842fdb7e8b3df3e9742905f643b2432b69"], - ["cf781855040a755f5ba85eef93837236b34a5d3daeb2dbbdcf58bb811828d806ed05754ab8010000000351ac53ffffffffda1e264727cf55c67f06ebcc56dfe7fa12ac2a994fecd0180ce09ee15c480f7d00000000096351516a51acac00ab53dd49ff9f334befd6d6f87f1a832cddfd826a90b78fd8cf19a52cb8287788af94e939d6020000000700525251ac526310d54a7e8900ed633f0f6f0841145aae7ee0cbbb1e2a0cae724ee4558dbabfdc58ba6855010000000552536a53abfd1b101102c51f910500000000096300656a525252656a300bee010000000009ac52005263635151abe19235c9", "53005365", 2, 1422854188, "d5981bd4467817c1330da72ddb8760d6c2556cd809264b2d85e6d274609fc3a3"], - ["fea256ce01272d125e577c0a09570a71366898280dda279b021000db1325f27edda41a53460100000002ab53c752c21c013c2b3a01000000000000000000", "65", 0, 1145543262, "076b9f844f6ae429de228a2c337c704df1652c292b6c6494882190638dad9efd"] + ["01000000031ae5cc19e89d6dd4ad74c1834493beeeea6667b84c4b63af6fa5765a4d667435030000000865650051006a0000ffffffff11c135969c8669e14b5de28bc6238b4de36191f6a2e12b8f797f8e276252b80f01000000065365ac0063abffffffffdac1320545cc27ba824a46fd12766bdf98d28f8477da3e7f4366ee57eea594520000000001acffffffff04128e57030000000005656a65515291202f0000000000095365ac53ab655353abaf128c0100000000045353630067bd130200000000066551ab51acab5d76c7b2", "5352516a630063", 1, 255808092, "a4a11ca528ed65641da26615ccc24f029a08b4892f5d7e7caad67fe5251ce82f"], + ["0100000002e4cf7820299a68d5e4793062545b337d5a13bce85002ae05da8df465e31b9f38020000000453ab0052ffffffff13a640a6be619172a700f9e3bdf3336a9567d73abe48ea42625acc522cf040510000000004536a6363d92a432f04727c030000000000066351ac51516386a698020000000000dba992050000000006ab535165ab53e164540100000000045263ab63de3cafca", "63", 0, 485693280, "6378619d387e8791d32265c3b05404387a7566416e363f957041840227696429"], + ["010000000285f5d8f90446c86ded6434e368828407eb213615bebcd19eb36c5a6251a68080000000000800005152ac006363db86db8454d25766624c84c4f9c5a0b873340d7bf88f2d6ce30a385fc53f584ee120e30002000000066a535363ac52ffffffff044b72fb030000000003656553bed490020000000004525151521b47d4030000000003516353b74dba0200000000036551536482dadb", "6a6a53ab", 0, -848231796, "e6b85d8a4d47931b1d3bf444b8ca08c616660fde5a94b6c396724215f1d8810d"], + ["020000000464956c3b0df42c438cd5f12adac2e6f70cca6eca2c26181b1ae9aeddff9bef5e02000000026aab9494ca2b19f2a95d2306151ab2f7956bc1c1cb46d23b7f314a0b8269b9ea83e1ca9edbe3030000000563655200513905ba8482534dbb1c697795a8d8485b26eedb782152ed4ed6c362cd2d902fb253b78bef0300000009abab51ab65516aac51ffffffffb4eb69f4cf8ca5b90b6ddd3d7f7dbf08b2fbd3c3914817d8022c5ef59d4f67b20200000001acffffffff037d6bfb0100000000056300636a5343a26504000000000452006352dd476f02000000000663536352515200000000", "", 2, 204214603, "354f1e4a4cd87ba48686fa166310091082df8f397658222745453c33d9d72453"], + ["010000000327182385038a109c50b7e72047afb93769ec8394c67c7736d8e97d9c2240d0230200000005acababac65ffffffff3b49b9cedea06af3f179d709ee73f1ad4cf917cc36dac18fcbff5bd75a6b2e45000000000600656500ababffffffff6f332918185395cb71a973e5e74b52c99f0871c0a8a05ed702a6d09c471b4b110100000005acab635100ffffffff01f0705b05000000000553ab005251d1b29ed5", "", 1, -781135472, "c7974a8e181004694be2ef1f2d52c2d356d21242544c90d66e9090d1700b0cc7"], + ["0100000002fad0a97aa3e233de162f07acf98ac71bcb862c4f829067d1272faaa5b83649a5010000000451ab0065c12e514a5f1c968a6243d106469d492e5d5466e7180808d72d55a91c7c6e28abf10ebb3e02000000076a53ac63515200ffffffff045d8e46040000000001ab5cf3a50300000000026a52d824b3000000000001accb0ee101000000000000000000", "5165", 0, -879957748, "832e824b845eee26e854cb0f37ebc8b7e4bea0ae196c820e5492bcb2c67227ea"], + ["0100000002450b334082036ad5f896842b69fe667355ed12d845bfd78cd69f171b6f6aa4640100000004ac5163653d3a04aff99f3163f3abf97e1fd6bed6cb4da83863849fa29ab2847742ee21c3f0f2b0ba0000000002abab745d164301c75a5b0000000000030065ab00000000", "ab6a5253", 0, 1412217334, "37965267c6c3f0f7e7336cda4211cb2fe2fe451ec5c567814bc7e9d4622e3d70"], + ["010000000266fdefd27f8471414b56d9409e9d63dda20e4c50261cc7e723d0b9a9e39fd70303000000045163516affffffffb019a898d96930fa052533e32f11e53d1c6288190002f9c6b97dc256137c94fb02000000096a6a5152ab516552ab01e370ed041593bb05000000000863ac0052ac005163f5bc0204000000000963ac5100ac52acac009604f405000000000952ac63ac5152000051a58eb6000000000006006a6a00636500000000", "630065ab", 1, -1959689869, "b1d880a93505565a8f06753b27ba536929b2909bf3d721d19f3210d77373cb84"], + ["0200000003991f574c18a8ddf5510a9543e01c5e60a67e11dd3a881b57eee638f4c3ed3a6202000000076363abab6363acffffffff54726f5c2fac2979114b20f04691eec50208a0ea1f2c984e4df32b4ca5f6625802000000080051acac65635252fbc01868001b6734f4b360d0242caf952e402cde9bbe2521faa97c8bce685cbccc398dbd030000000163ffffffff0358c028030000000001ab73ea1a050000000000c987d80500000000040065ac6500000000", "52ab53526a", 2, 1688960160, "8498ab7266c94164e33a89468233ab0533703a8f0bae8ff3afff24fd7c4177d7"], + ["0100000001d2635f758e110319f4cabbb228bc0cedd09af5ce403a4109ce46e1632acecb5c01000000066aab00acab00894a67d9011cd1060100000000003f81a948", "ac6aab005353", 0, -1962536388, "ac093da67c3f0bc1749940c221a11e091aa89dd2f1ba4d7fc0e1676f763ba37a"], + ["020000000325c100ef7f8abb40737771a21625fdc8a122832f444d21e50bfd56db310faab10000000003516a53ffffffff67166672b773d45ec22f1176f250385e3a2147a44256ff57ed218d2a8296ac090200000003535300d792d102bfddc1933e662c124c7f8670cecbdb2f9bdff2d4c9f38f81393822391b69108e0100000000fe300d5e01fa3420010000000005656aac63ac0c571bab", "ac6a5152", 1, -2100181403, "c50c3806b335f90dc4feafc47fa2d6acae7d4bb4bf810f2a27409c875507b37d"], + ["02000000034e7ca8da4de9bb1e072ea7c646a495bcea6102776d960a11a815fa37dfec82210200000001abc9fd4c2419ec2d0bf72242237f83b35b6d4bb155ac27548f382602f4ccf111b5d8cea6fe0200000009ab51516352530053abffffffffd6bca164813754333caeff1892413f044b8f345dae1a33f68e185def28f1f8ab010000000153ffffffff04733be30200000000056a00ac0052144f70050000000003ac52004c44b904000000000040e7660100000000096aab63510052ab52521bf08a66", "6365", 2, 488840860, "ced494a3b4e3f4388eae3eedd393387f8f5dcbb13f0d3110718892434fa01316"], + ["0100000001aebb18e98aeabba02a191864a73bd575e58490a866a8262a0f911c11dcf6ec24010000000763516353ac53acffffffff0261bf45010000000001528ff3ad030000000009656a5152ac5152635100000000", "", 0, 851573804, "04232347c62aac4c0050cc8543e73f1f25b66d0217ce8f7c5e7636e15d6fa09d"], + ["0200000004b721d49a1fe2565c73383714b923480ae507f6f9d898096f37b878eb2133940a0100000000ffffffffdc9d4878013310ded66c959fd3bc626abd498174c0cf39032054515f2719396a02000000046a6a65630eb0f55917f1271756ad65962f45af3f55f806070d3916ecc5addbbb6570da0dab7111550300000005ab5351abacffffffff9c4e7f5193cac68c200dbbbb224c3d030fc9891b482e67962a33bf6e3debe74a000000000353006a5cf3224103586c4802000000000753536a526353538752d504000000000096a9e20400000000056a0000006a00000000", "51abab53ac5165ac51", 1, -990855379, "4cfb954baa82128d45bde498d0d791dc0c85bf0ac763e8ae276ecb96edfdd23f"], + ["0100000001ee3282adeebdbc9b7c610ad06bd5638b37c7ad0258e1a9c632ae9fc380148383030000000665526a00abacffffffff0107daa1020000000006636a526365536619e606", "5153", 0, -625214744, "b4cc68bac81b1bb1e197c35b8a2e94cef59d3c3c7f9017be17c8797e3b448f85"], + ["01000000039a8b05ba0d598f08ac18390c01df5a9e4eaa324825dbee61cd7b331c707f606c0200000000ffffffffbb602c0b7a657e66c185ce6644aff2b5984f7321709c7ea0e9c9cdc5c19638f6020000000029c465cd8fc419ce7f46c6f49367f1914a621af0ba131c72bbbcdbbee14ba236c8b359c8010000000652516a5353acffffffff03f713b404000000000765650065ab6a537eafad030000000001518245f9020000000002535200000000", "63ab0065526a65", 2, 1034512125, "16879f2d3216590058284c730d3f52b78bb0708cd5be0673c9efdaca6d447c72"], + ["02000000030a0565b185e4f2ac33975d95357b9346323ad725abe53a1f1c13f173505e4ccd0100000009516a6aac63ab63ab6afef31f3b8bc5cb473b26a9025cf29debfde76fe0ec03e49cc76534615b1cc8b3101abc90020000000963530052636363acab627130e1aa9921c52cbf4accef387b397d1167c9bac29f32b50b9be625d1f57a6b798b8600000000080051636aab65abacffffffff02c5baa6030000000004ac5265001e9a6d02000000000363526500000000", "00636353515253", 1, 566500037, "722532eeb71244301d153a34b4734a546044a9a56b79bb396fd94fce8ea66adf"], + ["01000000018a0a2e10bbbb1f634c5e12ffe6e4aa707ef1912ae40cc78f6deaaf0e9a208e7703000000036a5365ffffffff0182b2bd0400000000085163536551536565adf9d8b5", "00ac0053ab51", 0, 562883043, "e37ebf997f443dc859999eb8f0095f0a594c8fadeb9e9def6f04c4fd032b38ec"], + ["0100000004ce40d64bc378d57bf593327cce06c719dffcaeef4328b2bcf24a4efcb00c7c7802000000026353ffffffff5891382f9b83135739d03317c6b8396ff4eeb84de632ace725f2fa72de6144a80000000003526363ef1f2828e430ec309ea81fb2de43b90fd0f36405ddab41000995f18c525db3b4c5c02480010000000251abeb1c6cd395afce6374f166ff1a4ad90d0a1fc2c4c5545d0781115abe3cd61b7eeba43645010000000365ab63c1870b1104a4b752040000000002ab630f51f40500000000003654260400000000020065db867101000000000452515253698bfc79", "535152", 3, 858773725, "c0411817beae25cb456bfd66612dc0da4b8a64506f3b17e7144d010c312a29b3"], + ["01000000047ba7d52ae60d42cb670e59c1726fa3d7f5e5c82dcd05554c444a4b5df4159f870000000008515251ac635263512e198f3b41e2a4c26b6811699c436ba26540e7da47e15eea4e1a666a2a2a3f7c907f25850000000000ffffffff457c1bfddedabe16f63acf045e6840c9749a3bace5c771dd596d0a98fe99515f010000000151beaaca7e1e3d6dd82864f3f5601e93bedaa61b73f452594e32b9e85a3ae035b636d697f80300000006ac5165acac51ffffffff04527141010000000000d59cca030000000009525353ab516553ab634fe5e1000000000008655200ab6a65abab8c42210300000000026551f355b309", "636a6565ab6565", 3, 663863489, "60f11d0658a3f319d63c124caeb64d6980e933b9339ddd2ec68f759aca69b509"], + ["0100000003fdba841f1f55b602d5254fc0f0866a4dad0675b24da325a50db7ab203be8b19400000000036a65531a63327b8d4ad361b0f39ab156d3db8e3088603325117be0835eab1e37d42cf66b6b8ade010000000600ab6551ac52bd919514efe08d7875b7f78705b424d17adb3c4308d60cefcae04263dc55c7b2b17ca0280100000007acac53526a52ab8100dc800319ae6305000000000451536aac5df7c8000000000000a7401104000000000765536363006553c7c21122", "006a636352", 0, -872945930, "aa4a1256a25ccb431fcd0626661039c109c367b959e95cfc7443b6a00a99aec7"], + ["02000000029bc0c6510aefda97d91546128b9aaab6f3f6dcae5dff99814c7152803dc142070300000002536380f4074dd0b4bfaf4fca0724dde46dc30a54789c33f0b1f3faf24b68fdd9690275c7866d0000000008630063535163ac53ffffffff03b5285705000000000700656aac006363e79f9f030000000000f2083f050000000005ac53ac00ac00000000", "6351abab00ac63", 0, -765478768, "b7329eda60f25081e4b24477c87c3847ee274be252c9ed86ec7b2a0c2255a4a3"], + ["02000000019d7a92d2eeaaee3f6bf864f651a3456e455326b30a3d64cddd161fbac5b4edf00100000008516a5352636a51633b61a07d0363af760300000000000d6258050000000002636a729907000000000003ac516500000000", "6a5251516a52516a65", 0, 1438924377, "04ca984a84352c0ca3d7fc76c7e42b035d797d045ffa8abb6be95d729979390b"], + ["02000000025d67d20d865f4669403c4622470c8e1ceeb5ee332e12def53eff9e128370f84e00000000076565ac52530052ffffffff17b3c304d8277a26fb659cf805f548dcfbcf703bbd421e5fe6be3a2936e62888010000000151ffffffff028daf3d01000000000863515363ab6500650fc8bd02000000000352635200000000", "6a6553ac00656552ab", 1, -51831032, "ecbc74cf25c3a2ee37e3cc5bd4a2f5a7e5997d420a72cf379d05e784738bb88c"], + ["02000000034041bf68db43b74cab112fcb56ab3dedafe0fb1758f4847442fe2bd40a0725ee0300000005ac5353ac003cf4fe2dd3032e360ac658d98ee52cc0d0d2f71c21cb42c73a7f1baf57e296b6ef6bee4600000000096aab63526a656300abffffffffe0f7dc68cd77812d7ea3710036d694c304c9b51f29f6a1a8e3c84af33ef9d4800300000000ffffffff02355106050000000002ac5270ffd902000000000953516551526a536aacacbf86d0", "ac", 2, 1798167899, "ef51bd20e894b2a129ab5d6a2a39a073f41d5b7c0736420840e6131a1f421efb"], + ["02000000045e5c985d7af9a8b77585c0a8776c71076b9f0a80f16e2fdea0b1be235d80a1e900000000056aac6353510ed52420f0ae72bcb5a65710b5b535ee3af93fb3c7ce81f232e0852f5ba26d6efc8f052c0300000000fffffffffc18ad635b8919eaf50a945ed834dcc2ac8e63e88a793a97c7bc8abfc1a2df1900000000066a536565536300943e0289f7d090bd9477db3d13c7242ba9c6ea0c3d56ab76ba56926c6874bda07da10202000000016a8ba47d7f029b98790500000000086a51515300abab6559857e0200000000045152536500000000", "abac006a63ab", 0, -601193396, "4e1c7e20d3a9f95ad797059b129536dc13ee25b9a88989988fe9e0fba254345a"], + ["010000000122624e8ef8840956eb4848adcb1a593ce08e033be49f057d821e264a4532e0b300000000096a6300ab656a516300ffffffff01f065c3030000000008acac6aab006aac5100000000", "abab5163ab", 0, 547503330, "98336c594ac9301492156e61154c1dcee3032a52b147f82c38361c52315c353e"], + ["0100000004bf611ae10ba928ac715d38e7feb6f3d0447331fa709c6e41e5ef2dadc4a4b5d20100000009ab65656a6a5352636a76231dc16e00f6892417d2f0b4a065b6f12d42a14ff64e89ffa0526891413e29b7906365010000000653ac536565ace4a97d32cc9b0275cecb48cf2933e5e258b435c02e0ab38e43c610c64f9d66f5d3c485fe0300000002ab0091a01f0250567aae030c4760efaa089c216231e7da42a443bbfc0c6aba4ac425a20df9160000000003abab00cc9935e3016585410300000000095351ac5152ac65005300000000", "ac", 2, 215439119, "12ba36b2b267f4fc87b327ce951050b66ec5aa5c5f49b60096498fd9de7e35ab"], + ["01000000032812f5302ce98836c0f7711e199b60a2308ed1e39ad943754d9c94ae5902bb6f01000000080063636363526352ffffffffdd23825163ed552286f8122817b915d696f08da6950d7049be8930da3c9401560200000004abacac63ffffffffc2b5595f77ccd99e69b5b78226dab768ad1677aaf61d269de424c3050f1a58f1010000000100ffffffff02362568030000000004635151acda694501000000000165f8a3a2ab", "5365acac53536300", 1, 2119151725, "b84788bad1f7251ac4c7cfe251ec37a5a1214474fd31f12aaba4582cf80f72f7"], + ["0100000002254a5dc2990e23cb0c58f60b765592f193d8ce6b3c8e986d3be7f52b4712482b0200000006006a6553ab6a64cfdba87265b3a56422411671ee15c874ff06c3b188789bd2cd3a44e9e16aa5b42739560100000002ab51ffffffff04fdc49d050000000002636ab90b5d0300000000026a52bfb9d3010000000002acab53b5a50300000000075363655163ac53f3f59eb4", "63abacacac00ab", 0, 1791253063, "eaa53fc503386c9c2354a9c5ceb63cfad514fe3ef3943bc697a9a9c090978e20"], + ["0200000003b3682e63f0b0bd9b3c91d5871167e3395d615fb60c314dcc428cbeaa18cf8ed403000000090065ab0000ab53ac00ecc348b2ad3744071881d52d0b97af939073e9dd6589a5062650d6b144a36fb88c847bed0000000007515153acac00633e378787703648fb3ac2a271a0da33cdf040f3f860950d3c27aae74d9842aef965c0baed0000000005536a6a65650bc7484b013470ee0500000000010000000000", "53ab00510051", 1, -2033574883, "6983cfab9cc08479eb6c028279ff9b42cfc9f8600763ea7ae8f1af41319b0e0b"], + ["0100000001ba0749af74f46acfeefbb7860819c228ae3ebca232674420f67b37f72f80b1cd0100000003ac63ab96991a1a02ee8a60050000000001528aa71c0000000000095251ac6a530052630000000000", "ac", 0, -538330370, "4cb99209005e9b364d7d9b1de7f5877dd204fcead6fcdfac5efebaa8ccbd7763"], + ["01000000014c59e2e1b53e2efae4356535c2e5dec4cc59f8cf0561705a1e70e1dafdc5e15f010000000653526a5363514d8052ff039f93be000000000003630051454383020000000002ab530002070000000000066300acab51abff22b7d1", "ab", 0, -31432205, "8462d02eb8370975229259f05cb68032435d048b2dcf99a121720590b41f0232"], + ["01000000022cd140748adf5230a1fcf526ea1701b548459b807384fda30d84d63f5e233b560300000002acab67e7a1abf1e842d0fec89d4fe2885d8d02219766bacf3e02e455d2c500c6c5c87c4e5a3303000000096a000053005265ab63ffffffff042239fa0100000000010066fd920500000000046a636551bde7c1020000000007ac53535152ab53112b8704000000000700006a53ac6a0000000000", "6a", 1, -1679601771, "95904dbc8f6b97183e12a60a20ec3f38deed24e7b130f0891e0034fa4c7cd36b"], + ["0200000001a3067c385f9e8b75acf477b15b4e52c783f9e387bfe70eee0e7b96bcf063b70703000000036a5352ffffffff03d1afee0000000000065153ab6365ab86079000000000000753535252515265825e3b00000000000300535200000000", "656a005151", 0, -413333699, "fbf5943638f6b38258f02187b33c84edc2b0f79358303ac1efc3fab8f97f1d92"], + ["01000000033d5f8469aeb187c7fda45999852cc855ed5849154238e2fe64e5e34a793e92250000000000ffffffff5880e2d73d2fe34c34e5dbac3ada7b8b817e30539c65905e760132f50f4f3538000000000765656aac655100191fbe0bb8405c16e2eeca3c10ae16fe0f80fe7bc875fcd8f42c31ac2e2166eca61505a10100000000ffffffff01d3f73801000000000153a97cde4a", "6a5163", 1, 947808628, "b126e001d4efa1d3cf8abd9c3988cb2710a33f845daa10fb0e03260cd851f7ef"], + ["0100000004930578cb4c32e428a8f92217ae5995a78b4969640e7356b63fb3b2e1a41dd57603000000035200acffffffff952083cd6aaf47a24ee094305ea15818368c77279af0dea09fd9a8190bcd9e1d00000000016affffffff953f347540ee66501b1925e2053b7b1c05be09538db007aef17f3024c9005654000000000751ababab656500ed53ca9d2ceb4c9dba02bf473872df2b033d4d9ad4189c7075a5bc78d2e49946e6400a3401000000056aabab5200ffffffff018dafe60500000000086500636a6a6563632c762eea", "52ab6a63ab635363", 1, -1495482313, "8db8ccda0435e0f77308f9a00c7adca014de6a93a12f74b04252419dcd8a9a41"], + ["0200000002bf207c35d27e0832c131b698b790bd91d9da1e80b57b172fb8beb2c4cf480386020000000363ab513a14a4675967f01a0456d424f1e007d78b9e2e688af9b68074b95c83f0c0598d56c19001010000000465530053ffffffff0368e80d0200000000080052515251ab5152f17b2a04000000000363abab3c77a7030000000001001ea7b3ec", "00", 0, 349242419, "f920602f8d2dcf566ffc3661139ba545cc4cdc1133ad2445c58b8bbcecb8ada4"], + ["0100000003e4299fbcc044a7102eaebab8513a0ca3f679c13ccbcbccc8f608c53feeb5caba00000000056a526553006b97e04826aeb6e6f1865c9791f0d74921ea366f5ef4f01600db0f9650b9c47e29e80dff010000000352ab00ffffffff14f00aea83cd07f5ba1bde09d0027530377525a39aa6b343c2f4738b32a7ca4202000000036a5100ffffffff03216a36030000000005ac5352516323bd0602000000000040af2f040000000007006a6a5363636541cb0b39", "0000", 2, -1672012230, "1632e746eab88cd65927e13acddf12fda5d734e885520b020873f1835e410a66"], + ["02000000029e5c0c5c72b0b92aafa3deaac63869dfd97db320ef61ab84949e4c6a4f20ed60030000000665526a0051513f09d820ae6427b9d35632d5d2db12a4280cc6740f9a6276b7a1bd5cc746c79b582710a2020000000700ac52516a5365ea777c5d0267ecb9000000000000f9e4c305000000000551ab5153656c38c0bc", "ab6aab6a0053535352", 1, -486870682, "19c0ba1541e7e80a5da98e2914b89906b54895fb77afc19c5aa8529e00686204"], + ["0200000001306a2d0e997e089fc6583113790d23c1898a2bf18128923848c7bd294557c68c000000000765536352655151ffffffff0389f3be0300000000065353655100525af4f60100000000045252536a3203a205000000000351ac6500000000", "635363526a5152ab", 0, 486016165, "1c379b647235535797479f54c34870864d8b6a6b96d00216fcfc5acfb2906905"], + ["0200000002d8b6b5da530878fcd2ee1f12078730509da4d896e4489cbbd808cb100ef1cb210000000002515357c22eae0d1d5735d287cce078b6296d881fc032e4f62950523675a77de8b07bc65422f40100000006525252ac5251ffffffff01b3796704000000000153e54975d2", "", 1, 1271301181, "db78780010a2c9140b6e8461e8c9ce91e0ebae5a5382db439da6c0808b75224c"], + ["0200000001b3c71b1b521869c9135d7da3f85d98d3b38c86add4cf367fe463cfe90a0c9d640100000009ab5300656352655363953bcad402126e4d01000000000865ab53630000ab6a5119d4020000000007ac636a6363525300000000", "53ab530052ac51", 0, 510955255, "cc8ec961c807efeeaca67d4d968cadbe95c9804acbdf55bc92dbfe372df4c242"], + ["0100000002a9c5e2c5a32e72c830ff30cacb90e351cb05534d2ea544d2684fe79d3f7b653d03000000026a52ffffffff6ccea9a83a58f60b9de617e68b97443b4d1bd1baef4a406c7616c253d504152902000000076a636a656a636affffffff049a582603000000000652abac6a526ab6402f030000000008ac515151ab6a6500eb27d9030000000008656a6a6a63636a0028e7f60000000000036353ac3b817ffa", "52ab6aab52005152", 0, -461826524, "c7e3fe4d2af6b90a86939fbca0e38e30b02136c0a96ba7f085ec961340ba20e7"], + ["01000000022c0e906f7d35db4c89aac8d202fdbc77f5e3289ff28e7f4050590264d8530866020000000263acffffffff9002796a5d1dbf63df4d6ac45178962ebbf849da53d125edf77366992b01126b020000000034a8ce180445fd650100000000016a8f341f0500000000056551ac0063887b720500000000046a5352539d9ca905000000000900ac6a6a6565acac5100000000", "abac0000535165ac", 1, 1097715594, "7490dfeb4432feeb060dd20c655965fc8c0cab7cc76d51a07a5b1a1d54ae5b89"], + ["02000000019cfa828563dd17941793fddd27438146ad50e6f9105487ba273e4c72e42cf45303000000009700bf940435333f01000000000044e5a201000000000500ac6a51520d55f4000000000009ac5365ac51ab5153ace6e581000000000008ab6aab5351516a6a72993832", "ac5365510052", 0, -884847366, "083c2b9a765c8acf7f61653e275c141c526a41daf30e191a3531ed8109e30907"], + ["01000000011d991c90ef79246a5cfc40311c7fe029b4e5982d1b36a31fc69b4699d3b8c2700300000004acacac53ffffffff020a13b90200000000005df69e0400000000010004d32400", "65536551630052", 0, -303491680, "4ae70592a28a61d5fa9fd59515a8618f474a62867e4dca8e421f18c74553c7f0"], + ["0100000003306e6e7e6cd937df287dc1ef6843c77998c4387b45e74a54d38a10ce27704a5b000000000563656a65005fb2111f6150da4db3ce2a42c668d70920e7a754cdf8d8e9a881164fec538eccec53679700000000006b4ae9c55dd518a31142c3db37e331047c715de6a331d86629b0a65c5edd6556abbeee10010000000400656a6a28ba73da01de871804000000000351ab650cd617bf", "", 2, -727822470, "e5912cf1ddd44470bd9cadc406be17fb19b3b7abc9a00ce22b871143fb44398a"], + ["02000000012731d2baf052bc16fe4c60db5aacd1d700d7f953499ef5f386c25a792b773140000000000451005251ffffffff03f3da0f0100000000036363ac62e5d2000000000002acac70e58d040000000003535153418b9f67", "515353526aabab51ac", 0, 1830785537, "b990eb60a5ef4e594d7fb2b7500ef34611146486ba663f495ee135f981541569"], + ["0200000003468478dc359f3d16bd776333b5fc91794a0a95be3a411004d142cace0fce60560200000006ab5353ac6a6affffffffedad42f68c97b175da48c55af16fe91480fc8eb7b76ade92a7c74f733a55a9e90300000005536565516ae8084ebf4790ae4ac232302d6c296e132f9760d573e5bbdac6193504ac827a874e3c72540300000009536a53526a526aab6acf4d4faf01e41471030000000000ef4c0444", "ac63ab53636a6a", 2, -314925033, "29146e0d4d83138af288bda843236f0f48023f2fb9d729468033d6ec6f50167c"], + ["020000000452e27a594f78be6b3fccfec62bd36ed0ee2e7b90fb0272a3530c9cb23a7c014601000000075263516a6a5363ffffffff85ef47e10eb5b2e4f39134af5f82a303aaf93c898cc95c93c3b035537fcccbf301000000066a65acab63513f6593000b7fd9c0de32163f3ff2e2ceb1efea0df4ae008c27e78a54996a307cdb62ea74020000000563536552528ac1be3b9de53f917294541e37b072fdbc43ae61e3da505d65824c78602fefd6301852310000000007655265ac635200ffffffff03221b59030000000005ac63636363e0c1ca02000000000151877b7c040000000008ab526a65ac51525200000000", "", 0, -625770860, "3ba45f61f16187a3d7c40ce0db9882a9be633266c268a7d50c624a7a2fa13f7b"], + ["01000000047ddd535b9f91669a1a68bbd2f9828b74e4cc77248908d3b3a57db1cf6b797b0a0100000004ab510052a5888f563420b7c714d4553243d2a0c650b2c3ee65347da14be0746213ea8ffd82b98f8e0100000006ab6a00526365d7a2730cb72dcafcc9c09e4b3910aec204aae845401c4e4d126bce1f3a7508c9ecb6ec630000000008acac6500656a536aa4e521976a389ea6504e94999a7819644cb7b24b610dc6a84a9ac2733a0dd13ed57ccb69010000000752ac5200655263ffffffff0302e744020000000004636300ac2fc1ea000000000007636353655165ab05560500000000000665ab5163535100000000", "00656a53abab51", 1, -502583302, "37c0006b49386c8e2ea31072b23321858b8e1f3b9f67b4a31af8eac63f076ad6"], + ["01000000023ab69585051f5bea6f04d23d0ad7b01b72d0839a28f8c367687af93ee92051d3010000000163ffffffff1fd11406caa890b421f1118d446d5845709a43cee6060bfe9c05a1bf67cb9ae00000000005ac6552ab65ffffffff0314f58d000000000006ab63ac53636ac90b7a05000000000953000051acabab51000b981d01000000000553ab5265abafc9a398", "", 1, -1233525516, "35d1fc6fc11d04a9000d3b867bba40649d5f8af0ce731420ffad41dc31767c64"], + ["01000000030bbfe029c5ed622859bfeb1b06b48e5a4eded5ef20554493811792a628f61400000000000665ab6a520052ffffffff0afa9acd157b4f7069574cc2c8ab45d1d59267b79e8c662632988b7ad3c24536000000000953ab005151ac5165acffffffff055ed8837dc7480c535380ae064eba832927cbc33aed5f16fa8630940c05fd510200000006ac5363ab51004d053c5303a061e5040000000001ac030356020000000004516363ab20bed0000000000001518a80c863", "65526551", 2, 2040753955, "8cabbe02bb2c66c797c56d1032ae0f0c5eac9390950e5d9cff6c7fc66ac5c349"], + ["020000000203783577a7a1823dc76d06bc7e4e802b43fa5f40974c8125be259f1737c43c770200000009ab00515251656a6351ffffffff97704dbfe518ca84fd6aebf2d80a91466bbd76adf759fe1e0bafc43a0589f6670300000006636551ac52acffffffff0407854000000000000253ab9d44a90100000000020052c6c7d2050000000009655351ab63abac6a52800a3e0400000000045165510000000000", "", 1, -448396885, "e8fff19f3c99ba85944844dac053c4ab08696a9277df3d79578a0ac17f86494e"], + ["0100000003cd869f5cb4c4ca8b4af187b87151e2cc88992ac73a8e8f78997b359ab64baa570300000007526365ac5151638dc35964b51a36a9c48594e25618cda01c815f1c5c3165643f37a4917d839a26fcdcc42e010000000463006aacffffffff30b7c91f2fadaa0a7006cd8fb9f774c3e0666d5f18dc33df313e7dfb7f0246fe010000000152ffffffff047c7af202000000000963abac006565650053f89275000000000004636aab51f7ebd901000000000700006a5100526569221305000000000763ac52ac53636300000000", "63656551", 1, -682598304, "cc99bb80a68070ef266ff03c4e4b4f2a37dc6dfd3e0550e1af18ac2685729cd9"], + ["010000000226e3039d85ccdaae87d33d4bf44be2f66826bb29373e28de252c7c76aec25b20010000000652ac655352abb05f097ba6ca766e7ee36c22104b8ae9e34d55fccb58eb05b9b82317a7c898519d75212b0200000002abacd6a7718904a486a60400000000036aab526a4b400100000000005df4bd0100000000015217a639030000000003510000423c2040", "5351526500", 1, 1174211156, "1e8f1f8d66892c1b9221d14e8bd7d896ea19b4f4e3d33c9280bac4dcf84cf8a4"], + ["0200000004d24ae54b21d2c515c42db894ac8b84ad04f2bc31cfd3ac0c0fd3ee52c6cf3ee203000000066553005353abffffffff12d76f2e96e8c31893cbabdda58a8e7eefa9e80a42ccc98598da0689bfca00af000000000551536a0063d13ffeda5ad7d6294716634943827d8567a948e7e8b329081d5047bbfcf23f0015c1057b010000000151ffffffff8007e87628b6e1713a39a1efc7c479a4430bba3d34190388bcb2db9e9ce9ac0c03000000026a630d2fe8560291d9990000000000015101cc9d02000000000251ab1540ac35", "00526a65", 3, 717488596, "0e2e527f140f011bebb5e62743298a2f73b09ebb36439a358b69c3fe8b273662"], + ["0200000001c1e4e3c12ec222c39417d24db930601d5fddbdaccd582f013ac9fece191edd89030000000763655163ab0063ffffffff01aa0ded010000000001ac00000000", "acab", 0, -1936841469, "4f5d93a2cc86145e32a6cee05b8d8040ddfaedb5b00f04e095319889594f5669"], + ["02000000036498fba0cc5edfd7279fdf58a01e7936ab68567c89802151926f7b83b9b9a5ab030000000165061890b6c6ea49378d26b0d323e47dd23ea655f0f06cdb39d65bb84fc43a2ec6b85425f80200000003ac5251ffffffff63b785518e2166ee223448572db5ac398cdf917af00437669e5ddcc78e6909a202000000086a5300656a006aacffffffff01c1f2d201000000000700650053ac656a00000000", "52536a51", 1, -260058562, "889a5bb12c112e9919b308767cf7445ce6fdc7e8aa3f692c489c7c86d108979b"], + ["020000000340700c96063a8374dc54e70357ed9b93008d66ec50ceadad8b78324b2cbe30710200000000381fd7bc60e21ead5245c5aab1f98298e685a6c400d7899848611826d92ca5810a6e071702000000006dc8f9459f32dfc4ed4fc7af4a3a95d7af313c648eae2b5de0587fdc58917c3f257a64ed010000000452006a52ffffffff03d2c64505000000000565acac005352bc3e010000000001514b8af1000000000001ac00000000", "65", 1, -1352893060, "ec6acaad0f5fa0ca0a2e171da03535f2f9ab030fbe4b76ea2f2f422b745c44a0"], + ["01000000037f4c40e101ee7e44198f6362331254ec561d945d0a570fbcb19ff419c262bbb10200000008635263005100ac52acfafa42103553b0d1d0336620bcc3fcb3691c6d2be0751dc61984bd95429bc854bbd34d03000000076a636553acac63ffffffff6b1b985a3da7e31f00c7e2a6d350f2953737c8ce1efed94b0063f56b590fd425000000000551536a6a00ffffffff03aecb7a000000000003abacac41c5c7010000000001acb2ef50040000000006515300635263e8172292", "ac51526551ab63ac", 1, -355062109, "dfadcd780d03b069bec444ca7779fdb5d671cc9427c212e9168294ff82cbf866"], + ["0200000001a4b439022387779441566a1901279e48735afc0ee78c46104c833303489bc98f01000000016ad32ec01804853e4d04000000000563ab536353ef3c9e02000000000400ab520050d0a801000000000500530000abf24e6802000000000552516a515268ec9ff5", "51ac52", 0, -1872059682, "6131a80ef2be3995fe907fdb46657dcf45d9b773178fb172f42a60f8c3350b64"], + ["01000000020df98325613d178249889488219b13bb2bd2b1ea91555d1c71591f6e534741440300000006acac63ac53acffffffff68c78edf1800dcb242292061693a0b367d4a7fc819f030ad2057494cae68797b010000000163ffffffff021913d802000000000165c5c123040000000001521169c139", "63ac51535100", 0, -695363908, "744f6892d9fd5ffdc5f25259e29cc31162079a9857d71c3a4629eda7fc41b34e"], + ["0200000003a20c347b5df8a04467b20408e79aa3150afcc4f71a8af197e8b5c08235953ce703000000016affffffffa54dc25448181afd06febe6a1ebed12de56c3dfa7add762a08dfad298151e91e0100000007006a52ab6a6aabffffffff0b14e37cc5f1e9f54f8b046cc9eb713bc0c7a5f496c012fc7b2a0a6429afa1a1030000000952656aac6a510052acffffffff042c4aee04000000000300ab634a6b5d0300000000025100f7e662040000000006530051abab512af77a010000000008ab530052526a515300000000", "005265", 2, -1279792123, "eb17786d488d02a848283bd4b22fb37761a301c5a8673f8c1966860aee507057"], + ["0100000001630f55ef2b9ddfc91075aaafd6b26da42a7abf54da996390f2043a29022017380000000002acac95b2b692048a8bbc010000000007525351516365530efd4801000000000865ab635365ab65655a1b4a020000000006ac00005352ac9f607303000000000652ac6552526300000000", "656552656aab", 0, -826076830, "7edca57c2924ea4a8415c152f16eeb6392bf5d81421acbe5a07cf16700cae3cc"], + ["0100000003d27ca817658839a62fc617cbec9f8467dcd80a53a84c748318a22cac0a5d63ba01000000046a6551ab87eb43ee9ab72bf706d1c0318973bd4d31b9ce170ab0d16bb858c3e78e666f0823665bd40000000006ab0053535251ffffffff05097908343482a4281ba48050052658b0e15b5fa64fd3ee1b315ca5d17e7bdb0100000001ac7bb4ccfa011dad2a02000000000800ac5200ab51516ac5a4668c", "6a6a6a6552ab635351", 1, 1064763661, "e0a1aac2581a8bb62ed4557d7bbe44f6e144e3578bc2ba19d3823314dd9e6d9d"], + ["01000000027371e163935b82c6709e090eefee67f40f6bdf0dd8691e2056d120bc80b4b9740000000005ab635300acffffffff09f49892eb72ed2751acc9fb2376a631ace8753cc4b86dc8aa0e4a02f6013e5b030000000853ab516365ac5351361f13820462c8ef030000000009536a51636a5151ac007f7005010000000007ab53535151ac6a2cc80f000000000000b483fa020000000007ab65acacacac6300000000", "0000", 1, 370243856, "ac3cf09d3387bffa770e41a5c16aa71439a0a7cb74326b06e3711f497c8cfbce"], + ["01000000041a75ab90b7f1b02ec8bacb5dad2ec5409ec760d71d0098daabc61959a9f9cbc50200000008526365006a63636affffffff3fe817f577c0586051e663c8ab4c9004fe614b5e3d1eecf72ae038efe6f74c2a000000000763635365ab5151ffffffffd16265c68675d68c85435794302ca77d55b48a7c9e20457313e3a8a5c2339a9c020000000265521b9c970e72d2c13b978c10fe6e57d073e8187d762df8a16c11eca1882fb92841abebbe6402000000076a65ab005200510e443a3f04facdb8020000000003005363efb65e0300000000036300ab20955c0100000000026353b93515000000000001511f242a0d", "6a65", 3, 662729901, "9d4d98f3247ea72a0fa7889995b1776985dfa4423eed3fd1ea4a77e9b35d4636"], + ["010000000218b4842fd7972b429996510061a23396fdc1e54746aa8cf8e99309d69e3e46570000000000bede0a70a0f132b846b294f69feb5b2a9e03fefd7f726e546835cb1345ba79dc4a0869870000000002ababffffffff03bcae850300000000086352ab5100656aac849a5e04000000000088fd24030000000006abab6aac00ab1285b347", "6a6363", 1, 1297434961, "62f1ecfbfe9e2997d4add664a5689e7af6630598ddb3cb2f6129aae4dcc88d77"], + ["02000000031f56747e9d94b1bf3cc8b5066a83d86a9597eb9d8db787467cd748eb224bfca70200000000be835516d66c69de1c5881d3d73c9a882afb7fb8e60b849af7cb0db52c143f12b6b7b43f0000000005525151acab31123d765879a99ab5d4dd155f2ea462cef74929a488ab217adb11e528283db937e5a71e0000000001529c230efd0301ff6a030000000003acac6a323a3500000000000765516a650063ab3567d103000000000000000000", "ac", 1, -2009331450, "2ba40ca93c020fe1a28f8567877ca00ac87fe351ec1f3bf1a24df2f7900a6d0d"], + ["020000000297bab177d08ca82b2412684965ec6face79511764f39f5950b2201d1f7670a680300000003ab6553ffffffffccf02d012162d426263190449b3388b4e07dac85638acaa4d5070ae2f4a9966f0100000000ffffffff014eef21020000000008006500536a515153be1ef78c", "650052510063ab00", 0, -1473796665, "f72c09b2d82efd25add9df758aab14282ae688f531e2e86ad4dc10ec2671abd7"], + ["02000000049639c9d0836e9ed5d020cab22d54bc0f90f42c2d436a3794cc6c4e460431953c020000000900ab5365006a6353acffffffffd1bae921dd5dfccfe30bba5d9434f8f9e007224835d4cd84d8b8b88e3741e2f50200000000925c9c553f3829f9c2a14f866f3780fae8bdf9410917599ba1a42720d4f2d9e363de57e40200000004acabab51da30f1fcd0172ec2d035605aba5d1d14f04627c660075231b349071aebce8704c1c6807d0300000000d1498cd903f6bd0d010000000008526a51515351635114746601000000000252ac75c319020000000009acab00516a00ac005126f975dc", "", 0, -1718014032, "90541c69737bc1079b9e4b8310c407ebcc443869b1027d7ab975666a7a5cb1b6"], + ["0200000003bed9bc021e9be66340b54c2213ae537059ee4be60d43a7b211150155f58d4c1900000000025151ce2293f618334eb537ffda83da9495f4c6c5ce23bedcbc4003c68994674040810b90da320000000004536a00516f843381c532c839f9908562c18d27f729d60df81f25be6dec5f7e94f7ee22ce9378c2ad03000000016359392c5d03ab32be03000000000252ac79f92c0400000000076a635200acab53346b5202000000000265ac00000000", "ab", 2, 684754837, "8d6cff327116b4e32cc1ab7cbc260a0d584437df1dd318be17d7254f40d85e0e"], + ["02000000033bcebaa6da956038b17ed8d8dbbc1ae70d39e7e9e124b72e8e64ea1e5cb8bb5e0100000004ab63535275e3454ca974f4fac8268151af3a4ea8d11281e4371b0e24c5505cfbb06aa5079acc40eb02000000096a6a5151ac6a53ac51ffffffff282b2c21a662adf25e86833f090055a8ac9b55d54f15bdc6d09cdb38cab49f8a01000000025351ee5b9adf044619c1020000000005ab51006a655da07f040000000001ab028d3403000000000057d0a704000000000852516a006563abacfc556acf", "63", 1, 643433928, "b75b1c9f683bba463a259e784c682e522f73a1acd71362807a7a6ef8d86bf93f"], + ["020000000181f4fc3bf997345dd28075edaecd0ce8f3aa1538215e5c3ea54689fdc56fb6d60300000004516351acffffffff01174a9702000000000252ac00000000", "51ac", 0, -639460243, "e26de7f86d0fa2508f7dc00e197664e59e8c0daf1c1d953f3446ec30d42fec39"], + ["02000000030533690dfdc8abdafe6b8b0b702ae0fd588321d69274699af4e09f7c50b481430100000009525152516a536aab6affffffff76215a9b833ccb6d1c4a3dbcca52318f66db6bb137b4b1488647928d49bff326030000000852ab630065516353ffffffff8752e1bfcd9c029c08db5979057313cb70f931b75af2a224400bec06a90c15a40300000009ab6aac6aab6563636a1bb1c3c801db79fa0400000000045200acac00000000", "5251ab", 0, -963512391, "50a6ef26be26d260520a4ed05521eefc8a51ee356f3dd25085a81cdd8538bb15"], + ["0200000001201b45fe59c93a31cb600b4f2757a7872b6057bc766ad535204cc02c577544b90200000003635352aaac5d4d04273c9a030000000009005252655151656a657b46210200000000026363ec0d8c0400000000016a336e6b000000000008ac53abab516300acf0b04055", "006a51", 0, -849291477, "d7550e27ed5d960e58fce2d1e7f93e9f9623118113346cd9774f9cd1a0ebd44b"], + ["0100000003c04538baa0b0a6df780ec932c1bac235ef864caff3715a7ad523055e76399a280000000009ab526300515151ab63575182ad6dc89279af479b3c3e1fe7cffe08b4350237721747ec522fc268ede4d2f4effa020000000200658b17f022632f30c5db7f44f67b66becebcc9cc6156169eeacf43f89997570ab06c318765020000000363ac5327074bf5036d4916010000000006ab5252acab008a10b60000000000096565acab000052516503765d040000000009536a65635352516551d9f874bf", "6565ab63", 0, -1559093471, "190e48d38826e8f0e77633dc0c5bb1825ee578e144cebad304419844cdeea5f8"], + ["0100000004823ce8d6ac5ae658df438769f1c84d410dde5a99501a5dd6ef94e2b18872b0e5010000000753636aabac00acb6b1f8ebbd712fc7c88a0407936d436b10c03126836d35ad1ef504b7797580bd12600fa303000000065151ab635263020eaecd832b15b2cc036af3aaa4a90ee714211bce6e18be9e76fe5168aceb090e5d9e1201000000026500d82f1c7c88173f57358cf609844705d5a9e41a646ec707a95dc649cf796cdf87d9ad80430300000008ab535200ab006a00ffffffff03d8c326010000000002ab52c01417020000000002ab51583f7501000000000665ac63656352059dcecf", "ac", 1, -216307583, "e6d8d84358409af800ed042ccea5cb3dfeb674f8cf843b7eddb0d807c70d8aca"], + ["0100000001bde0c612b806bd749a0ac4d9d86f54d23f4ddd0156219269b19f856f91a73ce5030000000463ac53ac7962270102b21310030000000000e48acb030000000007006aabab5152657b3a9339", "655352655263", 0, -837840233, "f1efe1800ad1ba7e44e52e38a75fa7c20fe22cc9c873470ca76288b8fbe100f3"], + ["0200000004aa25b603c838ef366da6dbadfec1b3f15788db5ba5e1c778fcc938d365452b8201000000026300bdc27d8b865da1d2da0613ab4ac95ce291839a441dfd8443c454f910030e28200b03e792010000000952acab52abab536500ffffffffb186412a6c17991a2792cb280541eaf4b755adf85ac8d14fe6030e37e2d3dfef020000000600abac526aacffffffff25449f0a467e74415cf48733cbb52a3a95cfa1dd7177edf116e9ccaae2897c21030000000500515152abffffffff01158d630000000000010045fa7af2", "6551ac6a6a5252", 0, 1186753632, "278bd805f170ebbf754e56769e88092c4809c07a0e3e87a3de9450dbd88f6743"], + ["0200000001a238cfe36071383f9c28a25a32f13c27f98e0b335e60896066b21dfe8afdebe2030000000165b9fd8eff02972c8b02000000000500acab5152a53f2c04000000000265658f45f66a", "52", 0, 1606357640, "99d044d43ac9d349f471fd78428bfa5d328f08bdf627acba0f25c22bd68761e7"], + ["0100000001d2bb8621617202e71f4dab2423732ad0be5ce1d64c5678378a7da6d0d6946d7600000000025151ffffffff04ea34c20500000000086500536a53006a51ab5a36020000000003525300940a6d02000000000700656aac63ab5202e430000000000007636a6a515363ac00000000", "", 0, 130061149, "eb507f4f71da977c98da1b311f03a975f597886b2961dd0d1f12d9aa283ecbd9"], + ["02000000011a131f5fa0533116decd1ba30d6957461ddd18c62cacbed8e0d9f877b8c32be00200000000ee4d5094010e541f010000000009516300ab6a635165ab00000000", "ab6a6351", 0, -1897202437, "589c6b3ca0316069ebe9139800055fba22485694a00025eec550efef9b722368"], + ["02000000020d75dde7a549da0a22624e0db9b33535565a0fd21c9ee2ba4ab58a1e2e54fd1c00000000046a6a6352ffffffffd31c50ad624be7c585fc9b009ac65813e60c3ee8de6a9c1df02f2384254c5e290300000006526aac65ab63ffffffff0425107d030000000006656565520051a66aa3020000000006536365ab52005d70420400000000036a52ac4270d20400000000046353526a00000000", "", 0, -2127031691, "3dd9f71a47d3b4fe2f54154ba0ca462258d0fdf41c17671853921e2ecdf36f00"], + ["0100000004dcdc917ea60bea1c818276b12c79fc46499ede9582c77e9acbc4a019668e5d4202000000066351005151acffffffff331baa6f7555794acfeeb88a91176335e93709656209a53a03b4baf136f10b4501000000075100acabab51ab3299a504b85dba64eb1bd4e171b6b47a6430d6b328b167d91ea058384ff1c6c16c102b9203000000026565ffffffff9a18844bc6d005273ac908436a4bf82b77bc375a3dfa02439e5ae5eebf84ce9c0300000000ffffffff017de52005000000000652636a00515300000000", "6a635100510052", 2, -1762541760, "3a8a4181c93bfcd4c6467837f899fb5cf930303d466c6bef6404ae018d09879c"], + ["010000000200a6b499cf62ebbe97e881a1a0af9e480e9edc3ce69824c5470ea1e16498c91f0200000005ab0000ac6aa46b59f14e0df3f218bed73242792613d33efd4f7473f15f3d80f1efb506dde5265b81cd0000000004acac6351ffffffff011974010500000000056a5165656a00000000", "526a0053", 0, -1925031748, "51dc7fc25361c020b83d2965b6d4d6e309523a25e55d291047353c659956118f"], + ["0200000004ff72781faefc783fba73efe9651fb0616dc07f082a1d92b6bd7663251d681db702000000076a6a6a6aac6352ffffffff6a6c98f8162595b80d2b41d0abf68d911128e677e1447c6e12322454efb8a25501000000001bb82e4f6d8b62203fb1113f9315c6fec8e1129f332e8f7533334f09124a78021447de460100000008ab526a6300536353ffffffff8d98614774ddd14d202ee6ed3d476123312a1be7593faa8960a9b9d41639cd8d01000000066a00636300abffffffff046cf1260200000000036a63ac99c18c02000000000663ab00ab636338df8e050000000007515100005252ab93c639000000000006535253ab6552b5b4386d", "52", 1, -588513923, "7ee77cb5f3620ea1bf6d4bb3ebef63a30ae3653513f94c3d3034d05bc24eab4c"], + ["020000000301c3cc5e4d5eac702c83ba7db6034f890182b93d079c39b8e3b2d9f12513298b0300000003516aac1b48dd99cc23ca0fcfe519577d4f0c4e1dfce58d852f41f5c284129526e83803cc6c3afd030000000853ab005263ab516a9a1a65f73e39ee6ac4b30edbc44d2c312061c5d4e2fcba4fe9b2c0a641b434b5a0d489770300000000ffffffff01f5efac010000000002515200000000", "00525200", 2, 1767603544, "c63dcf51e70130c77daf3750a67b804ad2853e9f92c74203f471007916dd51af"], + ["0200000002843667d93839aff2775381dbf868bc1a1b337af0e7d3becf8b7eac9d956b14ad0100000000ffffffff16448e63254be3657336af8bbb079be65cb4cd5cc59822e4f38f5b161d3e2a01030000000553acab5252ffffffff01503ad80000000000016500000000", "00005165", 0, 197107977, "7706407317fbc901432cfb68d69165f2e6447da1d130e414ba637895a394c277"], + ["020000000312228840dfb778aa35917ac6e2eb5a8c40f0a5ac7b7d86649f14759a8ec6416b010000000953acab0051ab655165ffffffff0c119893c68502bd80471c53f4048fefa0c5bb21c2cc69eb221541b55c474f6102000000050051525363ffffffff6866d339a272c44bf4638fcd6cfb2b2262a8a2a988cfe241a83e4406cebdd3ef0100000000ffffffff0451695904000000000351636348e278020000000003ab6352ab19cd0000000000016aa940aa050000000004ac00655100000000", "630000ac0000", 2, -1472718449, "06c388fa26a28ca3b40c097a076d2e95619dafc5413743ecb38076fdd915265e"], + ["0100000004a68657e6cf25ef528ccc1d812edafdd4be09bd6c29f0cc40b89f801e09935234030000000563acabac6affffffff1986fb09b2aa8b38cbe920161c3570811a7e42fbcd328aba67f4869fb63b687e020000000752ab00536aac511c488598b900c750c3a72ad0972c3bede6c66133cf1752c0e19620ddf822b9796af59bae0000000003510063ffffffffe84233aaa7e60b2ff079d1b54cc78a62921fdeda80d38ed81b0e6022948796f802000000015279942aec035f61dc030000000000ef6736050000000001632c0c5500000000000863ac5151ac5151abd9207809", "6a", 2, -333890815, "00eaa569927195308d7157057ade9ffdebb05fa259632c62e48a28b22d319ab1"], + ["01000000025598833c671345c6f008df9653e060da5a2406f728a5edd6fed83da159108f7f0100000005ac0000ab6afffffffff4215d7e3fb09c1ce536f1b439bd2dbac669de98348fb379679e5fec5f8edb740200000006ab53abac52acffffffff0441ccf00500000000086aac6a6300515363f1959c010000000000b79a6503000000000165ef8fed000000000006526a53510000128a8e3d", "00655351656aac", 0, 823464884, "8112dabe1c837a0a997cd5a548a0963a97c1a23cac5dab70a9dd9ba9a7866ccd"], + ["0100000004ff304b784228c596ebeccd486fac0de1136c89253caf4d4efcb02ac435e031df00000000026a511d148302c9be1980ccf6a711a783d2b3ab5a9b5818b3050f36ff298145cf68b55e650de20300000003ab5300ffffffffd2331c2baaa866d99f9b345af536acbd11106ab71b3954f96ac68218ff6dbe5e0000000009acab536a510000526af2b67ae440ec9f6e8ae6f8e36ccbd203c319bdbcab8e4ce68d4d0b3a11e31684bea4a37f010000000851535151acab5163ffffffff0244728f000000000004005200ac6170540300000000065100636a65abc1f882b1", "516300", 3, 4187748, "471261dbb769bcbad9b3947a857e9ddeb8cc023a6795638e3ac7ef508a7db62d"], + ["0100000004bc1ed0abb39b537baa8f28fc4d6fa36693a5180928eabbf749fb96240ac004fb020000000151d5c39116aec6fbddbd328154e2bc1809b38d5062f2023494c90204932037bae0db0d3dc20000000008ac00636351635163e5b6b671410613a5496cb5b7afd8f68aede2a23094a699501e963efe7a4ca649e17f0fe6000000000463530052ffffffffa0b4f762d86ec4f3eb5ce65ad58520d169a1229eb30966ee1ec8bf58b554e2f301000000065100ac53005347c069a70289d2dc030000000000bf1e4302000000000763515300636a6a00000000", "6a5100ab", 0, -90668021, "86d6f97840a3557c341a164d50c16a5e8114c7d4316f150c2ba2d70d9d5d5d55"], + ["0100000004ce961c920a288de024b28d93950af89c0279be591fe17b1a251ebf474ab7cdf00200000007ac51ac52006553ffffffff01e8fab1125046657e0b36204854461f76a9465a134478966312f16692300a3d0000000006636a52ab5253ffffffffa55abb08afd546b0b498fbc7927dfe1595bf3459e5e6021ef4f34458346508520200000004515365ac95e08de4244dfccb82ac9f82c9a65b2bbf2df6fa5724efec18502d63bb2863cfadee5afd00000000003f1c5802040e5d78000000000009656a65ab53ababac5376bf3c00000000000563ac650051a85b9e0400000000026551825402010000000000b25870f7", "5165", 0, 1301167711, "486bd8956537bece801f44c7e50c2553cf62abb72730369588f1b4d5df1bc690"], + ["02000000011868474d41f888a593091cfa647a9b80f9cfecc8a20fb8699f5c3f98be0f6d89000000000452515153ffffffff0485d5950300000000036351531296860300000000035163651d0a970000000000016af594300500000000010000000000", "", 0, 788185461, "9e01e14f81f39f4af04fbd5797922fc4b5204882e96f6cab8b354fef49babd18"], + ["01000000042db54dbf055b57dbb5d43a075360afafa84a39f574e1259f1373173ab441eae5030000000565526a530040a76925e633f2cfdcf8eb231c1ae04f8a13de4c84b5873bf8132e72acfb39101b65da73000000000263652d20cb294ae477b54866891c8a6b3adcef2f4029bc4b7b595e7fba56860bddc24b64888902000000036a5300ffffffff9219a50c9655e59b0da0c80e778f21ddcc4cfbf32d90f2b4888eec89624d76f7020000000100ffffffff01f89e8400000000000100729f47ed", "63650063656500acac", 3, -1992198257, "5d7cc5084301146f3c4b3cc900a643e27688df71bdc8f4ff5224d6ec4f7e5696"], + ["0200000003a0f58510499d9430d45042d3eae55e52a49718283078c4be0cfd1af693e244f6000000000953abac00526a6a006affffffff236c517815f1ebe4e7648eb296cd13546f8b480537127f6aa3bc7d9effa7f7940300000009ab516365ab536363515c4b0cfc71faa190fdc71ec13ef55032698998f284793d0cd25d0be2919b571a3055eda00300000005535351ac53ffffffff01adbd7302000000000363ab0000000000", "00ac6353ab65", 2, 1993698858, "65a4368c57f156ca9713b7b2ae1ac493b7dea0607ca9448d884c93f12862ae82"], + ["0200000003b37fe1308d7dbc9ff02a7abb7831da5249354123045b89b72dc12857917063330000000005ab5253526affffffff9b20053c34242e7c859133ff87dd5e59219fbad0e2023e500efbc0360ed3b3620100000005525253636affffffff196294513dff8ee25f1e0a2f91dcd8b11e8214b009497aacdb20251a090d80310200000007ab6565005253ab6fbd016a03ac7ca905000000000265ac31518202000000000251ac9c87e903000000000265009b33c588", "655352630000", 1, -1515903603, "389cb18a067d933075be5677e253190990c7c801136e9cffc67d8edac489bf2c"], + ["010000000434a41d6ccefedab154a889ceb70a48b01b3f8a1b21d3c32e0cc10829ca379bed020000000251acffffffff86e0a93076a52775d097529c76bd42dfb257a6a199e79ddcdd400fe09a883ec8000000000951006a00655263516acd0ba25043fd60376a138ed762f946062d160157d304c87c6d84cb0940be5f511a6cdb1a03000000096365656aab63ac6a65ffffffffffbbe442aaa0f8fcf692bcdd17a09a304733f9f2f80ad6bb120a4c8b6dad4c2a000000000753ab51536a6553a8da718c04c015d8020000000006abacab6a005192efe1050000000004516a516aae2eda0500000000070052ab526500534725d002000000000000000000", "", 2, 196497637, "96d1ef7940c8df6e8afadc8c3d9c99a4b3beac32fba9b6fd53a1fc2beabbd821"], + ["0200000002491bd9f63e16a5bf8625c20622d33b20fd6d8da875856aa5d051e6bdb2ef73fa020000000352acace2e1a9aceb2197e392d81a41877f8bc5e0160f3d45df502153afc318f460f65cb34b5c2e0100000004ac635152ffffffff04196c53010000000009ac535153635100abac46b396030000000005516aac6a51031c0a0300000000056a6a5353ab4b57570500000000086363006aab6a5352bee905d2", "ac51", 0, 532303399, "f8daab20ccb1af82a194aceb8765e80e9d10c91892a97b7c5bb4a8e30299c637"], + ["02000000010ad744d8559676068a984e69a9624deee966696d130d2f961d458302aedc3a6e0000000004525351ab6c9b5588012f513304000000000965655353006365636a8a068488", "", 0, 1275835177, "9bc21bfaf641adeff2263504195444f40e5f01b33628a5af4a9836b5ff9e6a7d"], + ["020000000126eca84c63faa284b502d3eb3eef26468d39225bab1a561288c787a0e38d94910000000009acac00635152535151d2b33147032553640500000000036300521b4dfe040000000007526a635165535274fdb80100000000035263657cf66bf5", "526500ac0065", 0, 672992304, "37937cadc5b34c702d0b57322825b335ff4a2634038cf81d5b087318ac6ecbe6"], + ["0100000003d770a91ad1f7e1aa82ecdf936b0e9f4df76e77fe1cbdd70d216b1e56e306fe4c02000000076aac6a53636a5102cd78a39b2e9107930857d2b91776411d1553929e6ee0da071d8717424e69520f17262e020000000752525365ab5351ffffffff6eb1eac67429952c18638d0eb82c6747bc98037298dcae9c8e2da21cecd225d903000000026565ed2c9c9e03c51131020000000004636a53ab69505c000000000000a4655e0300000000056aac00525200000000", "63526a51ab6a", 0, 1937152713, "acbdf0cd60447063132f5ffa34c0bd2f27130b8c04525b50a5645a57c1682a9d"], + ["01000000011d823113c1acadf31794202c8ab14aaed8359616f8f9768fbbc6e26aa702608b020000000600ac53ab53abffffffff04d991a8050000000007ac515265abacabdf4ddd0000000000030052513d555d0200000000076553ac6a5363ab371a35030000000008ac006352516a5100998caf2a", "ac63", 0, -1118365516, "dc5f4e437609cd4b3f97ac176de3299742a550f7014f1847f4cee6e0672161e0"], + ["0200000001e3799ee16e0703c2d5aa4ce2d547c33e7d0899b8a13dddbac8814f692864352b030000000165ffffffff0321bba00100000000055352655252b602a805000000000563005363abf82f51010000000005635163abac00000000", "ac63", 0, -2031349344, "4470140a9a798f9d6da97026730c0243cfa0176e8d84718d359374bf8daa270d"], + ["010000000423ad677a0a1e8e06b8368fee7748442bd8a7d4411636496054b1516bb6d86bb50000000006ab6a515352abffffffffc6c9c532c54ec855ee463788f2dbce699dba559fdd3c00ea6c00291549de615f000000000863ab630065655151ffffffffdc6b7e06a4c33996f72726c5d24a9d4cb9079ceec1ad6db3d71232d22613a94b03000000096a630053515353526a92745d7f83c7e183ccba93183c2d1fe751c9659e84c9db78b68cf7d3db31ae7f37468dfd0200000008acab655251005351ffffffff038214fd020000000002ac6a62ff8d00000000000100c733730200000000036a536500000000", "ac00ab", 0, -1084887835, "bb427c9b76ed603b49ec54688c35356ef612ceba155ad5d36d57083f8645d6fe"], + ["010000000446c716adb971c277130db65a250a795601861a059b81eb0ac43d3c70971a6b790200000001abffffffff882b43c68d0478dfba3d37fab9799db5dc44f0dd54cdc1a0aeb8627360574b9103000000001c06021cfc349249508a90730bc6726daeee17eb112f9914f8e7741e7a38f5921e53ce280000000004ab536363ffffffffba4372a216a84fdd33fcaeb6320df0b2f8c432e3ae08e566a30ed59fdcc8c7d80300000003ab6352ffffffff02790e49030000000000bfdfb60000000000096363656a53acab005300000000", "abab", 1, 1450066778, "4d5917bb69065a266901de44d754492fa9d03bddb6dbabcd547c63eec927f5be"], + ["0100000001b6bd52f198008cff24910fd232c23eaff1ad87acbb6a53124ebb5702fd55a90e0000000002536a368d42430267638b0200000000036aabab69340e030000000004ab6353ab00000000", "65ac", 0, -661823862, "dbcdd0d35914b7c8b70068054d73ed5ce51eff802a710c5ccae44373faefb651"], + ["0200000002829aafe8ebe1ab7a857a0342d672c47723109405ddd3ec0216dd30416ba1cc880000000009515265516563525352e82a1da15dc579c9e707c08e028126270ac231419e41183989d540c0391ea733e22b3e420300000007516a63acac635302fafac004c5162302000000000165bbbadf040000000001633ec33700000000000552535365ace6ed7a020000000009656a5165656a6a5253808f3336", "ab5251ab63", 1, -1222269728, "d7c5bcc63b5e4a8012c8bcbf24b2d44994cd4d72a899905e3440c0007566b587"], + ["01000000024e906313ecb5b3ebe779f23145999f5dc729e41f2bbc8a1b9f216bbc65825313010000000100ffffffffba09eff31a633e9582322c14f1fcdf535d47968c4cf1b2fe6ddf56dea13140e0030000000753acacabac6351ffffffff0123c86e03000000000152b7b0bd81", "6a6a", 1, -1900746302, "e6a8828f78bb0d5375497a76f2079ed99ff170343e33af7536140052566bc7a1"], + ["0200000004b5d065a6af94edf3c12782ea55a15beae9e96a549c40f2b85fce54dad073c7780100000002516a97d48bc07641336afa50caff4aca2487e1c7c4b276a7cfcd4556572404f3345dd767d014010000000152ffffffff4d62883d88a7d019b81ddbd56e74aec8cfe9e5b760c196238db0e9e70aa26e7c01000000096aacac656352acab53ffffffffb1357e7190760570ffa5582291bf78228a4dcc66071e8289742043b69662eb2b000000000100cf1f8e7104006c600200000000096aac5151acab65ac65550334020000000004536565ac16c8d5000000000001539ad7b701000000000653ac53ac516a3a1b9366", "", 1, 1732219707, "72564fe8a1ebd70800f84636d27bdc846d7ad389283e65295150e13457fd3314"], + ["01000000019a73d7666231e2dca8118ac4c6d1b9b045a6174a0f697c945d45cbf16e39ac67000000000452525300ffffffff04427dd2010000000009005265abac006563008e600701000000000152fe6bd90400000000086aab5100ac51516a4eed6c020000000007abacab63abac5100000000", "6500", 0, 614458628, "e9cd0f8a0bc502ccefa4d2b45cbbeac8ef32718ba2e1e55f09fbeecd6b560d81"], + ["0100000002e1fd356bfa4d63b3a9dbabe9f3dd3b4279b84f3c22fc2f37fb3fb7c5a96423330200000007ab6aac516aacac103a6b29fc7a601c3e7e7de35c3c003f9dedc8e2075eeff7c8c753aca62cb5295ce5f6cd020000000452ab52631e632f5a015571a804000000000453ac005100000000", "6a656565", 0, 1124343374, "c80d36d0f316bd960e38ae21e78ccff8d32c06173af57ff862f7ed3a9090fef9"], + ["01000000034caa24804eb85149167e2d64185fad70e8a822ef29871e2d94da9d84143d6cb802000000004a83e3d3316698cb19e11a08116ac491a75c78fbaf0f9b13ef5186c515c364cf45f2f843000000000565ac516352ffffffff6a80b8d47eabf1c6728a920b5f6ce64de48412a65bad7a1e53cdc405294303940100000003ac5265ffffffff04de6a2b0500000000026352d8516000000000000965655152ab52ab0051d600e601000000000200533ba86f020000000007515265536a6aac00000000", "6363", 0, -1070672074, "72b449d707e6191eef58fcb8797f6eb7575092a1320e2de020a004f45b18c1a2"], + ["010000000399007b008a80d93481d5f21f31a4c752ed2a35ca328e926285943d0f34635fe3000000000151ffffffffbc20ccb2338c3cac5ed1c86b9bb6faee73a4456bcb4747bc2d0a03e2a2ff859c00000000056aabacab00ffffffffc78c5029bb1c34a9080f71b817a67d76069d84c93f061c0745062383fd8d064101000000030053acf5be90f501e7a9f60300000000015300000000", "6a6a6552ab6552", 0, 1691613657, "f7ae5dbef5a942b87a067ac2ba7cef576a3ac6805184a865fa355686a46c9321"], + ["02000000043092ace6954e2864c3887cc3be456e900cdfa01ee4185e5fab579c254f572e1f00000000066500abab5365ffffffffb6c43d99a9ff109b562c465d3798c544b232473cde5642d96d0832b5eabc652d0200000009ab006a51535351006a865148a0023467bf3717986673ef7a728d4121a93763e358ac1adc6bd82e6a3c6e68c37601000000055152526a53e209317244b02b975ec5b51e0e72eed0c213e723d84370f201b8c59a625368710581e5720100000004005300abffffffff04fb0dbd050000000000fd396404000000000265525e113102000000000451000063529a7c040000000002650058411b78", "006a535153", 0, 190750575, "56b1c1f38f13f47aea24d3da9630b47fcdc993bfe619543bd3c0347b90ce407b"], + ["02000000017ff8baf821f2e86847313f88c5c3029721fb5ea739c8a390941dcea77831536a0200000005ab53535363ffffffff044910790100000000003b879005000000000163034030040000000001008f74e1010000000007ab0063526aac5100000000", "630051ac6353", 0, -1717317777, "a6f0d8eb33cfc6f0ba6950345ca1343d148a76065eade95e2f56aa4c1f3cdd88"], + ["020000000277b679a3bc31591efd6abd4a2709ffb8d94583161d86801c147c9a8e3d3889120200000009000053526500525263ffffffff0e6ae73ce8e4f37efcd8c91848610b5b2ba8874c1146b148a859fbb03d8affa4000000000852abab63ac6352acffffffff026c523d03000000000151031da0020000000003ab63003bb6149f", "", 1, -1909154572, "f6c2bd2fce52721a46c068c7eaa31298746e68f7a1822e4271df81ba8fd26dba"], + ["01000000043292e1b1d4bbdb64fc33d84b8ce8f355dc099b81e491baadc2f9bc6171e3080b03000000055165ac656affffffff13861cc930a5b228ef0641635d87cf48accb98aab08e6b52ac3c577945f3391a0200000006ac510051ac5396a9bd7f5a9c828dfdf5c9dd7b02b22b5066646c77e14b08391ee05067728b52d26ec1fb0300000007635265516a5151ca26325bd56abcd3a18a04808337f1d3e6b1cf16a1261527087f373a4626f6a5204fb905010000000400ab6352e774697d0389cc760100000000036a635134582a000000000001532f564a020000000003ac00abc2eeba6d", "abac52536565636563", 3, -488975991, "b5a8ef63f114b930c9344a809956a021afb3a3f5282d5712d41f2abaed6559dd"], + ["0200000001e7edb63a134c5b04decbb11075e00394de88f4e8c9118b655af0d1be653df3e9030000000565ac00636507e864cc020a98ac040000000005526a6553632889bc030000000008005353ab006a6a5200000000", "0000ac", 0, -1238191162, "40627927a06c70193b3756455c941a1889b40190f13d5f37e5e13cabdd9d5b89"], + ["0100000004a1f2531141f5302ed04bc36ad4fbd141b2a5820bb4b356e2bd8fd6aade41a28000000000025363ffffffff4f0dcfa4a47687eaf70ac85d921b72ea89cb4bd128dbe53ec54d5ea5477ba5570000000003516553c92e67aed8a855d6fe66100677d64507e8b806aff666c2e55e2ec4af4956850eb9f978e602000000085153ac65abac6a63ffffffff86d7c10a02cabab31eb786999767baae1d4f111fee9308c061c24164f96904410300000003636500f407b774032f16200300000000075253ac00abac522b60eb02000000000951006500656a510053f6f36e010000000004ab6a51008e9bba11", "510000abac5100", 2, 913285234, "78bb2e065e91e925a66a6c732f257ac8f6132ed4f500391dbd3644ab3702e752"], + ["0200000001bf718e829b213d9c6a15004f5e326deb481e4f458c859d4d25d606764f0297ae0100000007526aac00ac650045d2357001be9de405000000000953ab006a6a635263ac00000000", "6553abac", 0, 1743492969, "824caecbaf2875ba42658bb7b10d301217e9b941fab34c296924c4a55908ce75"], + ["0200000002fcad77b891dc74324e52b7e92de24c120f8609594e379c587264f3e10b98464c00000000046a52ab63ffffffffd5cab110a6cd7a527ae73221e4d63356c42bb3f02f5e7c6b2a3448e209ce195601000000096551655151abab6353ffffffff048e6ee4010000000006515263ab52000750690400000000010021c46e05000000000965ababac655363ac6a0d254001000000000265519cddc4a3", "53636aab63", 0, -635031111, "40848a93e696295a8e8df2190d1b24f7bfd166b8a62669b5476cf4f5d1071397"], + ["0200000001a6d624628115d46b1a0f4ab0899347de0b27e95878f42bf1d45f521b1ead9c4e010000000153d203970b01e95e91020000000006ac6352006563f9d57e64", "ab65acac6aab", 0, -1678302907, "1fd36efad78a706510d0534eb1dddfb2c4eb7845a301ab2da418a3aecb2584d6"], + ["0100000001734fa00c51687f0907206141ac9830e5d54f3c293c4d4dce9fc2b9a0c8410de30100000000ffffffff015eb2c703000000000552ab63656a00000000", "", 0, -1355309770, "107a4737e8ec5eea9e005f4cb7234ccefcfc3521b057954414d6232e69ce7d77"], + ["0200000001d522663db58eec91a251aaab3e3668a722bf400de0e61186635c663dc6ea7c40010000000553ac6aabacffffffff04fe28e0010000000009516aac51ab51526aab16043b02000000000551520000abc6060b010000000003530000847d66000000000004ab516a6394439ab8", "005300", 0, -1469473, "df9ea6b8e5becee0cd32d6c62ae8a7440bc58c8a0d45ada26d1afaf6c79cd3cb"], + ["02000000026db55862b3514e11fd569687df3446ba97356a9aea3aaadf9d1b922fc8d4156d0300000002655188cd59adedcab8946c8e68dde8e3c1681f73bdac02abb1ec2f8614c5100529058c68f88b0100000004ab53ab6affffffff02a06bf0020000000002ac5265d48502000000000751516a5353635300000000", "6a6a5153", 1, 1601302440, "c5092cdaeb1bfd0ac1040c11f473f9e72e78c3f07e404e6216cca2ef89b543d2"], + ["02000000020126575c6b861141255e6292c01768a50f5cbfc1e78fbcaa5cb7ac08d044d3c5000000000253acffffffffe2ec9619daf946900a5722ea1aabc25d49e7259307d6223493ce98190f27245d0000000001acffffffff02d417a00400000000035152657edcc500000000000852535251ab6a515300000000", "53ac6565", 1, -798789696, "0d19288c994966bd312f3ef5418e4066ad4c88cda34dffe9426ba919d8444c82"], + ["01000000033503d8c5f551d761cdf348a12ff605221691ea851d1a428b79fac1e3a0bdd8710100000001acffffffffcaad947ad15b3a7deb4de515a2d5c121bb9a3921ab2a7d0fef822cc6844329ba03000000001f74f8272377c9a48b4804884794b4de1283fdf79486528618ed23b8c0defb5f37aab34c0300000002006affffffff04a3eaf203000000000253004a131e000000000006006aab65656aa7599905000000000451ac005321934100000000000851635252ac6a636a5ab67745", "6a53636a6a63ac00", 0, 384489214, "dec236aabc37ce2c53660a17205924c30415e8d85465d9239138e265c3f5cf4f"], + ["01000000046b4407493c1975393e991ac04d87fa6fd7a6272294d0a4f2c80f7873833e54640300000008006aac536aac526a1c09be6766f6c1b424e75112ab90f7e802940197a1f6806095387084c10fb7b12e81ca1402000000016533fd65c611fb7f67de73b7d2cab84017839e64ab3199c05f098d66eeb620e44fc18164b600000000046552656affffffffe3af79a2616a6afb6900b52bdaab694ba7389a6e8afe09a50e07235852a0807f020000000251ac475498e90424fccc040000000008ab65ac6553ac6a65f941a1030000000002526a89dd29020000000001ac624001000000000005635153526a6a7667bb", "ab656352006a516a6a", 1, -1932846165, "6572945db2483918b51789dd472647e8dd84d51560c1e465024ab63f99f0d383"], + ["02000000010879152848597e04345b49e638b180159d12e2049d2794295352ade03da64cf1030000000453630053ffffffff03524ccd0000000000096a5153ab5300ac656522cc1b0500000000016528adac030000000008ab6353636552515200000000", "ab", 0, -1694816276, "949b38920977fbe5c4f45d2366f451225b2bf22c9095ae3092ec2c18c5b1500f"], + ["01000000040ae215d8945c7ab6b3ada30dfaa423dacbf149d6ca678f2ee8f52b618bc3adad0200000003ab6aacffffffff0d92e16f4d5b6424cfece50eccf0ce27ea992cfa6c06fe603baab3cddec2572a000000000552656aab6ac8f78cfb36be30986613ebad6b665f576692625461b21442d45038a682964f5ca0d0d7db0200000008abab656353ab65512d29c7faa7f5b3694d5d9a55ebcb70d989f5707df7bebe6d7231b52ebacb5ded06a728ca0200000006526551abac63569066a2046fd941030000000004656a6a52f8abae0400000000026aacaaef07030000000002ab6afc4a25050000000006abab65ab636a00000000", "ac5351ac", 3, -1169360239, "557df1019628443d80f2c99ca51f2c8063305ad475b1f2c05c6663d80addb17e"], + ["0200000002d09a6c80c7858aac671ac3ec3830635fbb88fe0caeda46b028a6667efa74ae280200000006636553536351ffffffff0842466d79319e7311a8af36865880b62cdda90b29cc164768416b5d1a378471000000000651000065ab52ffffffff037dd1950300000000040053ababc104fd0100000000016ab95a4700000000000151e20e8746", "ab515153", 0, 1513984431, "914881b4c2c7a618853bbcd73e4721f1bb91b0c4b70584c78361c77b6f8c9dff"], + ["0100000002fb377beeb4712ec8b61af7f06a1133bd0fde7d625451eaf3fba512362327edd6010000000663ac53536a00d15a5943e327c09b54b9920567f873b4942d93bcb19f43d583a3e811204483af47bc72130300000009650063ab6a53ab5365b59e3b1b044ccaa0040000000009006aacacac00516a51eb814c03000000000165c5eafd0400000000036500001d9aec020000000001ac00000000", "6a63ac656aac0063ab", 1, 197644119, "b35ea5fbe610fe730043dc2e9a794e16c92730d880a2702b5bf83847358e1e5c"], + ["020000000496f27629913f087e5d5ccb65e1ebc8a911856e8b6e936b523752b8e3c160956c0000000007acac6563ab53ac86f290b110940068781e2d2eb47015212834c9b7292cf771dc7d5352d9dfcd91df07f8c201000000025263ffffffff97b9d0c5315460c0246ae67c35c3d43da127fea24e49e67dfb3d519ea041d0d9010000000200abbe52b6c79fd05feae8ed681ac3034d1e4407a6c4db6360805d10d5014974c03ef05a8f220300000003ac526affffffff04b4b2ac040000000000c5067c000000000004536a6a6ae56cbf020000000005526aac00007677cf0500000000076a635163abacac45f7d80e", "51ac", 3, -822790401, "982de068265399439b567731bf8df1124bd38b62db50c01c2ab4e45e228edb64"], + ["0200000004dee025a1eea74dd8875a88bfdac595a020682807e0a967039f15ba48ece3a67d020000000753ab526a536a00ffffffffa479350631044a8617220a42b1f61e2ce8eb98bf3108536b2eb02cd01b00f1cd0200000000ffffffffb95d7a8bdd2839aa945dc37dd3a64489748d52a1939a9631c38e96de6413db780200000007ac5300ab530000ffffffffa4f3a55f72a181150618804dc8a5a7a90e58757f956c1d44fff07bbc00731b4b0300000002ac005a63bd8e0346d3b90500000000050051ac535377499e0300000000076300635153526a2efe57010000000007006aabab6a5300dfbd688b", "536a0065", 2, -1527518032, "a36d7b87a22eb9ed0baf43b7f4bfd61814fd969da6d1538c47edcb06db46eff5"], + ["0200000001304fd0bce206ca30ae1423ddd1603c6eea6508e579f576e0dd2ed5da23bc28240000000006ab51acabac51aaffefa901716a8602000000000551ab65acab00000000", "6565", 0, 2135318928, "93a6b45e662b5005ace3fee2e017c38cff5eacbc04d638325a57b54caac3bfa1"], + ["010000000249a36ae5f5bc440e8bb4327226db41dc4fe88184ae42eaa43afe187bc9bfca51030000000163ffffffff7469007b6f0e82f9a260c21bd689609be4af96b631d1726e967d371c8e9ff3b80000000005ab6aab51acffffffff04a4b57e05000000000853530065acab6a6345a060050000000009acab525352abab5153067a9d000000000006ac6a0053536561517704000000000863ab6a6a52635253105ba674", "52ac6a535152ab", 1, 709042824, "c3a3a9c02e8c1a49e7f6bc391500ffb0df697729298a4e1a03cda959f7a205e3"], + ["0100000003b7d852de10db07d226ae471df53ffcfd08d587f7c07cf0c47eb8270f58a1119e030000000665acab5363511b576927c94adb09353a16a107b91003830cb7b5ee893aeae4d8bbec1cd21cac5f70eb350200000005526a635252ffffffff6c4ad59ea5fa8b5b38ba70f112b26d156fc53331e29acf144016ab76a11f9c4502000000025363ffffffff026ea71e01000000000152555ea805000000000700525251ac6352b6f52af8", "53ac65ab53", 0, -1639592185, "456aefb9cc5d2969b6c6c58b0efad2549017c7a5d756406d6da5839ad40d3c21"], + ["0100000002cacec6b4c9049d83ea1cb4c8f2cfdfef55e31fcbf8391d24f0d62cd240529b3e01000000036aac63ffffffffb1152c611d68841d08617ce2f41d6dec4086dd986b4c3a395e2c104d625702a5010000000851ac65ac63ac536549c4ea6301ac2939030000000007ab65005353ac0000000000", "63ab515352", 1, -1257271659, "c8db11acc01e4bfc8434dd80fbf46a6b552e906b62bae1b9026487c383f707fe"], + ["0200000004aa5013da19105b2d9e76a44d8f7e3d6e4d0b5ed453a487810847e730a285ff010200000000ffffffffbce74c174f91615d6447838c13d7fca90cd688ad2a46f8baf62995b3532d95ca00000000066a006aab65000d578ad7510194c4618eecb9f0397ac0364224d09d71b18ff05233ffbcaca0d34c326e3c010000000046d0fb0baa693c78d2addfb7aff98c869bf3bd3243208199ef54677a70302541f643228900000000076a53ab51510053dc89784302555b8b0100000000076365ac656a51511c3aa1010000000008ac0000ab636a005100000000", "51516500ac63ac", 2, -1795166161, "759c2930fe70e1f1fae2f6d042275bd0acbf7656a756f2a7c29977114640a1ba"], + ["0200000002e8b05daf9428d760dc8b7bf71d20e37a0428bb7deabc55c3dbb41ae2c08860c6000000000100936d7acaa6786b9570e443c64d19d2fcf005dcb3d12101ba508c30ec2b9ae78344e780500200000002ab6affffffff02c120ab0000000000036a51ac93f28e0500000000015238323756", "63515263", 0, 461261861, "e071f882e563893c1648a4bcdf03c32228b16d01de58efea04573467d97033e5"], + ["010000000210fa8200fbda4d06f3043c0eff9701298955171d81e0e85a4c26bf421e34d31700000000060051ababac00ffffffff0589d4045987b251f99479096cf4258367f459627e719b158f472fe7aaa04e2902000000036a6a52ffffffff035d38dc0100000000055351ab6352ec4d52040000000005ac6352ab00627fe203000000000253ac0f28e1ea", "656353ac65", 0, 1849461826, "d52c3d0baa1805c808a71f6f6ed4faed79475c1545093570d13dc47656fe13e9"], + ["0100000004c97306a15f8e63c6a0ad856d32ab7520159850d98c8bc48991171d52c510178f01000000075365006aac6352fbc9ab634f22421bd9bb01376fca47fccada27f19ce2304a893be78646bf4e43c8de18170200000008516a53536363ab6affffffff26d18b3d5368a31f20a096198a8e02fedc283ff46089ee1a19b9e28e239fdc790300000006ac5265ab536593e9fa119bc26dd06b15e9f66b013c96828487496be78736ea2faf1e1ccea79838bd439401000000056a52535152ffffffff017d7bbb02000000000353ac5200000000", "52", 3, -496909671, "24ab7f67c488ea6cc1056958698d7194c759b8b76e9b3b5ea5e706d7c2d74fcf"], + ["0200000003191b74c38f46ca70bd2c293aaa3df9388ab457bbc992a52d3d34c448e6045b92000000000351ab52ffffffff4ba7946e7ab589d9d43eeceeb8be47d3efb8c85fa0abdee227e66b808113dcec02000000056353006a53c1d71251864933a0a0d6fa209280d8eb9785e09168f26f9fc26f4786f7d4e7302fec0bfc0000000003ab6563ffffffff01eb008600000000000400516a530a3c3bd4", "", 1, -397388665, "b99cb9de27895b1f917e4e4f446745b8db2bd68610a1e49077418e6327ddf243"], + ["0100000004eb6c8a2e88da2fd2ba4b72124f9ee3a11a57b5716d84cfa3eaa511481cc34c180000000003655165cb29dbe40f28f5220b4e992310fd95287638cb9a16ebd8dc686301b1822ec890f968ae090300000008656552526a536a00ae85007f66cb1415bb5ed708ae9bf1bbfa50e0009f4beb50bdfc51269581b44b65723beb030000000963ac006352536565abffffffffda54925f7dbefdcfbe07ecfa5169a8d23a0e62522d36da10030d2fddcadfb38301000000056a52635100ffffffff04bb27ae010000000000ba6c3702000000000800535253536a516a3d2aec010000000000fcdb5d010000000009ac5365655263006a6a00000000", "acab635100", 0, -112809752, "0778a89936d817d683e9e7b3026ae331a3bf230c9a0aae3596cd30406a9626f7"], + ["0100000002ad15366367d01ce55e0d1437ca7853acfd64cb21935ab7468149c3f366c0f5210300000005655151ab65ffffffff3683fcba6eed839db5d45fdc1607b74a6d1684442535c41a30f6d79f1f55216b0300000008ac636365636a5100ffffffff01a072ee020000000005ac0065ab5300000000", "ac", 0, 945223572, "23fbd0d752e3e1e43e22695f3e64808e2e6dc87f79a0fceac0816338e70f97fc"], + ["0100000001584f7144a907cfd7e4804ca8012c584f8d6ce86803f047749c1a7bbab940bf990300000000ffffffff0280b63505000000000800ab53ab63ac525393f9f5010000000007656565ab51abaca1841404", "", 0, -808227476, "672deac36e553b76539e21ffdd30d4caf6b7e082f0c7bfafe234d370a71f2c8f"], + ["0200000003e8721f65e8edbd07d0df81f8517964b75223a83fc9f93637ad65c37a9969f46d000000000552ac63ac533e77a9864d471b306d5027b3e6f7e5665d0dd41aa462e62469fd26e3ad2c678af83a59840100000000ffffffff714fe9e9da241a265dedacbb37f218b0ae25e34d773205bc64d41ccd4af44a780200000003ab6365ffffffff0237620704000000000100cb009301000000000563acab6563c69a1966", "5163ab6a", 0, 155507786, "3eebfae7c26bc550571b8792fc218abbd8a746e2f71d3c24dd5467814ed50d1b"], + ["0200000003bebb4c81b5749dd2cca19f6bfbd31797da59cf841da99d3355109169cb36d2890100000007515300ac6552abe28c5387d2731ef5343bf00ad5232b0ee09a46cdbde8a1991df00563bf3652bd65eb211b000000000100e95fbc4f9e2af8949b108f8d1416e77517b13c767163ef8594cb47577a2f2faab17a3b600200000008535151005300ababffffffff039e9afe020000000001519aae9c030000000007acab53ac52abacdd2ef30200000000055253acac52af53542d", "52", 1, 656726416, "fa71a5caef12722713ae6a8b4425da67751c74cb09c74cd030a44a8ac0d53212"], + ["01000000015682372f0984e25f3110dd83f5f270cc618ea95ff4b7ca0e5b7db9c1bdbf6a5f000000000452525353ffffffff02e8f17f03000000000153ae116903000000000551ab5163651b360ea9", "53acab", 0, -1408860736, "b809b046d51e84f00fe157360f621953fc584a7d704febde4f137a114e2ab488"], + ["0100000004311ef35aee7033124828e9969eed06678535f22738bef90e6fd6075e6f36c2fc0200000007536a535300006affffffff7c8a16c8abd30c59be285b2d94b5bcdc71e2fdc230f3d723b6b7f8e343b6f5950300000006005352636a65f80b99457acaaad7ccb7dc6d418a331dbbe9f5ea1c973e70c66154e307dc13ee9e9d07f1010000000163aed4c4dcef0e05fbc32565a20fbe80be258d4907bdb49195663710cb6b95a9f69ecb9dd50300000000ffffffff03d20b3001000000000763ab65acac516a2e8bf700000000000152fd450d020000000005ac5251536500000000", "65ab00acab63ab", 0, 169090280, "6f0f89b5a25b6819434a71f85ac3c983882f5f9565e18b2cdd40097a81ff1d30"], + ["01000000019781bb5e2fc71033c1c7ea9be18e36424f958f4945543b2f4e1fe4147aafedfa00000000055363515353ffffffff04a878f402000000000963ab535151ac6a6352ef78df050000000008ac6a63ac52acabac4c046902000000000363ac52b2b8d40100000000025200a3882246", "ab6a", 0, 63141788, "16175d38f2d66578295aed9af2849e663d741fd5bd4459aceeafeb4f9aa23198"], + ["0200000004912557f95d740d510eefaf27fdcdcb9e81072e3b82c9281236b842dc18d79a1603000000008538628b25d59957873246d0351193315a7a03c83cd66529ab37b9169413243c0a231b28010000000553ab656a6affffffff73680fc5f10cae734646caff1715e283b3a7b7f3627433c9bfe4075892502f310300000008ac636300ab52ab52f1eef96ca3d4e53e615486e567c0f6e74323a9607317ca45bf23887c15daeefcaccd2b7301000000035365abe18ba80504d1a0f1000000000007526a5300ac6352541ded000000000000c822470400000000026a51ac40ea000000000006ab635252526a3a1358ad", "6a656a", 3, -1157134045, "5a3f32f1cb92b62a0a93f269ee0cb77664175f581fde4691db9c0efb3a706d0c"], + ["0100000004abc905a2c83bcf20b3c838e857a6d0ecda5edb31c1203009686d7ccd85bcdfff0300000004ac51ac6affffffff047d2adfbf66655d6f2c950ea9c8bc9316562cb868ce67b6b23646355383cc590100000007ab006a53acac516f33276206fa5523505ec59ff169d4187385dbc4a85b2be3c08f4913ee9a77c5c6760a4a000000000151ffffffff47fb4d4ed2dedde6e1d2b32e1bf5efa6e1d082a10bdd197a830d8b271f045e290200000002526359e762a604e1a5be0400000000085352636351515152b51e82040000000004ab6a53abde315304000000000163a9890800000000000863635352ab525300e8d9a9d0", "ac6553656a515163", 2, 1579184822, "2337e651c3ddacc19c4cd70fbee7d39bc455a36290a62c3ed37796147b53e06a"], + ["0200000003c42f2f388b73fa700662def4560d570d8d1067ea1ca704ae799609cd07acf74d020000000363635306fd2548efeb1b0b840439af85ba8913441c81ffcc8a9c45a286e8ded565bd962e67d08e0100000006536352ac5151ffffffff6d792edd66b5b4b49a290ff53904dd50ee6ec63adb1d6718c4b2ae807b18a72901000000056a63526a53ffffffff021e7d4a040000000006515151acac63e569650000000000060052ab6aacac00000000", "5352005265ac", 0, -1349618142, "87c4550d8c0b4bd5816e6fd8334716a96e31f3bf6e97d8d97d5e895e4cec055d"], + ["02000000017975f6a23c868635d25ce82405fbe2d1962df53201115aed76825d41e87d70470100000004ab525300bcc242ce042215a400000000000151335169020000000002ab52082c3d04000000000152bb94000200000000080053ab530000ab63c459472e", "", 0, 1911314896, "f00c96c68fa44ccf671ce4cd5f1372941feb0bead941a4ee98d1f312d143a13f"], + ["010000000136cf86d6eb590422a8e681a42799490221b3b4289f001dff9ecada5a71edef61000000000763510065ac6553ffffffff0220b7ca020000000002ac65566a41010000000007526a535352abab00000000", "5252", 0, -1482703781, "7867d18a99190bbe930b82d180ce361f6ea292ef6426a1d5ce876a60c724ddf2"], + ["0200000002519e53f2464d028bb0e53cb7edaec4ba8a761c15ae55e3292dd830ee6fbc22c50300000009ab00ac52ac636a6363ffffffffb2c027f340147ec39480b9d081051ac3c0e0650a17cecb2569ff62962ce87ec5010000000565acab005158348eca0133f2e7030000000002ac65cee75d51", "635153acac6a5352", 1, 1145668601, "21bcd88aa3ecc5930785d321409bc6fcfb75dc047dc7d38f1112a8e47cbd58ba"], + ["0100000003aede85dbff503d99453955025adba79b7e36a689c921ad07e57a1b4b22b168960200000001528dbbb0092bb012165b3b9f3ae0111752948f983e85a2935a6d47cd439a85cc0503c7db1b0200000002acabde74c5af0e4debc1e898e6fb668f77dfb54cf4daa979866b5ed24f6f6bf101d8d4a18ae901000000056565536a5396c473f20177e505050000000006530051636a002c5aa88d", "", 0, -462522364, "6bff53a51bfcc2b24df773acee2cfdd24e59a9105d4516a73ffc95a881fb5cd3"], + ["0100000004d59f915c7e107c595fa883d348aced2805d4788a097de6559e61c29e9f606c8c020000000163f4fd0fdc8bafa1ae402172b16ccea2be98c46b5117824749f04a480ef74be88cc20910d20000000003ab6a6affffffff10e2a84726ebc211e79d265dd653ffbb15ef31481ca0c9b46a75ab50e03b4c8d02000000086a656aabab6a5165ffffffff0d9ba9ca7d71111577b0ea23fe0cd385d275063ecdede93075ef13f88e75e9c102000000004fe0bf3b04a282ec040000000006006a52ac656a3827df02000000000352abac4bec9e020000000009526a535265525265ab83c8f70000000000046565656ab7e344ce", "6aabac00acac5200", 1, -995102105, "2d2f7aa7c6a44660c4ea89a5dedf9c79a2a9396603ad0e4bb22545eff28e981d"], + ["0200000004b36d2d8a98375281c0ab1b3a0ace918f64be943d792ac20aed7b77fa98d3f92502000000056a52536365ffffffffdaf59aa86df3f6b5a40978da2292ecf004db64bcfbf5680aa1c2b4dac235dc31030000000563536500519edfd06a286b9f9b59e77adf22283a9dc64e8cd22f8d2179d2ec5f51dd92dc35594dcb4700000000066a6a635253abbddda216c21326e8c91e57b42f414c0ebd11eaaaf3058d71b8c03b232b50a8cf2c489644020000000153ffffffff01bf973700000000000551acac635300000000", "", 1, 1215698669, "07bb138469507cffafd1239cecef6f3986281aad3df74c7b1c47ecbcd190c2bd"], + ["02000000014ab182f2ff5769feb7f7d9a76375b9c80dd641598eda2ac73b87bd1785754733000000000152ffffffff01552c8e0300000000010071ebe18f", "ab0051006a5263ab65", 0, 3533217, "6de1bf0790b318fb74f8791ca40737f3a126bface2c3ce3cc57e4d58c3fd4c7f"], + ["0100000003239948197ad832a47f9b996cdd77fd729d389db8eef69606980922bd4f989db900000000085351ab6352005351da85b207019257416f2ad391fd1819966808bc2cae3bac3da6f4ed4132b318918d60db670100000002ab006e132625c0492cffe058502dc0f34631eaedb9679711341bdd7446f0879042009753b3160200000009ab00acac5165630000ffffffff02b776a20200000000056a526a656ac7844700000000000963005100ab5365515300000000", "abab516a53ac5200", 0, 278791271, "a4620115eea69a713863ce27ba85cf02c93b667cfe93dad318965d809a48bca4"], + ["0100000003d872b7adec8c2d117dd3650db8ac925fd13d4184f35569c08a56e756510e8e78010000000165ffffffff480000a7e57e4154b50e0b7501e07bc858a3a370b744cb6b600ff62b7b2ffa930100000006abac52ac5351ffffffff1fc6722b3b804e415dd44d2f3f99d9049a85d4f38762e7b76726127c4d99331f030000000071eccaca022c5c3701000000000051a3f002000000000252ac00000000", "53636551", 2, -642772777, "b62e9fdfbfaca0124b26e6bf435d259c8d1526f277b00707969767339334fc21"], + ["01000000020a99e72204787c26df19007329c797e3530b5352553d7f5288e7597f426776900200000000ffffffff470aa2d8fd4a53041e3b69934ace87c55940cf20a1aa1448be45720e52812b7e020000000863635200006351abbe45076a03057d06020000000006635365006a652ccc5702000000000452516a523353fb01000000000253535cbd4f78", "636aab6a51656353", 1, -261241237, "3dec8427d0be285769fc9e25d58264ad5b0fe1bfa0e85a0d0c8b6b12ca5a66f5"], + ["0100000003646b63e3d6166c0e5aa52125df7e7d69065194ac7789772360e03132f605738c00000000056a51ab656a5923ece1f6f193fb6f5a92a7d4fd07a88c98a4ebc03d89e32403b09a74596acb15b6b3f10200000000e188691f5ba81cf056f9ef3ff1537b59621921ec2dbbc69e1448df9b58a19e1423a7e6650100000004510065acffffffff02dfcaeb0200000000066a005253ac51e09f7e050000000009510065ab6352abab5297efb93b", "52516500ac", 0, 1014165714, "3f12e2ce036befee6fe34aec6c040d1600c76ec090912c411d62772f8b4f3ba5"], + ["010000000290dc9cd11b8900643487a3139a46269af32b77da82d4d269795e45e5983b1cb201000000095165acab515253ab65148b6a0d014de01ca98a99bff9120e07add455ea8ead0371176f96f2ff1b1bf60161868402000000025153ffffffff0251a78d040000000002656ac94a16040000000001537498d829", "ac5165ac51006a6352", 1, -1280122673, "46b693cf0a0ca804211e7988be3e74fe902c01366adf6ea4d76160e1c6d5ab7c"], + ["01000000019c7c18e1516d2d78870c596d31d3694ffd2dd1acedbc436534aed89ceb701bcf0300000009526a525363acac5100fcc8645a02cbc4500100000000096551656a6500ac6353bbb8aa0200000000010000000000", "", 0, -2053754124, "11d6ebd0fed2808955104a19141cf3c4993c322ee0e6f76cb8365895d54b1328"], + ["0100000001c20b71c8202df24f69ae78df3b55923fc670c3fefe77178ee2439db354af53f90200000007656365ab00ab52d66d096302371bb8030000000006006a6a52526adafde804000000000000000000", "636a52515263515153", 0, -347149704, "2c653767c3b41ef2a7fbffbd17f0f2d57ced97dd1fbb06eb3157c53afd098643"], + ["0200000002952832343341619a629b67218739f28e8bb7839bcc41e342754e2c09acdc958d03000000008bbae690d24212bc737c473669d9c7c780bd477986dc954de161703de7c9969b6d2c10a703000000020051ffffffff04d3e14605000000000663ab6a635363a54c540000000000025200dc941c03000000000753ac00abac6a63c54cf604000000000023a1a4c3", "006351ac515363", 1, 2009769444, "1f8ebb99916980a2e411ffb102daef3338f61844cea74bfd4d1e410bf7cc843d"], + ["0100000004d34f731323b53a9a184795e0baa5701dae03c51e95de12b3f68b5170bddcbb130100000005515352510049b4fcd848c5950c7eea61bda5a23a7675dc8f19023223fbd449c3b8dcdad5bd1c58a4060200000003ab51ab5e8d127abb44d6c0b9c3f1791e3ef8e23d4608f4c471f13e250c8dd7600dd52920f4ca070300000000e08a77f16c3672f086e8bc8b0cc6611a253273428ad75273f19cbea7c87ffabfb574b64a0300000006acab00ab53ab198ffd0101f18b32040000000000d66ce5df", "51630000", 1, 1185664449, "d522e1dc988693996e56272239a6beba86353b3436787ce101a785193828c182"], + ["0100000001dccbe117af197e340c2a75961dcfbabdecc50a92c38f1f8d175fc35fcd5054800100000001528fe614d901f679cc020000000007ac65acac6aacab00000000", "", 0, -1033256435, "d43f389fd67f73f100c98f14ad6dbe6c233256445a8c7b283bdf114cac7ebd5c"], + ["0100000001173d15d7ea230b68fa61b74804e0ae922685c1e7e3ca73c3a4f30a7ba65ac3b3020000000165ffffffff03455006050000000007635263ac0052ab3aac7e000000000003abab516b8f2a030000000006ac0051516a532601e7ad", "", 0, 547674670, "e79369ef9542f143c1c4aa7ac3f914972a502e55ec4a08a0082bceaca7208f3b"], + ["0200000003e82e1fc3f15ba6e68952945675a13c0b5b315898667c01c01cabe729567dfb910300000000ffffffffa971a483bd460d5e75dfab3571807bc28b26ac36378c024248db1bb620b8cda60200000000360343ec035257fb84ed762e42ab7ad5a37dd1fddd6a7dd9dd8fb4aead12280eac2e47ef010000000163b134759404f9357d05000000000463525263bddf7303000000000963006a5352655352ac0729220400000000026a6a610595020000000005ac65ab65acaa350647", "", 2, 1723445415, "f1a29723e76aff3f3a7a72a1437d4a701df701fd842118e7e22f0e00358b8ab6"], + ["0100000002103e3103bb4ffb8ad9e752a46679c2c33b540da789a9a2502ca76c3cb01746870300000002ab63ffffffffca37979bca160d5618dc29083cf39a56f58224170a923736301d5e5b646db9190000000006acac63ab0051a400587904db761e04000000000765acab636aac63524ca50500000000096aacac5152526a52007acfcb010000000007656552ab63ab52d5c9af020000000009656aab6300516551ab4a935f64", "00", 0, -1398654011, "23967185dcd66c0bd63f5316c9414514f1e5d20a6419ed209318c541e657bab8"], + ["02000000049b0e91026cf9ee59f30b2ee6b1fe9e49d1c04c365bc3102aaac113846634642e03000000046a535165ffffffff88a9b6b51c2ca78f74eda51677499af96acab15c22a412786047e938aae8435e020000000600655165ac51ffffffffba40760f01cfcae264d7fdf51062bc56d33e9ddd76cf1427fc267e7700f581bb020000000400ab5151c127543afecc5a810cf1e0975709c3f03837acbb2e5beb8e4b7b72ed68c4b37de3011251020000000151ffffffff02043a09050000000004abac6352ecd307010000000009006a5165ab6552ac5100000000", "ac", 2, -2083979130, "5f4742def193fbcdf35b80c2a38a48025cb964420de6b07f644e335ffba1b1d2"], + ["02000000045cd37575c8d6c7596c18a19974e51f626e237f04448d1094fde87e6302feecb20000000008650063ac6365516a5128450247ce0f65bae8c862b063af631341bb00f54a066265abb0c24658ecf82472f4780300000007005353ab656a6affffffff7247ce25f394be767d5a8922493cc4d4c85df8175266c495fd9dac8a2a22d3370200000005ac6500536a3e3542c5eb73fb9ffab6c7e3af0b40238ecfd4d0b8c5d569c25b2cc84fc38cab585669530200000009526563ac00006a0000ffffffff01e44c6f000000000002ab5213fb74b4", "6a", 2, 783741594, "30ed58b5c5208281414170ea9820aa81b8cb57788d66b3b5e49cead0a848eb40"], + ["010000000247d566848390bee63dbcdb8feeeb4485e978481ea40b8b7c897a8d5aafafa7660300000004acab6565ffffffff59adb85f94fdb97495b03a838c2008b6b31a955964a069ce9bb75183ec2dea6e010000000463515365ffffffff0296e37b010000000002655363943f0300000000096a5252abac53656aacdf4e00ad", "0051", 1, 1276103491, "ec308b79483771ed6858fc80a17bd1b634bdbb8188d904673f544fc9f441a2ee"], + ["02000000010d947567fbf24b4a3f01a6d0ba1c3e85c77c3f4f02e6fee08b6b6602be4405010000000007ac65ac6a00ac51caa3bd3c046a7737050000000000f4910b01000000000352526363c88a030000000003ac6a0067f4300200000000016500000000", "526a65", 0, 1729948814, "7c320d67c7009384bcce45cea39036365667c6daf95dfab248eeef6245434081"], + ["010000000325ee4b9e92af79558205b369380fa11b0f4ad1557c51534841a28b1dbdb20d6e000000000953ac51656553000063ce2b4653759b497865c226db0b86dd3e94283a5c9cd5d1ae9330719918e551afe38204df0100000005636a51abacffffffff0db6329ca754d2e62cf579e833f78e902754071922a0fde2117442dfe318460c020000000152ffffffff03056db204000000000751006aab63006a11697c02000000000351006a4b2f5a03000000000765ab51536352007f14e3e2", "", 0, -1375849579, "4aa0b7d6d1f0425612e75f22a83fda9ff3d50bb505ca2f7cb4a0d9f07c3a7194"], + ["01000000012a74ed2307db121906cf53f3050ae2f5f600daa15048fd098515771b019f0784020000000851ab6500530065acffffffff0275077e0500000000004e6c530000000000025163d77520ec", "52516a6a00", 0, 1194548809, "2c138280dafcc49cac0e235cf7f426f9ecd462fc4e849ac5458c32e03d63f92a"], + ["02000000027d0813c58f0647cdb5c80477ad5076bee49e1ae81c752a4e31604ec1b1c6379d010000000263aca9d0c97e5fe3d09c14cf97e06e30e37bcb2681513d9df96997522f3f97cfe58175af423d020000000017f606f1021a609d000000000005abac51ab51368482030000000007535251ab53006508f4472a", "", 0, 1627321907, "b5957f26762cfbe086ce94f6c20d5e9c3c7d93b385552dd3c9946415947bf2f0"], + ["020000000449a1537e84466b73ea718cf9f86e4c261c49349884648e3d5989d136c7f2136b000000000653abac636300ffffffffc23ba73881205353d7b30f5cfa089327d0f948ada21929ed37122453d0c72ab2000000000952ab53636a65656563d605fcfa019688b1f7d3ac70e9f375172e0333894b127a8c43eb311ea526cbaa888446e10000000008516363520000ac65a8f17802a66445d628e95b89f62d7815060e5e970b796a5ba0bda0f116707646330b4c4c0100000005ac00ab6a5397228e9e03b48c7a0100000000036551ab6b3de3040000000004ab53abac8bcd60020000000002526a19208b62", "6a6aab6aab", 3, 1614793800, "e01c4c4802e4146a8b772d588e604da232a7810c6861cc24804dfba73ae79b32"], + ["0200000004839eae0453edaf9a89d275e969152d5b2af6ea758669c5b602ad94ac227166a5010000000900abac655263525353ffffffffe93c50137e97639cfe750d236cf390f644874f0e39653bf597490676a0bc49b902000000026353ec1d24a2e561f96adff80a8327487d109a27c51ea5f22cb1ce91e8d7b7f1bbdeec908915020000000352ac636c5e10f3736d5a5faa905365d2ba63fdbf2889b11155d41977f5e265ec5a4e6b4762709f03000000026365ffffffff040cd18101000000000500ac52ab65c24bc4020000000001650bb44c0300000000096a5253ab52636aab65e64a7a03000000000800650063510052512c1293b6", "ac006500", 0, 1723657020, "8ee9a2bd83986ccb9b59f336b27894fad2bbd60c1f3488d244b7dfa321606482"], + ["01000000018c2348cb11278c44f4cab4a7333f1d9db75535766dee54f3f48f0e6d52d9ed71010000000451535353067275df02d0b44704000000000263529898cd040000000002530000000000", "636552005300", 0, -706801118, "05f15643369cba085af7ffce860db046f19dd7e8229b08fbcd4b82d2ff2e1d64"], + ["0200000001e840b8e86e34b2213603113675e2298b23e600487bb6e3f8b14ce36d6471b3d0020000000651ab6a5363ace2f1ecc803c100490300000000036500ab1e73270000000000095252636565516353abceb5930100000000086a535265ab53abac392bcfc0", "53acac51005365ab", 0, -472254134, "84da47c1287048e9b5b13dd126c462bfff3d4321d736b157421d2dcd740036b9"], + ["0100000003598af364e67e290786d398d8926232e83805b1f4a3f77b7b1d521f6980f6f9a50100000009acacacac00635100abffffffff42a033e3374fc7f4039643926de72c0f64eaa1f546df6fb672c30fb37803fe5b0000000008536551acab656365a7ca50587f14a4d988929685854b905d06cdf24381a5bb22da2eba1f8671c6440fe4236b030000000851abab005163abacdbd011fe02022a9d040000000002515331067202000000000653ac6aab6a6a00000000", "516a51ac6a6551", 0, -1861646214, "0d01a2315e77b0420714af7fbfaf5bbf267d2dd1047f565690b5b5c3412238f8"], + ["02000000020aa17581f580af401abd1b8c074b9ec8bb91044eb1417a100d524defefa523a1030000000165e8f159d2789b6dbb3c68489ee42a51651d5755276298c93a2eccf36faf8ae9a1b688bd9d00000000076563535253ab53f5ef3efa0290eb5503000000000465526aac37d88f030000000009535100abac51ac6a6300000000", "", 1, 511514470, "bdc091bdc05ee6bba8edde627b7ffc87ef2ffc3a7df731e4acbeb11ded749c81"], + ["0100000002613e567ffd860bcd368ef3ed73a5a4dbb7c89a99ec092b927d333f1d545ecde101000000085251ac006aab006affffffffff4c624a851c9b64abba024a1be9581e6753e67d2475e655d34c3bba9fc14e0603000000095365ac636365ab5251ffffffff0432316302000000000163f0c2b3050000000006535251ababac75a3e4040000000007ac00acabac52ab98af7904000000000000000000", "5152", 0, 44513037, "6294b7af3a0a17310d22a56634e9b28f04075ea42866f3897678aca14f53ac95"], + ["0200000002fe6c32a2053414ebf5c8f11d19a8ab6222e8c05eebabbaacaec13b95308a139400000000096a5165656a6a5252acffffffff4e36ddc102b2d6c34d604053e120e74b40460311c4cd985be66cd6b100f7a9570300000002ab6ac6caf8510124277d030000000007516a51ab52530000000000", "ac65", 0, -1010923027, "ae307b66360abd9f1e45146ed65ec49984ffe110004d991042095643ce43b125"], + ["01000000016cf2eac28ce41a64f0356508e87887523f6b9e5f523316a40fef8edafd5dafcd010000000700ac00acacac6a934c10e404e75d1201000000000553ab006500b4106e0000000000016508acd6030000000003ab516a734d19050000000006ab6aab6a52ac00000000", "ac6a65ac6a53", 0, -966661556, "0419f4c033abc3dff8b16386acda263a58b766e7edfc97e7e7a4b193e4eaa0e2"], + ["010000000287d8d030f459ee98b1882eaaa795500cf394cfed7496475d7450b56ca64705710200000001acefefdd53a82706f7f3266e019bb01872ac895d8ad56817b73020724d6e4bafc4e3d01b76010000000453655253ffffffff0102a2c605000000000153cac7870f", "5153636365", 0, 1293311164, "aab9c484ecc43336266c08ebcca8d44994db66114f3b49b4e6e212b39de0ef68"], + ["0100000004c5cc175ffbc81921c8a826ec4ff4901ba0ef1e96c66c8d341c77920b5ef82d96020000000900ab63ac636a6aacab1f486eb19d1f73fbed2c27486cdf404bca2f03b50e0ed200fd7eeedfc76f1be813c1d98703000000085263acab0000ab52ffffffff843355391aaf41170871c55c2badf684f4c3ea8d049ef5ee57eec7ccebdcdbaa0300000008ac65ac6565635353ffffffff71b34bb494fb273d928596f33f27e41aa10cb8b10baf15959f74e7fddb83ac74000000000253ac05dd34720353e81b030000000006ac00ac530053543cc40300000000046363ab51044fc4030000000002525200000000", "00ac6a6a65636a006a", 0, -1441775340, "2f0c7b3de46aff4155d38dfe4bf999928eea12725d440567847dc7d36790c63b"], + ["02000000046c46dc4c2d3dd4a685bca0bfbdaa792e399fec8384908745a85be7bf1491047202000000050053636352800c9dd82f467f75245a469a757ede14f28e668919ef295897e79d2bb25ff45956ef1e6e03000000026500ffffffffeb0f437ed8661fdb1d147ba2c6e39d2540e3837711e527e87464d7a6fa3538990100000006006551516553fffffffffcf3173c6a4545b1fde2cb3f71794b35d892b8b7b883c0c28d681728328c5b9d02000000025100ffffffff030907170200000000096aac536a00635352ac6b45bd0200000000046aacabac5870f001000000000152f4e324a4", "ab520063", 0, -473742548, "bd34cb4e1954254e7a2c56c3dab6046f986a4761389314352d2224c1279277e6"], + ["02000000045c3d77742904b36ade338015d4ab887d4108ea9c420e233bafb94f23717bca960100000000ffffffff7389f48a66591d8cb8332011e32bce06569f3472cf8f8d2313f726eca4aeebce0100000003ab6a6a0b75ba8e21d358cbae62ce3e2c465f76aebd10c89ba2f48dfd4cf34b29cd27a004f3edc00300000003526551ffffffff5e7e41b918a0ab3548fa760acaf3f41af02e1920c15d3153d175dde9003ac3320100000005ab525200abffffffff025a26030100000000060051ac51ab51b5455901000000000900006300ac5300510000000000", "65", 1, -1092642413, "0553edb99fd6387f00839124b467ff7e2e56fde47776de7f8912ab353df105ed"], + ["01000000035995f599219ff073ce6327d679c783bc1185fb25abceb3a02cea51ebbf884dbb0000000003ab0063ffffffff6fad07d026f77888bcbeb2eb357719ab79a536514bc02a3ec325c1ff8a57946503000000046aabacacffffffff9d096d16363eafe7dc9947aa773bf223f70f682318b1eeb04b399a1086022f790200000008abac655163acab51bced07fd04ae63d90200000000076a53ac53006352fdb9b00500000000046a6a0000f3318100000000000565006a00007cd6d601000000000094491df4", "", 2, 104137376, "f89b0a9c4835ad833656689f3a618fab9b66a794ca11c732ae1f902a48c95ebf"], + ["0100000002b16fed7732ce489a6156effda17d5d12ce7da558c0af4c81f820c69a571a354102000000036aac53ffffffff516dc9f7acf73c831b739a0348fb706bc746745577a29253c304b2a01a5fbaa30000000006abab6aababacb85ac66e048dd95f030000000001ab4491d902000000000453ac5253b77dd704000000000451656a63dbaa9a010000000009ac6aabac535363abaccd2e601f", "52ac53655363ab", 0, 1663493216, "ffb41399f999870753d9a08e121535e7f7e2969f5afe028d11f9041eba157750"], + ["0200000002479f5487626a4204f2266982118f3bd75d5cb6cb041dddea36a968249e551212010000000453005363334b74fe1371422008b3acc589a4a03f9cdda8c7175dbf610d8059da27f8c243be5504f1000000000963ab5265ab655363abffffffff0350bc5e02000000000765ac5352515152c9fdba050000000006acabac535165a9919f0200000000016500000000", "63acac", 1, -1072123096, "d0764c09ae676da499d819e9b19b46eeb9b1d523f4184fc24f09bc1e9d407287"], + ["0200000001ffa5829144c5f321fb1d10e5b709042e9a6de84d1e76856d9ac1bd4c2c68c69f0200000002516a89103aba01fab6f3010000000006ac51ac53636a00000000", "0000ac", 0, -1312408068, "ef449e0f6add5aaf9af746bc66bb68e62fa598f0c73dd92a99541a0d812f727a"], + ["0200000001613343a77e0eeb004e77605a80189424ac29d0f0f8a1bcbc5132944a2ae66f05030000000463636a52ffffffff04fabd02010000000003ab5265a8ebc303000000000565536a5263fabbd302000000000451635351059fd605000000000953656353515300536500000000", "ab5252630065635165", 0, 1456076824, "dc7873f59a3ca671e663e113d696c0917b7dbd223f3a442d2c6eb11d20282be8"], + ["01000000028fd878f24b779c6f20cd02713d22e9641ff11ed54cc463b4af4a0e753b6459bd0100000003acac63ffffffff0c15c6285434f2f62177bb25d54471ed4539dff1abe0efb7995e80e114161d55020000000851ac65516363ab6a2336f8b3033afe9f010000000004ab51ab52a9ef0102000000000453ac6553a0e5990000000000056a6a63abab00000000", "656365", 0, 222417535, "4071747bf998a4934ae705fa37ec781cc7bef30ae2fa7ab750aca5c0b561e88e"], + ["0100000002065131e4d80bab5c615641d2a80aa53b4d4bd8aec09e75a2815e9a4e747855b90000000001abffffffff15f7c121e87cd6a3a61c3885b687581fe0e5a8fa31ef696438759f47bcfe8be1000000000453ac00acffffffff02f0895604000000000015a50c030000000001631954957b", "53526365ac515253", 1, 1515534188, "f95a47332194ab1242965f58f0218d777c752e58a712fb4d72a7ddcd1df4ff5f"], + ["0200000001aa09c1e083d20f0ace60d06b062dc96b4ab27d51c268969d70c9c49b0f6b8751000000000900006553006552006affffffff04b366520200000000003437fb010000000001524db42501000000000700510063ac53abce1adc0300000000056500ac65527de31a2b", "6a516352006a655253", 0, -2012299622, "be41158664026fa7924cc9a370fa2d21c8c71c80550208e4cef62ecf528366e6"], + ["0100000001bae81ef6134c1bf56ac2ce3e89d00e23976a73849c876c42371a1f6e4db2a42201000000056a005263abffffffff039e8fe90200000000096a5152ac5163656565174959030000000000c1af7d02000000000600520051acab30dd290a", "6a", 0, 1114135346, "06e42e396bcb5d9b864727a3497481383157c2bdd06428cc8d0cb47407cf6950"], + ["0100000003b99d37b44a70e832736114b492fa9811c614364cc25302d23a53609606a464070100000004635251526fbff483977178f83a29cb214289e851cc88a18c80ca1e20eaf77571394c84d200d415ce0000000009ac51005263ac535163e6e2b156def72f0f939cf50ef0f7c619b6e31d5f692e812783598900da63ae51866d6bcd01000000035153abffffffff0220105c0100000000045251ab65d372f203000000000851ab525165abab5331e808ae", "6a00acabac5153", 2, 815400807, "ef04fc04cddc5a4ffc075f58f4575ed60c14aeb2c1509d6942f77952ec966b45"], + ["020000000311c7a2b03a6feddf8e66098910d64b4dd5f8c6f899c8f0b25839e2e2419582d3010000000152ee1f02990f74ab21b7c043b6e8784229848a20588af5b30ae6c5da1dde3dc3df4c4fcb6d0200000001acfffffffff02c1b9d7fad5816da5f913fa38f776dcb8370b9b1aa62d047dd07876d0124ca0000000002656528a6471c032551d1040000000003516365227c34030000000001655aa31d040000000006abab536a6a6a00000000", "52656351", 1, 1684333854, "4736c7a8db41881191e6b1f1be1bd7122a2c8a2f6fed12a3f27e4d5b3cd69b03"], + ["0200000002522ed2ebd6d8edbb9fdb391bf6e393e6ba1e0f434719a9caa9a25f9fae3e04c20100000000ffffffff2a40333aeacf7045d80fc11a21f84518138bc1de64aa34ea228a347922d0c50a03000000055263525300ffffffff01bca04a0100000000066500abac636a38919c57", "ababac5152530063", 0, -974314962, "18eb2b2f186e1489f96c18343e7caba5aba86ea2a388abea488f6e042222e249"], + ["0100000001b43c0c3551165bc487dd7a047edd4eb85df25ec3abd9c3c24f91d93666f5538902000000025200ffffffff025892d20200000000036aac6a8006120000000000066a6a536a536500000000", "53", 0, -738449032, "8807e5720dc936238f6eb0ba9efc53a6d59279b5bf111e2950cfc6e960b16168"], + ["0100000001a07a5e23819abc602de953e7c1435b570bed3c0c62b13ef1c8e721bc17b66f0b0000000006535353656563ffffffff0194e77a0100000000030052633b428161", "6aac6a0052ab52", 0, 533490619, "80c0a251a5c5b7b7f4714b3b1bde1403871b471786cf3b6ee97f16ea463be0df"], + ["010000000115da0b35eb70138426fa3f32f4c4cb42aceee5707960240b794ae4aad63c89aa010000000051eadb43022b3eef0300000000076352635352ac523476c2020000000008526aab63ac6aac6a00000000", "ab52650065", 0, 1441004329, "cc9573e1d5c39dab715ea4eccbc0f205b965d5c2f36a7572e33be719652f178e"], + ["0200000003fe02c124a132fa5f35a6cabd102eabd768ec9aee9e5e47ae1a9200036e4326910200000002536553d5a62beac8c1b190a0e31e6d2466174d8a63980a63e1b199c1ba684482d6769571c56a02000000066aab00005365424d573fabef452131f0759783b5e8d12bd4bbb61e847aec767ddb2d955b4ad4eef513590300000007526a5151ac65ab8482450f01e39035020000000007ab636351acabab00000000", "ac6a6a", 0, 917370940, "067c81f3a00bbdd3b7bd082da158541191b07ac1db71f08dd4adc724f41c96fc"], + ["0200000003d509bdf32c55449d506310df0be654542735761ba30c745e9250e1e9c4ec8a4c0100000008acacabac5251516acca0b6f8bf1ab3485c9e178c6bdd64646021bc4501c7f0865f31ff803eb40cb19541a36a03000000046a53520064bbb2084a1636385377dd4f9840ef587cede9ad9f72300f84837c4b02018996657c6a31010000000251acc813c45801d150df03000000000400636a65e03909a3", "ac63525253515365", 2, -830296820, "583fb2ec530bfff090489491423ac8b362a1b69535456a7ed0b6888f9d208e76"], + ["020000000244b3dd6f31726f5193cca348eb606d35f28e060e4492bb7ba9a22a3686eb86710100000004ac5351538e8d5edc4542d4b6c07a2ca9e905781e2ba0a1516c64287970e4ef09b23c30581b092ca00300000000a704ea86024948bb030000000005655252535383ddcd010000000009636563ab52636aab00e9152d71", "ac0063005100ac", 1, -1663652928, "6672650d1c3b2ac2fd1e837e82d8f9c5a2ee680f8a95cef33c316f7efd4650be"], + ["0100000004d40860f68e8da4abacc34d7a801173650592d1eaf76c58ede926d99cf6c2a3c00200000002515100d66d59084eafdbee52f969caaa41f7d435575bf9214b5ebbd490029ea33fdbfb4f91e102000000086a65ac63ab656a51cdb91339bed3d99291982fd713d81cf89c42a7d652d0c44f8e17f1bd4144fbaac8ec481f0300000000e850fdbdedf6fb7a85087e225929c7230390226a94051e28ea8bf321d8ddea9ad000353b010000000153337056f602ce12d00200000000045153acab67ae29020000000009ab006363ac65ac65abc60f936f", "5200ac", 1, 865469666, "a1cc0e4d4b4a7db24f274add28005d049e24d6af0eda00714f71f2f82be3286d"], + ["0100000001bf0138dbc38bad78d080b101ef6fb6a88ed23061cac7e4422840cf2ceea80ad30100000004ab520053606e715601f513dc050000000002525100000000", "63006a6351", 0, -1779567042, "b148f4fcdfabcbe537a82a27e52220156804238612d71ae5baa1c2d854cc636f"], + ["0200000004e9bdacc5084fd74159b5e4cde1774591c5c0c309ca791b761922abce3ded3dad0300000009636352ab5252acab6a1736b604a2df6e6e3af85c98e837dbea33a75f02ff6f6bce0a9954698155a760eda9845f0100000004525365abffffffffa2dd56dd2d9f1a7d1beff75a8815ca417756e7e609a20eebedfeae6d61427f0e0100000000ffffffff47074f65985b8647a50f9f5fb2bab6eab13855aede599c437b1095d1d043e51f0000000000d8bdd15f0325b0bd0500000000004118e7050000000003006551d0f1a50000000000075165006565536300000000", "ab", 1, -1821792667, "1e0f02e1361364d1bbb9e86eec3b5f2b04af4091784252560beb2948259d7072"], + ["0200000001f0dcc6f435474ea3fa61af4b5faefbc7f5ed576a9402ffe78892b88fd0fdc9ad0200000000ffffffff047733820100000000040052ab52773d7c03000000000163a39e5004000000000152965577050000000002636500000000", "6563", 0, 1517463573, "e17a1c95493cbcc109fb427517dd75982cf69e79a29d9637175d2f8a26cbfb9f"], + ["0200000002a390bf4afbb74aa73f183b647a3105506a89758129743562f3c383ad99ce7f8a000000000263abffffffff9c1861524051121aebddfba1fa5ded4afa30c0ff062879bb40b10afa96a36fde02000000036a63abffffffff017c9a5f03000000000651ab6351535300000000", "53abac6a63", 1, 1619188972, "ec7af5c8b8d9b1527c588b39d04b7714d63badb308c12be23f9ee3d63dc4930f"], + ["0200000002697d16bca1178c451dd384dd4574fc4c3dff8c9b225fefb79ffc98ed527f8be70000000003ac5263ffffffff3f302b7655f4c1670842e7df1dbba183158096efa0de818598523c6ca5f77a50010000000900ab51ab536a53006a34151fe1032420bf0500000000086aacab63ac00ac53f5cc0902000000000265538fa17d00000000000200ab00000000", "", 0, 113460979, "7149244c5fadca8d697e3b8f8b32a5369a9a07687a2a7a632bc8e4268f2b3cfc"], + ["0100000004502f9be62050e426eb28d7791ab8f57c07360d2427bb315bf37d796c6d48aaa801000000035352acffffffffe6cfba0227b8a6ae37c4ecbeab84ad4162f90b1c9affced3d7e9186c6c079ec3030000000753535263ab53abffffffffbf06315555eaa45fcf731dc0a473e036b48daaa8933b73e02f6ebb7d0b1d9d0503000000016affffffffc55943bd624a33c0b483c6c2e61fff404434f167549349b7381c4ac9984edbfc0300000002ac63383d7943044af10200000000000300ac6314077a00000000000952656500ab53ab51ac87224c03000000000500ab00ac63adbc740200000000025151b7206815", "ac6352005253", 0, 1237521186, "acb27bad5e6dd4d0fed54db7bf4e35ee20a5e7dd49573b2c667e641c353760de"], + ["01000000025d61f84360461e518c65648458a8151f821b1f329629ac5315ee1472d67c97050100000006526a00520052ffffffff6b76b3a17874f6d575424a24537248bb444c5abfcdaa7164f03a795cdd2ca2b302000000026353ffffffff047116da01000000000251635d012e0300000000066a0063635151699446010000000002516337f8ae02000000000851655165ab53636ac1526c5c", "ab", 0, 1612837028, "1d9c85e2efffa8e073a66386dfa60a6cb0108f8e196d0c050e70b0472dc6ee19"], + ["0100000001097a03fc1808926bdadd08a026a17f2ca483aac9fe0e72f203fcaf87953a0d5c0000000006ab655165526affffffff02ea5507050000000004536aac65ccb95c000000000002536a00000000", "6353ac0065526a", 0, 1855457353, "d76057123b49ab4f1d4bc2451544231c3a912c5d47d74d23b86ab304fbb9646e"], + ["0100000003080c67d08bf3f1cd5f2c603fbc2948073bb9423d30e30892437600a00749b3df010000000800abac52ac656aabfffffffff2736080cb31320bbef856d3dcb164283c42e19cb54065ca0670d0ac252bca7e00000000003c92fcfca3399a6151e6933b5a9a41e000c7a54616688fad1e197de0b4cb3a6225f5809c030000000165ad8a38d903937eab010000000003ab0051865679000000000008655300656552006a52d7bf000000000008520053006aac65ab00000000", "51acabab00ac", 2, 2064574197, "9d94b13096d8b3d1270c6f060533e0323617ef3cfb6c58b3f2b29ce8cbafc134"], + ["0100000003629b3b3e772ef4412a1161b96bcb0627d5658cbda799b491b1814b0e100462650100000009ab53ac655300acac53d56bd33832370c5d2dc386ea7fbe4342373928f7b818c2adbfee0f10f54612fee243a1d400000000066a52ab65636a51e1c714dbfeccd553af52e669b18c0428ba734d243e104bed7b34049fb744cc981ff3a801000000035351acffffffff02be88dd010000000006536a5265516390ca340100000000046553ab6300000000", "636aabab516a5200", 2, 1610101981, "32dabdb720fbdf618b92460e93479a68ee9f7eb9cb3f97570649f32c8e6e4320"], + ["010000000330bc4f68729c3626e8f33d113a0d9f296bcb229245fcec807a11d6f1fce30f230300000009655100006365635153ffffffff2aec68cefd1e4988ff89d575d108d960ffa9be0e08176be60236429b9e85b5ab00000000075152acab5163acffffffff7296a55c9a9c9ec5b5109578d551b1a0421bb7241c4b75342db03eac4a2aac6a0100000003ab0051ffffffff02cfb9c20400000000076a535352ac5363fba8e1030000000006520065535252147e5c7c", "ab00", 2, -2136228069, "a24a572afe64ba4949de65d0178455377cad9dd03ccdb1714d0d61854dc0fd2c"], + ["0200000002dacfbcc377d4950c2dda1a734c5ce38ad2725a3ad427bfb54ec4ab540494c5ac0300000007ab530065005353ffffffffc2d6cb483226cd2db04d5960293f9005d257116efbd806307c2c68c19e64662d0100000009ab63635100acab6a52ffffffff03e2ed630400000000065365525352523375270100000000007b9fb20100000000015200000000", "ac65ab", 1, 663560022, "34671c32f9ec36fe12a413bf16ea35a49fc9bfa216a72581ee4ab7e3e40d3e32"], + ["020000000268968f50763897aa6d3805dc9f0b5235b6afc4776ca115d30e443468238f0afd0200000005515300ac63d57d39f69ae7f782aa741d6793895374042a0a26dbcf92ab25161db19ac0748e44f4842500000000076a65acabac65657206dc7e02e6421b050000000007ac6a65526aab52a395170300000000016348904cfc", "ab6a", 1, -2119766325, "9273f2f4b7e61fd444d14f6d62d0e557d0d5e7f7f317786ea8516044a4012c46"], + ["0100000004543e3a91b677737843ce2437ab8ea452393579f2bd410aa4240b96be72e55857030000000863ab6551ac6500ac2f17c0b1cd4a68fa3a041299712686fb4f79739c9bc33aead5492c5d1576e40115de06850300000003526a53982d642f21a7449858bf2fecafd8366da3e89b3dfb78c5e51a669b8dd70881bbae69636802000000026351a7fff14558a33133180241ca25d1bd0a89163ba61cafe20a264aa39c49dc8f430bb0fad5000000000653000052ac00d5e0d6ab020d36d50200000000076a6553ab6551000a2ede030000000004656563ab00000000", "6a0065ab51", 2, -913040128, "bc7d238df29128c1e9c13e8bf699bef9d153f070a59ba6bdd6215630d334342e"], + ["010000000102a11234869536ed0f2164556d268d2375139945a88f8808a00108109823ddea00000000000616a240036666720000000000086351655365ac6551bc513b010000000005ab63005251bfe93302000000000000000000", "51ab5163", 0, 1683585228, "f0972528ee768ff576d8a5190866831419b0c963ea70329bcce71100adbd54cd"], + ["0200000001411876b67e8794e64348f3de4eda5ce536515c4800744c96c7fd542972ac5d4c0200000003005363ffffffff01b05d830400000000025151fa692394", "52536a6a6a", 0, 41748170, "97476baa9fb1e8c748858e86015a36b7ff7d477766963661c6ee1cd2f7a967d8"], + ["020000000195eff4d788d62aae50fc0a54c2dac5c816e5ecc291d3f9ce07a89e0389c3cd2b01000000055251535251010068ec04e0e017040000000002636344df65050000000000bdf09e05000000000463655351f9e7a10100000000055300acab6a00000000", "5163ac0052ac53", 0, -1816766782, "f32c7ddf47cffae71f5272d24c6e6277417d4013e164da4faf28516126058211"], + ["020000000119d51ab32a1759390bbdaf1192f1f31f1611792e4f142d672d1beaaeb289bb30010000000763525253005100ffffffff044a1c38030000000004635351ac9f338a0400000000026300e942940000000000086353005252ac63ab9c8cfa030000000002ac5357357313", "5252ac53656353ac52", 0, 550091552, "a11f4f377244069bdbb8f2abdc8bcec643575bbc158832a0fd63765f170f81ba"], + ["0200000003e4d20afa5c8779f40e077be37cb9de02016c57955e80ce17a9d2647aafbb38070000000002ac63615c1d0a694e58ab277b9030d2d30e64b6d3b505b2f1bc2c343d486b5ff5910001dfa1980100000005ac65ac00534f11ab414fb1abddba39b5932f203f7b58d227c56f0324b30ac1ec9e660a2ec1d70b7d8d0000000005636a6a6353ffffffff018bab7a05000000000200652fc271c2", "63636352006a5263", 2, -1492368316, "b9fb2a1e8f629c0f763f137df46fd03173e98b62b4844b4bde0e25b924253171"], + ["02000000014128589787c978b998ec995960693aef2ef3057033f97467f70cf77137eca1090000000009ac63526a53ac53acabd43ef85a02f1f3c8000000000000169a840000000000036a6a6500000000", "535200", 0, -1366829315, "793a9678836c321fe9759d77e336da9909192ba39e5c46156f86080cf0970a93"], + ["0200000001123c3f66d36efed66c1d6c3189e6be86d16a6c0685b4d99a680557f20bd40db30300000004ac00ac51ffffffff02ff82d10300000000075353ab53516aac80d1e0040000000004526a5263b90c0c08", "535265005265", 0, 450560496, "02a9714ac6c15726140afe6e861c665e25918f2ecf9574c121820d7ccf4fa446"], + ["01000000030bf782f6e78526019f75777fc0ebfb50b93d6adf75fcf1722b321cfbfab327d30100000005636352ac65ffffffffd7993aa8548c78aa3bfc12f62ff95ed5709abf1095c58d47d85130adbd261fb7000000000163ffffffff660c617f055dcc3a4187a6740b48946a757cc4eef8141fdb3b850d26a3b424f301000000001cd5bf70021cc87c000000000009ac51ab53ac6365006a1d552a020000000004abacac0000000000", "530053", 1, -1894282550, "16a440b3b2b46b428fee1aad8aa1f17b532f8668282e8e1cf87e4e47db8e9d23"], + ["02000000034722711a6992294505390c7ece21d874b28a33398c62bb2e2dcfbb595785ae0900000000040053ac6affffffff51dfd34be876a2c9fc980aaa6cf503a9010db8254e9fe4c85c116140381afc600200000002ac6affffffff75ce93c84c6aace8fc4bb180fa0d3d0b1666b7a1b231dd0e20f18cbbf901a14b00000000015375e3199a018061a3040000000005656a516351f7faf07c", "65ac516aac53", 0, -1665545907, "0cdf7a145c4aae98fdc17020b6784d71be1711d20504c92fdef22a8dd8ed2a31"], + ["0100000001e6d9156b2b46d0b40bda4f79e326a1b00310428c11b96f27123f02aaf8b1ab050200000006656aacac00533d51b84c010adb2902000000000651516a5165ac0e15259d", "516552636aac", 0, 91357757, "792d16a70670991c4b5f517a207ded40deb2f78721c66c61d96dae76a6675674"], + ["0100000001b7a9e08d0129549c74777079eaa614d85a5bfd59f96a85a8797477f0a2f2d4b00300000006ac00acab0051a3dcf7f0034f58e501000000000300ab6ac91dbf030000000009ac0065ab6a6a51abacab66e8000000000007536a6a51006a6300000000", "6553", 0, 76736365, "f87659c936ba9be0e9c86f7ad04c2eac401591191c235ee560b882ddea08668c"], + ["0200000003aa2796d7ad65f9b488faeeb52b7bc937bee71abb2dedc091a0faa8d094fb9171010000000465536aacc12d1e556ac93df67ec1bc2b9f4ae9ee13eb93dbad4a94c9a0afd0b801a0d8a8959f4f00000000000100ffffffff58209261818ac5c5d8a9b4960f5fc0e261980bd2a32380e23df0bf1d0963c23f00000000036a65ac15ad6cec02264161040000000000b13ba1010000000009ac656a510000acac5300000000", "526363006300ab", 0, -1319463170, "35d3025c1936d104d801d9beadb98620a008628db44a7e49191cd48b808e5844"], + ["010000000149238226a051f5a2ce93dd9d6c8893aedf1fa9ecf0f6c5263233c9cb7b17fe880200000001ab2ba79f69018ff49202000000000963abab526552526a52a86e153e", "5353ac656500", 0, 399099038, "44cca2ae998f8924c5400091c248d79f0a1e7951f9a1720283d5a6592bf4e208"], + ["02000000018f8f34b34d7380abe22c619933b2169f0203cba4294c1b114b2c71fa5217214d0300000005ac536a0052124ab7b20333413001000000000100a5b4520500000000095251acab6300acacacb5c24c01000000000352ab0000000000", "52", 0, -1306349524, "a37d2e92887ef6be82d05eb1baaba40fd49ade3750d6ee9685ffa21c0c91fd3f"], + ["0200000001227d2b4efd3e79e02197a6fec383ad444a1555cecb8ab8da549ff6f4ce503d37020000000900006351ab65536363ee9b1c49049c7add0400000000076351acab5300ac612db7050000000004536a5263a52f9805000000000663636553006a15c53200000000000200ac006a4989", "5252", 0, -1506050254, "2afcae080666bbfbf953bde170bbd35a26769b9e85af0e8c8a915ac36033b80c"], + ["0200000002970f05d65d0b95edbd7a7a5fe15275bac26e8afe7a95128ae62ee09a00953b5b020000000753520052abab00ffffffff5e1f215479ed5d437f3da290f5d19eeb10717556de0d4b056ba765c37879ed3802000000076a0065526553ac352b201903cae2540300000000096300536a00ac656a00dcb4f20300000000085263516a6353ac53efdd5e01000000000751ac6363acab0042c22b1d", "63", 1, 305849281, "281eb50048827aabf8b897d015fc914ecc828242211b15a16c0fd95a5549c3df"], + ["0200000001bff7d59f5d81f4a93fe61c1c3c1207688c1d3062fa42219d4c55ff83fb6d32c00100000001ac86ce6b120360e61b00000000000253005a609b0300000000026352d054d90500000000004279634f", "6a6365525363ab6a52", 0, -1211522497, "92a3766a1e24c8f92b69463f9d4c26619c0b1427810501bf6b57e6526efe724d"], + ["01000000038509418d634060f589a6413c1d69da48c581d223832cf2bca0ac1a5890e3d16e0000000008510065ab63ab636aa4bf76960954575f398d4839b76a31cf97f42ea4fae8dc6c9b115ca571ead8d35e1000f90000000003525363ffffffff2c4c62ac36c20f396cc722557c9a0e3578a6f5ed03254c8fbbb6cd59d259db370000000006ababac6553514386c86a02fc9cbf030000000003515152ba882c0100000000016a00000000", "526353acab", 0, 153781130, "50f57719236c333463b6d0c8eb64a30e025e0147c52e84a281c008dbd63d55bb"], + ["0100000003207497928eaf6248a1ab4f7fbfaf6bbec0dcf662eb258bdf8425fffd74769a600200000001005b4b64ed564b32a4e546a39868699e1bd1d9de9bc20e1a2bd7ce9a5828a3c06b4dd7e50002000000065352ac6a6a51eefa8228f8d75dba00fae3764ca21b4f937688906bf67460125a1e829b349323f641af9a0200000007656a6365636365ffffffff04eabca8000000000006510051ab53534a3ea105000000000963516a6a635353ac53e6db710500000000035263654d28b305000000000651516a6a005100000000", "", 0, 1554235380, "3aa4ecb2a46fa866d111458fa5329e632cf8c3a84aaa00c4d3abd7dc46ca0f43"], + ["0200000002f5f51e19f9190b4fdbec144f56338ec121f885878a37a408b23a9eb1a1bfa407020000000653ab51ab0052caadff00f6b41c15411da726d33c242cd5d97552518069721edddaf475fd07da002b0bfe0200000001ab502f4dba03d02c7a010000000008636a63ab52ac65acbd7644040000000000a61341050000000008515352ac6a63636a35c2c57a", "6a526300ac656353ab", 0, -767855141, "2f60d2afe9ed7e6facdea8ed617ffe894f405b6c88aefdf1aae6269b4a247e8e"], + ["02000000011d5a064377f8531bb54e535e6e91dd28396952066dbadfa769300cf5e821241e0200000005ac53520065549d20ca042310a50100000000045253abab7f8d1c050000000005ab6aabac00eb660702000000000763636a656a5153eb8e9701000000000865006a51abac63ab00000000", "6a6551ac6a5165ab", 0, -2098288235, "ff89962e4b7febca3136da408173d164a1935b283c1e86113a8f95f256e62bac"], + ["0200000003378c1905f7059571f113678e80af5762d91210426a33e36876b24289fb6cee060000000005636353636affffffffa2dceb00af9a592beab9d66122afb5cbd263080d9e42642081bf626a2687de940100000002656a7987c0d7f025402c47bc76e6433bce27b990663163f4e28f18dc8e6c175f7a016f9fb08d0200000002636affffffff013e6303020000000008636365ac6aab63513630507e", "abac", 1, -2146922764, "7acc1d0a2bfebc04855654bfae16170d2caf9ebd8a66e82c59e60937462f8581"], + ["02000000026e24f151212e30a0321e6c8f77f3412f08c66ec725a13990c588ea10777a07d7000000000952536a6552ab520053ffffffff87fdc4dedce5ee9f7ea3abbb122730d2d5ca70ba041a5b9f32f104d8200d79760200000003ac63005c45fd44016aaee0010000000002536300000000", "ac53ab5165516a53", 1, 916217034, "be16e2c66f9e7106083383ccae9d604b97a84780009740e25bfc5ba2e6b9d97d"], + ["01000000027dfd515974e1fa1ade9b567642fab29acaaf6ca4ab5625b80ff3bf8e3e146fa90300000009ac656aab655353636affffffffe3308a020a0898756000a4f0de8c8d1ebccae9f4bffe2b20b2974118ac0fa05301000000025163ffffffff04295799040000000006636a006a52538470a00100000000035251511be47205000000000045b86f05000000000000000000", "52526300", 1, -144228316, "24c64eba2cc2e381fdc04d11ea58f54be29f939a6486418e3b60adcbe8dc06ea"], + ["02000000037571eb5c40117ebe59015bbbc07dde957e6c275d347ccf313d19547ec214c6ca020000000800ac0000005251abc134dede11db3a420899610bfbab073e9f01cdfd5d38d204b00bc89b520e23f5586d4f100000000004ab6a530044832df0d93ed27a7d43b8c4c444fd6a8e70440f60827d10372d0fe1f57dd773bb61b53702000000046a536352ffffffff04108f42000000000001ac87352d0300000000007d39af0200000000095363525263536a5265261f9803000000000365ac005be4e304", "", 2, 2137374074, "799a67538dc73871d5d4cf0648c36c88d0fb73b44e819573854b380a1283a39b"], + ["0200000001f6958efc6c946bd28c5ba457c5221c61b9889e2c6847c4ecdf7ed0b00a25038003000000025300ffffffff015e89200100000000086aac6351ab65535200000000", "63ac6a", 0, 651402834, "bceedd3f250d22807153184874a707f01d1cde41d80d977d7e1f4f5f5b08491d"], + ["02000000037401d6ec7603e54a7eb0bd99c43eb57f4c9e1d485363571cf71c0b932241f35503000000026a63ffffffff67ef2ab1f8462aed39deaed9401c479ed08123b5e429473ea071ec888c5fc83a03000000036500ac6e80b7027406a512019fd399c8e458e2ef091a49e929f0471d1c91554d1445955c18e8dc00000000026565009da058039cb7e1050000000008536565516a52ab531be98a030000000006ac516a656a5372461200000000000952005365656a636a00c032c4a8", "", 1, 966177473, "3ae6515e252208e47d92a4f15d14301c05fa37fa28885ba96f54862a3551fd88"], + ["0200000002be6c5cf5263eabdce1efbea23581fab9e84507630cdf02c917ffbe1f7a0ea1ac010000000100ffffffffee7549c67d116b55dc9ae669797aedf14f65c9a077a28a3d47ce44e5f39feeae0100000005ac53655353690bc5630220dff205000000000100f14e9b04000000000463ac516ae06533b4", "ac65", 0, -1393867832, "1943d6e1d1e197657133b43ca7ab97627e551000d7287705fbd90f59c914a2b9"], + ["02000000032a1ec0e8d4ba9718068212db2518f2ec0b27c1da58d886915151ac116b0852590200000004ac526a51d1529249e4cc3ccc553f9f832731eb80cfda32aeff627f307eba66e68ae7c82d1f3f089302000000076553006aac5200fffffffffc61d51e10dd118b004c94a346895851ce34d39de70a85821b702d843c6bc66d0100000001acffffffff03d5beb3040000000002acabf7e86e0300000000026a65bcc4c8050000000009006a52ac655252ab65ecfad317", "", 2, 1245347251, "50702fb557646aa1db8c5a00e0f399595c225c5ac5129d9ba807a177e3668c91"], + ["0100000004899fcb1a6e43c361475aea90d5eecaefea66473002b2733a21115a4a43270221010000000851ab006a6aab00acffffffff86ae26a1c270655fd79bd828ca7bf2c887e6db8d94afa15cc0b0c7961f7069150200000006ab0053ab6500e3b0b1a780491bc3b6d31f2ef47b4be049e34a4d95e812c637a42236d3f63d8d7c7180f60200000000ffffffffb04843454b1e18666891e986914325abd1754172e5a91e0a962ada4f75893eac0100000007655251515165519bc5179601930752040000000003ac6a6500000000", "656aac53", 2, 1346064113, "2ae8add40c090afe26fc776f063ebd875af8d64fd0139009db033941a5c77cb1"], + ["0200000003af6791ec5c061608d1e8d1188978e1f364a757064f6a51ceaaa32767a18104c901000000076351006352ac52638a7d21aa2e06564f79eeee5d7e15d23281ee548f15f0702f73253c859f2948a5698c890000000004ab6aabac56a7ca5797832580944ea4dcbf43d96371305d4592333cca68d836a31d77537e409496b101000000046aac5165ffffffff0165fa730400000000065351636a6a5300000000", "", 1, -1730509343, "bccfb3f40e500ea431f7872c55ffea9ef93fde2a1fe097feac8d5663b948d7e3"], + ["0100000002899f03464d46b98b84d2b8e4f92ee1efe7dd31448558e4db10c1b4c33e8839dd0300000000ffffffff247d72543919cd5ce9f7918e5a01d49b3b1c511816fdea601a6df179cd44b4c20000000000750dc02402a8032f000000000001515e733c01000000000000000000", "6a6aac526a63", 0, 1328077020, "35234af8a6b92e60233f4d4c1b81cbd4d285d09319775fc4af3c1ab68e7c7dec"], + ["01000000013c692f872ffa30b0f3e97320829da503c3b902c693df7eda9d5cd60539662c9c0000000008abac51ac535252525ade9e2d0100992f00000000000865abac0000516a6300000000", "", 0, 1060474179, "bfb7b0dc2487335403b46abe61c3bb4983de95bb928e0c9ea6b5836407e78d82"], + ["0200000001bcec6d43b7b13f6c39834d6ee2ad9ae4937fadfc2e0221771493206edaae96ee0100000006656500656aacffffffff03483a55040000000006636a516300aca28d0c030000000003ab526a798e6a050000000003525151e1df050f", "520065ac", 0, 477438089, "a6a4c10957c1d5b39c99d295fc5810e80679ae85b8ac6da793cc319f5b8d8dfc"], + ["01000000024f4ba3f6af2f866d4a821bdcb051f463e3b0fa76c7166dfefb63e318aaa6a2f10000000007ac536551000053ffffffff2da9df4714d2ddb5278163ba82e4639fb47322d16c8990f81c2b9d9afefe9f8c03000000075365005252636affffffff02d7d3400300000000036a63000cce8b030000000008656a65535253006500000000", "536a636552ab52", 1, 1533616977, "3a212bc414f9de4d52dec6987ed7fd95e39c3d8a8cf28d34aa40af44778bd79e"], + ["01000000028538d9d4171e0df88f5fdca1461a96fdfacc410afa13901eaa3d9080223b00a2010000000263ab74154c2aa9c53872e990cf41e3ef65725bcbde1aa79b5377b870e28dd263891f1d0bb98901000000030065abffffffff02306cd101000000000651635100536323084701000000000351630000000000", "ac63ac", 1, -345127177, "b758d8b6955f889fbaaa8891bcf27d31c78cb008873dfcf37131c60465cbc2d7"], + ["02000000029b32a0155935459259eaa1c612575690f6082d3c7a4ff6e7b895049dd65831380000000009656aac0053ac53ab52fffffffff29b5a8ebd9674d23eb3ed42a2b75221ed62b6021b0d0bb5787fd02002ac723d010000000037ffedae04116a91010000000000cf73560500000000030000ab50db32040000000008ac525352ab63526a7a36c002000000000453636a6556a9ea7d", "6a6a", 0, -2073758542, "85727232f194a6bc0abdacfff8b9c10637c124caa75afaae24b0298f72c82d89"], + ["01000000039472e1959e2d08a043d92fb2c5a790d7b65017d6799e74729217441a52eb10d50100000006ac5351005251ffffffffe9f00c12a148ea0af76cd3d5971573000363c5f4f546f682cc465cdb349f1d7102000000065252530053abfffffffff1c0cf253cd4c190c7873b3fe4dd167a7f30f6a8fda2c12fe4aaddc6aa90ef6802000000036aab52a9b66e04024fe375020000000003536a51e1cbd9040000000004ac655151aa3000ec", "ac", 1, 378735510, "8af04a5bde9e866d8545c1698a78fef6b891300d4b7ea5e2fed8db28ed37e8ca"], + ["0200000003efb867765cbf13ff1fc1d3df60738abd16b74e09f78862a9afb12778bd88104f0200000002ab52ffffffff87f2ddd9c0a02b9e3e87fc8b4493e10ceaf049809628b573c193d22db996b74b02000000085252ac53ab510051b0ef62cddd34ef3e019cf2eca8c2ec0edd8522daf62d329fe5d39f1b5bc024e8c259bab60100000006acac526a6500c214bd5a016fafab0100000000046363005200000000", "636a", 2, 1925357944, "0e0527c81a2d1d2e8c4d364129284abfb4f4e0fce030d1c069dc889c2a05a81a"], + ["0100000001a992dee1701304d0c552ae701fe8477d1e381382f8b4ea7b7aedffadd7a6428c0100000008abacac51526351acffffffff02c10e0c0000000000090053ac65520053ab53af64490000000000016500000000", "ab6553510051acacac", 0, 1400459007, "62766e439b7e86beacb3c42498b5f614ff31dab2f4874f3b4146ca890bbb6267"], + ["02000000011dc62ad9b232aa86bbf949579013a6728216416b0d139ace54ecdf9e720ce66f000000000400ac00ab82aef45a04fee38a0200000000060053636a5151725acf05000000000751ac535251536ac5a071040000000009636363526552006300047eac0200000000025353c067aab0", "", 0, 433159872, "129cf8b09e5ac2a54222fe3b9f0836faf4696e519777af61f9a163576f0b5604"], + ["02000000031b83471d76ff9103e5f168ad1179193d8862105f1acc116cb0a5c116e012118d03000000076351ab63636300ffffffff6c178ecf52fe6d3192eeed75c3d83b51599005dc881b2221bca209e98142f7de030000000153ffffffff7a3597ebb1ab4af9a7f07887c20359a7b6533caf396bb5df75c4b2b1d5cff5440300000005005363ac63de3e7ee0049a0d040400000000045200acacb04dc0030000000005ab63515153c67d96020000000000e9af0b0500000000020065cd51f700", "ac00ac5251", 1, -237948480, "1659abd901fbafdfe42a8575d2b4d2f118780619cbff8b2c53639419e231b0eb"], + ["02000000021e83bd87f8cb0e5d04504cc2b5a1db8067b5ef9aabc065d3f43794dddaaa556c020000000089cc473b951d10b55fe1306a53b0d5615742fe9049cf2133f231c928c190e2147515b090020000000563526565ac50a3113604e62a7d00000000000800ab5351536565aba6932101000000000165c47f2805000000000100ad09b9010000000002ab63702e6d26", "52536352ac65ab", 1, -1068132150, "6849e48665355c8c722d42eca4b618c2fab1e3f1aac3c0383ac5a7fc1ef1cc6f"], + ["0100000003bd9309b39d98df6aa89bcd2e65cffb5839b8358756da3b85d2327575d4b6fd01020000000700acab0063ab53ffffffffa800c41300f4364c4077c8d3b029ece5eef143a86c7a053781668b0f19c457550300000000fffffffff282cf913cb7a23f47ecbc9c34e8501f81a2c73e18593c1b0e6f319512fb752b0200000002ab52ffffffff019dd4a701000000000363525271c0ec13", "0065ac", 2, 487086990, "a3e5fc70f1197becc973d7ad9ff23e31016674270ce7659328badda101822170"], + ["0200000002199238c97106cc7d3ac62a10457c0d3d983b389d320eeeb0514b1db5907f7b2e0100000009ab65635165005153acffffffff0ddcb9289a9131b40983d7fbfd15fd7950f955f4554ec453295a7b9af3ac5017000000000863ab656500ab005257f2e5e0027e9f7901000000000663ac53ab6a52fc444c030000000003ab5200c7bb26b7", "65", 0, 32847090, "e5ca874c5ce770da8f0d56b2273d7d791d6b95232d76550c40e76c4d935154f7"], + ["02000000020fdfee871744b9917b9114dcc7248776e750ba16d0e6e1cd30686b8b1cce41ac00000000008b87cc2bfa1c2eca1ab4be77249226089ba8574665af99f7cc8a1fa9ad8972563000deff010000000351ababf900362d043052b10400000000065165ac63635314420b03000000000151b85d31030000000004ac6363abfb9585000000000006ab536a51525200000000", "ab5251abab6a00", 1, -1582946491, "45feb94e22cd04a2be08fdd7f2e58fd8bbccb0c5eceb088e2f0ea2c18aeedd87"], + ["0100000003277d3b46e10e276af3a5a03586f882b4353a7c6e6d2863f32851d5ca78810f260300000001abffffffff4b002ed5c483597cd8aa9feed03724ddf0137d337800efad654baa702be56e3a0200000004ab6a6a53ffffffff79fac65ea907bdde357c1f6898da091074c873ec78b1a628bf69968e913957240300000003005253ffffffff0236f4db0000000000002880e4030000000002656a80d5d521", "ab516aac0051", 2, 348899298, "0ed6ba08c1b1c180c59e4f2dcac6f7d7d2012cd4566b51f4c86ac26adb112746"], + ["02000000048c2c9098704de9284ef0a0a9d376ceaa27cf16283de13eb21cba39d1765437ab0100000007635251ac006aacbe2a49219b6111fbb3116162af6169533a6d0ca2a3fd7dd2a68509d454f92f765d5f7aea000000000651636a6352ab1c3d38cf7dae214297a930454680d98562f14da9fd29cf2a5605c6550f88e62474dbaa52000000000852630051ab51ac52ffffffff95941c1f607ed4b5b1e5e0bed41b6a98ef6af86387abcfc09dcad7f4661e508f02000000066a516aab5251d1cba666045501d20200000000045365ab63aad3fe0400000000085163ab516565ab6a604c22030000000001526bc18904000000000153f9f4f4ea", "535300", 3, 2063461218, "521d5f0f3799aa4daa23dcd598e6d24d767b7bc465ad23197e39fe7858ae4291"], + ["0200000001167d27f81a0f21f1967c7450fbe3dde79890e86116182cbce0a3500eb22169e00300000009ab5365656aab635100d36978ab0457aa350200000000036a516565b19a0500000000080053525153535165643d470300000000075253520065ac6544a7dd020000000003516a6500000000", "ab53525163ab005151", 0, 1440132256, "457c22dddea79c9f57edcde30580b8abcf2c56f8be76e3dc15c0f1a9d6e29af1"], + ["0200000003d2d25347d9f61f8158e9985e2c00e0dfebea8f9c9b22c0f69db423fd9e55dbf80100000003acabacffffffffc1d9876d0a57e918596b8ae88fad75946553f65a90e04f16c578c69d28eeafae0000000007516563655365ab5e2c87a1e2c0cb8d767682d4cb1c7aaf17e5c148438b4fb093ffe4a42ea10c954f03ef5b0000000007acac00526a5251ffffffff02a990c500000000000463515265e7c2800200000000056a5265ac522b7213ce", "6353abab51abab", 2, 1550611021, "4a86c7d8be664259e723e95fa9bf1ea58e8eb3526c2efc4198992a3ab418e89d"], + ["020000000315e56a97c168f33174c35a3e7c1217c280bb78d95db7549dff6416d2a3f66f0b0100000007ab516365ac51529477eea1eef52676568e57a8e9ab9f472a9c67813b50840ecc2e257de69275a159bd2476030000000952526aab6352536a6a53c0dfc4955abc8bfaebc58b601e613b75d0d71adfa2385a783bc15b7a366939e152723e030000000751ac6551ac5365ffffffff01bf7beb030000000006ac5265006a5100000000", "6a00", 1, 680311327, "06a619d9395f6a9db37995fb5297c6d1649a62f3bf410849a0f7d30b822068ae"], + ["0100000004d8d38341a452201533c3f17f4dfa0a7a54af745e549e6ddb3ffc6103caabaeee0200000008510052515263006affffffffddf5bcc1d4310aa4d14f890399052193ec2aee54143971c03554e31e45ae07e603000000025151ffffffffbe17fc0ad567bf114f08893309934575ad5cd461086d20a19bfdc0e8c810bb9803000000085163ac6365000053ffffffffe78d591c6691ed1ba8235409323f919baf532090efe1d1310ef8423fc5eed17900000000055352650065e81f5ebd0221673a05000000000253ac5ce0a4030000000004ac52ac5300000000", "6aac006a65ac53ac53", 3, -516909655, "fba7671d3b90b37b272009167abc33e1aa5382d7f71919cba326384dd3287a9f"], + ["0200000002cab7178435f39511b299277fb6f67eee2ca42c2e5f99384d6bb40b7d4c1e324702000000076a6a636a53acab28ce6745f75e4e13031235eb3d3a01b910db6543c06ed13487e23f8a6d1eb59783a3699b00000000076aac63006aacacffffffff04fc52c2030000000004abac53525506ca02000000000165281f6f04000000000852ab525163525265de33190500000000036aab5229c205d2", "5265ab", 0, 48618737, "707bd60395a8c11e97ee0a13e88ff5e18521dfe31282c24d236c0e8557f137fe"], + ["010000000410e82bd7599c5a30ccbc5dd2c63b3fb75848364dfd59d052011fde46cf0bcd0601000000016affffffffb7d62f4fcd425d5d8a197a9e02f852c728ce1da97a90e93f4bd2125c004d031f000000000851635353525253acffffffffbbe839bdd82e8a922ced8e105c1375c8213f399d438a34cb13acd353699c472b020000000965ac530052526a00004a95a4786c0bf9ca1cd2e4e26970e68a70d3b623152cbf1be05a05df048d35950e704dc103000000046563656388068161048f898304000000000200ab99a64b020000000001acb50b8a03000000000900acab52006a53ab51dbe8c701000000000951ab65ab636363ab0000000000", "52526a5265526563ab", 0, 229488500, "1dc24c9489e16e6f9729ab0aca30d0fda1d515cf85dd3313c19c8bcfa6e7d5a3"], + ["0100000003d08d14aa70d383ab2127bf4d7df9788f267018468e132c8e848a3508cb09e206010000000152ffffffffd1b8fb98502017586673657ae365b71266abe01dfba899a6745575fd14ad9d2401000000056a65ab5300278860d0785b5752b817ae31664d2998624c6d126c8b2b6d959ac0d6c428cf168c6f87e900000000002c70283c04dc6bac050000000008ac636551abab6a515a7697030000000001ab715a04030000000007acac635151ab534c637001000000000965536300acab63526a00000000", "abac526565530063", 0, -2107955821, "b2e6b5c9aca0040b7f8ddcea9639700dc060c129bc0a4c73dc1567373c09b52a"], + ["0100000004504cfde16b367a50fd0a8a2de702d11a8a87680a86a2f3e2280718cc485e7dd0010000000752536363000052ffffffff9b63321e9c509e9f056fb54434841928f2ef92e686dfc6ed560fcc79acde0b8f020000000551655163634fbb5d7ebffd92daf78f943e3d1c7f9cd8ab7ca37c7fbd9a6e53c8173ee0ce8eef85e03101000000040053656a4d075a3d495b681c517114e9cc106f162853dbd4be986445c5de79b2eb9f0eb0d1ab5b1002000000060051ab655353ffffffff01de9ce102000000000652ab5363ab6300000000", "ac", 3, 1386694097, "4f3a4bc73dba2955734a45acd630369423cf42577d5becd4ba182be7bdee778b"], + ["020000000485a0dc54f0d96ac242412f590cd842b3ba02c77da272abdc3467edf62faf63e401000000095363ac5251ab516a65ffffffff81ecede46112eee9b68e808fd99f0a04d4798f68636c857b98c10b6a846227190000000002ab52ffffffff72287ec6939292bbd3c5eb23b13880312fa24c079992d1df71b0828cbf28c11c030000000253004e9f5352c743e1a376496fa31478f1652a3e13a6e718e6a3148172d3993b981e413dedc80100000006ab63515365acffffffff02f9391202000000000263ab56c67f030000000009ac6a53abab520065517dcc6c59", "65530053000065", 1, 1908815815, "d80c7f6d707bf4fe604510e006e9934e291434e9f7392c8a490b6c03616df6a3"], + ["0200000004c7f9db541de9e300029e8d840cd44e4691b7651a9924e84647a547f1467976c10000000000ffffffff869117ad2408ef62e0c51fd714049f1d9b09ec7fc121313bcbd61e0701f173270100000005ac63525353ffffffffc79fa3883d5aaf105aad76f0b5deb4394bc88c6643c311f504d64b35b1e515200300000000d43867f5061bf5999a23548d452fe52c17ce9ad7e8fa7fbdb7c54113f6ac495e5bd891d700000000066aabab63acabffffffff0375975c0000000000076a51536351ababa0adaf0400000000036a6351cfd60b03000000000753ab656565005100000000", "5251", 0, -964685234, "6c7132ac25009c81c869f287ff77d471accefe6719216deb92c0a7052d88054c"], + ["0100000002b4032fc3491dfb3d58dad92010e2debddc26bbfd002e2de21689a26a98c5c3a8010000000365ab52655e57cb05eab0174540bf0e0e2158863129a3e9bc54499b0ed0357bec395b8f6ba7531003000000025251ffffffff034d45ba0400000000004e28340200000000075151635365ac0079f7e804000000000551ab63655100000000", "ab", 1, 605560674, "ecb4553708bde0156974e27d8824b08c696ad46ffa3baafc94d9ad1734c6e343"], + ["02000000023d49808a920a089dbf8791c959c9a55ecd08cde7e2e8cd89bd3c3d930a99ce1c02000000085253acabab51ac65ffffffffb082d9d70f25d73690570e6094bab1953d025d6bbce9249680bb28219cea0c440300000002635311d5eed901176b7b01000000000000000000", "0063", 0, -1110316386, "6afefe6361bdcc8f09a656ad34ed6c72bfa18de3ecc4eaf38fc46da12f61373e"], + ["020000000430b2d9d40a27f1cc1557fd307816173a07fef58ad0925edabffac6ccbffbbfb302000000096351655163ac52ab00ffffffff142983be814119e6fb0e5e1e137929a2bb356f9460a2664ab668265bb2ff361f030000000963535200ab51536300ffffffff87547614c4166fba1150a04f8eb778b9014b05887afad9db4965685259689fe900000000007a8e33b45f707d66d3974be0caf02fa9127171236ac47881cd617acfb5ecf5c73a6cd4b60300000000ffffffff0330c22900000000000700ac650051526559b3960200000000026a535b350f03000000000000000000", "52", 2, -527625338, "5c6673e043cba0b40394a03997f588f915349acb97652b6a507a80e9227f58a4"], + ["02000000048bf477ce1a5a050d1dfc8c65882d69e78f2ea50de3d1c9f4b1e5f54123002a19000000000663ab516a65ab9df04fc37ba54ed1db2c3021581fbd33bd74b6ecdff378f94c4da1b46c0bb7301d6fb512010000000252534871e0663f81cd6609a9d5608c390fa03c17f58a2d02ce2b6d2add618d27b7fc9eaa316000000000075351535363ac65ffffffff891aba2b09eb60d5b4a9cec546d0771d7598ea146f5c97c40e22cf6391603b4e02000000020000b31c47b2038219620300000000026a5330aab6040000000001631f82fe030000000005ab51ab6365e69fdbf8", "6aac535253abab5251", 1, -320978578, "7c22d012dce14f6cb90dcbfc677189210efbd3171804c62073883102d1fb1871"], + ["0100000004c3f391db798ddcdd10a61d084a45c3c707d141e21a6c355f95c92a22b8fe6f0b000000000100ffffffff56ef902b7149afbe4c86c3cbc435f88eddeb4102809eed64cead905b5295a6d80000000008ab65acacacab6a00ffffffff5c22137b071a0b6a2577873a3c591534c7ddbced17b2db3bc314daaa2e2b5ad901000000026a631e4c5608d7173978e1ca4ded5fc186d045aaa9d0fd60f86ccb8bb46aa54802d6457f52d301000000056353636353ffffffff03a1435c00000000000963006363ab65acab52cc0e44010000000005006a0051538b67dd030000000005ac5263635100000000", "6363635351526aab", 0, 1499639603, "9a505d47899ec7e34464277d60af5f676d2abbe7a1bddd1e8a92e0caec6f642f"], + ["0100000002c29d5fc9f331ac6ab04848b75ec27306dc9f0da7eb4a81ed6260f65341ba21410100000001abf6134ed372499475e2337e569bd04a8408d346465cc127910927ca2f3def46ae288e8c120100000003ac65ab4727488a0268ff3000000000000451525152cd38f60400000000065351525300ac00000000", "6a656a51", 0, -950379965, "7cdd7f051fb4aa7e2b374218b6e0e333db44dc787e567a03fca91c82e27e1b28"], + ["0200000003bfc56631b479172a31880380ae0af6f7ed5a6392dfb914bb5e48f6bed43620560300000003ac51529f25f99f057deeb33ed08ae4b9df56b50c3441c184353188fa1109b37c65e5e4d23d72040300000006ac5263006565ffffffff0a6fa2e1b4dba3c76e5f46eeeca555ca7a1aa76f8f7ec33e8c7a83e5836a49b90300000007630063acac6553ffffffff024b08df050000000003536351a79c10000000000005acab6a535200000000", "", 0, -2037862805, "7e94fe68bc0072627852912bbaa6872acb8e88b9b5926da00f32b601b3820335"], + ["0100000001cf6c8b6c08aa47fcb6d12168efeebacf8526b7696bfda5285d1b07633a2d2cd40100000009ac6351ababac525363ffffffff0460d50c0200000000045363ac6531f820020000000000fdfa0c0300000000045365536516ef0d03000000000563ac52510000000000", "", 0, 1896015792, "225461c9a69f3afca65333e1ea8b87b3e303acf0dd45cca01da68358953935a4"], + ["0200000003854ef4780c7990e25a1f315b587a4fed84309413d7b4ad79fff4dd2b447a77cd00000000055263515200ffffffff27f6c516756717b236587101d9abdb265e21f81251f5b71135672629d073d3330000000001abffffffffef2f0d0ceecd497d988df8ac38132d347c9a62b62b5a7bcedb8b3e451d51c43e000000000465636a63ffffffff018c38df010000000002005300000000", "6551", 1, -1609573407, "3647cedd67ae65557017958ea1c818cbf2ddcc7e8c112325c4f4db327c402a71"], + ["01000000049d53241d7c96c7e11e8159b603f16b8315fa7111094cc9d6af8b0768a3f3d72b020000000152cdddf0c4a1a88b850573a9518adb1a33e8330124efd3698a330b1f3c2b4e4cb06296765e010000000500ab0000653df378bad0dea72a70d1e292c2f7a48e061001f8e68d3854e1553a1be7e85df381b8c1480100000001abaccb2a558f0eec250a61f6a8c4cc9af246e59fc6c2901d44108417883180ef28e689ffc203000000096363526a536a656563ffffffff0392017c0100000000046a5163ac8d6e8701000000000200533df3a800000000000300ab5100000000", "5263ac53", 3, -41200023, "3262b5389b3d3b83207380e83dd83b45d2f17684e648c5da0165f6c81de2f4bd"], + ["020000000117e570c08dcfe64bcd3a03acbbee6cd38834f88a2f7cfb5d16cce7690401d87f020000000500ac005251ffffffff0394d95d030000000009636553ab526551526a8255d003000000000900ab65635363ab51ac534495000000000002005291631058", "636aacac526352", 0, -2068284080, "b64dbd0771f1025e916ab3c588bfc67dce7795e6139295ebaf0197681e93788b"], + ["0100000001b2f08fd2db17c594ad2910b2ee9112f21d8aa5d9674a08ff49f667283b7b3bb5030000000700ab5151510063ffffffff0140d212050000000002006300000000", "536a00ab5265", 0, -802648157, "71abbdfdbfce195aeea1c7af0f8036afef733c2cd12bd3b8e0147ea83a3e5b08"], + ["0100000001f62b693f1b3543dd760b56363ee952ff9ea2092353da1e17292b22bba221bbbc02000000050063abab63ffffffff03af625c05000000000400656a6a36675d050000000001ac763e140000000000036365528eb5aa8e", "53", 0, -1240964539, "f34922cb7c1c700a3f808459b9fe55afc1c46aafe5af48ae522e709b9673949b"], + ["0200000001a55e0820f89e037909726bf0152cb08bc3e93a3c7d3d38a981c2284c0564fdf6030000000353ab00ffffffff0227b8290400000000004bde2b0000000000066a526551630000000000", "51530063ababac", 0, -502175838, "93e09eee910d9aa612f09b29e9f7db316b6b6c5d3ff4c7e8fcafb28e50e806a0"], + ["0200000004d9e13d065c9418f87146a41deb5cbd4272013425ed84901634e1ebcf91b39345000000000863acacac6a63000008070866438156911302609baa7ef047db8063c1a2482e1262a4cd3e0130f00de7d34778020000000351516affffffff979821c978b68e5bac637dc8db1a94e4465924845b3f2a65e09b1a872a7b7a5200000000055165ac63abffffffff1a75898234bb03fb1b1268be6553ba180e9b0872f615f829d02129f988015d50000000000463ac00abffffffff04cbacc5040000000009ababacac65ab53ab53e7929e05000000000851acacac525152ac777de103000000000563ab005251bbbd590500000000080063ababac5163ab904b3715", "006a006563", 1, 1739091199, "e68134e4af62e1b406e68ee54035e7e39aed07e53cbe4d69fe6a2544a0daf357"], + ["01000000017ed732fb55bb0bc4b651132ef5d7504b62b4ed28cbbebf3787eafcdde9be56ad010000000100ffffffff0431689c0000000000055253ac52ac0d54ca010000000009006a6565ac655265510914c0020000000005ab53ab5352f0615c000000000001ac00000000", "ac", 0, 1732818257, "68e2edcad7c552e9390a29ad653d7fa4af3989d5bf06fe2a089331ef206c0cce"], + ["0100000002197d89be11feb795653574d21b9ed8d27b1d814c62d8f83bd4b366c7a9e7b96500000000001e0c91ca650025125c08d7abc9a8ebb7fb548beafe6bc20a0c9f73a4111f1d80e941a21e0200000000285dfb61033f72cf0300000000035253631f4c3b0000000000016a56a733030000000002535100000000", "65536a6353", 0, -1553445046, "b44bbf1eb377fa9838409b67add5541693ecd506686af09821b5aed7790f7c29"], + ["010000000111526be4b89c3446df6d555cb8282891aea0db60a8000f82e16b45463d0bdcdf0300000005006551acabffffffff0452747704000000000863005163ab63ababb1c941050000000009abac52ab6a00ab53008ba5a10400000000096363abab00656551acb52c3903000000000951acac6353ac52ac6a00000000", "", 0, -1132108195, "2ea3e1b6842b245967dc348298d20a1cbde23b1f3f37b525ae59730dfa976477"], + ["0100000002f1007d55e6bd049b6cd7bdfc10ae73a0d9b32f2d2612fba197fe27bbec6043000100000007536300536aababffffffff64fcd4424c66f5c10d529e55c3945a0c4aa04ed99fa3e78e0ea4c0ec54045598020000000665006a5163acffffffff01625a3101000000000352526500000000", "abac656a515363", 1, 2120489035, "0c2c654e39cf573c783e9a49efac9ac304663398cae89ef9808505ca8b09eb14"], + ["01000000020f3553926e6a7b852a4e20ceb18d836b26d0e23a039ba4b244a7cea7b0df935203000000075263abab63516a8b1b6523841af7aa5530717cdfab0b4c927c5a8ca2afc9ba798462b28605428ae225ffc302000000096aab6aab636a525152878ee2620236d4a001000000000263006e70c0050000000003ac6353963a8c2b", "00525351acacab52", 0, -2029057225, "0f1d0f8dfec0a72ea5b906174a2231b1f561937e1a2f4b673ad8c943c3da839a"], + ["020000000246a9a42d7ac3e44cd184d132d2e8a63227d8f9c9269fc5d5eea917871b6cf6ff000000000953ac656a6a52ac536a6ebd9f6e1872ea685e2222a8517cb3c0b6d58f68f68241ea6fad6ebf3563bc4a5be91b2b03000000026aacffffffff021a242705000000000865ac6a63ac0000ace6afd802000000000000000000", "abab6a", 0, 1892589641, "0b2171fd001cb8bb1ece9d56c9c17ff229f4f418a7cf88fb48ecf8426351330c"], + ["020000000169988595cb64fe9d7a81d0f26cc18530fddf7c1ea1409ebc11f4664fe7a4d8e60300000005535151636affffffff04b8115f020000000005005200ab528e08e9010000000006526aac53ac00d29fa400000000000100a43ea7000000000008ac635300636aac6500000000", "656353ac63", 0, -1818721708, "43dee883050bb1b4b4bda8ec9f5bf3ec3b5359f2d09e492de417b1a01499521f"], + ["01000000010967129f70cc7a2cafe9372335ac7feb68731fcafe2753f3420300aff99cd3e2020000000463636aac1889db8e04739a66010000000008acabab51516552527e8b2702000000000551536500512bcf640400000000046aac6365b001430100000000065152525151ab33976fd0", "53abac6a51ab51ab53", 0, -430319778, "caab3e7d5dc0dfbb78cd84012718ab3f600e0a06373a84be70d944f784e6e7fc"], + ["02000000027ac7054b656e69fcf55555517c02ee60fa655c919dc0c5cba15b59e9bbc338c703000000046a6a5253fffffffff3639ddc359ea5c3070c876dbb68ded3f0e358fd81a926c031553e6167b29bb9000000000300525395e8854402557eec0100000000026a5278efd00200000000015100000000", "52525152ac6551ac", 1, 2147206774, "9c4cffa28b183b8e77f460f0421386603ef200ea9b917a6e339d28753fea4bc3"], + ["02000000039f87eaa8360ea6570dec8875c8ca9ba71de298fc217a81dc27a26c36a7a77aec010000000352656affffffffbe5efbe1d19e8b5df48ba1a21b067d269bbc2af1ea20509c09032dfeb8123a040200000006656a536351ac4634311910d64c3062b25cc153e601c5c23b3ad07d6cfdee4a726ecce27bba90c63f30b4030000000653526a6a6a53df46c51704ccdc8f04000000000651ab00656a635db8b8040000000000b2b0cd0100000000066a51526a53ab701852020000000004656a00aca25d27c8", "6551", 0, 771923979, "74d7f7abcc846511e579994482c3fcc3dbecc70a6bcdcf251b913e088a404b53"], + ["020000000374bdf9117ddae2436b8fcd05bf9bbdf32a73b79b1ea2e0752f11e6d892b545ca020000000463656552ffffffff495ab36b16b053ecf7b715f9a02357fc8f55230abdc0a6e19002f1019bee3f24030000000953acab536a6551630086f6b51e49767a1f40a2a68aee4ea55eab39b55b124db16d4418a109bc5c6e9fff9b9742020000000652525163006adbea15de01afb39a040000000002ab530883cb76", "63", 1, 375683310, "34b262b44e5cb92fbc24d9967cd9ea13279add6895bdd9c89a405e41c77b16d2"], + ["0100000002456c64adf048a1f79216f841831f5e4581178b9823172a4f2d3e6fb2bd624b390100000008655352abac53536affffffff862e4f65f02177b546baea848cfd1b0c28e7a92c334e83de12d1b323690a3c820000000005516a5253acbd6b02b203b8478405000000000066834e010000000008635351526565abab8317f1000000000002636500000000", "5351ab6a65", 1, -1848809601, "f720f33d2da0bf50261e055cfaa4558dbea096e3852f8f6a91ef5f7ddafb0e89"], + ["01000000039daf266edeffb36a567b1ad2f4defe5edf77403e056b4d67468e3c13c364b45a0300000007ac00ac656a6352bd1fe6c5fdc003e4a137f907ee98dea2962509eab850945b9dc66f2a40bdf21a58e5a3b10000000009520063acab53006a65ffffffffa6eb93c73c904e452edcdfd2afb8d48562d55ee9c1762c970805bce6256733b30200000004acabab63ffffffff03fe79a50300000000095365650063ababac65958b0f0100000000046a6a65519c485d000000000006acabac65636300000000", "656363636a536a63", 2, 1393880067, "4d8ffda893dd554636b6595ffd3c65d6719c69fc16f997b86ebd891c976f2da9"], + ["020000000390a2c5661e4803c3de2a2b9a3587a48af19ff4e2e806bf3158f1b8d33ad70f4a0300000006ab5365525253dfbea07ec29ef739a964785de1fde1ef31f3bdbbe04d071a3c62c66dbb29e5f838d7426400000000045352ab51ffffffff53be09c064accccd2ab9c2aa6b09fa2c667e10f89e3319196adec42d18712f4502000000026353ffffffff023e91d80500000000001c87f60000000000096a6a51655251006a0000000000", "636a52", 0, 855436405, "2c989b989946ec2def028adaf4ab24b195533542f2a380b9938627dcd4bae37d"], + ["01000000028719736cc20431a1ce7082b1f606ffcd1612f81767e4d958b9bf42ac754014bd0100000007ac6a52526a6500c0a6d5d525b3fcab3543f0636fab96953fb0ffacfb7b870f5e7bcac521e45c4d91feeca002000000086363525200516352ffffffff0324e05d0500000000055251abab53620a770500000000066a5153ac65ab6b4dfe000000000009650065ac526a63636aa56d4f14", "53ac52", 1, -863593618, "862790152840caa56f708a7caf1dfe7564a46c8e3b0d657051740093cd73793e"], + ["0100000004827ec0d092d92d974e6492b50efb24ff723cefd8b9be448a98b6318520a5bf9a000000000200ac83218229123ff8b298a3a0da7db512c89a19cacd538bae3c21c254a13663b0ff5ba572890200000001abffffffff086438b02aea2d0c2fa4f454fe3cd93ca82f075082a53597935fcf6147c2679501000000016331d789251d9be499a1a6f3d54e4c0b4961467a58ca34cc639292cd26ec2fe9ef444ed7c30200000003656552b3ef102002be28bc0000000000095351ab5151ab000063a45f5101000000000463ac6a5300000000", "516a65", 0, 1540546069, "34f267bd5996fb6ad2ca855d53ceb2626dde55945f356a88e145854b4dcc5b67"], + ["0200000004f49211f28098a098451ecaeb7a213dd97e5cfe20f5a93da0e301757a0f1528cd0300000002536538dc8c536c3436a01601208507fde4549a9d5aa8fcf450b47338d91016501ecb077e16020100000006ababac51acace5a9b141eadcaab76ca14d0823b8c566837b5343def2c9c7b50ae65bec89e072f04d66040200000002acab6b3d36458a8d81bb045298d80ad12c1b98b996d47c6c09ee17b5b9bfd4b2b0c7bf9db00402000000076563ac006a52630af3b4f2023d4baf0400000000086a6aac00636a5165fd80a2030000000003006a5100000000", "6a5163ac63", 0, -480977581, "b80214713ac0dd8c4c3df2f70e9022ea0369f42dbb7adc1cb1dc111dcec67995"], + ["010000000318fea6c97f89b33ab3cba94eaeffa0b5cc7b36f9042312a307e2b489921e4a31000000000953655163abab636a0070b4ecbb6247909a2bf9602c2fc107dfe397661eb5742b248e1c1246b4cdc31f659e77ce0100000000e3f91bcb573847a335e1667fbf4819fa4aec55e28f1baa66061b27b154c110f8bba3556300000000066a516a65acab39702a8003ee2da70300000000026a512d1f7704000000000018f542040000000009ab635300ab516a52abcef3e7e5", "6a63acac00", 1, -1361304118, "b40e7905cdaa701900c5b2c8cb79bc4d069dc7eb1212ca269e31c451fbec2c05"], + ["0200000001fe28cf2eb5b4bebee25e486622e5d6a3d636cd09402b6bbb7992214750d4213701000000075351516a65abac63cf99d401b89a900000000000076a5151ab656a0057a4ca3b", "51", 0, 1266281766, "c1e997215e705c5c210a625b670b8125ea9e29277121721acd0cefd97e235b8c"], + ["0100000002f8d60be6ab7a62e7a942771339f590e5812e1dc439ac928379ee84d9d789bd8d0100000001abffffffff5cc6cfc4931bf329ed713b1aec2db05cf424aa86fd67a46dda47a6b2fd4181cf01000000065200515300aba80efc01038e51a101000000000200530c4d6c010000000000ab773c05000000000263522592decb", "", 1, 582229803, "03b57b648370248bdaa52059285cdbc73234d5fdb12e13afb2b77bdf9558d30a"], + ["0200000004094a1170cbd3ed79071b00ff7644bae3a4238345688da7106e7bf8938a98de510000000007526a536aab0065ffffffff85028bf1ce7a8a1f38996713c3058d25fe0417484d475b6e4a64fa3cb5ca1866020000000753536a005263518530aaf7dd2d6b5624a99b7898b7a28bc117cc70489161a4994b26d9df771d7dc0029274020000000151ffffffff7ca7dbf2ecc9ebe9648c37a25d895af7889176f0fe08f72cb1c2111605622e7f01000000056a006a535242302eab04ad9bba020000000008ab00006a526352abee3f5b0000000000086353536a6365656581c3e6030000000003655163f3e92000000000000965abababab63000065be033a77", "000053", 2, -1795341772, "942b7609d9e90e3838d1e21c64cbc030594fe068393d1ef8a11902e016f6a856"], + ["0100000004865f7a0f3b789804275dc8e68b35a5620bbb25ff045236206795d604610272f20000000007ab510065000063ffffffff93b1309c2e46cd869c40569a6d945ff65431e347b668a7b504d71a89121ac8ea020000000663ab65635200ffffffff23f8de0cbd011c0dc4c5f81a6fc3ce5a6151857d28c7f63111e7e33de8cdb76a0100000007acac536a6a51abffffffff6b9ab819b9fa74076e92320fc67352f27f90d4c6119c13b9540aa3300b72fd930300000000ffffffff0406fe620400000000096351ab516aab516a65ee54a601000000000652005265ab5195d9e00500000000016ae06645040000000002516320390f39", "6a6352", 2, -755482813, "ef7516f74ac6519e560ec905c49f3bde581ddb8d4cd648542818166453088667"], + ["0100000001cd1231306c857d698699c8addb12569bd11200f8fd938790aff3efbe5d76d9d00100000000a08b1e420257c66d03000000000652655165655259b2d30400000000075253acab526351424e927a", "636a", 0, -388159877, "0618b6255c23224ebbfc2b802b49afdfdcabbab1c87a203fe311d6ea9005007e"], + ["020000000403e92801a7ca8db4b311820f3e9a576bdc887e3c7f19dd61e9e3b3c7c988fa0e000000000165092680f5e897067ac62c94772a79735c8e3dd54e6c038b4339a34ba69cfcf37234487cf201000000055253006563b5539b2561b181facb752c796299fd009a7caa2b4a41357fb5f7f096e9fe8f7a31ba611303000000075251acab535300ffffffffefdf9ad8eb03b714c793cd031e901728ca16f5e01509448fa265d26d0b25c20300000000025200ffffffff04db148f04000000000652516a536a6aefaccc000000000003abab5164661c030000000003005152fe8f6a020000000008005251516aabab63fa7c8a53", "51ac", 3, 550227609, "c16e9d0968507dfadd76fc94093fb69e46423aa2b8629c8e4529881703f91385"], + ["01000000029abc79a8d8bf1b1a53b5f9921b31643a1362633653783afdaae9b16cbfc6acff020000000751abab636aab6a314ff3d50deaf78a939025eb25f05eb88cb3f5fa631c3547461ad66ca164ffd534ffd56103000000095263006565ab00ab5246b973fd030f0f8f030000000002ac5297b42b0100000000076a6a6aab005252bb02a3030000000008515153535253abac509cd934", "6a", 1, 93257775, "f07c38a983ec0d6c95b681dffd54d9d0f4b2ec75d743d12bc8fe0b9e56dd0352"], + ["01000000015ece3e0c1108d886d585940c7a671a1a2b8bb6cc25b68e2756a15cc588d0d44f010000000865abac536aabab51fe5b945d0324e975020000000005ab63526a5174710e030000000004656565510ee7da050000000005005151ab6a0ceaa72e", "63ac65", 0, 1898441636, "87372273c0001857c7187963021181e9ba0e8d831146b39a9fe46b8a61c55adf"], + ["0200000002fe3bb48085536a710bbe0ceaf1ecdba50ee58d103d008c96d4fd22799bb9bd400300000000ffffffff14cd638c7ac1ac4943ca9b19022c6470adab9155fc81d0d860a8afef7b68f8280300000006525200515163f84635ac0341cb51030000000000cacdb2020000000009536552acac6aab6363e192cd03000000000153080de405", "6a5252ac00", 1, 1076519502, "2010b304cd6eb1ad4172fb5d6f5a87106736d44c1b8841059cb49e017a49d05d"], + ["020000000239a7f21e90b77fb558ed34fa464127193dbe1f5207572056ebf48e02dd561e670100000000ffffffff1494f7887faf2473fae3115b0b0735f84400d8e85db3c9ce8469f6baae423f14000000000900ac5252ab6500656affffffff038df9f800000000000465005363180b4a050000000003ab5153d506380400000000016a3d67244c", "", 0, -1899402801, "0aba3d0e69ffec9fca40b39d1a7e64faaf5335309b7c87a7b8c7fe64c371361c"], + ["01000000021d7884651536d5e8d285b4a31c2bbb70e687dcb56939e0b57ce7758aad8c649b02000000025153cfefc0c8b58e35fe71ee2e7be1b9400a014a91a68403018329f7ea005850f2be276c88bf020000000400525100346c3e7e043bae08040000000000e4ec430500000000001a1f390500000000095251526a63526563abe233670200000000045353ac5309bdd7ed", "", 0, -1414741799, "f23925cef0f641e77ed52f9163ac58cbeb3ea264a647bbf6ec66ceff552b2c3b"], + ["020000000388961b403614683b752cff4c155399e34e6f390fa6b6d186f3b06367811555df010000000663ac535100abffffffffc6d6c24956bf98544c94d3653038a8c2432b890d81c1783bc0d587d1932007e4010000000963ac5263005363516551c86b6412a3203336a19484854234ac4d474f1a84032ac74c56dfa23e7fb14a34b7f0730000000004ac535252ffffffff045ef5e003000000000018d51a020000000005516aab6aabdc543f050000000009ac63ac656552ab006a171b0205000000000000000000", "516552abacab656551", 2, 1923655797, "e8e850d28287cbd3c22e86a3067226ed9e487d9e8d41ce089c408471521360d6"], + ["01000000039cafc7a5ac2727cedccf24105ffe8cd3e8009c22d9c7355acf982145e41d9b2f010000000963636352ac52656a6545ca18985f347cb953b58f89d79089a420ffc48212bf87de196f1ca555ffea5761a612a60200000006516a00ac00ac4d91b239bfb45fb447ad8d701877b990166392760abf060d31e008ca4805ca642b495e28020000000363ab6affffffff03d498d201000000000653530000526348e10205000000000853520063635351654282b3040000000006515165ab006a680e915d", "0053526551", 0, -1571642645, "cf7bfa0716c555d89bae7c065047fa2ee69cdf5cfbec8b9d464a5b73616aabf2"], + ["0100000001e7eb1129f64f7c8a7ce816e9bd81aaced962cbe9a80bd1e56f569460ab08b996030000000953635151ac00ab00ab4ff6439303ff68080300000000065263000063abd9c04804000000000552006500abf7c1a20200000000075200acac53abab7dc208aa", "656a51510051", 0, -1400270926, "1affcc8161f9091d2aacc01e79a0369ef76db1981eef273c4dd85cf7f5e567bc"], + ["01000000014f72f26ba9a8172203ccf72c890c674e9975ae0f64a9b246720ae6cd124df5220300000001652e29a42b014e574600000000000465ac5151ab305ce4", "ac", 0, -1235233301, "7f96c998a6f57c4ffc5224fdb30f865a77fd60b113c4ede6db79efd83caa9343"], + ["0200000003dbebe4fa9e16cb48f7b0ab504384b8d45c952869ac8d43cf2df037604a4b168600000000085353ab5252655253ffffffff71e4ae60b7d2adf58b9386a5b1fb2208e8f07c1fa567712299eb5efabfa684fc0100000005ab656a6500b1dbed22d2e4c329f40cef59100fdba7817b34ec4ebc8789c977a01cd642235d6ae659f600000000045363ab51ffffffff01161623020000000003ab6365350b8e1f", "6a63", 1, -858489489, "f49c4db87dd30a400a43cbba5b58b7e1c6a0346543211ef9d55bf32b7a65c302"], + ["010000000200b3511927ef203e13a913f97c8759b3cd1ae59cffcbe03c200476a5cb486de80300000000ffffffff5929a001f6092a238352b308b20c298b4fc671334ee232c9c6efe58bcdacdd84030000000465515163453455ec038514af040000000003ac656a63ebcb030000000004ac52ab52c1b59c010000000006656a0065516a5d20b496", "00", 1, 1997459792, "83e2c703395a9c3a474a3e83c2a376d5d3ed8f93e5d58364e1541c3e9d7bb443"], + ["0200000003138f71c7eeb5b6a56a077699b0ca64e82a9495c6b8f8d5abbe98ba14179a07bc0100000009ac52abac63525251ab9eb0407f06b9be586800b5ec3cd04d5b69a0f70578fb6717a8b73c9b49856f47e9ccc8a30300000006636a52656363ffffffff60c4874ad8c232b404d20cd5dfb33b82445bb0722873498b962244bf3cf48f1a0300000006536a526aac001da83b0704b59682040000000002ab6ac12a5805000000000265510d9c01020000000005525200abacd13d6f04000000000851526551ab6a6a5300000000", "0063ac630053", 2, -559350932, "d01ed80356140b6bc44c7d3de1b46c028c396a45bf7f2c2d7abe2746882f6364"], + ["010000000216fb88895383bb5c8f8aa62236ab67e7c1c8be7a9a75d314a5281c1839b0905f0000000001ac7660bf2c73868610b2b1231ad52c63595e41b6cd85043fac49c2d408a5193084747ea5a9010000000965635263ac63ab5353b0bf3c9a0185107f02000000000853525263536a516500000000", "ab6a00006352", 1, 118781840, "24c5bcc885c24f9c71cdc65ba27f4f4229c98a9922d419354822f5887ac519b7"], + ["0100000003e314815e98e02f00bcbc0d956a9c314d2ba1e3bbd69fc5c5a1b884412635e43e02000000056352ac65abffffffff44a7707bb0b490d5fe807c74c73cbbec846f910f4e312bbd41d72331e142a0030200000009516a630052635200ac4ea5272c8840d96b1bcf171924270ccd4fc3a7b0d5537d672011dea028c63dd7cecdde080000000005526300ab5212d589ee04d8d83d04000000000951abab51ab6553ab00f10ab800000000000951515352005353006abe152f00000000000352ab6a08403504000000000700acab635300636838a146", "00656a51ab", 2, 1327421626, "5ffc990b72ce6fbe7bab38207f73093aef20029aff8bdf0eeb9c33fe55b231cf"], + ["0100000004f7d7225630006b6b18178a80fcf180a1b356b6e4aaee3a4e171bb90c5b4de7060200000004ab005265ffffffffe6cd8057ecb08f47d7488f172a177dbe963c21b66f6935db7b64b09d93a603e303000000085152635163655263ffffffff0030160460850f452543507814f18b9ea29f9b827dcaffa28c5a6d5b62d8e0c4030000000263abf3a17d61a260d315500d83c41451c61307da7d6f437feeb8edcda1828d9fda9e15dceaa20300000004ac6a6363ffffffff030266b102000000000453536553310fbc020000000003ac65ab933a5e0300000000086a6351ac00ab65ac3268ee9a", "655100ab6a", 1, -1874719432, "925a903ddf50dd255a492cc7f7a50c023be036a08f1781493e505ac6bd4a6117"], + ["01000000028cd29e8e90fffd6b40bd0420dedf43adf0bee4eb14b02e3bf0c5cecc3e262f35010000000752006353ac5163615f7d6f922bc17a4aac6743aaeaa70660f3dcad376276ec4e9adb47400b031c69eb70b00300000002635343f7a27b022a18c0000000000005ab6352630088a41803000000000553ab6300539d911fae", "655100ac", 1, -2091895135, "0e48be318045a83c68aed5bafdab15fc04ab8c57ce287e2145f0e6ff46d013b7"], + ["01000000024116746136a87693182a3a8d2e402c352925ad580d5b57a1a2ae11ff4e81117c00000000085353635352abac52ffffffffe7c94c3c22e2fbee1f4a6eb6124082e31b64a58ca2109a2665442251a4b2c3fd0200000003536aacb487221004109304040000000007ab5100525165ac9317c5010000000009ac53ac6a6a536a6300f4d1d403000000000200abfd6b4c02000000000000000000", "6565ab650051630053", 1, 1781084253, "6ea7ef7b8de0861a3a15f2b176708a8627b2c9165c34596fb7ab066e1130c9a5"], + ["0200000003dd198253c350e712d09f8ea140b354e986d4b2be11c4465806542f3a684e32260300000000fffffffffa3b3af0164fc5665e814bb8da2e6b44199a92bf0dca9fb8ceb8cb2a58c4da75030000000963636551536363ac6a1c0077f520c46e15c3e86ef596fa8452b24b357343d77898c58bde030ae49b0a424a44410300000001aba68e967e01242bf30400000000040051ab6536ae793c", "abacac00ab5251abab", 2, -117415644, "ce60daff4f43f5ad2276579d7275c591f1e426235d21fac5c09ee0c577566e14"], + ["0100000001ca17a01edd3dcc03bebc5ab53329440ce971e977b8b73bdbee2d93bdfdec2b4200000000046a530000ffffffff027b9cbd0000000000075351006363ac52555626000000000002656a00000000", "00635365ab", 0, 1178416736, "d53bb4bb89d54b3a02c747eebaf88083b57fa20e25b93685ab66c24eb0213c54"], + ["01000000036fb4a83b5e42d1ab095fc77f494f3d6aa7063adeaba85f10e1b4f0ef7b199a48030000000151fffffffff20a5e0f6bf6c7ebacb1aa39f672cbe90733bff3c0984616f9998d7c319186fe0200000000d8ad3b2b927783b002d23d042e1db03d624fad2733200acb92ae91959acdfbc16770be3002000000076aac00525251534b84dc2202b9e0c1010000000003516565dbe13304000000000251ac29ebfd7b", "ab656565", 1, 171528129, "cd2d987fd4ef156fd3fa6297623bb2daff1a82fd9f2fbf9abe5a7dca35a453ad"], + ["010000000103bb1665624a4d0892d70dc6a94a4fdcaf293e1f9eb03705d31548a6aff1077f020000000265ab7f31c8540348d68404000000000200633eb11c000000000000553855040000000006ac6365ab5253fcf5d220", "520053", 0, 1617201769, "2b6ac1ea1cdfd3217b60b9dd532d58f17e8b5cb387e245792b5ee7f5e1c110a8"], + ["010000000265fb7c63b704a4583623b85a7eee68e08b0612d5c29ad073386cf83c75b3cec70100000001abffffffff21cbf8ed1cb77520f2dc8a3d78db1870c6bca7fd424eabeb7e260c49ae9b99e50200000008635165ab51536553e808e2c604dc86b5020000000000ae07420200000000086300ac655252ab637c05d2040000000001525553bf0000000000086aacab0051ac65aca42a9465", "ac", 1, -139339286, "14428db11d09c0a6760b780a2be7da9c8b80d3b67d244ee44136c12e6ea1e020"], + ["0100000003cbd44c855f208582977f89b365187f191be5b9cb3fb15996425f6f421cd8a73d03000000026a520d789bd683795b6d68173381884cd56743bdad54897aa15ecfdadfbc837953be759adda8030000000753536a52635153ffffffff71dc789721abdb300d260a6d95ee3e249ce7344c51050f3c3d2bf050054bb17b0300000005526552ac6a3df7de8903db9819010000000008516a5263510053514ec0cb0200000000000a214e04000000000352635352beda80", "6a6a006aab5353", 2, 1417394722, "dc1106babcff8fc0519dd385673773f30fb88b20ee9a0f3e03894fd62944ad01"], + ["010000000139f9dc507bbdcd3fb3072883a02ccce0c38152a2148a2895ebc34e8370afb4f50100000004ac636a65ffffffff04d1f91c000000000006525363abab638dc541040000000008ac52ac6553005100a1c984030000000001635d79c80200000000056a52ac00abd669c862", "00006a6352abab", 0, 132400782, "2cdb7680635c682fe0822479ae074fa8df28ec707405f7cc08070388e0c44d46"], + ["01000000035ea9c30def651cd72d47aab34cad9ebb2ea6c8e70f9871e0ac9aa37302c5a79c01000000026353383b0da52bc60dbd80e4bea5b30410d6226b734110a69e3efa1a33a9e40a0b25cde60ae40200000005655163acabffffffff5b953ec8e8e9178179c3b0a44b97119681d457483b9ee37cfce3c294b70e68b4010000000077d3da58010131800000000000003da6e6a9", "520051", 1, -814482219, "784a803821f0084112de19699164d51cfdf6d2e3f5eb364504af1f2ea7c5b3a4"], + ["0100000001bcd38d3358f15925e34ca87b60ac03cbe07c3c8dc1049814553824b312f7ffa603000000075263abababac6affffffff015c87e900000000000953ac006a6a6aac526500000000", "ac516a53005351ab52", 0, -464946903, "8df8ac1cc53ba849119a7cb5d66cb331db70b33e84154bf380c404b33ce6b4c4"], + ["01000000037169608713fa30c7faa13db9b4c6a4116cb55131d1c4e4cb303e004f3ef05bf20200000000fffffffff2c1e8b9f4ba95ec58be2adbe4cf6385fd4694fc8f61f88d00ce61964c931b930200000006526a00536a51ffffffff70c034c4daf6c79caaa34051c65f9e76c646d660dc08533bcdeb9ad09aaf411c0300000008535100ac51535152ffffffff040749780500000000046a526a52a19a2205000000000765630053acab00d691ed0200000000026365e9916b020000000006ac65006365ab00000000", "", 2, 998307734, "608699c4425b4b6234aa13f933e970f30b817bfc1ec51ae57326f9fa64d9f225"], + ["01000000047e2da7a580266ee94babd5946aea65e6438d13c8c9b3c96fd274cef716a2c87500000000026aac9b2bc22551b2ca71ee64f39bcd5461d0ac02d4169be6c507ae41aef92615deb97ff11b570100000006655265ac5151ffffffff625e97536a7ff08c6177501443cf0512b565bc5164be09e74f47bbb6da1b5ff30000000003630000dd1b4f53e9c1243e6cd00e4a9177e2bfc9204103b995ce7be68b945266f11778f94acca70000000001658cb8655801f893250500000000046a53006500000000", "53516363ab63", 3, 1085348301, "607405e7ac68f3ee1172b770a27d115051105a324fdeb9b83a16e65f223ea6ac"], + ["010000000373716d75a4886e083a75df4c0252d36d4307783ecfd38efe7839444193b3e4d703000000026aabffffffff7cc4797fb10faacd73ee76c5e9a579f707af9e90528109f5395900ce2fad708700000000000f44ae2fa2445f4f80066e75e970420ab0496766b3b211d6cd9fb73083f8152da67883270200000000ebe13a9a04da3d4705000000000652636a51656387be8200000000000300ab635c826a020000000005656a000000887b11020000000005655253abab00000000", "ac635351", 1, 1864968414, "427df956e5456325217b0665212a41cfd636a494372fb7f962b266ec1bd28119"], + ["01000000027596a645bcbc38b017334b83086276ebcc5cea7cffebb84a0bcf6c9430f3f47c03000000055100abac63231ad4537756dd97d513931f5d2c32574629ae74cf5644cf1bae8c95a0d002a4a4d76ecd0100000009ac51655353515163ac9541521002749c8301000000000500ac63abaced54910200000000030052acd6488ec8", "ab53ac", 0, 68575139, "2f24fdc9dffbf9c8f45b8e43e9af5ce260c5d62f363e6d154fd790fc6efc0ea4"], + ["01000000022b75a632ca90c6bd406a6b19a2e130f84b9d68dd1c7cd6925e291f12a551679a0200000003656a6a2a21b90d1ece5bbbf64fcc575ca46bb3802abb5d343437d61474ea66eb4d4b7be6397fef010000000652ac65ab51abffffffff01aac3a002000000000353abac00000000", "53ac656a", 0, -2069181109, "d0223709530cbbc4727cde76250f61cb78d51567368e3ba4585ba4616f8e2ffd"], + ["02000000039b6f1382b35ef66b03e09ed231621f540ddbd5acb973ee1319a82ae48a7fe436000000000752ac5163535251ffffffff1c9f71cb548560b1efc637b0beca7394bca8b3291faca05259c4d212dd413182000000000500ababab00ffffffff1521f9d377fcce5015d03499a66d860fc4e4b4abdfa444bce03c08b33658d59f0300000000b640258504183ceb0000000000056353ac0063c53db301000000000753ab536aacab6334232d0200000000086a63abac6aab526506591a030000000009526a65abac516a53abe46ebe34", "6aac5165ac", 1, -972536778, "09493c3f0c399b3b4ab9c2939818d96c8fce6fd2becdf29768a32db921e32603"], + ["02000000037d2ce567858a7fe22189662e3cc0051eb12b5a595ef6cdcf7b6fb0f31c4533fd00000000056aabacacacffffffff0ac502def963d8de11f2a0ea4aef26e5626476b5a4d8bbbbed80e5d4f5a187b7030000000465ab52ac891103667403e90844bb45cb1e19677cf8ce0184b3b41d921b8a8f94188cffae154c8a32010000000765ab00acac5353ffffffff015a13b5010000000002525300000000", "ac6353530063", 1, -1349902779, "939d57bab6696c67e274bfd8c419e273990cf80f2f0e3fff12939ea4e321d8ea"], + ["0100000003ba86d2c825166d50dede39ec4b77187a3fb71c2f03c460372ea6431d7a28c79201000000055100515263e24c1b5065d9f62710c0384dbf4dffa358de5707a58ec463d73fb7587d5687d4435d84cf030000000500525100651e3ddbab860f03db4bd86af7c1ffea84fd14584932368d95b06a3f6d9099659746f3679e020000000500515253ab276663490385f25805000000000651ab5365656aa0e45a03000000000163802d9b0000000000096aac636a656a51516a00000000", "5365", 2, -1347993085, "0c58e118be7e76c7205418b6409da29dc851bedfdc70e1d32acb42e7c9aa3030"], + ["01000000046b1607bc3365a4ab933e785887c012dae426041c729c09e82d4ad236afcbd1a7000000000400635252ffffffff84330d379dca85f933cd5147a8358399966208b904fd543e69d0cc993d92c6e70000000003635353a780634b3157044657455565f9c21b4321c04f29b19d36e4b2359d6bbb1ed41e5bc008280100000009abab0000ab5300ac530ea3d1f7213827dd9a6fcd1719d351c376f3fcd5627cfd4eaf9ada27827993f177ae265003000000066a6552ac6365fb14b59d0462f0ee030000000000023b4b0200000000075263ac6300acab7582ba0200000000030053ab04f6720100000000030051ac00000000", "52", 2, 314128486, "a583d30bba93f5a95302a0f95ffe5fc70cbc510a9f419344943bda3c07be5bc2"], + ["0100000001c7ed62d7d91fc55569a8ee26ca93b38c7fc4b4c4a0a5ee3027f0876c0964f12b010000000852536a53656563ab393a7e6803f62df4030000000004635352532dcf1b0000000000096a656a0053ac00acac64ed840100000000066aab5300630000000000", "", 0, -1741644732, "4c91ecabea175460786edf4bd16058509d393b279787b5ec89b9c40ab87ef5e6"], + ["02000000021b7d7ad5c02002de093780bacd6d1128831f51ef16eb19ee973555c65099b581020000000263abffffffffc4136d31daced9fda32a320c08c618d790af486ab8ca73bf4c5db41c7d6571a90100000005525251ac6affffffff026de3ac0000000000086365536a51006a51abb9b00500000000008b19d95c", "ac0053006a", 1, -887662482, "c12704962d110a3930992f03f54ba08a30d26295119d3789ea5442860be5572d"], + ["0100000003e0483ca281ca9bea974a69827bc69f8f31bc93a0a4b1e25bfc1cca5ae4ab0d0e01000000046a536500bcd7fb07187d7c5c78b9a251eb936f0f3a804e5d7dc16421f2ebffd11d8912295b37e1720000000004516a6a00ffffffff47f0022b8aef3a83a58153cb91ee205e84a2eebbe057aae52c143446c0c663b8000000000752635363ac6552ffffffff021a962500000000000363630072f713030000000009ab6a526a6563ab530000000000", "ab65006500ac00ab", 2, 1403254335, "174ad9a4df320626df1b5605ad657158b53b179d1057fd92e308a1931100964c"], + ["0200000004d80c4b9985a0a4b120b951e8e2f9887c9211514ef8b0bb7a922de356a5aa7c450200000002006affffffff216ea5bba0f2804aaa23f8bf117a5d5222833a0a1972aede176125d2cd6fda1a03000000056565655300ffffffff459fd57837308222301193c05f1aada4b7bf607b466687c2774ed9240f7faf990100000000ffffffff0e5e78de1fc07f70615e22fd9917d3b62a4aa5ea8f75f6578be30765e8c19863030000000151ffffffff0275b048020000000001513eaa9805000000000163cb61f516", "ac53", 0, 432951362, "27fb441be86fa599c039b6570f6e9b65f3f5fe745dd759d02463bec2afe46fa7"], + ["0200000001b70f5797ca33a6773e5418bca2004fb61dd043a8d20b7e4d9d0887c156b537aa0000000000de02d49b021f74c3010000000007536aac0063516acb12f10400000000025265c96b3fc4", "ac515263526a", 0, 1887350139, "43715957a570f8aa32ed27c88b1f63946aa1132d03234afa23c5d7dfbea2d4a2"], + ["01000000045125f92f10bb312a51ecc2ac489a3ff887d658fdf45d6bbeede26c51341480840000000009636a6a536a65ac53acffffffff3057449390026f81c778c3e3ec704b5a851b4ea0a35e556838a8461ca0b633af00000000096552ab52526aab6a51ffffffff2734c125ff35f007891590881975a11ee4c9d6c84f2ffbf2416df0ea9c2248f40100000005ab6551ac00fffffffff9242c9c690df661ec2e36c07d374d5d5229d7cc6c00bdc7567a62971875adba0200000003650053688a9b850472330f010000000005526552ac517002c404000000000753ab53ac52ac00a0f7bb040000000006656a51636a53986b4a04000000000963636353516a6353acad1afea5", "", 1, 151982316, "4291b22c6b7b50b3f9e932c449141671756806ec63580b58ff70224578c4b24a"], + ["02000000034587a49c10a03d799889a180f9b617d174c20d3c16b63bb5287dd666f9a7e71800000000096565ac656a53005363ffffffff83862f69c776741ccd98505ba32723bf868941d120a60f4b81d9c3747c00b2340000000000a2468ba10f3c10ca08215a837b8bf3af59ea5001db83563ca42dfa492984f5a6d8cd9ac2010000000751abacac0065abffffffff01a8ce68000000000009510063006a6365ac6ab6133c87", "6a5153ab00ac", 2, -1526548836, "815a163e4b2eebbe67e9d2976a3d1be6d4aca1df1bec362c6b57b3004f0a82fc"], + ["02000000014ea53b954aefbf9f7447d9c1a615c6e6b4dfb1cc70c1805c355185a645de08a40200000000ffffffff02dedade050000000006516aab65536af6089a020000000002ac6a00000000", "abac5163526552ac", 0, -1199444126, "8d39cb636f4e10d40bed8d9be9c69642ca67670098a95234ed0ff9f71d27d19d"], + ["0100000001e5b60e34c1a3c4aebcda40a980de839e41d2ae1cfe498247c3610eb900713d740200000003006300ffffffff02ab471000000000000853ac53ab53525251a63247020000000002525100000000", "abac", 0, 275680991, "453be721f9cbdcdffe002e1b50e49fe4fa312692446828427ac5e2f7019e48cd"], + ["02000000019c87e0f1a3c1cc3e94f1826b7bdea048785a304c793d91f12016c709e710d6a70100000007515263ab63006affffffff0316d4d904000000000553ac515253be066b0300000000056351ab536362fa080500000000010000000000", "6a65000065", 0, 843315372, "a7dabbb3792f5d606f558e908c95c4e7d6fdfd8e8e3aaff7fd6e0a7ca17c4fee"], + ["02000000012fe7b04505704639123bd6e907145b70492e9cedeca347529bd387184425d923020000000165ffffffff011fa13205000000000352516354b1a156", "ac00", 0, -2007215775, "06ba0103f19d64a80e808ee321c20ddf022a805a9dcfd64a6413061321743953"], + ["02000000033c44daa8d90b98798cf1d136a238845dc2abe7aad09fb0afa2bff231d6f06b970200000007526a51526a65656bfc02aebc7f44da611b163155c54d9e201d771674d5a4ac6fbb367f8e737d25dcd44661030000000153ffffffff1b160d598c66f1c0c21e72941e7161680391958929b88d312a8cb204a6eb7135000000000663ab51635152ffffffff012ef6d10300000000016a00000000", "ac", 1, 1659391037, "ee4fac9a721dffa9b2ac1d20d04c1333f6d2d5583b233f5312340b6d137da0e9"], + ["0200000003d0cd565f6417f94accb276f248c8800525e86143e5c17aeaeaec88a86aeeb6fb010000000800ab53ab00525163a93cdd2697bafc237d570486516040fbba9009fa993682e261cd69c4133ac659ecce5fd0020000000565ababacab7ff69a97485bbc8b3c99f35ae4a70c004f2b6acdb8c85bdefae2ac6b0417c48ca9f2ae090200000005ac65ac5253ffffffff03d8fcdc04000000000951635151ac00ac6a52173337030000000009515153abab005265008d69b70400000000066a0052526365fa1c9fe9", "5353ac63536351ab", 0, 1401863071, "e76f923a17980f762fc3dcdc6c40404566c58c1d4732839a26e3b639f5dfc2b5"], + ["01000000015db9d15f75a1fcea96afb715ffe47fe755686a5654996fd5736784c5e7c0deee020000000765656a656a63525d601cf501f02d8d000000000002006ab2fd1711", "5100535251", 0, -1959118057, "2e852e61b28c0bf9f333467cfb92d75ce946b8a018b8c2068f02b3ad8d428239"], + ["0100000001c0f074565f47e89308068e942ce988ad23f0dbe4e264b86a98143286f0bd357e000000000653525263ab635810e3490319087d0400000000096352acac52525152525db264050000000001634300cf020000000002516500000000", "0052ac65630063", 0, 1130026586, "a7174d3dcb11ccf14e788475a26fe3ba48a0ee3bfb9f7bcf6cd49a7c2459f05d"], + ["020000000132aa793b23458f942c95e55a7a56b1483cf80db977677379ec7a8406d4ae154802000000036300528c03e8290241fa7c010000000003656353f9b0690400000000046365005100000000", "5365526353", 0, -593430096, "32a08f4ae61ee3178d9821273b8ae11600ac68eb1e9ff37687c1e40de22b6263"], + ["01000000020db75f48f8445ede33a144e90795787db7bd9e71a97ea96671ff2030b9a05633010000000865656aab6a536353ca245362753c2cc29cdcf5fb7213e696c13019388b4150ebddc658af88ebb1a3d95d0a21010000000252631660908f013bfaa300000000000765ab5365abababff746428", "", 1, -576252142, "df365b0ebfcba89888b0f4ae7bc155b4dc361a4b75826c5fb9e30a63a40ef0f2"], + ["0100000001ad1ca5745e3762d2cd3ed60f4c404ff66518031c065f65817c63bb441d5839a0020000000652ab65acac63ffffffff02f2515c02000000000400ab65acf9c7b00000000000085252acac525253ab00000000", "abab53abac510063", 0, -677425, "f954e17dbfe7753175a7a2fef17ec8c4ecc07e98c34c16d07b82c43626aefbd5"], + ["020000000121d8a245ed29402a6f07656e198b73f38b9a881d25bb22b29fb17823bbb8a57902000000075263acab65516affffffff011bf69b040000000009ab636352000063656500000000", "5100", 0, 1516199914, "ddf9e0cb81879473ac91a4bedfcba538a79730b7900ca0af61eeb2e8875ff4ac"], + ["010000000449a2cb6a9c04901beee3c080b9d4c9cc509265c369ae6839bb21c399ea7d041d0200000005516a530000ffffffffe1a44bd9fab51ae70cc749417a2d425da20c6ddd90d654fc144c56e8e08fb69b0200000001acffffffffeeac146e0cac3350d1321d1d84e910ba82265a4cce90a4ad026419853f68529b020000000865525351acab006a4617a6c71b2be39a3030b19033bf2aea27093aeaa233ef3dd0071f5c76c4a9b26861ac720300000000ffffffff0238edf1030000000008636aabab65006a52dd0eaa00000000000010ec52d3", "0063abac6a6a656552", 1, 334498682, "3b49e1b46c576fef6f92b3d7adf36f988d8448a5d84cff6e662517d5470c1332"], + ["0100000004dccf9c899bc5f2fb12f9c5c594ef4f1201232f93d79a118c82bbf6be41fdeeec0200000003006500ffffffff89d29babbf547513dfc7b8b9d00515fcd94efa95fd7e1c56f7b2cb0ca2427f0f0100000008516365ab6552636affffffffc51ebc3228b4867d339b3876e16d045e2185b55d007503fee3783ee0028b479c01000000003d2fe2af1fdfc00d0c929bb0e7f30eb9a5dbecd4b0208502f130834977d9f6adb79bf639030000000451acababa20d3b50036a7c1e030000000000e57b24010000000004636565ab97b1de010000000006005200526a00ba0fc2e5", "6a5365536a516500ac", 2, -1697131938, "fdca1808a09263e781a8a8eb8dfce6984a2971839a46cf2f46354f0d6147b356"], + ["02000000045b9a7ade7d62a5f094beb4da9131467140101ad623ee848dd4fd0e556850e62a0100000004530053abc55bd54b20936a0dfd82dfd45ae741c7284fb29c4444adf548f5bcc37681eb462532bfce010000000153cb2b9d5cc7a4b93f7563ff8d12285237be8c595fc85c54a1a71ae5474b348621401adf45020000000465520063ffffffff8bb936b7808d1016459ec44d8f200fd7c1a6250fd1b83a94c5df77668e88d4660000000007006a63535151abffffffff01c526e20100000000015100000000", "ab65ab", 2, -621569358, "7513e06dab46b657be1d3d3c7da2ec6339b57bb81077703e979d4f30ad3d4b3c"], + ["01000000029b9306635e268de509e09be11b2d910ff89ded965f3b905574c5b5ab3f35fdf0000000000100a7c89646e074a4c0771c1d16f50e11bc4a5662103338393df9eaf070507053c6690f8c4a00000000065153526300653428fbfc017848960000000000025352bd32704e", "abab", 0, -1485423366, "7fb26cf774bce8b15d185284e88a99145aa001d8171a883a6259ddae43c8edb7"], + ["0100000003c5cfaa9e8b0260444b6917ffd25a0e58b9ca3c8e4be4c7f2619dd4e454412b650000000000ffffffff4f7decf94537731e64c3dc861f24364f1f26423be449a3ab131d94ece10bd44300000000076363abac530052ffffffff46c3ca38ebd4363f497780a4bf21fb3e14d0eee721dfe5cc47d17a3d484c5acc03000000009abaecd903c0ff3e0000000000050053acab51195cdd030000000005536aab5300a4c661000000000009ab63536aab65636a6500000000", "6a6500655300", 2, 791357086, "38e570bca2d0ebd451f702cbb764ef5d9d239ef47ae5ab20cabf736516f9183c"], + ["01000000029a80e3d28aab2b2267af0da033909eb49cb879b0dae4f5a90294228f57b34cd40300000005acab635253ffffffff7cbc76982fe0b3c8c46e6ba227445e634bf0646338ec4f2393d3b03bfaf7fd0a00000000025100ffffffff04f9bc460400000000016ab77534010000000005ac63525351a12402000000000003656a6522415a030000000003656a6300000000", "5353636a", 0, 1197925472, "c39d78315a97dd552397d5ffa92ff09346877440f6b79be154cf4e1a7110952d"], + ["02000000025e60ac43f4f5f34b207b5b56259f3082dec0b844dfda0ad2e7d242087e5f53990200000000167ffd60c239a000bf16b3a0c385048c46397c7255108d2fb5964b85f645b3c33ae63997000000000004abeee7030a1760030000000008005100630063ab6396857e0500000000066565525200abdbefe003000000000000000000", "00ac63635363ac", 1, -653694398, "6f5154cae6f439d01296c5ed910654a1e25db4779e6b82da8d745c693168dd27"], + ["0200000004259b9d5ff084390eb0cafa0747aed65b8f554599ca7bed668fe4c58d8f2d7f110100000009ab0052ac525100526537800557384a68b24ab0a4e0973e4706d97040986802ebd1a5bc10017386b25b6945f3930000000003656553ffffffffb41794fc06c02681e92ca65247bb44a50439fd7907d2fceea51d5db9280eb93a0000000000ffffffffcd7e77dc82593c95afa8a1d406d6c7087a21d410722700f33b9a2df021b819e70200000002ac00ffffffff01638e550000000000010000000000", "65006aab", 2, 737353594, "71860811eed051d0b59277d031c748a1a7f2ae56b00b8d51d6e570cb3d054ca3"], + ["010000000433162f6c2637f6fc221b6ebecfbd40e7ba3acbf238f6aa7fe49a90b4983bdf4d0200000007ab6a6a5363516affffffff4d2dc454e9357511436a9ae88346ddba21338bd6feea494af4e1401b5469dbae00000000096a5252ac516565ab6affffffff0e7be994ab142fbf447e9ddb4ee06ef079c65e7c63f1390e87c3d34799d1064a0000000005636aab0052e17352c3bf2e63fdc01984ce08548c6d3690de3c61c9149de2cc1f8d869e99773a3e5c08000000000653ac516a52acffffffff010900ce010000000005ab6551655211d61864", "520063ac51", 2, -422105599, "8ab3e3ad0257d31c5cfe7dd07c747275e0fdbc2c3569df46bda3b67b62b957ee"], + ["0100000001508081c45197bc4b30b4b75faec7b9af7ea18e18d6e6cb997b63aa6b436107520000000005656aabacabffffffff03e261b9040000000001ab4e474d000000000008656a5365006353ab88f8310400000000085365636a515100524e2dbe44", "00ac6aabacac00ac", 0, -1832260816, "ebdfd16a34b58a33d09d47ac48bbf6d3e6eb0a040960e2c49f989e226f36d13f"], + ["02000000049281ff629677087512fa7a9164433584efafc19f95030ceba709752604c7d3050200000006535251516a6aa604a69db4eb7b97e184a41da977e4b4ec05ce9f873ba8e465c7aa349847ff7db655a9f4000000000100ffffffffc20926e0b6d573dddcef55a6861d60a5b9c69b9dc9aea77ec5b8d71a37a719210100000001632d8b2afd3ed6d0ecc9213d86f051d401724970ac47f658f6b3f5c27986d4e2964564e6590100000007ab6aab5200ab52ffffffff04e5ce84040000000008ab516a005165ac5367cba70100000000080063636a6a0053acff1062010000000004526352ab647d7e040000000003516a51a473e496", "ab515152", 2, -470798990, "2e4a55db22b6f26cada6461a4971cf62eb0539ebf98cd67444701a2d8220b60e"], + ["0200000002ae217d719e03b0c448da6fc4443ea6bd20e845bceb677aa13fe13a635840cd260100000000744925fe5f5115834e9542f812f3247b86da729881e0b079c140fc35701ca457e5a686a9010000000651656aac51abffffffff0114010c040000000008006500656500656500000000", "", 1, -1198429795, "5cead390ef8fd144ab4da05cffb56d7c5d4a1a147a18de31c88048c0af316b2b"], + ["0100000001bdaab4199a118b8b2380666ed0f0ac3bbdf836b3fda11fcdcae5f63100f324e5020000000651abab63ab63ffffffff037a545b000000000000baabf700000000000253ab96819f0500000000086a6565635153635200000000", "63", 0, -845743454, "5e46b0679d9608aafd4973bbad9a9341fd08e17c0d0b5dba43dfe7a279936316"], + ["010000000312c3363175a0df9baf3f55facdd94b9954482d4720e900f3692c141df7050b2d0300000004520065acffffffff52301db2fff5c9baa2d5d65c8c79a8462bd7b68b582bb908fe6538aeeb0662430000000000e45316b6a45503e501366655ccf0b5a8de48bd5b5aaffdc1633d065527cd7beae331924d0000000000752cc83201d83bc802000000000453ab53ac00000000", "65525351006a51ab", 1, 435573142, "f5ba43ed2fffa29feed8b72b7dad1905da06ac7c4545986456bb57f795938e44"], + ["01000000030b5279e6dcb742b153f353f03c8f7f1c9429cf16963adee29e589eae68962332030000000865635351ab006551ffffffff0aacad6c8c2af33c428a5906e32be8b21bac0f64c183a229d3666feb94ea5b45000000000035f5e409f6140e7ec5946eafadf0b43a882f6940668b1bba457b986054aacb12b7d773b90300000005ac65ac5152c22eb96d0113d355000000000009536552abac65520000ac9543b0", "0053ac53006352", 2, 420390579, "0429fcc15989238359c6ae4057b0d5bb8ad82f2d1ccb068ff4519f227256c19d"], + ["010000000292335e76f3c55d5fa321c0ca0917e207440efa5a06a66e2d0089bfce601a6d8303000000036563abffffffff12ecd36f804254d07cf320650634dd1d28ec376c54b08c463f3a395ab5c78a090100000003510052a6face6204058894020000000003ac0063e2f67c030000000004ab6a6300919cdd00000000000265ab8387a1050000000003536a6a00000000", "51abab6353516365ac", 0, -259546840, "90ee84284f6a7ea148ac0751e57039c7168a5b4b8103dbd935d7d097d9dae1cf"], + ["01000000040a5aec0fa10f4bf7058d3baf1784a8cce62e7a77a09dbf8132b5ae6c2c2802960300000002ab6358824a844ae653c4a4ba43733fb495f4c848565e7eb0b9ae0ed39cfe6051bb6112d6c8ea0300000004515152abffffffff37d4c47ad62f50d6187402e08d40177994e4cb6079d2174d6f07a99d4c3d5484010000000153bb36f16130942ac32a7ccba04272cdb0b5b652449a4082f60dbc853ffc339dd09ca01071020000000153848d8bb502ca045703000000000011088f030000000004536351ac040909f5", "65515152656553", 0, 465838712, "e19616df36d6595899e9b2967ddc82b9999ded28ef9c5aa0781979a28b9d0b58"], + ["010000000218895ade1e9510913c7dda30e9bd01eca0319f560e39ab9b388e7a40dd8ff15a0000000004636aacabffffffff032edcfc5f7db53a77fa807653d8af51da896c6548e9c1eca1ec4d5ad32b385203000000030052657e09794804efa77704000000000552526a630042c63e05000000000952abab6563acacac005014ad040000000007006aabab6a51515b20600400000000065353655265ac63dc47b7", "ab6353", 0, -1943946073, "6ac4d1bde69aa3611865ded07461e068d1a8ee46ddb4d2971bf66997a44b2314"], + ["0200000001625ae3a2b25c8e8e9aba7d7fe50a10c468ff5750ad9becf48c0acec29cfe59ea0200000000ffffffff010321520200000000056363656a6545d99040", "53", 0, -1140438221, "58d6f0d62837a8e6c1e1a84c90f7ce58985328140e00929477b807d24473328b"], + ["010000000373c057857e934a15a4d1cfed078e4ab1e90c47fd354c81a7f69341e331ebaf0c0100000008ac6a5252acac00acffffffffe1845c7738c4d23904668d8d9a316d392ded2adb27e17720422ca393dc6bc3300000000001abffffffffece1a44441683f505f9abc7251668ded5307908d085198e06c05c4ced1fa2a8600000000026a6387d993e60289d71e050000000000ff9e46030000000004516a656a00000000", "53516551", 0, -1538616268, "7e5e573c99b086fe867cc5af52dd9bf32e407aa4c4f406837e98fbc5b88606e2"], + ["0200000002996a2bb62ed9e78b9f9c0e3cbd7670f89928eb5d33ccdee964ff0332e69690670300000007516500ab005263d7e97bc50c881f21922645d1e50ac90a8a061417fa7bd7bc930b1e52f40b9e6433be3a14010000000253512d4e4b0203bd06e60300000000009b34c700000000000251511a710e020000000005ab52ab6551fa80ab42", "00ab5251", 1, 1058644277, "0e301ff49e78ab18fb9e5ef51504df6cc912fb741da1f470b6726604c35e2f71"], + ["0200000003807941ca0c5e7109ac58858de6631f37189e0792787f332d3647710e40a5d154010000000165ffffffffb9a496d4ab51982e990a7ef12e78d81550f9bddbd162e27c39e8b3c874fcde7b030000000451520063ffffffff4a2a6fea836073e8f5e0bfe3d127c70b5fd48252100c2fc1386cdc4a6dbb64b20200000004ab5153635ea5b6e1016dacb70200000000015100000000", "65656a65", 1, 124939325, "d8cf203160603a07250a4af398ef851d97c32a09d6abff1581a6c3a0500b608b"], + ["020000000425b8194374709c4b97e7cf8936734a14d8ef7da36f318f1a5df27f7b0a6f0a23020000000153fffffffff7ce2b9329f863a61fcabfd738df1535e921e4d735ac092ff6e7ab526c031f700000000002ab00ffffffff367842413de9b549da63076b3ec8e5341dcf27f344805faab8e78c08dee309760300000000ffffffffb8974ef5976b18d189cfe49964e89f6036f5c62259bfaf1b1a71bcdba662cf9203000000095265ac53ab6363ac52ba41cc47016bb4980500000000026353a3347bf7", "63", 2, -1653315751, "3a6bd689fee311b5dd97985cbbcca739145bfa951efb85ecdfb08f17b45024bf"], + ["02000000031ce517810c47b0b897101d9009b2805ad6c72d9b20fb4beab9ffb19876e653ab0100000000ffffffffcf0c868d196134071f458a2ff5f6bdb65168ef1b2bcddbfdce41f7c901eb62510200000000ffffffffae9bc414e776aa2e16fc04f69f7ad890d1ff6d560f5b1c718021e15eb63633cc0000000001630f8de1f20130b963050000000006516a6365636500000000", "", 2, -562373056, "b32c5cbed9d5331c566441e284853a3e69fcc33ab662e8ed8e4b0e4c83fddea5"], + ["020000000305a8f7c252df6bdbbaa48fad40439ffb605d0746ed2cbe7c2c741b069043ca1d01000000075252ac53ab52533ac8a0d874e4776621fc6dd6b7337f69ab10b75f6975badd1cde1b9b15e14287378dd71f020000000200ac943a7aa4d5eb25d7f82312e893d2e7196ed5636f984142523992277c494f1a4f03ec987c0100000004ac6a52abffffffff043384e4030000000008ab5352656551ac5104fb66030000000002526ad83c5b0500000000035200ab3fb7de050000000000434459ef", "", 1, 326831777, "845822e35d79d84aefaabe0485351f0393c4b18813ccb444473d036262e192aa"], + ["0100000004b672aa615cde7c76fe097aa432f52b820192090278ddcf414ed9de22186d3f0f00000000096a515365ac636a6553ae392d91b1662a44a98448676b821bf492d43695ae41ea6407a4e4ca866367234807977d0100000006ab6563ac65ac90115b055f34143c8567c0fee18777e255e3a6c11317e45cf2a9dd7cbd262083752321c10000000000ffffffff2edc8d2d248acac66c3cf471502bb09d92062a588221d2a4da3f60a0e8e81be100000000016affffffff035031b60200000000076a63ac63536a510f51bd050000000003ab6500394b7403000000000453ac53acf64544aa", "00636363520063ab", 3, -1571937822, "c0f984b31230e5cf997ae8466aee2279fd70b6d04754fffaf47f59d5c3fc1230"], + ["0200000001036de0cb4308b330604c1e3548dad81a26699ee3699b1ae95ee22c116ee7ff8a0300000005516363516affffffff04be5d55040000000005655152ac513501d0000000000003abab6a33afae020000000008535253535153ac514c432003000000000000000000", "6a00656300acac65ac", 0, 457702333, "3d77d386cd068eafa3cb034375a67e430c230a0c3c1f3f40e79e1eeff437a229"], + ["0200000003270f6a8f35f0685d313a1535c4ccf33c68699a7fe9461986948b00cc690fca0901000000055365ac5163ffffffff2dd97eabbd8721b4c4bbbacb9c531e0c64c81a5d973154cfff1c64bc270d2e50010000000151ffffffff782becadf9e47e838beff47f7f6e9426f5cc6148b6b1fdf5d20a86d6f9f0988202000000065151ab516363ffffffff031db6dd0300000000075165ab6a006300cd447b04000000000852ac515253005263768767050000000009526552ac636a635165879d067f", "52656352ac", 2, 64134754, "5134d12f63a187159420062ee9d73355a3623e6952c2f707c8135e7ed441ab77"], + ["0100000003f9a0e45a20c102e19db86e140c4cc0078c7d6767d6439b6a81f3b8cf0f849a7d02000000036aab52e3dc3a845abb932ae4b478fa0d981b2fecb6de442502681d3399783a753458381efcb694030000000365006affffffffd3590f20bd908e6398b2eeed1efce4079d51d6e99405996f0899bcf4a8af94f00200000007006a6553ac6365ffffffff022e6d87040000000009525100526a6a6a5352a2de860200000000095152005152636a52ac00000000", "6500635251655251ab", 1, -1868897541, "5d1a3c58fa04b2a529b7753c33e40e8d16e3f6edb6d6a49ce8d6b0232b603155"], + ["010000000440bb60e939bac09de47f016dbbb6d2fd40d03368e4e9ee26222233d11c06697c0300000003635152ffffffffc3bc255246862cab86f5c1bdbd7f4bcbb56752ae0506ce9d57d42a037bfd8dd802000000055351ac51657f0f633f8f7e8259054af521b4f1c2e31dee20cacd3f0913b0f239f82391d4232b5530600000000007abac6565006a52ffffffff7457afbef9c6a8d0448925d4d77f4f0a3b3c8580f48d098b955f0ef2310ab96e0200000008acab5251abab51abffffffff0492fd8c01000000000165fee254050000000005636300ab6a1edb920500000000009689cd000000000004535100510758523f", "6aac52ab53ac", 0, 1547643705, "cdc6d42f9411968335351df176302cac006439309770873fa4362c9525f5a87e"], + ["010000000421b8e3b3529b233a34953d06cd872e63438ad8c5be14f61ddd740455ae023bcc0100000002ab52aa686843601204c9f997ae222f1d2824663078ed9529e440ed95065b232463bf98cdf04003000000090051636352526565abffffffffb8101e3cab9364b5b2c2d4578c582aa63798b6737ba452fa0c6cd48d46e365e80000000003526a53674808b7feb17ab0d64f70dfe7ff18a929d2729ac387aec4f3e419a20044ad902ac9052b000000000451ac006a0334c49201c3b4b00400000000086a00ac520053520000000000", "6a5100", 2, -406186260, "68d50c5044f20dec908c130dd564423e1542ca534bd178562359d986372ebf9c"], + ["02000000030d3da1f191d14dd4246aaaadfa579efd7dfed3e7f79fd6d00b14b89cb7178e170000000007636aab6a63006a97973d6b5f1d240b4edab3b05bc9f9cb441872b06d1498afb722710fb8a0c287b6a314da0000000009000063ac6352526a65c8b33dad1bc3da57557a8193e0966e1b46f7e363b6c86b821141d48f29df95ba57a40d280100000007ab51ac6aac0000b6a4692f048099f601000000000600ac636a5265232a0d040000000005ab5363acab5e5394030000000001ac463f18050000000001ab00000000", "51abacac0063", 1, -526889464, "5cd5d5406a472a4983786fb2be189b9bca61d053533c46694a19bb59a23742b3"], + ["0200000001b0f2292d81b1dff7729d4f92fec98ddae050b6c47afea1516c9db10503ad9b4e0200000007ac63005251abab9dacfe6701d197e80500000000040000650043376d74", "ab00abac63", 0, 976930118, "81e992df56e6185bce6afebf46d057476c9ffbbce7cfee3b89882c6a6ed19e39"], + ["0200000004d6c6d5f82cccd52999d528047ecc9ef6043bed38608e9d439045833732b85a6d0100000000a5fbdbd13bb5c9c947befe37e3172c5e61151cabd3ec4b969149ad6fb18f6c37defdc401030000000965536a51ab6aac6a63ffffffffd26738b65b91e90b83792af815cd4781f4c43349aec9c360455e8af300154a880300000003655165ffffffff23705cf72443587f5df67d2a6d5cd7939691e2fac76bc2e695ea0aeb607dda7103000000060052ab63ab65ffffffff04fc890e00000000000565ac005353c5a0e5020000000003acac5114525504000000000200002139da0200000000085265ab6a52ab655100000000", "acac515151ab516365", 1, 1792040527, "221de64d19fd6e73d6d31ae9da221b4c90dcd8c52383f276715127f1d99ef2ac"], + ["01000000026478682008108f7d465202950ced694534de3ffa4cec4a266f0f20e79e9271a50300000009ab65ac52656353ab52fbb6943d6da041cf6aa18b2763671ae33277a08251aa1e580b5f59836a16ce14048c1849030000000700ac5153005163ffffffff0364457605000000000553526a006a14b33505000000000400abacace4d57105000000000565abab6aab00000000", "000053", 0, -783643302, "e281b5671ceaab4d02f4a914e3f294de22d751eeb32613a93711b14cb60eae61"], + ["02000000011786406f03f9ba90e5d17291916df1a17b6b002919c4490119d17ec6e5a8520802000000085253636a53530053a30822340198ca0f040000000003515263a704d275", "ac51", 0, 1071539603, "c9bff11c2631f772f06f6dc6a171523b57c2bb5c51ccdcc3bbe3af9db589acf2"], + ["02000000024cadbab1943d741760455a7b3fd74b4c77ac6d322937c2426233cf9668b616f3020000000663ab6a52635204c05c39adda0956cc022e72857a9ac4d891803179d8996bf59272c3f769f58bc3d721d60000000009515263abac51536552b41df8b102fa061f0200000000036a52ac9f5b0801000000000552acabab658c5a1155", "51abab63656a53", 1, 191341541, "9055b0f98dbf31cafd4a09132e5b411c1a04d4fc24e6532dc1afdd684953ee5c"], + ["0100000004431aa8b3a0b7b11740969533becf85f442bcf6f8e8f05bf053775ae67ddff1020100000007acab6a6aacab00c2aecb3425c9282b7bf18b68042244bce75d7c6057a1e4239dc7fecc84fd8473cc67575f0200000000ffffffffd901a4122e6dbfa9c6c58c0594e194319dede0f972e494e6f53052b8f0d09b8c0300000002acabffffffff6f79c54f1a671ee3e9e193771ac1bd0dc034a90b5fd90a4daa34b95852a9f36d03000000015348efd5220117f480030000000007ab6a53ab52536a00000000", "63535251", 2, -2057229989, "52e276d938ea5407e8f9238f70181db1924d0283438c6c7dbfca3108c9e7d858"], + ["02000000027e174dccd248d88051374d4262d1cc06d26f4e358df6d8baf5f13ae3012a8dd802000000075351006aabac5202b4bfd1aad16572847168661b08346cb12ae982951e3cf62f81bba6356eb18bd1ce29de01000000025253891f8cb403a8f92c00000000000200ac71d6150200000000056353abacac3f2ee602000000000093101d3a", "", 0, -1837874484, "54661a6f97dc7e029d0ba296dad9b52fc902c006771f76d18c9cd8fc5b179d75"], + ["0200000003ea5c5c8d08a62819640226f53d0b910df8c3a0cc9cedbb05def2b4ba8cf7eba1000000000900635153ac6a65ab65ffffffff411bf64005a0c595b129876d7f948970fabcccdf87ec632dc232ebe3f87808010300000004ac635152ffffffff60bc48146d39862f909ce4e01e954106e4952d8f07d757560f04da7534ab62ae0000000007ab52ab6553ac005da8ec020310bd66020000000007abac656352ab53afc0490300000000036a635162ded602000000000251003dea3fec", "ac6a", 1, 2085450019, "3b4344b4069937901cf287d49fcb381f7619eaf0383f68e2e873428313fc9a82"], + ["0200000001385e4108a193ca409986f5996c06648b0c63cf0244a0133d2f663683b5824ee203000000026aab185f021703aba17d00000000000165f4f51b020000000006515251535165607b810100000000096a006aabac5365636300000000", "ac5153ab", 0, -1237653078, "0145a5bae95c2aa7378de371f82cb8fe95055c1309916a49b50d8cf8e8b98d3d"], + ["010000000490c8335bca182152021e95c6f36d9cbde6ef0bdf45c5d7c37919a3f52f815f140100000006656aac526a00030ba241ad8dfa6fe36cda34f14a8f86b7c97a030e0ef1f9f0840cdcb78c54c093e69a26020000000600acac53656afffffffffea5a3099e6163404fd96da8ca93dc7bf9816fa5bccd92a8851a90ef889bd13b0200000004ac630053f44242d90e72c7d82aab48212eb7a9b1a00bd0b440575b1a571d9eb77b11ac0254504726030000000953516a635352536a633700630904e5edf80100000000003fafbd0300000000035152ac60768503000000000153b47a98000000000009ab005153655351525100000000", "51abacab6a", 2, 1783800036, "485681bcccd7376e06a0faa72de506415128a844db17239e10a07994ce84ff79"], + ["0100000003e1904a975bf36796b489e363c258349cfbcd967200d1bf4f5c4a7a6271151c09010000000465005352d55910193971b5f5464f863023e54908101fda36aad39f6631f375c39e47743eebd12508020000000300ac52ffffffff6625d0039f66e6b8cd63ffbce07e3bf69736453bf8cdfebf567064a195a79a0503000000075153abab6500acffffffff01be9818020000000002ac5200000000", "", 2, -2054174851, "7a6f4dcfc5cb7c73afd86e174a1215834cf525755ab14de2d47f9389f966f891"], + ["02000000039bb6da28199734d321e1777a2ede5f296d8264b11ca0189c323e0cca9eeace730200000008abac515151ac6a654d793e2e04ae6072618272797426ac5e213bb8c0328e3f22497a856206ead1b01c0ec5f50200000009ac52abac5100535163fffffffff6930e6fa61818057986eab16f252ba6293f7b39a2f6037d249e63303027e9d70200000007abac6352006551ee84174b0428b8f3010000000004650063ac8036d4000000000008516a5253635300539ff0ee03000000000600525300acac3d03c70500000000016300000000", "ac", 1, -1113805666, "08167f915bffb569ac7d1973cc7b15c93daff33a6bae07b273b18b7d83f8b34e"], + ["01000000016229d692889b02cda0ff55aef8bed43e0d585b7d64607c4c6a49f23eefed34b701000000036a52aca4454024022b061f030000000002abaca2b8d50200000000086351655351636353b9ec1966", "5263", 0, 287284499, "b8a62454cd8934a5fd7f457b613a55b1fda7fa0683c5c48313e86554f7224ae6"], + ["0200000004a6a07181b891e1a5a104553cb52dadb8e4fe8186caf65d18118fab1086f70c550000000004ab0052657208ce4e063a0260638e5636d4f103ec27299ff7813da99b7954a64a4d6517c7839175b8010000000253528d946e951d2b96a0744033625964527b72f15544d48101c62f29c370c1855cff1d5649eb0000000002536394b100c0a460de24d0093647ef46004d26c68ccde9f220aa63d0556eded232de11d7f1060000000006ab6300635200ffffffff036bbacb050000000001ab3fe41c0200000000016a120ff1050000000002ac6500000000", "ac00656551", 1, -1517937862, "099e1bdc28ae672bf0fdb274009b8fef8fc44bffeb3023f708df601525185062"], + ["010000000487307afb548b71beb22c1328ab70a1af0cf14927c9da05c777cd0352c1bb24bd020000000665516a51636a826982b16a14c8a5938551b8107c93e383c9b6ed74d300942b98b3c7150f626468ee84690200000004ac525152cc906c12f1782da270c8c6297699d68929e5aff53892a7ee047456296b23b5556d891bdb0300000001abffffffff0ad298b3042aa193978de4e673de353499850c484cb8a8a187409400d20978b5030000000452536a008748583c03316a88010000000008636565acac006a538731f50000000000036a5351b7044c010000000008ab63516a005353ac00000000", "", 0, 66377103, "2e1c7fe82a6d8629c8e22e459c19f5b96dacf51f56a27c7ff3add01f2aa67a0e"], + ["02000000032054190330a378ac147642fed1bb6d1ab9eec85e433ff6407eb05c9a411eae28020000000651636a526a6a6ec4f18cdc0b71945db371664d1fdb2a81a3fc86bc31c870ba4ed599939a7987bb91679e030000000700655253005165d06008dfe88c05c12bd25cf84f45459b04de85df708c6a2ab5a2199d1cfd5aafd96488fc010000000551acac0051d26c574d0103b2eb030000000006636300ac006500000000", "ac5165", 0, -1194681327, "0019578c26a80100b01be4c091d6ca47d251c4ce98892b67336a7cc035bd042d"], + ["0200000001c6a86d80b8b9fd7b04dc00a877b0481894aa66d783066479459109c7e4dae1ce0100000005ab5252ab6affffffff034269ad040000000006ac005353ab51049378050000000006655351ac52639ba0cc02000000000351ab63ee4dd0e4", "655200ac53536500ab", 0, -1898240252, "a78fc3b30929f50bebef9763c598f72c93eb24e40d6e3b95cb79b8ae94e6fbe3"], + ["0100000004f112c0e6399013cae9b92afdf06e3bb5da8349ebe6b0ede0d833370e7afd3295000000000163ffffffff2f6a984fbd045bd9cd1fd2846f35b05c8f7950b5ba1801173088fd61ed902f1e02000000070000ab53ac6a521e3bb593143a7cc448ad3cb6fb6370330c1e78ba2332568028a7ec97b6a7080fbcb524280000000007ab655163ab0065ffffffff01b299f686f314dce611bf2e643ef0fb9b1add0b8404d69f18e4a9a14ada826c0100000005ab6aabac65539a808703565a760000000000066aab52ab6a52e7d6a504000000000453516351455bc40000000000065251ab52536a00000000", "525351ac6aacacac00", 1, 2109207276, "2ebc6fcf9e5af00e6078af9b46e07669285c0b227b16e01dfd9a600d1bb0130d"], + ["01000000025ba68b2bf0aab1caa7b526d878005e0b1ec430a55b7ade84eef292b2ba6cd5e4030000000453636a00ffffffff2684b245293fde20cad8dae629f9c2a53b0ac578eb40ca5906a3e0b13eaf00290000000008516a510052ac51536c21131a015051cb030000000002516a00000000", "5152ab5251", 1, 1500971381, "003d08890de21f4b7db0f1008b4876f019e94fc032d673e0f1aab9d27721a2ba"], + ["02000000012d765ffe1ffe52b48c6c13fcb6e0354ccb76e3354ef706c3c62efe524914ff0e00000000026a514eeb852c01a38b62050000000007516a526a6a655200000000", "6a536a65", 0, 2002142639, "950078c0e4c37a93e4e761618c3d521cd2e8875698a5d68be5dcde0a264c2242"], + ["01000000023485c84c8db0ae17b0651941e474c84b78f789d8e7803391ab28401843323cd80300000006abac5351ac00ffffffff84eaeb40b6eeb32f80db1687e486ea04e0936ad12bf40b66a0caaeed61dde497000000000165ffffffff041b72ec020000000008ab5152526aacab5298865c050000000009656363635365530000c6c49d05000000000700536a636a536a5e2bb500000000000565ab630053c6a1a141", "536a53ac", 1, -1671310691, "c2ed98b0b3acf3b271d86c6c32ddffd2719b13b1503d4cc8e9685cd3f9c8da62"], + ["020000000229cb697202ec8e974cfe3b9b81bdaf5067d97d757ad4b17d95638d653914ea5d0000000005515251ab6affffffffbca557231a20e0d5fa846019923155abf6ed08c8fe0125ff274c55d8b01207ba02000000056aac656a53ffffffff0381a600000000000005ab530052ac525b65050000000005ac52ab6365106f310500000000096365ac65515153abab00000000", "52ac6351656500", 0, -1046067144, "f8b8a85905382b37e842df59e749003c054e549ca3a7b13889c28e7d79aab00f"], + ["0200000001adebe34a1395c260d8f093848854bf3d1a2e24acb02fa74e75fd2f81fd3cc9e3000000000653ab00ab0051e250a4d304606c2d00000000000465acab637851d40300000000076a005253650053cff6e5040000000005acacac0063482d290200000000086565005252ab52ac781173a2", "", 0, -1740115220, "92b6916b391d6991ec537fea273597c68a0645e91ae7f13b62d9959d3cfc7d31"], + ["02000000045fb27f739d38c0b3bf62260632e09a4b53bb31bdbf15daef876525cc2abed3860300000006526aacab6565a839612c2ddf06653d3dc97491a495c0f641662515b74d732f98671f32ba5d32f38b9f620200000008526a00ab51ab5251ffffffffcb3c03ca0ae8a2e98a78b527f68cd9300ef8700e0805e7fbdc44b5f0e9693f50020000000552636a6a00a66f18ac3099fb3ec97302acd9c9f8dbc0c318a9e8041ff114bd3c86fb4fdf95d48027e60200000003acacac03d4b46f011c9dee020000000003ac635300000000", "65516363ab63ab", 1, 898742916, "4626038aebc087668daf6733399d0c7b410501f3fb7e9b77e673e76a17ec9459"], + ["02000000031434193e293f9a5e8996e275e04397066c7d339e0ab12037b036ed26968733550200000004536a0063ffffffffe6b9456660c286ba3e4d43e8436b905ffb2f9402e4814d8674b262a40ef8010c01000000026a6affffffff7d4f2414abd13612755c56e38df087498ee69f92dde85a69b40698c382709e27020000000953ac5263006a655165eff3cea3015b583301000000000351536ab9abf17f", "525363", 0, 1955456161, "22e7e6932d556ee477bc05c9d94f49e5386494bdd38c2a1c047cc05ec1eb99a2"], + ["0100000003bfc55f8e2e6f44366779f6da27832d876ca2e4cf4a62934a7680cb7434af1db5020000000151ffffffff331f3987488cbdf01aec5d845b9dcbd8cd4ce04ce84997a7eaa7f17e18143ae200000000076a6a5200516552ffffffffa722a8e914114d0a27dac56a174f300b5f24616adcacee4d763ada9ba001754301000000008503001b01e9b78602000000000552526a6a65118a98fc", "6aab510000ac5151", 2, 443336050, "ddf079d304e9d681212e1ad424146bce6d418eb77aee8bfeace4ba9522fad1d0"], + ["0200000003da2468c1ce0775cf53eb7b21e2e31cc5dba9a3c0e52453d646dea300f858ce6b0300000000ccadacba0ab890c573e9b897cee40eecdb82df03eb144c0062668913846584f0b33ea6e700000000085253005300abab53ffffffffa492b4bde69d6922536d40e1519371c99385b79ddd7c712feb1d4604df5e2ee20200000000ffffffff0336515d0500000000055352536563445f8b02000000000152fefb4305000000000552ab00ab5100000000", "65636a53", 0, -1555918153, "8b64c7b180c0dc8a145215059b6e401588bfc1ca0fd581a32aa46dfae4291fcf"], + ["010000000156d1cee75b7fa67479f50645068ccfb92de7291a4d6766bce58cde35da09cc9e0100000004000051656c15b80b0262b40e010000000002526a0b7c35030000000005636a526a5100000000", "636365ab006a65", 0, -1707866812, "8db42028db14439900ad3f304d9e24db57fbc1c93ade68ec7542912a90dbf906"], + ["0100000003359b695c0762ebc5505669ccc12971912491f9840c72690ef7c2d79729c75e8b0200000007ac005300ab536a42b466d5645ae47886c4f1048f62ee850c581fea75afc751b54a70c4ccf0501ea9b9b38d0100000004006351abffffffff3e4016a6836cfcf7401d43ba82646b45f60f0d8f51e868d9084dd396d2943aa5020000000151c0eb140f019ed99f0400000000096365005100630051ac00000000", "6a5153535351", 2, 1113319490, "b7be14ee5efdc26438b97d337d060872563d1867db7c3987af6d8c0974de2267"], + ["01000000020cc9dbd66b47fdae5e440ae489dedc0bef531f8e68fec477c295b1ad88a27e640100000008ab53006a63535300ffffffff6e21ae44c4fb3d128d4714d9549aa47ec81850d12d35b74dfa27cb060c47155402000000066500536a63abff3e5a4401ab4c99050000000008acac53ac5353abac9a1eb0d6", "", 0, 272111636, "3b1d8fe41cea7ed46b659939bce377e94c0796e11eec8b5df04af826f3ed24c4"], + ["0200000003ce2a11aed310079f4ee8adcc49511679dc3b22dee98557f8d80bfbe20ce2105b0200000005ab63ac63acdc4030086d8a4f051fba68eb11d63a2766e45fe3b5f2b17a2a8878f891eeebe0885d5b4801000000015384dfb8165a56d22541d5f116ea2052fc83f742b03f49b385c3175bc842243d45a4af5188030000000763636aab516563c2346e54048fd0c5050000000003abab52dd859d010000000002ab6a8f1c88050000000005ab6aac516a3f5b31050000000009acac006aab52516565f217cede", "51656a", 0, 1362729559, "b853a631e3b89cddda8ee31f316029adb99f34877d8094a6bd65f0ed9e167cc7"], + ["0100000001246e3a83b744e16728d08abf6efd632227a80f38359ffc9f0f8eb7df809698bc0100000002ac65d1b81c25023cc9c802000000000752ab6551ab6a653b42ce02000000000153ca55a0eb", "0000656a52", 0, 1150771644, "bc556fe8d3632d5d5c9d8728ae6d56ebef06b5eb5fa5a93b0ca8fee75f63e160"], + ["01000000041f65707964520fab3995b7d6e2ce190f23ad6b455aff7296f998d936de54d9dc000000000352ab52bea35abd3cfedf37de9b640a0f015764235f6d4be67cf9c2e95fb5e8c6473480e8ae7229000000000853516a510065abac6de7560cfbfbbe1986ccbbe53ed16d66bd27e9a3650ade37ae8957fb17c6d5bec2ee98810100000001ac3c60f35532d3ff34676d81d88fc21ec7d09e2aa6e55a911f88e8d2c50b78229fafc2d9d903000000026aab7feb9806037c47170100000000066a6300ac6a6a417ecc03000000000200ab5fd9c4030000000006526a536a006abe1e039c", "", 3, -1306782123, "fa78c7d82573a1b09f873cf17ac8a744a5b3aa946ec67e6856c2d4d653177eb8"], + ["0100000002ab0e86404691a1c83041f7d2121423bdd018007c4b938cd9d7dcde77180723680100000000ffffffff67d5227becba4993301acb5de32cf266380c7365426b0b89b83811be39e3fdb40100000000097fcf5904d12a5101000000000600ab0052abac9c415404000000000551535251ac22159f02000000000253000df81e04000000000863526353530053ac243fee27", "", 0, -291599067, "e65638f696e477fec8129f532ad83ddfa9aca0f93089f303166dc66cc6b28fa8"], + ["01000000010ee7079df78c199b64bbafef5636271dad3bd6cb38a74ea9015a7852accc67b702000000025251ffffffff0279cec501000000000453515152e2f72501000000000851ab636551ac525200000000", "5163515265ac", 0, 1924885263, "c1a8555f461ee638fd4f461cd6eeaa0d3a5c942d4b0162ed8dad3c8a1bb90949"], + ["01000000027dd88566c1cb5a2f4ec3e5ee7307e000cba036f9af9246c0bbafc9c28234c76a0100000004ab525363ffffffffe558186d30db180ec09e595093f9fe242da990680b7419e366cce4be30909e1f02000000085351536a52525265f0d28e7203f020ff040000000002ac5162e290010000000006536a53515365eb5fee0300000000076a526a636a516334137e81", "6a51ab", 0, 976548022, "bf583dba8642ff8b8be76c5d68fe4faface885922940fc29ba9a14fcbd2c34b5"], + ["01000000049ee9e92515fb823adc3acd8f88fed1be11d21d3bf51e61b2abb748ccfbdcf6c502000000046a636553dae527d7b38b4a2bfd14acb1f71654c215608c4f994245afb720eeeeb020559bbcb2f04a0100000000ffffffff501d797e7cdbbfa4fe20c7644eb61acb4008e7f39531bcfde72623d0cae2fb9f02000000008b0358fb51a4bea6b4de1630d7bf6b9c5086649031cc1b76f353919ab1b180bd1a36c21a030000000951ab526a5300636353ffffffff03ae9ef80300000000026353523d650300000000036aacac8d591705000000000953535363515251ab6a00000000", "53ac", 1, -48945216, "afa38d178c98d4aeb959294c91d0c8c31a1068a78c4397ceea152e0386c6ce60"], + ["010000000481de201481a015f5e2c36543cb3d31b8beaa8e99cb6cfb4fc7798b24ff0109920100000000c8cbce54f7436f2120c6844800388158dbbe80de7b37922cd4e16f3f364020274121d93e0200000008ac51516aab63526ad5809d04a28a1303b59b3d86bb3be82533a70581583b0dd783e27925c5035caa6a2ba729020000000751abab53006aab7a090c0445a1e9f161e1d20d0437f29ea1e7c228294668fcd9dab36847e3855f90c8f98c030000000752ab630063ab52ffffffff0444e7b9050000000007515252ac5251ab60c49d02000000000653acab63ac519a7d7c0400000000096552656a6300ab53537c55750200000000046363ab524f1c75dc", "ab", 1, 1076485766, "9f2c5d930883093022a33359d835a83972bba6285edc79e59f4dc16787990a77"], + ["02000000026cc9bcc7a70cfcd746aa4289a4f3ece21fd3655304b0c1a43954b169ec23832400000000076aabab0053ab51ffffffffcfdc71638b07561f99fa971d7b1a164e0fface289b5b9bbc83e9a856b6f7e7bf00000000046a005365540dba04014f37ad010000000006ab006565535100000000", "", 1, -662245314, "b9fa90104f6b552e8ef77cdde760b2cd9057754c5b388ca9346b72a730b2dbff"], + ["02000000019f39745baff747727f61a40a3901c4a86498b94aaeebcd1810c80e7cd602769e0100000003ac535199426af2034f60860200000000009c0a9f0400000000016acb13c301000000000652ac516a006a00000000", "00ac52ab52516353ab", 0, 1127519573, "32e1b68b8824294eea6582ccc05300bd4d370056b5cd10e33a5c2c41211d934d"], + ["0200000001bd31e467599e391ef98588d11c4598c498b874582a8541470923c8aef0fee4e602000000076a52656aab6365ffffffff01c4a89e050000000001ab492453b9", "6a655300ac51acac", 0, -2101772118, "4b5c5cf0614eba49dab074c1ba5ab9e1250d3fc71537abee9cccd77ef9df1787"], + ["020000000431301234a0a07b177c27b6c05678120a797de409d56e4ab70b512519d8806134030000000163ccd3399a087503b544e1b0d18c454a7f20ba86e0b20ef1feded2fef8e4268c539bbf3cd60300000000d0afeb17da0697f67da5ddf8fc19eae86b338b177fef36114706d4acecdae0e94e0b0a0b020000000352ac521e5e76fd703adc844797d2c7bb79a9beafdfc02d6bec89c2510593cbc1ff188d25ab79e10200000003526a63274061ff02fd7992020000000009006552acac535252ac95f4bd050000000005ac6352acacb3db365c", "5100655163", 1, 478290184, "2d2e2ca2558dc73173af6bef8559a3b5c67d38de796321a18de4b8747c46457b"], + ["02000000042d38184883577bd5d5809f6ccb2936c0a7d33a7c2e55a5c19439c62781054e0e00000000016357494f15a3244f14beee7d408f78cca8c721e757b53a6d6b01f52476370a47da942b9b1303000000086352635253655365b9a0975570d0ec8fffe5b2e12c688254c43b9b197a732406e152c791bc40d33e21af20dc0200000000ffffffff8c691601dd56b0102bf3992213e9243563c59c0993993aef225228660572ccef0300000001634e9d6a290126d9eb03000000000453006aab00000000", "65ab65ab", 2, -1717571363, "051adccf354a223eac81a8ace79b8cf4c22d4959d22950bf69a57738d1b9920b"], + ["01000000016adeb36953c0b416c7c4e6c6517bf6aeb9a45520a119dbccf964e37c179253d60000000000ffffffff0451fbc301000000000152322adc030000000003ab6a65dfc74801000000000053b9ba020000000002636abec211f5", "", 0, -1808040290, "db5e00c73c6e50139201d696e444d0bc569a181a24c096f102c5e6c0b221670c"], + ["020000000283c60087ed96e3042e077fbd8af73bed8cb16ec06c0a22dfea748d65a81bc0ec000000000863536a536352535307241c5921ee465161cf5a7e507a41ef1888c41490daf3e382bf2925f738786bc5ee3062030000000753526353515153ffffffff04d85c6a030000000006526a5351630018feef010000000004515153ac360beb0000000000056a0053acacbd72f0000000000008ab006553006a0065ad0a3978", "005265535252", 0, 1755874496, "68cf1b978a15a165a4e9d8c6543bed41ba05acc7ca17bf20020a4a9c3bc3b925"], + ["0200000004f9e6238fbd7a124025e366caed4c0574f6a0166286d0d96fe7abb3aa20be3bbb000000000165ffffffff9e78b25a941e90484dcf21bf722071990615d2c1cb88a4ce3334bb3b24b09d2401000000075300515265ac52ffffffff3c376bd3ca2a074f3e0c267328d8b6e340e62c8c716d1e23c176a5ffad1eea140000000006ab0063ac51abffffffffd87087bd4f109e4054846ad5eebbb156842a6820832b93775c6bbd0fb9686ea200000000066a5153acac63c3c0307b01cbae6c0100000000016a00000000", "00", 0, -1039306889, "123d89f5772b28a4706b0956fc7ce5b06142b5ebe2bb22de272232a7035a8f1b"], + ["0200000003d57a57e2e29c99fa2137b7b71aab708bf7183849af61216cfcc1bb09d237e26b00000000035351002f777442dec8df64de736ebfd7436611df5d0c0c77e90e522f9ca83857f60948c0c3ff9c000000000353006a32d66504c06167b484a848e6ed535cf61704daca16d153598695cc3483af5da3c56812180000000000ffffffff01ea3dd0030000000006ab00ac65516500000000", "ac51ab52ac65", 2, 700729943, "882d7a86081bd60434a0b12992051ee3801c7f7bf2ec21401d5b7b305bb2c10b"], + ["0200000004350451de2ac8daa12be8741774165e5f956a6c30b6656389fcc30c8f5ceadd1c030000000100ffffffff91c5ad2a8bb1ab605744cc2108d97a9830601e57ac05d1ca5ca79a02667ce5430100000009526a6a6a6a00ac52531282777b86c2a5fad88d18f687ad50d673394a74021f941ee91673727962598c0cca99380200000005636565ac65ffffffff0a839c24521958be6cda94a6c72e9b3a9c18865f21c3c49582f4fe46b820409e0100000000ffffffff024ce00402000000000953ac6a655152526565b30c6203000000000151fe12e0eb", "5165ac0051656563", 0, -2014179624, "0e9d18a51ace1771f32f457c6f6a723bf2a2793dfdbe272910221b3eaf6921dc"], + ["010000000144a4c7c25652b22daed606c753e6e32069eed26dbf8540cadafb50f4040958090000000007515153530065514ea4441902cae6640000000000056a53ac525239ce6b0400000000002df5da88", "ac6a6aab6351ac006a", 0, -1010353860, "448f971190ba6301523c5badd73c6ce7079c168a134e11a853360da11c11e9fa"], + ["02000000019ddbd6db61cdca8d529a4970f9fda20c19c305804104d46f495d0f1f0efc57800300000009656a00630065ab6553e263467204347d0d0400000000066a63510065510bfbf6030000000002526a962815040000000002636591ea160300000000000905ecbf", "6a52005263650063ac", 0, -1172862841, "e571aafefa7f95c76e2b838034d7dfc99ec4270ebe6ac2dda03454dd8b216d6f"], + ["0100000001700318fb35789fac6f2c6703c3a50c30d77185fa094f9960189ed3df25805c3b0300000009630000ac6a65636a52d5e96c3c03c99dad050000000009ab00ac6351abac63635f42bf00000000000900006aabab63535365b2bd730200000000020063390ead82", "6a65515351", 0, 282451787, "a32dac9f6c3928cdbe1b812d5c46e2da0e909fe43c87e684ebbe52fbbb9f68b4"], + ["0200000003cecada5025a61fbd5295aaf7666d2d9163d6cbb8b270f12fe1bb9e5c5b0fec7a010000000552535265acffffffff7b12842077571bec86c0d4b511554aafc935072986d2fe12249f023ab5754a9f010000000153ffffffff58d7906d1e82cf899048db829fd7fef3fd7baedb27ba9c2bca6d136ef3c0783b0000000009ab5300526a6a526a51ffffffff040c1b1f0000000000066aacac63630080c95a030000000002ac6a93412e01000000000553636a005373799505000000000265acd68a35bb", "abac", 2, 284825211, "c6eedfcc16d30291dd1a86241d90315176ce01bd4357fd8b6feadd8a35f08395"], + ["0200000003202d9199a70c62da6b609c8138b6fd6e52995b83f159f2ccd2401e46f493a8a40200000008530053ab655352abffffffffbc321bbcb708a233833d72d55b6194f89b1f2365d10d17ece626e793c17d1d99000000000165ffffffffebf417c86f4c571b5958e12fa094d080ff65a3357064a8cdc13f3bdb3837cf8300000000020000ffffffff0474f497050000000008ac51656a5100526323d8a503000000000563ab53abacab8ea80300000000036365ab03eae101000000000000000000", "636aab63635200", 1, 1890352756, "f8539d6fbf1e65ebe86f8b057e82bc3e4a9ef4499be9dfb33a75c7ee5415ac54"], + ["0200000001db0b0ea1ec0613d4be33105965a557bc8f77f31849bdbfa9f4ccafee65fc3d910300000000ffffffff04ea964905000000000253650e0be40400000000096553ab6a5153ab65ab98c65b040000000003abab6530f6550200000000010000000000", "ac655265ab6aabab", 0, 1624944571, "82b62f41368accefca3fbcb8b9a6cef7bc2be191bf171099d79560f241416316"], + ["01000000033a86237b56f10fa593cf95c19d4573879b1c44ac33160aced98091b9d4a3cf9b020000000400006a52cfaac9bb09ddcff0ebdaab0610b9e739c0031f8dc4eb661db92ac646824807aeeefec2ce02000000065351ac526363869b6eb174764c2ecfdecf130a2bb483ad9501df0596a5df5df124860881cc37ce35c7690300000000e0c251eb0298cbdf0300000000046a535100402604040000000004525253519359834d", "ac00516365636365", 1, 1609440258, "7d936383ebff501e4ee0c8025ddba4c4da4bb147404a0f3194eb9d7bc12ae23e"], + ["0200000003ea4dc384231b376de2da9dcef72f8255be8ae6d980705f9b9fd4fe7f00d1890e0300000006630065655200ffffffff05e9df6d7ddd36a283d0723acce93f51c8c4238da5086d5f5b0573a4a4e43bc80200000006ab6aab6551acffffffff2ee1574b1c7d07cb9b66a6ef69031e1a1226e24ba6a8eb78f132f63c8653e9f70100000003abab51a31f57cc01734b270000000000030053ac9d5cb657", "00ab00006551acab", 2, 572495442, "1586ba9543f61ad759bef49ea3eb68e57fed0ed630c3f378ae8f1b4dcb0153e8"], + ["0200000004cda9f7d14b29cb83c87a55b8c8baaa488433e4ceeb40ae4c0d3c84c88af6d97502000000066aacabab6a00ffffffff14ceecdc25e9518877db35708bb350cebd3b98f3b63c9f7bc40a411fc8f73c80020000000600516a65ab65ffffffff5c5aab71d663e1e2659ae1f6062d6494543ab829c362354cc3d9618fa14695ff020000000752515151ac5351ffffffff7a4c1807416f5bdfafbe2a28e19080ea20f5092009ea3d9d6114126fa12e935600000000016affffffff021dfea5020000000001658271da04000000000465ac655218b1829f", "", 3, -1856740566, "118cf02008d6499517113058e8aa5daa10d8a811cdc38fc51d9df8a71fe0bdb3"], + ["02000000012d0e9483849550b11346c73156b82a0e50e8602aa8acd889984ac6c3d2523225020000000353ac6affffffff03411067010000000006abab630053ab0a97a6020000000001ab33605c03000000000300ac513222df37", "0065", 0, 1332731574, "960ca6d26c624348885e344511ef8c06f46726a28d9b1b45cb26de7f2d98112c"], + ["01000000013fe00aec44ef8bfe5a1fee512f4165631e44df68c9cc044e92515a34478866100100000008656300ab6a6aab533e465cd004240a4102000000000653ab5353526a8796eb030000000005ac52ac53ab34471c020000000006ababab0052ab23448b04000000000865ac6565006a6a6aaf28ccd8", "abacac6551", 0, 99774902, "61294d1b98e88100e94851997c4a2b965b6ea4827c0cbc9818149f9f9fa02af8"], + ["020000000176eb169d3a00a8c41a6b4aef605c74f0022dada8202391ae26a0e7504ea1a91d0100000003526353ffffffff02c57ee701000000000400535352d84e1c01000000000453abac5200000000", "ac6552ac5152520063", 0, -2139822938, "74feffd5170e96d6ffd369871ac1aea894f7f864e3cc5e3b9c12c5072e905aeb"], + ["0200000002f853eee828e51c5fe0b53c64c0367172d63eb0246ecef931248e77471affca460200000003abac63ffffffff7efecc76778a489e226ac8ed8ed7f8e2ddb10bfd00244549c90018ee916074f200000000040000656affffffff03a2499601000000000800005152535151631fd52701000000000852ab63ac52005252a00f94050000000006abab6aac6a6300000000", "ac5351ab52", 0, -1611572682, "9845b64f3f08cd2f213784d3d6573255449fc7f6c199a2c96a3c6f52f502aacf"], + ["01000000036833feeed954452380bff7418e099df11198b4bc5bd3ef9c2f15e6af421026870300000009abacab006551abac65c0b0715d51bbf3b2b25b48b447d65095c846f2aaad40dfb7704002d8ee7a57301aa12311030000000500ab00ac650012dd754d2af915ad0677847d02d1ce0af99225dab09d3c16060f02c5bca7184e2533ed0100000008acab63ab655153519218324803506839040000000006ab525353abac9432f9030000000007005165ab000063b67a33000000000009abab6363005363530000000000", "6a6551516a52", 0, 423285726, "9f1a6c8b1011e1012f77bae83ea4948b863e885814832d5849b1ef4e69329fd1"], + ["020000000479f246fbf186ce477d1d70f3a11b86e258c3a5cd14c5d8bbabd14ef344c727b50200000005ac5152abab77e46acf48abe83a5c4b22f5bc8598b5bb98fd55742fd710e11b671bc35dd52d6c1313dc03000000056a655153651e3b897002bf33767adcd9596fcf09d2bafd0cceae284668ea083822bb8569a2cc817caf0100000006005300ab6563ffffffff4a6be6d1e7fefd316287a1688fdc8e51f00394d20f9cc8d819fddb9b7fe19e670300000008635100ac0000abacffffffff03fd360301000000000763ab00510053ab99046200000000000400ab52ac241579040000000007ab6500ac65516500000000", "63ac0053536a6a00", 3, -1718297630, "364abd9d00d6058440524896f74ad7822858b5fccf499b49d7a972158c353315"], + ["020000000176c12e73f9ebe02197cb7c80c9f9cbd54fb55330e5f1d7e8a3e5739f3cdbf23603000000035200aceee3779602ecbaaa02000000000952655151515152656372e7d7040000000001abc3880a41", "52", 0, -2025073260, "ef7caa75fc8bc3ee68a0bd19b3142dc1ffc83a2f900427a4750f0a6c57082200"], + ["02000000043571e1054f92a721a2bf105622f4b03ebad7d7997eac390fc98484582bdfcf9b0200000006006a526a63acee4c80acfc4e3762b7f2d53f369adac073a9ae7519b328c4695789942890cbebd56a96050300000000aa987660f53a7084fb9e760fc0dfaa6f2ea41cd666bf7f4d02f033ab17593b77adb3364b020000000200abffffffff4bad8d00150abda1d79238d37e2d34f320492235732cf9822897218e20b9aa5501000000025351ffffffff0416f2e7050000000004006300ab98bf74010000000008acab63ab53536363ba975e02000000000665656363ac634dd12a02000000000553536aac0000000000", "5300", 0, 723084505, "5c9bea6857f711439da991561840019f531eddba49615ceb3c222528fa2163fa"], + ["0100000004e2972679caac1a5f458e5229115434c8ffb8333fa618e95c91b7e3fc9405e1fd03000000016afffffffff1aea7a66e84870a73fb16a0ce04a692fc86bfd956e29b14b5c49903586d10240100000004ab65006affffffff6d2d7927b49d142ba6085569eadb74d4222a3f38db9fd397cce46240699572a60100000009535251655363520065ffffffff79b46851b1f0b02bbe11eef1b2021c3e1a2575f66d85f663eedba3719d75a131010000000351ab00ffffffff042d9b8f000000000004acabab52148bee010000000005ab6a535365c119cf030000000001ac3dd06f040000000002acac00000000", "52acac6351516a", 1, -444097911, "8d9d867d878268549b0a8739f4db96189875c6e24b26ab04f8c776a99d545d9d"], + ["0100000002c050eb51a0b95dfc0fb5f3512ee9f37bca681fcb0575c01fb6383a1a4ea52f9c0000000005ab51ac636557774ab67fc263a8c2103b6337096515af94459bf98a4a640247f61568efb6a6494b445b010000000700656a6553ac00ffffffff041b90fe0100000000016a7f48c70100000000036565639c712d050000000001519ee338010000000001530639523a", "ab", 1, -1137467087, "72ca428f3497fa83011cd70feecff46ad46eeb2caa82c7b6a23a94a978da83f8"], + ["0200000001ee7e4c7aaf8041ccfa537815746185d9627e506e3462d2a664d72ba6f27920390300000006656365ab51acffffffff0352e7f70200000000076a00abab005153ce2c10000000000008656353510051636a80b440030000000003ab6553797ad5db", "65ac510053ab63", 0, 500678194, "08e1d79e739e2fe23f9d67a2809148e587ae2c4c1cbf95fe65830be9b5ee72a2"], + ["020000000200624e196d3d258148c3eb9b364a7b32ff56ab5e0cb153828d8eb6dc3820b363020000000863515365ab63ac6affffffff3a2be611251ca66afcbe85dece9c8d99368a3c7b7aa241f7b862adec0c3ab06a010000000300ab53d6224cf202035dc1000000000005acac00acacd4f7a801000000000600636552635100000000", "ac5265ab5163ac6a", 0, -629302397, "ad4b9e666e1f1063e6d5d0609960ba5f8170a620f91d46bbd81f40f21c94024b"], + ["0200000004c0a9ae8929a05f674f31dff15305d6e2c7cc7d41e173f97980e77f3efbe31975020000000165b4ccea27ff27f98e5c7c19c598d70fd1797797625e3593e1cd278d99a7b8f71cb006f2a80200000001abffffffff3d25314dfe45fdd063b4cb899ed173f35f71db9fd3e8daa4b5d1759b61a0a23f010000000865656aab52650052e903285d80975f4daeeef4fbe9907e3d84b2c5d6a556b9976ce43ca757356a04a34a776c01000000015370f82af0046c0f450200000000030053632616760200000000080000516aacac6552ed096e0500000000096aac52ac525300636af2a62800000000000851ac5363ababac5300000000", "ac6a", 2, -1961665423, "a64e4fd31f87df1123f58cfecb7c73d9a9a1464473a69be600c6fc9478fa5cf2"], + ["0100000002c0195e2d09f916ac4230f0be718f3811145a0ce9e63d091bffd990daf91f5980000000000151ffffffffd67bf6004297f0c9a82bc970ee408315bfc8829447017c7adad518d568488bfe01000000086351ac516aab5253aded47900278830b000000000001517f0484040000000006abab005265ac00000000", "510063", 0, 1486335500, "a32d778a2a491d1046ffebe8ad13deda879ea454f63905eecf03d0d46d3b5790"], + ["02000000026fb6f39de5abd1c18a6ede2bbb6c970a6c28d3c8e41d6163c4714bb4e37df1cb0100000008630052ab53636363ffffffff5e9716b20ff4bcdd8a15ae02a123ca95ce8b6c9c0e4fdffe8fc2fd475b2853fa0000000007ab51520063516ab86e1c6b03ee9b860100000000076a536551655253de6f21050000000001ac36ce89040000000006ab525363650000000000", "5163ac636352ab", 1, 1623104627, "1be1c2a7c1aae559fb1478eac26932bbabc15a90374669dbdd4314eed62473cc"], + ["010000000224f18c7435e21af1429197ff06d68ee24ebaf705b26e84f4bcc47620b7a17bdb00000000055300516551fffffffff47656500755316fa271604b07060d883443740bbb89166486a17e2b9c0943af0000000009ab52005200ab63526affffffff019b94fb030000000003ab525100000000", "5200", 1, -1544938889, "7652e1b2d33755e90174c6fe1984d9d5b7e79d1359f161cfbd55715e612ab1bc"], + ["010000000393e67e33c27ff2a569ad2cc4e7da1f873dc3f91b5f4c8b207eae03be5b2339700100000004ac5151008f2f34168b0d0460ebb82298a9ad29d1039a82be8a2666afadd3918d7c09fe1ac82390e90100000001abffffffff665e7b898ce6462ef785bf0e5a9abb90fb5901e5ecc830589e16e47e0031b6360300000005526363acacb1a1172603d4b9e20400000000009ec69b020000000003655153c45bd703000000000863516300006a65530ed7c485", "52acac", 0, -954987013, "cfe19e6b8e92fa332df754d543a6d5a76d20258657f39cee9e81f4ca0c10ef0c"], + ["020000000467f24a1d8348604bdcd121e1cd69c84f4ad6980c3034647145be108c38341868010000000800656363656a65abffffffff78cd448652c32be8ba8a0fbbe0a01109181d73f0f40ed837f703113152c290e70000000000ffffffff9e19d3d5cdd18ac9be0d880a1ec6745da163207431e46db5ce8bf3edce83f9da000000000351ab00ffffffff909c9cab6580823e3f7ce29df3218b10c0cc58ef599428dfb1afb3f71f5477830300000002acabffffffff028ff3b202000000000097780c05000000000763acac52520053d5859248", "ac6a006a6aac6a", 2, -507148742, "3c4e9ac3400fab90e9d6e5679f077b01578b590cee8e4d5fc60e018bba965cef"], + ["020000000362086760751f24591432c030edf964d31828f771feedd9eac367916fa349aa210100000003536a51ac0a4128fa519d88fef33135c94d5ffcf7ab7513e6f0732517e11815482c6e6bf3a718a20300000000ffffffff5627c5e3ca5a856d8cc980a986ba94c039b909be88a86ad73a18e1afaa6411dc02000000066a0051655363b1d9a5b90404b483000000000002ac520a1ba7020000000004526563519f2b29000000000009ac6a005252636553ab46dfc6010000000000134aae9f", "5151", 2, 349590567, "1281961fb5bf06b854746e352a785b93370248dcd4f488ba30f45836e12fcdc5"], + ["02000000030716268bdb33c042a3beb465e934b120f7cf38dbfaae19716c41ae32154178da0300000000ffffffff71c2d1e758ca65699892655fcfdd107e8fdc8c7d9c6cd2ba0312fb3d87a1c110020000000252abffffffff5be3a36c0f6db027199653ca59302d94fac172b8a02ac8575051c6bc21c4af4a0300000007ab530053ab526affffffff014366ef02000000000800005152ab00655100000000", "6a650051636a65", 2, -1266412110, "a9eef99cf4b5ea12f47ae8fd9ba1cc4713423098164dc438b5f14a5547db5332"], + ["02000000027f86f2baac3844f3d2a8f7f6cb09df437555e0e2d2664aea71b5ee4bda27e9e201000000016afffffffffbe15d2d4004466f992ca3122fb389c52583ae1abb60f78fa71af5271b767ceb020000000263acffffffff0382b767050000000001632b6e350000000000026553e6fd760100000000075100530053000000000000", "655253636565516352", 0, -587195013, "74aaadcd682a90d8dd8b03cfc0ab5a7fc757027d2656b268aaf95bba80cacdfa"], + ["0100000003093988f73d5c0c72e9b3e517c5b44fb5675b6ddf03ff9df53e7437156dabae60020000000752acac526352acffffffffc506707e4b73c5baf9ce136c48059b5931ba67fe99cc829ce5a6c6233d51befe0300000006535200acac00fffffffff182453ebea0c72f7fcb4ff48d4543d3702270922d3bac16ef1626fadbb90b520000000006ab6aacab63abffffffff04fd8ec2000000000003655365aec9c2030000000005526a65526a595239030000000007ab65ac65ac6a6390abb001000000000100909c8ecb", "", 2, -426939433, "eba1a3eba4552626e131c068a764ad0567681a05ff8fdff76638dcccdd268d0b"], + ["02000000035d286021f63c81fe46edb7c3a12d35e837703c3430e705529f6345820513ee8400000000056553006565fffffffff67652e0c0d4d9b94799ad8ab776a8db2be3a002655f73a4e6539838667246430100000003526551a7984aba755e425e9671212019b3413932764750f25e675087773ae6d6d83dce2cff66de030000000100ffffffff03ecbc59010000000005ac6aab63652ac2b8040000000003536aabef76060000000000026563b7e2e984", "536a5152ac", 1, 631327355, "b42f3c54cf124d51d65f95f98f0fafb7d970d2b6cd82bd9587996bd2a478f09d"], + ["02000000047a6179c6ea2b861ed284feb278e244a686a27f5e247ea84b4e53a017c61ef9a5030000000900ac52525151536aab47e6eb875edb6f7a7c1aef8cdb02cdf399472cc553e22a7a9c3375cc2a6868637d7d910d020000000651526a6a5200ee6a2887325837fb057ac6ea251f7e7cae6aac33f7dbf5e72b2e7d843371dce122d5e3fe0300000000c1cef7dfddcea86b89eaea5b8302431c31922ec5230c3e94adaebef5048557b480e47418000000000752635352005165ffffffff03cc4cf001000000000851005365656352517d696e0300000000009a2b42020000000004acabab534824291a", "635252516565", 0, 1107121172, "1b926c18a49bc954db9978708d87ff07aea9d5f11bd1ac242805c323920719a9"], + ["02000000022ac065c962c12e53a8627f12e126d2c9d2cdd0ae4f204b5e38313b30bc7eb7480000000006ababab536300ffffffff2eb51b04d9b2c0143cfc518b2ce96518ce1cfc6b64a211200bc7e283ba9d30bd0300000001ab57de2a5a045560440400000000035251524e1e7a03000000000951ab636a51536a0063979923000000000000233054010000000005ac0063636300000000", "52ab006300", 0, 1400427974, "6d010682693017f65c5bcdc3ae79ed030eb7a328cf69b8e01ec784eae7e8e507"], + ["01000000020e760d2fe84d27eab844b1e8eb03b647ef9f387cba695d53ca900326bbe4eefd010000000465636a52ffffffff5bc3dd42389bd0404bfd70a7b5907787aed19bb75757861d6b2f347b54c98a3300000000026551ffffffff010b0adc010000000006526a0053ab5300000000", "", 0, -2061588591, "6bd282b69577caefff717fffe406c022ecda7f0e7f5c5ded674ea098f203b40d"], + ["010000000130cbe2880eb8678f5bd0a5a9ba1b697be70fdc6aeab2db147f2ca725edef21d6010000000465ac53abee01a60703d3dc520200000000076551535300656a3f18c80200000000009d45b1000000000002536300000000", "006365536353", 0, 489837972, "66cdc393516e3b32815d1848c363a7731fe7e846beb10ee3931c9746fb836493"], + ["020000000444dc8449d39419eb03235a8ef94cfe7e69c66695539e20ea5a2b4ef2b4bb6c5a0300000000ffffffffb6317c206fa322f90fe6b2ee948c4fe727240848d180ff018947bd734caca60e03000000096552520053abac65ab04ca33642df4fbe93300bec4c8cf1dd0f6a2be0fc5effdc5dd7df901b884e50283f8b3f60000000009526565ab6a52530053ffffffffe7edd32bce9d815ed943041c031946819a0ff0533312e6893ca07963390002950300000008ac63006a00006a65ffffffff04d0730704000000000953ab6a655165515265e05e170200000000030053abca314c0500000000056565525263a3864101000000000000000000", "52abab6365ab", 3, -1174342318, "ad9b2dad4d0829f53ae86717ca18d62798f5cac5f75fc8f98d6107f8a1ac2a9d"] ] diff --git a/src/test/sighash_tests.cpp b/src/test/sighash_tests.cpp index c98ed57759d0..89a731f567ce 100644 --- a/src/test/sighash_tests.cpp +++ b/src/test/sighash_tests.cpp @@ -96,7 +96,7 @@ void static RandomScript(CScript &script) { } void static RandomTransaction(CMutableTransaction &tx, bool fSingle) { - tx.nVersion = insecure_rand(); + tx.nVersion = (insecure_rand() % 2) + 1; tx.vin.clear(); tx.vout.clear(); tx.nLockTime = (insecure_rand() % 2) ? insecure_rand() : 0; From d946f21bd9d2884bed70a46a3cef5256ab31e0ee Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Sat, 11 Aug 2018 21:55:56 +0200 Subject: [PATCH 044/400] Masternode related refactorings in preparation of DIP3 (#2212) * Split CActiveMasternode into CActiveMasternodeInfo and CLegacyActiveMasternodeManager * Use CKeyID instead of CPubKey whenever possible in masternode code * Rename activeMasternode to activeMasternodeInfo and make it a struct * Rename pubKeyIDXXX to keyIDXXX * Bump SERIALIZATION_VERSION_STRING * Fix build error after rebase * Fix compilation warning/error with clang --- src/activemasternode.cpp | 108 ++++++++++++++++++------------------ src/activemasternode.h | 32 +++++------ src/governance-object.cpp | 22 ++++---- src/governance-object.h | 4 +- src/governance-vote.cpp | 16 +++--- src/governance-vote.h | 4 +- src/init.cpp | 9 ++- src/instantx.cpp | 22 ++++---- src/masternode-payments.cpp | 30 +++++----- src/masternode-payments.h | 2 +- src/masternode-sync.cpp | 2 +- src/masternode.cpp | 77 ++++++++++++------------- src/masternode.h | 32 ++++++++--- src/masternodeman.cpp | 72 ++++++++++++------------ src/masternodeman.h | 3 +- src/net_processing.cpp | 2 +- src/privatesend-client.cpp | 2 +- src/privatesend-server.cpp | 10 ++-- src/privatesend.cpp | 28 +++++----- src/privatesend.h | 4 +- src/qt/masternodelist.cpp | 4 +- src/rpc/governance.cpp | 18 +++--- src/rpc/masternode.cpp | 30 +++++----- 23 files changed, 277 insertions(+), 256 deletions(-) diff --git a/src/activemasternode.cpp b/src/activemasternode.cpp index 7b262d6bb22c..c221dae07bc5 100644 --- a/src/activemasternode.cpp +++ b/src/activemasternode.cpp @@ -11,19 +11,19 @@ #include "netbase.h" // Keep track of the active Masternode -CActiveMasternode activeMasternode; +CActiveMasternodeInfo activeMasternodeInfo; +CActiveLegacyMasternodeManager legacyActiveMasternodeManager; -void CActiveMasternode::ManageState(CConnman& connman) +void CActiveLegacyMasternodeManager::ManageState(CConnman& connman) { - LogPrint("masternode", "CActiveMasternode::ManageState -- Start\n"); + LogPrint("masternode", "CActiveLegacyMasternodeManager::ManageState -- Start\n"); if(!fMasternodeMode) { - LogPrint("masternode", "CActiveMasternode::ManageState -- Not a masternode, returning\n"); + LogPrint("masternode", "CActiveLegacyMasternodeManager::ManageState -- Not a masternode, returning\n"); return; } - if(Params().NetworkIDString() != CBaseChainParams::REGTEST && !masternodeSync.IsBlockchainSynced()) { nState = ACTIVE_MASTERNODE_SYNC_IN_PROCESS; - LogPrintf("CActiveMasternode::ManageState -- %s: %s\n", GetStateString(), GetStatus()); + LogPrintf("CActiveLegacyMasternodeManager::ManageState -- %s: %s\n", GetStateString(), GetStatus()); return; } @@ -31,7 +31,7 @@ void CActiveMasternode::ManageState(CConnman& connman) nState = ACTIVE_MASTERNODE_INITIAL; } - LogPrint("masternode", "CActiveMasternode::ManageState -- status = %s, type = %s, pinger enabled = %d\n", GetStatus(), GetTypeString(), fPingerEnabled); + LogPrint("masternode", "CActiveLegacyMasternodeManager::ManageState -- status = %s, type = %s, pinger enabled = %d\n", GetStatus(), GetTypeString(), fPingerEnabled); if(eType == MASTERNODE_UNKNOWN) { ManageStateInitial(connman); @@ -44,7 +44,7 @@ void CActiveMasternode::ManageState(CConnman& connman) SendMasternodePing(connman); } -std::string CActiveMasternode::GetStateString() const +std::string CActiveLegacyMasternodeManager::GetStateString() const { switch (nState) { case ACTIVE_MASTERNODE_INITIAL: return "INITIAL"; @@ -56,7 +56,7 @@ std::string CActiveMasternode::GetStateString() const } } -std::string CActiveMasternode::GetStatus() const +std::string CActiveLegacyMasternodeManager::GetStatus() const { switch (nState) { case ACTIVE_MASTERNODE_INITIAL: return "Node just started, not yet activated"; @@ -68,7 +68,7 @@ std::string CActiveMasternode::GetStatus() const } } -std::string CActiveMasternode::GetTypeString() const +std::string CActiveLegacyMasternodeManager::GetTypeString() const { std::string strType; switch(eType) { @@ -82,44 +82,44 @@ std::string CActiveMasternode::GetTypeString() const return strType; } -bool CActiveMasternode::SendMasternodePing(CConnman& connman) +bool CActiveLegacyMasternodeManager::SendMasternodePing(CConnman& connman) { if(!fPingerEnabled) { - LogPrint("masternode", "CActiveMasternode::SendMasternodePing -- %s: masternode ping service is disabled, skipping...\n", GetStateString()); + LogPrint("masternode", "CActiveLegacyMasternodeManager::SendMasternodePing -- %s: masternode ping service is disabled, skipping...\n", GetStateString()); return false; } - if(!mnodeman.Has(outpoint)) { + if(!mnodeman.Has(activeMasternodeInfo.outpoint)) { strNotCapableReason = "Masternode not in masternode list"; nState = ACTIVE_MASTERNODE_NOT_CAPABLE; - LogPrintf("CActiveMasternode::SendMasternodePing -- %s: %s\n", GetStateString(), strNotCapableReason); + LogPrintf("CActiveLegacyMasternodeManager::SendMasternodePing -- %s: %s\n", GetStateString(), strNotCapableReason); return false; } - CMasternodePing mnp(outpoint); + CMasternodePing mnp(activeMasternodeInfo.outpoint); mnp.nSentinelVersion = nSentinelVersion; mnp.fSentinelIsCurrent = (abs(GetAdjustedTime() - nSentinelPingTime) < MASTERNODE_SENTINEL_PING_MAX_SECONDS); - if(!mnp.Sign(keyMasternode, pubKeyMasternode)) { - LogPrintf("CActiveMasternode::SendMasternodePing -- ERROR: Couldn't sign Masternode Ping\n"); + if(!mnp.Sign(activeMasternodeInfo.keyMasternode, activeMasternodeInfo.keyIDMasternode)) { + LogPrintf("CActiveLegacyMasternodeManager::SendMasternodePing -- ERROR: Couldn't sign Masternode Ping\n"); return false; } // Update lastPing for our masternode in Masternode list - if(mnodeman.IsMasternodePingedWithin(outpoint, MASTERNODE_MIN_MNP_SECONDS, mnp.sigTime)) { - LogPrintf("CActiveMasternode::SendMasternodePing -- Too early to send Masternode Ping\n"); + if(mnodeman.IsMasternodePingedWithin(activeMasternodeInfo.outpoint, MASTERNODE_MIN_MNP_SECONDS, mnp.sigTime)) { + LogPrintf("CActiveLegacyMasternodeManager::SendMasternodePing -- Too early to send Masternode Ping\n"); return false; } - mnodeman.SetMasternodeLastPing(outpoint, mnp); + mnodeman.SetMasternodeLastPing(activeMasternodeInfo.outpoint, mnp); - LogPrintf("CActiveMasternode::SendMasternodePing -- Relaying ping, collateral=%s\n", outpoint.ToStringShort()); + LogPrintf("CActiveLegacyMasternodeManager::SendMasternodePing -- Relaying ping, collateral=%s\n", activeMasternodeInfo.outpoint.ToStringShort()); mnp.Relay(connman); return true; } -bool CActiveMasternode::UpdateSentinelPing(int version) +bool CActiveLegacyMasternodeManager::UpdateSentinelPing(int version) { nSentinelVersion = version; nSentinelPingTime = GetAdjustedTime(); @@ -127,41 +127,41 @@ bool CActiveMasternode::UpdateSentinelPing(int version) return true; } -void CActiveMasternode::ManageStateInitial(CConnman& connman) +void CActiveLegacyMasternodeManager::ManageStateInitial(CConnman& connman) { - LogPrint("masternode", "CActiveMasternode::ManageStateInitial -- status = %s, type = %s, pinger enabled = %d\n", GetStatus(), GetTypeString(), fPingerEnabled); + LogPrint("masternode", "CActiveLegacyMasternodeManager::ManageStateInitial -- status = %s, type = %s, pinger enabled = %d\n", GetStatus(), GetTypeString(), fPingerEnabled); // Check that our local network configuration is correct if (!fListen) { // listen option is probably overwritten by smth else, no good nState = ACTIVE_MASTERNODE_NOT_CAPABLE; strNotCapableReason = "Masternode must accept connections from outside. Make sure listen configuration option is not overwritten by some another parameter."; - LogPrintf("CActiveMasternode::ManageStateInitial -- %s: %s\n", GetStateString(), strNotCapableReason); + LogPrintf("CActiveLegacyMasternodeManager::ManageStateInitial -- %s: %s\n", GetStateString(), strNotCapableReason); return; } // First try to find whatever local address is specified by externalip option - bool fFoundLocal = GetLocal(service) && CMasternode::IsValidNetAddr(service); + bool fFoundLocal = GetLocal(activeMasternodeInfo.service) && CMasternode::IsValidNetAddr(activeMasternodeInfo.service); if(!fFoundLocal) { bool empty = true; // If we have some peers, let's try to find our local address from one of them connman.ForEachNodeContinueIf(CConnman::AllNodes, [&fFoundLocal, &empty, this](CNode* pnode) { empty = false; if (pnode->addr.IsIPv4()) - fFoundLocal = GetLocal(service, &pnode->addr) && CMasternode::IsValidNetAddr(service); + fFoundLocal = GetLocal(activeMasternodeInfo.service, &pnode->addr) && CMasternode::IsValidNetAddr(activeMasternodeInfo.service); return !fFoundLocal; }); // nothing and no live connections, can't do anything for now if (empty) { nState = ACTIVE_MASTERNODE_NOT_CAPABLE; strNotCapableReason = "Can't detect valid external address. Will retry when there are some connections available."; - LogPrintf("CActiveMasternode::ManageStateInitial -- %s: %s\n", GetStateString(), strNotCapableReason); + LogPrintf("CActiveLegacyMasternodeManager::ManageStateInitial -- %s: %s\n", GetStateString(), strNotCapableReason); return; } } if (!fFoundLocal && Params().NetworkIDString() == CBaseChainParams::REGTEST) { - if (Lookup("127.0.0.1", activeMasternode.service, GetListenPort(), false)) { + if (Lookup("127.0.0.1", activeMasternodeInfo.service, GetListenPort(), false)) { fFoundLocal = true; } } @@ -169,75 +169,75 @@ void CActiveMasternode::ManageStateInitial(CConnman& connman) if(!fFoundLocal) { nState = ACTIVE_MASTERNODE_NOT_CAPABLE; strNotCapableReason = "Can't detect valid external address. Please consider using the externalip configuration option if problem persists. Make sure to use IPv4 address only."; - LogPrintf("CActiveMasternode::ManageStateInitial -- %s: %s\n", GetStateString(), strNotCapableReason); + LogPrintf("CActiveLegacyMasternodeManager::ManageStateInitial -- %s: %s\n", GetStateString(), strNotCapableReason); return; } int mainnetDefaultPort = Params(CBaseChainParams::MAIN).GetDefaultPort(); if(Params().NetworkIDString() == CBaseChainParams::MAIN) { - if(service.GetPort() != mainnetDefaultPort) { + if(activeMasternodeInfo.service.GetPort() != mainnetDefaultPort) { nState = ACTIVE_MASTERNODE_NOT_CAPABLE; - strNotCapableReason = strprintf("Invalid port: %u - only %d is supported on mainnet.", service.GetPort(), mainnetDefaultPort); - LogPrintf("CActiveMasternode::ManageStateInitial -- %s: %s\n", GetStateString(), strNotCapableReason); + strNotCapableReason = strprintf("Invalid port: %u - only %d is supported on mainnet.", activeMasternodeInfo.service.GetPort(), mainnetDefaultPort); + LogPrintf("CActiveLegacyMasternodeManager::ManageStateInitial -- %s: %s\n", GetStateString(), strNotCapableReason); return; } - } else if(service.GetPort() == mainnetDefaultPort) { + } else if(activeMasternodeInfo.service.GetPort() == mainnetDefaultPort) { nState = ACTIVE_MASTERNODE_NOT_CAPABLE; - strNotCapableReason = strprintf("Invalid port: %u - %d is only supported on mainnet.", service.GetPort(), mainnetDefaultPort); - LogPrintf("CActiveMasternode::ManageStateInitial -- %s: %s\n", GetStateString(), strNotCapableReason); + strNotCapableReason = strprintf("Invalid port: %u - %d is only supported on mainnet.", activeMasternodeInfo.service.GetPort(), mainnetDefaultPort); + LogPrintf("CActiveLegacyMasternodeManager::ManageStateInitial -- %s: %s\n", GetStateString(), strNotCapableReason); return; } if(Params().NetworkIDString() != CBaseChainParams::REGTEST) { // Check socket connectivity - LogPrintf("CActiveMasternode::ManageStateInitial -- Checking inbound connection to '%s'\n", service.ToString()); + LogPrintf("CActiveLegacyMasternodeManager::ManageStateInitial -- Checking inbound connection to '%s'\n", activeMasternodeInfo.service.ToString()); SOCKET hSocket; - bool fConnected = ConnectSocket(service, hSocket, nConnectTimeout) && IsSelectableSocket(hSocket); + bool fConnected = ConnectSocket(activeMasternodeInfo.service, hSocket, nConnectTimeout) && IsSelectableSocket(hSocket); CloseSocket(hSocket); if (!fConnected) { nState = ACTIVE_MASTERNODE_NOT_CAPABLE; - strNotCapableReason = "Could not connect to " + service.ToString(); - LogPrintf("CActiveMasternode::ManageStateInitial -- %s: %s\n", GetStateString(), strNotCapableReason); + strNotCapableReason = "Could not connect to " + activeMasternodeInfo.service.ToString(); + LogPrintf("CActiveLegacyMasternodeManager::ManageStateInitial -- %s: %s\n", GetStateString(), strNotCapableReason); return; } } // Default to REMOTE eType = MASTERNODE_REMOTE; - LogPrint("masternode", "CActiveMasternode::ManageStateInitial -- End status = %s, type = %s, pinger enabled = %d\n", GetStatus(), GetTypeString(), fPingerEnabled); + LogPrint("masternode", "CActiveLegacyMasternodeManager::ManageStateInitial -- End status = %s, type = %s, pinger enabled = %d\n", GetStatus(), GetTypeString(), fPingerEnabled); } -void CActiveMasternode::ManageStateRemote() +void CActiveLegacyMasternodeManager::ManageStateRemote() { - LogPrint("masternode", "CActiveMasternode::ManageStateRemote -- Start status = %s, type = %s, pinger enabled = %d, pubKeyMasternode.GetID() = %s\n", - GetStatus(), GetTypeString(), fPingerEnabled, pubKeyMasternode.GetID().ToString()); + LogPrint("masternode", "CActiveLegacyMasternodeManager::ManageStateRemote -- Start status = %s, type = %s, pinger enabled = %d, keyIDMasternode = %s\n", + GetStatus(), GetTypeString(), fPingerEnabled, activeMasternodeInfo.keyIDMasternode.ToString()); - mnodeman.CheckMasternode(pubKeyMasternode, true); + mnodeman.CheckMasternode(activeMasternodeInfo.keyIDMasternode, true); masternode_info_t infoMn; - if(mnodeman.GetMasternodeInfo(pubKeyMasternode, infoMn)) { + if(mnodeman.GetMasternodeInfo(activeMasternodeInfo.keyIDMasternode, infoMn)) { if(infoMn.nProtocolVersion != PROTOCOL_VERSION) { nState = ACTIVE_MASTERNODE_NOT_CAPABLE; strNotCapableReason = "Invalid protocol version"; - LogPrintf("CActiveMasternode::ManageStateRemote -- %s: %s\n", GetStateString(), strNotCapableReason); + LogPrintf("CActiveLegacyMasternodeManager::ManageStateRemote -- %s: %s\n", GetStateString(), strNotCapableReason); return; } - if(service != infoMn.addr) { + if(activeMasternodeInfo.service != infoMn.addr) { nState = ACTIVE_MASTERNODE_NOT_CAPABLE; strNotCapableReason = "Broadcasted IP doesn't match our external address. Make sure you issued a new broadcast if IP of this masternode changed recently."; - LogPrintf("CActiveMasternode::ManageStateRemote -- %s: %s\n", GetStateString(), strNotCapableReason); + LogPrintf("CActiveLegacyMasternodeManager::ManageStateRemote -- %s: %s\n", GetStateString(), strNotCapableReason); return; } if(!CMasternode::IsValidStateForAutoStart(infoMn.nActiveState)) { nState = ACTIVE_MASTERNODE_NOT_CAPABLE; strNotCapableReason = strprintf("Masternode in %s state", CMasternode::StateToString(infoMn.nActiveState)); - LogPrintf("CActiveMasternode::ManageStateRemote -- %s: %s\n", GetStateString(), strNotCapableReason); + LogPrintf("CActiveLegacyMasternodeManager::ManageStateRemote -- %s: %s\n", GetStateString(), strNotCapableReason); return; } if(nState != ACTIVE_MASTERNODE_STARTED) { - LogPrintf("CActiveMasternode::ManageStateRemote -- STARTED!\n"); - outpoint = infoMn.outpoint; - service = infoMn.addr; + LogPrintf("CActiveLegacyMasternodeManager::ManageStateRemote -- STARTED!\n"); + activeMasternodeInfo.outpoint = infoMn.outpoint; + activeMasternodeInfo.service = infoMn.addr; fPingerEnabled = true; nState = ACTIVE_MASTERNODE_STARTED; } @@ -245,6 +245,6 @@ void CActiveMasternode::ManageStateRemote() else { nState = ACTIVE_MASTERNODE_NOT_CAPABLE; strNotCapableReason = "Masternode not in masternode list"; - LogPrintf("CActiveMasternode::ManageStateRemote -- %s: %s\n", GetStateString(), strNotCapableReason); + LogPrintf("CActiveLegacyMasternodeManager::ManageStateRemote -- %s: %s\n", GetStateString(), strNotCapableReason); } } diff --git a/src/activemasternode.h b/src/activemasternode.h index 2efd6ec5e116..4189be734b95 100644 --- a/src/activemasternode.h +++ b/src/activemasternode.h @@ -10,7 +10,8 @@ #include "net.h" #include "primitives/transaction.h" -class CActiveMasternode; +struct CActiveMasternodeInfo; +class CActiveLegacyMasternodeManager; static const int ACTIVE_MASTERNODE_INITIAL = 0; // initial state static const int ACTIVE_MASTERNODE_SYNC_IN_PROCESS = 1; @@ -18,10 +19,21 @@ static const int ACTIVE_MASTERNODE_INPUT_TOO_NEW = 2; static const int ACTIVE_MASTERNODE_NOT_CAPABLE = 3; static const int ACTIVE_MASTERNODE_STARTED = 4; -extern CActiveMasternode activeMasternode; +extern CActiveMasternodeInfo activeMasternodeInfo; +extern CActiveLegacyMasternodeManager legacyActiveMasternodeManager; + +struct CActiveMasternodeInfo { + // Keys for the active Masternode + CKeyID keyIDMasternode; + CKey keyMasternode; + + // Initialized while registering Masternode + COutPoint outpoint; + CService service; +}; // Responsible for activating the Masternode and pinging the network -class CActiveMasternode +class CActiveLegacyMasternodeManager { public: enum masternode_type_enum_t { @@ -45,25 +57,13 @@ class CActiveMasternode uint32_t nSentinelVersion; public: - // Keys for the active Masternode - CPubKey pubKeyMasternode; - CKey keyMasternode; - - // Initialized while registering Masternode - COutPoint outpoint; - CService service; - int nState; // should be one of ACTIVE_MASTERNODE_XXXX std::string strNotCapableReason; - CActiveMasternode() + CActiveLegacyMasternodeManager() : eType(MASTERNODE_UNKNOWN), fPingerEnabled(false), - pubKeyMasternode(), - keyMasternode(), - outpoint(), - service(), nState(ACTIVE_MASTERNODE_INITIAL) {} diff --git a/src/governance-object.cpp b/src/governance-object.cpp index c62a28177796..04185db4c640 100644 --- a/src/governance-object.cpp +++ b/src/governance-object.cpp @@ -265,7 +265,7 @@ void CGovernanceObject::SetMasternodeOutpoint(const COutPoint& outpoint) masternodeOutpoint = outpoint; } -bool CGovernanceObject::Sign(const CKey& keyMasternode, const CPubKey& pubKeyMasternode) +bool CGovernanceObject::Sign(const CKey& keyMasternode, const CKeyID& keyIDMasternode) { std::string strError; @@ -277,7 +277,7 @@ bool CGovernanceObject::Sign(const CKey& keyMasternode, const CPubKey& pubKeyMas return false; } - if (!CHashSigner::VerifyHash(hash, pubKeyMasternode, vchSig, strError)) { + if (!CHashSigner::VerifyHash(hash, keyIDMasternode, vchSig, strError)) { LogPrintf("CGovernanceObject::Sign -- VerifyHash() failed, error: %s\n", strError); return false; } @@ -288,30 +288,30 @@ bool CGovernanceObject::Sign(const CKey& keyMasternode, const CPubKey& pubKeyMas return false; } - if (!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { + if(!CMessageSigner::VerifyMessage(keyIDMasternode, vchSig, strMessage, strError)) { LogPrintf("CGovernanceObject::Sign -- VerifyMessage() failed, error: %s\n", strError); return false; } } LogPrint("gobject", "CGovernanceObject::Sign -- pubkey id = %s, masternode = %s\n", - pubKeyMasternode.GetID().ToString(), masternodeOutpoint.ToStringShort()); + keyIDMasternode.ToString(), masternodeOutpoint.ToStringShort()); return true; } -bool CGovernanceObject::CheckSignature(const CPubKey& pubKeyMasternode) const +bool CGovernanceObject::CheckSignature(const CKeyID& keyIDMasternode) const { std::string strError; if (sporkManager.IsSporkActive(SPORK_6_NEW_SIGS)) { uint256 hash = GetSignatureHash(); - if (!CHashSigner::VerifyHash(hash, pubKeyMasternode, vchSig, strError)) { + if (!CHashSigner::VerifyHash(hash, keyIDMasternode, vchSig, strError)) { // could be an old object std::string strMessage = GetSignatureMessage(); - if (!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { + if(!CMessageSigner::VerifyMessage(keyIDMasternode, vchSig, strMessage, strError)) { // nope, not in old format either LogPrintf("CGovernance::CheckSignature -- VerifyMessage() failed, error: %s\n", strError); return false; @@ -320,7 +320,7 @@ bool CGovernanceObject::CheckSignature(const CPubKey& pubKeyMasternode) const } else { std::string strMessage = GetSignatureMessage(); - if (!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { + if (!CMessageSigner::VerifyMessage(keyIDMasternode, vchSig, strMessage, strError)) { LogPrintf("CGovernance::CheckSignature -- VerifyMessage() failed, error: %s\n", strError); return false; } @@ -490,7 +490,7 @@ bool CGovernanceObject::IsValidLocally(std::string& strError, bool& fMissingMast masternode_info_t infoMn; if (!mnodeman.GetMasternodeInfo(masternodeOutpoint, infoMn)) { - CMasternode::CollateralStatus err = CMasternode::CheckCollateral(masternodeOutpoint, CPubKey()); + CMasternode::CollateralStatus err = CMasternode::CheckCollateral(masternodeOutpoint, CKeyID()); if (err == CMasternode::COLLATERAL_UTXO_NOT_FOUND) { strError = "Failed to find Masternode UTXO, missing masternode=" + strOutpoint + "\n"; } else if (err == CMasternode::COLLATERAL_INVALID_AMOUNT) { @@ -507,8 +507,8 @@ bool CGovernanceObject::IsValidLocally(std::string& strError, bool& fMissingMast } // Check that we have a valid MN signature - if (!CheckSignature(infoMn.pubKeyMasternode)) { - strError = "Invalid masternode signature for: " + strOutpoint + ", pubkey id = " + infoMn.pubKeyMasternode.GetID().ToString(); + if (!CheckSignature(infoMn.keyIDMasternode)) { + strError = "Invalid masternode signature for: " + strOutpoint + ", pubkey id = " + infoMn.keyIDMasternode.ToString(); return false; } diff --git a/src/governance-object.h b/src/governance-object.h index 2ec25e620b0f..8738a1c99ae1 100644 --- a/src/governance-object.h +++ b/src/governance-object.h @@ -251,8 +251,8 @@ class CGovernanceObject // Signature related functions void SetMasternodeOutpoint(const COutPoint& outpoint); - bool Sign(const CKey& keyMasternode, const CPubKey& pubKeyMasternode); - bool CheckSignature(const CPubKey& pubKeyMasternode) const; + bool Sign(const CKey& keyMasternode, const CKeyID& keyIDMasternode); + bool CheckSignature(const CKeyID& keyIDMasternode) const; std::string GetSignatureMessage() const; uint256 GetSignatureHash() const; diff --git a/src/governance-vote.cpp b/src/governance-vote.cpp index f20760fcb904..7d45fa9df46e 100644 --- a/src/governance-vote.cpp +++ b/src/governance-vote.cpp @@ -152,7 +152,7 @@ uint256 CGovernanceVote::GetSignatureHash() const return SerializeHash(*this); } -bool CGovernanceVote::Sign(const CKey& keyMasternode, const CPubKey& pubKeyMasternode) +bool CGovernanceVote::Sign(const CKey& keyMasternode, const CKeyID& keyIDMasternode) { std::string strError; @@ -164,7 +164,7 @@ bool CGovernanceVote::Sign(const CKey& keyMasternode, const CPubKey& pubKeyMaste return false; } - if (!CHashSigner::VerifyHash(hash, pubKeyMasternode, vchSig, strError)) { + if (!CHashSigner::VerifyHash(hash, keyIDMasternode, vchSig, strError)) { LogPrintf("CGovernanceVote::Sign -- VerifyHash() failed, error: %s\n", strError); return false; } @@ -178,7 +178,7 @@ bool CGovernanceVote::Sign(const CKey& keyMasternode, const CPubKey& pubKeyMaste return false; } - if(!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { + if(!CMessageSigner::VerifyMessage(keyIDMasternode, vchSig, strMessage, strError)) { LogPrintf("CGovernanceVote::Sign -- VerifyMessage() failed, error: %s\n", strError); return false; } @@ -187,21 +187,21 @@ bool CGovernanceVote::Sign(const CKey& keyMasternode, const CPubKey& pubKeyMaste return true; } -bool CGovernanceVote::CheckSignature(const CPubKey& pubKeyMasternode) const +bool CGovernanceVote::CheckSignature(const CKeyID& keyIDMasternode) const { std::string strError; if (sporkManager.IsSporkActive(SPORK_6_NEW_SIGS)) { uint256 hash = GetSignatureHash(); - if (!CHashSigner::VerifyHash(hash, pubKeyMasternode, vchSig, strError)) { + if (!CHashSigner::VerifyHash(hash, keyIDMasternode, vchSig, strError)) { // could be a signature in old format std::string strMessage = masternodeOutpoint.ToStringShort() + "|" + nParentHash.ToString() + "|" + std::to_string(nVoteSignal) + "|" + std::to_string(nVoteOutcome) + "|" + std::to_string(nTime); - if(!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { + if(!CMessageSigner::VerifyMessage(keyIDMasternode, vchSig, strMessage, strError)) { // nope, not in old format either LogPrint("gobject", "CGovernanceVote::IsValid -- VerifyMessage() failed, error: %s\n", strError); return false; @@ -213,7 +213,7 @@ bool CGovernanceVote::CheckSignature(const CPubKey& pubKeyMasternode) const std::to_string(nVoteOutcome) + "|" + std::to_string(nTime); - if(!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { + if(!CMessageSigner::VerifyMessage(keyIDMasternode, vchSig, strMessage, strError)) { LogPrint("gobject", "CGovernanceVote::IsValid -- VerifyMessage() failed, error: %s\n", strError); return false; } @@ -251,7 +251,7 @@ bool CGovernanceVote::IsValid(bool fSignatureCheck) const if(!fSignatureCheck) return true; - return CheckSignature(infoMn.pubKeyMasternode); + return CheckSignature(infoMn.keyIDMasternode); } bool operator==(const CGovernanceVote& vote1, const CGovernanceVote& vote2) diff --git a/src/governance-vote.h b/src/governance-vote.h index 3b851cad2222..193ec26093be 100644 --- a/src/governance-vote.h +++ b/src/governance-vote.h @@ -90,8 +90,8 @@ class CGovernanceVote void SetSignature(const std::vector& vchSigIn) { vchSig = vchSigIn; } - bool Sign(const CKey& keyMasternode, const CPubKey& pubKeyMasternode); - bool CheckSignature(const CPubKey& pubKeyMasternode) const; + bool Sign(const CKey& keyMasternode, const CKeyID& keyIDMasternode); + bool CheckSignature(const CKeyID& keyIDMasternode) const; bool IsValid(bool fSignatureCheck) const; void Relay(CConnman& connman) const; diff --git a/src/init.cpp b/src/init.cpp index b6430790e7dd..f88419bf27b8 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1851,10 +1851,13 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler) std::string strMasterNodePrivKey = GetArg("-masternodeprivkey", ""); if(!strMasterNodePrivKey.empty()) { - if(!CMessageSigner::GetKeysFromSecret(strMasterNodePrivKey, activeMasternode.keyMasternode, activeMasternode.pubKeyMasternode)) + CPubKey pubKeyMasternode; + if(!CMessageSigner::GetKeysFromSecret(strMasterNodePrivKey, activeMasternodeInfo.keyMasternode, pubKeyMasternode)) return InitError(_("Invalid masternodeprivkey. Please see documenation.")); - LogPrintf(" pubKeyMasternode: %s\n", CBitcoinAddress(activeMasternode.pubKeyMasternode.GetID()).ToString()); + activeMasternodeInfo.keyIDMasternode = pubKeyMasternode.GetID(); + + LogPrintf(" keyIDMasternode: %s\n", CBitcoinAddress(activeMasternodeInfo.keyIDMasternode).ToString()); } else { return InitError(_("You must specify a masternodeprivkey in the configuration. Please see documentation for help.")); } @@ -1973,7 +1976,7 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler) scheduler.scheduleEvery(boost::bind(&CNetFulfilledRequestManager::DoMaintenance, boost::ref(netfulfilledman)), 60); scheduler.scheduleEvery(boost::bind(&CMasternodeSync::DoMaintenance, boost::ref(masternodeSync), boost::ref(*g_connman)), MASTERNODE_SYNC_TICK_SECONDS); scheduler.scheduleEvery(boost::bind(&CMasternodeMan::DoMaintenance, boost::ref(mnodeman), boost::ref(*g_connman)), 1); - scheduler.scheduleEvery(boost::bind(&CActiveMasternode::DoMaintenance, boost::ref(activeMasternode), boost::ref(*g_connman)), MASTERNODE_MIN_MNP_SECONDS); + scheduler.scheduleEvery(boost::bind(&CActiveLegacyMasternodeManager::DoMaintenance, boost::ref(legacyActiveMasternodeManager), boost::ref(*g_connman)), MASTERNODE_MIN_MNP_SECONDS); scheduler.scheduleEvery(boost::bind(&CMasternodePayments::DoMaintenance, boost::ref(mnpayments)), 60); scheduler.scheduleEvery(boost::bind(&CGovernanceManager::DoMaintenance, boost::ref(governance), boost::ref(*g_connman)), 60 * 5); diff --git a/src/instantx.cpp b/src/instantx.cpp index 3ede2725dc7e..7cdc274c01b7 100644 --- a/src/instantx.cpp +++ b/src/instantx.cpp @@ -233,8 +233,8 @@ void CInstantSend::Vote(CTxLockCandidate& txLockCandidate, CConnman& connman) int nRank; int nMinRequiredProtocol = std::max(MIN_INSTANTSEND_PROTO_VERSION, mnpayments.GetMinMasternodePaymentsProto()); - if(!mnodeman.GetMasternodeRank(activeMasternode.outpoint, nRank, nLockInputHeight, nMinRequiredProtocol)) { - LogPrint("instantsend", "CInstantSend::Vote -- Can't calculate rank for masternode %s\n", activeMasternode.outpoint.ToStringShort()); + if(!mnodeman.GetMasternodeRank(activeMasternodeInfo.outpoint, nRank, nLockInputHeight, nMinRequiredProtocol)) { + LogPrint("instantsend", "CInstantSend::Vote -- Can't calculate rank for masternode %s\n", activeMasternodeInfo.outpoint.ToStringShort()); continue; } @@ -254,7 +254,7 @@ void CInstantSend::Vote(CTxLockCandidate& txLockCandidate, CConnman& connman) if(itVoted != mapVotedOutpoints.end()) { for (const auto& hash : itVoted->second) { std::map::iterator it2 = mapTxLockCandidates.find(hash); - if(it2->second.HasMasternodeVoted(outpointLockPair.first, activeMasternode.outpoint)) { + if(it2->second.HasMasternodeVoted(outpointLockPair.first, activeMasternodeInfo.outpoint)) { // we already voted for this outpoint to be included either in the same tx or in a competing one, // skip it anyway fAlreadyVoted = true; @@ -269,7 +269,7 @@ void CInstantSend::Vote(CTxLockCandidate& txLockCandidate, CConnman& connman) } // we haven't voted for this outpoint yet, let's try to do this now - CTxLockVote vote(txHash, outpointLockPair.first, activeMasternode.outpoint); + CTxLockVote vote(txHash, outpointLockPair.first, activeMasternodeInfo.outpoint); if(!vote.Sign()) { LogPrintf("CInstantSend::Vote -- Failed to sign consensus vote\n"); @@ -1059,10 +1059,10 @@ bool CTxLockVote::CheckSignature() const if (sporkManager.IsSporkActive(SPORK_6_NEW_SIGS)) { uint256 hash = GetSignatureHash(); - if (!CHashSigner::VerifyHash(hash, infoMn.pubKeyMasternode, vchMasternodeSignature, strError)) { + if (!CHashSigner::VerifyHash(hash, infoMn.keyIDMasternode, vchMasternodeSignature, strError)) { // could be a signature in old format std::string strMessage = txHash.ToString() + outpoint.ToStringShort(); - if(!CMessageSigner::VerifyMessage(infoMn.pubKeyMasternode, vchMasternodeSignature, strMessage, strError)) { + if(!CMessageSigner::VerifyMessage(infoMn.keyIDMasternode, vchMasternodeSignature, strMessage, strError)) { // nope, not in old format either LogPrintf("CTxLockVote::CheckSignature -- VerifyMessage() failed, error: %s\n", strError); return false; @@ -1070,7 +1070,7 @@ bool CTxLockVote::CheckSignature() const } } else { std::string strMessage = txHash.ToString() + outpoint.ToStringShort(); - if(!CMessageSigner::VerifyMessage(infoMn.pubKeyMasternode, vchMasternodeSignature, strMessage, strError)) { + if(!CMessageSigner::VerifyMessage(infoMn.keyIDMasternode, vchMasternodeSignature, strMessage, strError)) { LogPrintf("CTxLockVote::CheckSignature -- VerifyMessage() failed, error: %s\n", strError); return false; } @@ -1086,24 +1086,24 @@ bool CTxLockVote::Sign() if (sporkManager.IsSporkActive(SPORK_6_NEW_SIGS)) { uint256 hash = GetSignatureHash(); - if(!CHashSigner::SignHash(hash, activeMasternode.keyMasternode, vchMasternodeSignature)) { + if(!CHashSigner::SignHash(hash, activeMasternodeInfo.keyMasternode, vchMasternodeSignature)) { LogPrintf("CTxLockVote::Sign -- SignHash() failed\n"); return false; } - if (!CHashSigner::VerifyHash(hash, activeMasternode.pubKeyMasternode, vchMasternodeSignature, strError)) { + if (!CHashSigner::VerifyHash(hash, activeMasternodeInfo.keyIDMasternode, vchMasternodeSignature, strError)) { LogPrintf("CTxLockVote::Sign -- VerifyHash() failed, error: %s\n", strError); return false; } } else { std::string strMessage = txHash.ToString() + outpoint.ToStringShort(); - if(!CMessageSigner::SignMessage(strMessage, vchMasternodeSignature, activeMasternode.keyMasternode)) { + if(!CMessageSigner::SignMessage(strMessage, vchMasternodeSignature, activeMasternodeInfo.keyMasternode)) { LogPrintf("CTxLockVote::Sign -- SignMessage() failed\n"); return false; } - if(!CMessageSigner::VerifyMessage(activeMasternode.pubKeyMasternode, vchMasternodeSignature, strMessage, strError)) { + if(!CMessageSigner::VerifyMessage(activeMasternodeInfo.keyIDMasternode, vchMasternodeSignature, strMessage, strError)) { LogPrintf("CTxLockVote::Sign -- VerifyMessage() failed, error: %s\n", strError); return false; } diff --git a/src/masternode-payments.cpp b/src/masternode-payments.cpp index 34e6b6e51541..e737de6effc7 100644 --- a/src/masternode-payments.cpp +++ b/src/masternode-payments.cpp @@ -264,7 +264,7 @@ void CMasternodePayments::FillBlockPayee(CMutableTransaction& txNew, int nBlockH return; } // fill payee with locally calculated winner and hope for the best - payee = GetScriptForDestination(mnInfo.pubKeyCollateralAddress.GetID()); + payee = GetScriptForDestination(mnInfo.keyIDCollateralAddress); } // GET MASTERNODE PAYMENT VARIABLES SETUP @@ -384,7 +384,7 @@ void CMasternodePayments::ProcessMessage(CNode* pfrom, const std::string& strCom } int nDos = 0; - if(!vote.CheckSignature(mnInfo.pubKeyMasternode, nCachedBlockHeight, nDos)) { + if(!vote.CheckSignature(mnInfo.keyIDMasternode, nCachedBlockHeight, nDos)) { if(nDos) { LOCK(cs_main); LogPrintf("MASTERNODEPAYMENTVOTE -- ERROR: invalid signature\n"); @@ -444,12 +444,12 @@ bool CMasternodePaymentVote::Sign() if (sporkManager.IsSporkActive(SPORK_6_NEW_SIGS)) { uint256 hash = GetSignatureHash(); - if(!CHashSigner::SignHash(hash, activeMasternode.keyMasternode, vchSig)) { + if(!CHashSigner::SignHash(hash, activeMasternodeInfo.keyMasternode, vchSig)) { LogPrintf("CMasternodePaymentVote::Sign -- SignHash() failed\n"); return false; } - if (!CHashSigner::VerifyHash(hash, activeMasternode.pubKeyMasternode, vchSig, strError)) { + if (!CHashSigner::VerifyHash(hash, activeMasternodeInfo.keyIDMasternode, vchSig, strError)) { LogPrintf("CMasternodePaymentVote::Sign -- VerifyHash() failed, error: %s\n", strError); return false; } @@ -458,12 +458,12 @@ bool CMasternodePaymentVote::Sign() std::to_string(nBlockHeight) + ScriptToAsmStr(payee); - if(!CMessageSigner::SignMessage(strMessage, vchSig, activeMasternode.keyMasternode)) { + if(!CMessageSigner::SignMessage(strMessage, vchSig, activeMasternodeInfo.keyMasternode)) { LogPrintf("CMasternodePaymentVote::Sign -- SignMessage() failed\n"); return false; } - if(!CMessageSigner::VerifyMessage(activeMasternode.pubKeyMasternode, vchSig, strMessage, strError)) { + if(!CMessageSigner::VerifyMessage(activeMasternodeInfo.keyIDMasternode, vchSig, strMessage, strError)) { LogPrintf("CMasternodePaymentVote::Sign -- VerifyMessage() failed, error: %s\n", strError); return false; } @@ -489,7 +489,7 @@ bool CMasternodePayments::IsScheduled(const masternode_info_t& mnInfo, int nNotB if(!masternodeSync.IsMasternodeListSynced()) return false; CScript mnpayee; - mnpayee = GetScriptForDestination(mnInfo.pubKeyCollateralAddress.GetID()); + mnpayee = GetScriptForDestination(mnInfo.keyIDCollateralAddress); CScript payee; for(int64_t h = nCachedBlockHeight; h <= nCachedBlockHeight + 8; h++){ @@ -759,7 +759,7 @@ bool CMasternodePayments::ProcessBlock(int nBlockHeight, CConnman& connman) int nRank; - if (!mnodeman.GetMasternodeRank(activeMasternode.outpoint, nRank, nBlockHeight - 101, GetMinMasternodePaymentsProto())) { + if (!mnodeman.GetMasternodeRank(activeMasternodeInfo.outpoint, nRank, nBlockHeight - 101, GetMinMasternodePaymentsProto())) { LogPrint("mnpayments", "CMasternodePayments::ProcessBlock -- Unknown Masternode\n"); return false; } @@ -772,7 +772,7 @@ bool CMasternodePayments::ProcessBlock(int nBlockHeight, CConnman& connman) // LOCATE THE NEXT MASTERNODE WHICH SHOULD BE PAID - LogPrintf("CMasternodePayments::ProcessBlock -- Start: nBlockHeight=%d, masternode=%s\n", nBlockHeight, activeMasternode.outpoint.ToStringShort()); + LogPrintf("CMasternodePayments::ProcessBlock -- Start: nBlockHeight=%d, masternode=%s\n", nBlockHeight, activeMasternodeInfo.outpoint.ToStringShort()); // pay to the oldest MN that still had no payment but its input is old enough and it was active long enough int nCount = 0; @@ -786,9 +786,9 @@ bool CMasternodePayments::ProcessBlock(int nBlockHeight, CConnman& connman) LogPrintf("CMasternodePayments::ProcessBlock -- Masternode found by GetNextMasternodeInQueueForPayment(): %s\n", mnInfo.outpoint.ToStringShort()); - CScript payee = GetScriptForDestination(mnInfo.pubKeyCollateralAddress.GetID()); + CScript payee = GetScriptForDestination(mnInfo.keyIDCollateralAddress); - CMasternodePaymentVote voteNew(activeMasternode.outpoint, nBlockHeight, payee); + CMasternodePaymentVote voteNew(activeMasternodeInfo.outpoint, nBlockHeight, payee); CTxDestination address1; ExtractDestination(payee, address1); @@ -893,7 +893,7 @@ void CMasternodePaymentVote::Relay(CConnman& connman) const connman.RelayInv(inv); } -bool CMasternodePaymentVote::CheckSignature(const CPubKey& pubKeyMasternode, int nValidationHeight, int &nDos) const +bool CMasternodePaymentVote::CheckSignature(const CKeyID& keyIDMasternode, int nValidationHeight, int &nDos) const { // do not ban by default nDos = 0; @@ -902,12 +902,12 @@ bool CMasternodePaymentVote::CheckSignature(const CPubKey& pubKeyMasternode, int if (sporkManager.IsSporkActive(SPORK_6_NEW_SIGS)) { uint256 hash = GetSignatureHash(); - if (!CHashSigner::VerifyHash(hash, pubKeyMasternode, vchSig, strError)) { + if (!CHashSigner::VerifyHash(hash, keyIDMasternode, vchSig, strError)) { // could be a signature in old format std::string strMessage = masternodeOutpoint.ToStringShort() + std::to_string(nBlockHeight) + ScriptToAsmStr(payee); - if(!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { + if(!CMessageSigner::VerifyMessage(keyIDMasternode, vchSig, strMessage, strError)) { // nope, not in old format either // Only ban for future block vote when we are already synced. // Otherwise it could be the case when MN which signed this vote is using another key now @@ -924,7 +924,7 @@ bool CMasternodePaymentVote::CheckSignature(const CPubKey& pubKeyMasternode, int std::to_string(nBlockHeight) + ScriptToAsmStr(payee); - if (!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { + if (!CMessageSigner::VerifyMessage(keyIDMasternode, vchSig, strMessage, strError)) { // Only ban for future block vote when we are already synced. // Otherwise it could be the case when MN which signed this vote is using another key now // and we have no idea about the old one. diff --git a/src/masternode-payments.h b/src/masternode-payments.h index bd2c0086740d..3db062d6ffe0 100644 --- a/src/masternode-payments.h +++ b/src/masternode-payments.h @@ -159,7 +159,7 @@ class CMasternodePaymentVote uint256 GetSignatureHash() const; bool Sign(); - bool CheckSignature(const CPubKey& pubKeyMasternode, int nValidationHeight, int &nDos) const; + bool CheckSignature(const CKeyID& keyIDMasternode, int nValidationHeight, int &nDos) const; bool IsValid(CNode* pnode, int nValidationHeight, std::string& strError, CConnman& connman) const; void Relay(CConnman& connman) const; diff --git a/src/masternode-sync.cpp b/src/masternode-sync.cpp index 7b421cb6c13a..272a31da387c 100644 --- a/src/masternode-sync.cpp +++ b/src/masternode-sync.cpp @@ -87,7 +87,7 @@ void CMasternodeSync::SwitchToNextAsset(CConnman& connman) nRequestedMasternodeAssets = MASTERNODE_SYNC_FINISHED; uiInterface.NotifyAdditionalDataSyncProgressChanged(1); //try to activate our masternode if possible - activeMasternode.ManageState(connman); + legacyActiveMasternodeManager.ManageState(connman); connman.ForEachNode(CConnman::AllNodes, [](CNode* pnode) { netfulfilledman.AddFulfilledRequest(pnode->addr, "full-sync"); diff --git a/src/masternode.cpp b/src/masternode.cpp index 26fae469b195..9fc59baf7dff 100644 --- a/src/masternode.cpp +++ b/src/masternode.cpp @@ -26,9 +26,9 @@ CMasternode::CMasternode() : fAllowMixingTx(true) {} -CMasternode::CMasternode(CService addr, COutPoint outpoint, CPubKey pubKeyCollateralAddress, CPubKey pubKeyMasternode, int nProtocolVersionIn) : +CMasternode::CMasternode(CService addr, COutPoint outpoint, CPubKey pubKeyCollateralAddressNew, CPubKey pubKeyMasternodeNew, int nProtocolVersionIn) : masternode_info_t{ MASTERNODE_ENABLED, nProtocolVersionIn, GetAdjustedTime(), - outpoint, addr, pubKeyCollateralAddress, pubKeyMasternode}, + outpoint, addr, pubKeyCollateralAddressNew, pubKeyMasternodeNew}, fAllowMixingTx(true) {} @@ -60,6 +60,7 @@ bool CMasternode::UpdateFromNewBroadcast(CMasternodeBroadcast& mnb, CConnman& co if(mnb.sigTime <= sigTime && !mnb.fRecovery) return false; pubKeyMasternode = mnb.pubKeyMasternode; + keyIDMasternode = mnb.pubKeyMasternode.GetID(); sigTime = mnb.sigTime; vchSig = mnb.vchSig; nProtocolVersion = mnb.nProtocolVersion; @@ -73,11 +74,11 @@ bool CMasternode::UpdateFromNewBroadcast(CMasternodeBroadcast& mnb, CConnman& co mnodeman.mapSeenMasternodePing.insert(std::make_pair(lastPing.GetHash(), lastPing)); } // if it matches our Masternode privkey... - if(fMasternodeMode && pubKeyMasternode == activeMasternode.pubKeyMasternode) { + if(fMasternodeMode && keyIDMasternode == activeMasternodeInfo.keyIDMasternode) { nPoSeBanScore = -MASTERNODE_POSE_BAN_MAX_SCORE; if(nProtocolVersion == PROTOCOL_VERSION) { // ... and PROTOCOL_VERSION, then we've been remotely activated ... - activeMasternode.ManageState(connman); + legacyActiveMasternodeManager.ManageState(connman); } else { // ... otherwise we need to reactivate our node, do not add it to the list and do not relay // but also do not ban the node we get this message from @@ -101,13 +102,13 @@ arith_uint256 CMasternode::CalculateScore(const uint256& blockHash) const return UintToArith256(ss.GetHash()); } -CMasternode::CollateralStatus CMasternode::CheckCollateral(const COutPoint& outpoint, const CPubKey& pubkey) +CMasternode::CollateralStatus CMasternode::CheckCollateral(const COutPoint& outpoint, const CKeyID& keyID) { int nHeight; - return CheckCollateral(outpoint, pubkey, nHeight); + return CheckCollateral(outpoint, keyID, nHeight); } -CMasternode::CollateralStatus CMasternode::CheckCollateral(const COutPoint& outpoint, const CPubKey& pubkey, int& nHeightRet) +CMasternode::CollateralStatus CMasternode::CheckCollateral(const COutPoint& outpoint, const CKeyID& keyID, int& nHeightRet) { AssertLockHeld(cs_main); @@ -120,7 +121,7 @@ CMasternode::CollateralStatus CMasternode::CheckCollateral(const COutPoint& outp return COLLATERAL_INVALID_AMOUNT; } - if(pubkey == CPubKey() || coin.out.scriptPubKey != GetScriptForDestination(pubkey.GetID())) { + if(keyID.IsNull() || coin.out.scriptPubKey != GetScriptForDestination(keyID)) { return COLLATERAL_INVALID_PUBKEY; } @@ -171,7 +172,7 @@ void CMasternode::Check(bool fForce) } int nActiveStatePrev = nActiveState; - bool fOurMasternode = fMasternodeMode && activeMasternode.pubKeyMasternode == pubKeyMasternode; + bool fOurMasternode = fMasternodeMode && activeMasternodeInfo.keyIDMasternode == keyIDMasternode; // masternode doesn't meet payment protocol requirements ... bool fRequireUpdate = nProtocolVersion < mnpayments.GetMinMasternodePaymentsProto() || @@ -319,7 +320,7 @@ void CMasternode::UpdateLastPaid(const CBlockIndex *pindex, int nMaxBlocksToScan const CBlockIndex *BlockReading = pindex; - CScript mnpayee = GetScriptForDestination(pubKeyCollateralAddress.GetID()); + CScript mnpayee = GetScriptForDestination(keyIDCollateralAddress); // LogPrint("mnpayments", "CMasternode::UpdateLastPaidBlock -- searching for block with payment to %s\n", outpoint.ToStringShort()); LOCK(cs_mapMasternodeBlocks); @@ -396,7 +397,7 @@ bool CMasternodeBroadcast::Create(const COutPoint& outpoint, const CService& ser // wait for reindex and/or import to finish if (fImporting || fReindex) return false; - LogPrint("masternode", "CMasternodeBroadcast::Create -- pubKeyCollateralAddressNew = %s, pubKeyMasternodeNew.GetID() = %s\n", + LogPrint("masternode", "CMasternodeBroadcast::Create -- pubKeyCollateralAddressNew = %s, keyIDMasternode = %s\n", CBitcoinAddress(pubKeyCollateralAddressNew.GetID()).ToString(), pubKeyMasternodeNew.GetID().ToString()); @@ -409,7 +410,7 @@ bool CMasternodeBroadcast::Create(const COutPoint& outpoint, const CService& ser }; CMasternodePing mnp(outpoint); - if (!mnp.Sign(keyMasternodeNew, pubKeyMasternodeNew)) + if (!mnp.Sign(keyMasternodeNew, pubKeyMasternodeNew.GetID())) return Log(strprintf("Failed to sign ping, masternode=%s", outpoint.ToStringShort())); mnbRet = CMasternodeBroadcast(service, outpoint, pubKeyCollateralAddressNew, pubKeyMasternodeNew, PROTOCOL_VERSION); @@ -457,19 +458,19 @@ bool CMasternodeBroadcast::SimpleCheck(int& nDos) } CScript pubkeyScript; - pubkeyScript = GetScriptForDestination(pubKeyCollateralAddress.GetID()); + pubkeyScript = GetScriptForDestination(keyIDCollateralAddress); if(pubkeyScript.size() != 25) { - LogPrintf("CMasternodeBroadcast::SimpleCheck -- pubKeyCollateralAddress has the wrong size\n"); + LogPrintf("CMasternodeBroadcast::SimpleCheck -- keyIDCollateralAddress has the wrong size\n"); nDos = 100; return false; } CScript pubkeyScript2; - pubkeyScript2 = GetScriptForDestination(pubKeyMasternode.GetID()); + pubkeyScript2 = GetScriptForDestination(keyIDMasternode); if(pubkeyScript2.size() != 25) { - LogPrintf("CMasternodeBroadcast::SimpleCheck -- pubKeyMasternode has the wrong size\n"); + LogPrintf("CMasternodeBroadcast::SimpleCheck -- keyIDMasternode has the wrong size\n"); nDos = 100; return false; } @@ -511,8 +512,8 @@ bool CMasternodeBroadcast::Update(CMasternode* pmn, int& nDos, CConnman& connman } // IsVnAssociatedWithPubkey is validated once in CheckOutpoint, after that they just need to match - if(pmn->pubKeyCollateralAddress != pubKeyCollateralAddress) { - LogPrintf("CMasternodeBroadcast::Update -- Got mismatched pubKeyCollateralAddress and outpoint\n"); + if(pmn->keyIDCollateralAddress != keyIDCollateralAddress) { + LogPrintf("CMasternodeBroadcast::Update -- Got mismatched keyIDCollateralAddress and outpoint\n"); nDos = 33; return false; } @@ -523,7 +524,7 @@ bool CMasternodeBroadcast::Update(CMasternode* pmn, int& nDos, CConnman& connman } // if ther was no masternode broadcast recently or if it matches our Masternode privkey... - if(!pmn->IsBroadcastedWithin(MASTERNODE_MIN_MNB_SECONDS) || (fMasternodeMode && pubKeyMasternode == activeMasternode.pubKeyMasternode)) { + if(!pmn->IsBroadcastedWithin(MASTERNODE_MIN_MNB_SECONDS) || (fMasternodeMode && keyIDMasternode == activeMasternodeInfo.keyIDMasternode)) { // take the newest entry LogPrintf("CMasternodeBroadcast::Update -- Got UPDATED Masternode entry: addr=%s\n", addr.ToString()); if(pmn->UpdateFromNewBroadcast(*this, connman)) { @@ -540,14 +541,14 @@ bool CMasternodeBroadcast::CheckOutpoint(int& nDos) { // we are a masternode with the same outpoint (i.e. already activated) and this mnb is ours (matches our Masternode privkey) // so nothing to do here for us - if(fMasternodeMode && outpoint == activeMasternode.outpoint && pubKeyMasternode == activeMasternode.pubKeyMasternode) { + if(fMasternodeMode && outpoint == activeMasternodeInfo.outpoint && keyIDMasternode == activeMasternodeInfo.keyIDMasternode) { return false; } AssertLockHeld(cs_main); int nHeight; - CollateralStatus err = CheckCollateral(outpoint, pubKeyCollateralAddress, nHeight); + CollateralStatus err = CheckCollateral(outpoint, keyIDCollateralAddress, nHeight); if (err == COLLATERAL_UTXO_NOT_FOUND) { LogPrint("masternode", "CMasternodeBroadcast::CheckOutpoint -- Failed to find Masternode UTXO, masternode=%s\n", outpoint.ToStringShort()); return false; @@ -560,7 +561,7 @@ bool CMasternodeBroadcast::CheckOutpoint(int& nDos) } if(err == COLLATERAL_INVALID_PUBKEY) { - LogPrint("masternode", "CMasternodeBroadcast::CheckOutpoint -- Masternode UTXO should match pubKeyCollateralAddress, masternode=%s\n", outpoint.ToStringShort()); + LogPrint("masternode", "CMasternodeBroadcast::CheckOutpoint -- Masternode UTXO should match keyIDCollateralAddress, masternode=%s\n", outpoint.ToStringShort()); nDos = 33; return false; } @@ -635,13 +636,13 @@ bool CMasternodeBroadcast::Sign(const CKey& keyCollateralAddress) return false; } - if (!CHashSigner::VerifyHash(hash, pubKeyCollateralAddress, vchSig, strError)) { + if (!CHashSigner::VerifyHash(hash, keyIDCollateralAddress, vchSig, strError)) { LogPrintf("CMasternodeBroadcast::Sign -- VerifyMessage() failed, error: %s\n", strError); return false; } } else { std::string strMessage = addr.ToString(false) + std::to_string(sigTime) + - pubKeyCollateralAddress.GetID().ToString() + pubKeyMasternode.GetID().ToString() + + keyIDCollateralAddress.ToString() + keyIDMasternode.ToString() + std::to_string(nProtocolVersion); if (!CMessageSigner::SignMessage(strMessage, vchSig, keyCollateralAddress)) { @@ -649,7 +650,7 @@ bool CMasternodeBroadcast::Sign(const CKey& keyCollateralAddress) return false; } - if (!CMessageSigner::VerifyMessage(pubKeyCollateralAddress, vchSig, strMessage, strError)) { + if(!CMessageSigner::VerifyMessage(keyIDCollateralAddress, vchSig, strMessage, strError)) { LogPrintf("CMasternodeBroadcast::Sign -- VerifyMessage() failed, error: %s\n", strError); return false; } @@ -666,13 +667,13 @@ bool CMasternodeBroadcast::CheckSignature(int& nDos) const if (sporkManager.IsSporkActive(SPORK_6_NEW_SIGS)) { uint256 hash = GetSignatureHash(); - if (!CHashSigner::VerifyHash(hash, pubKeyCollateralAddress, vchSig, strError)) { + if (!CHashSigner::VerifyHash(hash, keyIDCollateralAddress, vchSig, strError)) { // maybe it's in old format std::string strMessage = addr.ToString(false) + std::to_string(sigTime) + - pubKeyCollateralAddress.GetID().ToString() + pubKeyMasternode.GetID().ToString() + + keyIDCollateralAddress.ToString() + keyIDMasternode.ToString() + std::to_string(nProtocolVersion); - if (!CMessageSigner::VerifyMessage(pubKeyCollateralAddress, vchSig, strMessage, strError)){ + if (!CMessageSigner::VerifyMessage(keyIDCollateralAddress, vchSig, strMessage, strError)){ // nope, not in old format either LogPrintf("CMasternodeBroadcast::CheckSignature -- Got bad Masternode announce signature, error: %s\n", strError); nDos = 100; @@ -681,10 +682,10 @@ bool CMasternodeBroadcast::CheckSignature(int& nDos) const } } else { std::string strMessage = addr.ToString(false) + std::to_string(sigTime) + - pubKeyCollateralAddress.GetID().ToString() + pubKeyMasternode.GetID().ToString() + + keyIDCollateralAddress.ToString() + keyIDMasternode.ToString() + std::to_string(nProtocolVersion); - if (!CMessageSigner::VerifyMessage(pubKeyCollateralAddress, vchSig, strMessage, strError)){ + if(!CMessageSigner::VerifyMessage(keyIDCollateralAddress, vchSig, strMessage, strError)){ LogPrintf("CMasternodeBroadcast::CheckSignature -- Got bad Masternode announce signature, error: %s\n", strError); nDos = 100; return false; @@ -742,7 +743,7 @@ CMasternodePing::CMasternodePing(const COutPoint& outpoint) nDaemonVersion = CLIENT_VERSION; } -bool CMasternodePing::Sign(const CKey& keyMasternode, const CPubKey& pubKeyMasternode) +bool CMasternodePing::Sign(const CKey& keyMasternode, const CKeyID& keyIDMasternode) { std::string strError; @@ -756,7 +757,7 @@ bool CMasternodePing::Sign(const CKey& keyMasternode, const CPubKey& pubKeyMaste return false; } - if (!CHashSigner::VerifyHash(hash, pubKeyMasternode, vchSig, strError)) { + if (!CHashSigner::VerifyHash(hash, keyIDMasternode, vchSig, strError)) { LogPrintf("CMasternodePing::Sign -- VerifyHash() failed, error: %s\n", strError); return false; } @@ -769,7 +770,7 @@ bool CMasternodePing::Sign(const CKey& keyMasternode, const CPubKey& pubKeyMaste return false; } - if (!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { + if(!CMessageSigner::VerifyMessage(keyIDMasternode, vchSig, strMessage, strError)) { LogPrintf("CMasternodePing::Sign -- VerifyMessage() failed, error: %s\n", strError); return false; } @@ -778,7 +779,7 @@ bool CMasternodePing::Sign(const CKey& keyMasternode, const CPubKey& pubKeyMaste return true; } -bool CMasternodePing::CheckSignature(const CPubKey& pubKeyMasternode, int &nDos) const +bool CMasternodePing::CheckSignature(CKeyID& keyIDMasternode, int &nDos) const { std::string strError = ""; nDos = 0; @@ -786,11 +787,11 @@ bool CMasternodePing::CheckSignature(const CPubKey& pubKeyMasternode, int &nDos) if (sporkManager.IsSporkActive(SPORK_6_NEW_SIGS)) { uint256 hash = GetSignatureHash(); - if (!CHashSigner::VerifyHash(hash, pubKeyMasternode, vchSig, strError)) { + if (!CHashSigner::VerifyHash(hash, keyIDMasternode, vchSig, strError)) { std::string strMessage = CTxIn(masternodeOutpoint).ToString() + blockHash.ToString() + std::to_string(sigTime); - if (!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { + if(!CMessageSigner::VerifyMessage(keyIDMasternode, vchSig, strMessage, strError)) { LogPrintf("CMasternodePing::CheckSignature -- Got bad Masternode ping signature, masternode=%s, error: %s\n", masternodeOutpoint.ToStringShort(), strError); nDos = 33; return false; @@ -800,7 +801,7 @@ bool CMasternodePing::CheckSignature(const CPubKey& pubKeyMasternode, int &nDos) std::string strMessage = CTxIn(masternodeOutpoint).ToString() + blockHash.ToString() + std::to_string(sigTime); - if (!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { + if (!CMessageSigner::VerifyMessage(keyIDMasternode, vchSig, strMessage, strError)) { LogPrintf("CMasternodePing::CheckSignature -- Got bad Masternode ping signature, masternode=%s, error: %s\n", masternodeOutpoint.ToStringShort(), strError); nDos = 33; return false; @@ -884,7 +885,7 @@ bool CMasternodePing::CheckAndUpdate(CMasternode* pmn, bool fFromNewBroadcast, i return false; } - if (!CheckSignature(pmn->pubKeyMasternode, nDos)) return false; + if (!CheckSignature(pmn->keyIDMasternode, nDos)) return false; // so, ping seems to be ok diff --git a/src/masternode.h b/src/masternode.h index 9e738e7d4df6..6b60b93e18f5 100644 --- a/src/masternode.h +++ b/src/masternode.h @@ -95,8 +95,8 @@ class CMasternodePing bool IsExpired() const { return GetAdjustedTime() - sigTime > MASTERNODE_NEW_START_REQUIRED_SECONDS; } - bool Sign(const CKey& keyMasternode, const CPubKey& pubKeyMasternode); - bool CheckSignature(const CPubKey& pubKeyMasternode, int &nDos) const; + bool Sign(const CKey& keyMasternode, const CKeyID& keyIDMasternode); + bool CheckSignature(CKeyID& keyIDMasternode, int &nDos) const; bool SimpleCheck(int& nDos); bool CheckAndUpdate(CMasternode* pmn, bool fFromNewBroadcast, int& nDos, CConnman& connman); void Relay(CConnman& connman); @@ -130,12 +130,21 @@ struct masternode_info_t masternode_info_t(int activeState, int protoVer, int64_t sTime) : nActiveState{activeState}, nProtocolVersion{protoVer}, sigTime{sTime} {} + // only called when the network is in legacy MN list mode masternode_info_t(int activeState, int protoVer, int64_t sTime, COutPoint const& outpnt, CService const& addr, CPubKey const& pkCollAddr, CPubKey const& pkMN) : nActiveState{activeState}, nProtocolVersion{protoVer}, sigTime{sTime}, outpoint{outpnt}, addr{addr}, - pubKeyCollateralAddress{pkCollAddr}, pubKeyMasternode{pkMN} {} + pubKeyCollateralAddress{pkCollAddr}, pubKeyMasternode{pkMN}, keyIDCollateralAddress{pkCollAddr.GetID()}, keyIDMasternode{pkMN.GetID()} {} + + // only called when the network is in deterministic MN list mode + masternode_info_t(int activeState, int protoVer, int64_t sTime, + COutPoint const& outpnt, CService const& addr, + CKeyID const& pkCollAddr, CKeyID const& pkMN) : + nActiveState{activeState}, nProtocolVersion{protoVer}, sigTime{sTime}, + outpoint{outpnt}, addr{addr}, + pubKeyCollateralAddress{}, pubKeyMasternode{}, keyIDCollateralAddress{pkCollAddr}, keyIDMasternode{pkMN} {} int nActiveState = 0; int nProtocolVersion = 0; @@ -143,8 +152,10 @@ struct masternode_info_t COutPoint outpoint{}; CService addr{}; - CPubKey pubKeyCollateralAddress{}; - CPubKey pubKeyMasternode{}; + CPubKey pubKeyCollateralAddress{}; // this will be invalid/unset when the network switches to deterministic MNs (luckely it's only important for the broadcast hash) + CPubKey pubKeyMasternode{}; // this will be invalid/unset when the network switches to deterministic MNs (luckely it's only important for the broadcast hash) + CKeyID keyIDCollateralAddress{}; + CKeyID keyIDMasternode{}; int64_t nLastDsq = 0; //the dsq count from the last dsq broadcast of this node int64_t nTimeLastChecked = 0; @@ -224,6 +235,8 @@ class CMasternode : public masternode_info_t READWRITE(addr); READWRITE(pubKeyCollateralAddress); READWRITE(pubKeyMasternode); + READWRITE(keyIDCollateralAddress); + READWRITE(keyIDMasternode); READWRITE(lastPing); READWRITE(vchSig); READWRITE(sigTime); @@ -246,8 +259,8 @@ class CMasternode : public masternode_info_t bool UpdateFromNewBroadcast(CMasternodeBroadcast& mnb, CConnman& connman); - static CollateralStatus CheckCollateral(const COutPoint& outpoint, const CPubKey& pubkey); - static CollateralStatus CheckCollateral(const COutPoint& outpoint, const CPubKey& pubkey, int& nHeightRet); + static CollateralStatus CheckCollateral(const COutPoint& outpoint, const CKeyID& keyID); + static CollateralStatus CheckCollateral(const COutPoint& outpoint, const CKeyID& keyID, int& nHeightRet); void Check(bool fForce = false); bool IsBroadcastedWithin(int nSeconds) { return GetAdjustedTime() - sigTime < nSeconds; } @@ -389,6 +402,11 @@ class CMasternodeBroadcast : public CMasternode if (!(s.GetType() & SER_GETHASH)) { READWRITE(lastPing); } + + if (ser_action.ForRead()) { + keyIDCollateralAddress = pubKeyCollateralAddress.GetID(); + keyIDMasternode = pubKeyMasternode.GetID(); + } } uint256 GetHash() const; diff --git a/src/masternodeman.cpp b/src/masternodeman.cpp index 71f9b4e757e7..bd89f275820d 100644 --- a/src/masternodeman.cpp +++ b/src/masternodeman.cpp @@ -25,7 +25,7 @@ /** Masternode manager */ CMasternodeMan mnodeman; -const std::string CMasternodeMan::SERIALIZATION_VERSION_STRING = "CMasternodeMan-Version-8"; +const std::string CMasternodeMan::SERIALIZATION_VERSION_STRING = "CMasternodeMan-Version-9"; const int CMasternodeMan::LAST_PAID_SCAN_BLOCKS = 100; struct CompareLastPaidBlock @@ -471,11 +471,10 @@ bool CMasternodeMan::GetMasternodeInfo(const COutPoint& outpoint, masternode_inf return true; } -bool CMasternodeMan::GetMasternodeInfo(const CPubKey& pubKeyMasternode, masternode_info_t& mnInfoRet) -{ +bool CMasternodeMan::GetMasternodeInfo(const CKeyID& keyIDMasternode, masternode_info_t& mnInfoRet) { LOCK(cs); for (const auto& mnpair : mapMasternodes) { - if (mnpair.second.pubKeyMasternode == pubKeyMasternode) { + if (mnpair.second.keyIDMasternode == keyIDMasternode) { mnInfoRet = mnpair.second.GetInfo(); return true; } @@ -483,17 +482,18 @@ bool CMasternodeMan::GetMasternodeInfo(const CPubKey& pubKeyMasternode, masterno return false; } +bool CMasternodeMan::GetMasternodeInfo(const CPubKey& pubKeyMasternode, masternode_info_t& mnInfoRet) +{ + return GetMasternodeInfo(pubKeyMasternode.GetID(), mnInfoRet); +} + bool CMasternodeMan::GetMasternodeInfo(const CScript& payee, masternode_info_t& mnInfoRet) { - LOCK(cs); - for (const auto& mnpair : mapMasternodes) { - CScript scriptCollateralAddress = GetScriptForDestination(mnpair.second.pubKeyCollateralAddress.GetID()); - if (scriptCollateralAddress == payee) { - mnInfoRet = mnpair.second.GetInfo(); - return true; - } - } - return false; + CTxDestination dest; + if (!ExtractDestination(payee, dest) || !boost::get(&dest)) + return false; + CKeyID keyId = *boost::get(&dest); + return GetMasternodeInfo(keyId, mnInfoRet); } bool CMasternodeMan::Has(const COutPoint& outpoint) @@ -994,7 +994,7 @@ void CMasternodeMan::PushDsegInvs(CNode* pnode, const CMasternode& mn) void CMasternodeMan::DoFullVerificationStep(CConnman& connman) { - if(activeMasternode.outpoint.IsNull()) return; + if(activeMasternodeInfo.outpoint.IsNull()) return; if(!masternodeSync.IsSynced()) return; rank_pair_vec_t vecMasternodeRanks; @@ -1014,7 +1014,7 @@ void CMasternodeMan::DoFullVerificationStep(CConnman& connman) (int)MAX_POSE_RANK); return; } - if(rankPair.second.outpoint == activeMasternode.outpoint) { + if(rankPair.second.outpoint == activeMasternodeInfo.outpoint) { nMyRank = rankPair.first; LogPrint("masternode", "CMasternodeMan::DoFullVerificationStep -- Found self at rank %d/%d, verifying up to %d masternodes\n", nMyRank, nRanksTotal, (int)MAX_POSE_CONNECTIONS); @@ -1199,24 +1199,24 @@ void CMasternodeMan::SendVerifyReply(CNode* pnode, CMasternodeVerification& mnv, if (sporkManager.IsSporkActive(SPORK_6_NEW_SIGS)) { uint256 hash = mnv.GetSignatureHash1(blockHash); - if(!CHashSigner::SignHash(hash, activeMasternode.keyMasternode, mnv.vchSig1)) { + if(!CHashSigner::SignHash(hash, activeMasternodeInfo.keyMasternode, mnv.vchSig1)) { LogPrintf("CMasternodeMan::SendVerifyReply -- SignHash() failed\n"); return; } - if (!CHashSigner::VerifyHash(hash, activeMasternode.pubKeyMasternode, mnv.vchSig1, strError)) { + if (!CHashSigner::VerifyHash(hash, activeMasternodeInfo.keyIDMasternode, mnv.vchSig1, strError)) { LogPrintf("CMasternodeMan::SendVerifyReply -- VerifyHash() failed, error: %s\n", strError); return; } } else { - std::string strMessage = strprintf("%s%d%s", activeMasternode.service.ToString(false), mnv.nonce, blockHash.ToString()); + std::string strMessage = strprintf("%s%d%s", activeMasternodeInfo.service.ToString(false), mnv.nonce, blockHash.ToString()); - if(!CMessageSigner::SignMessage(strMessage, mnv.vchSig1, activeMasternode.keyMasternode)) { + if(!CMessageSigner::SignMessage(strMessage, mnv.vchSig1, activeMasternodeInfo.keyMasternode)) { LogPrintf("MasternodeMan::SendVerifyReply -- SignMessage() failed\n"); return; } - if(!CMessageSigner::VerifyMessage(activeMasternode.pubKeyMasternode, mnv.vchSig1, strMessage, strError)) { + if(!CMessageSigner::VerifyMessage(activeMasternodeInfo.keyIDMasternode, mnv.vchSig1, strMessage, strError)) { LogPrintf("MasternodeMan::SendVerifyReply -- VerifyMessage() failed, error: %s\n", strError); return; } @@ -1283,10 +1283,10 @@ void CMasternodeMan::ProcessVerifyReply(CNode* pnode, CMasternodeVerification& m if(CAddress(mnpair.second.addr, NODE_NETWORK) == pnode->addr) { bool fFound = false; if (sporkManager.IsSporkActive(SPORK_6_NEW_SIGS)) { - fFound = CHashSigner::VerifyHash(hash1, mnpair.second.pubKeyMasternode, mnv.vchSig1, strError); + fFound = CHashSigner::VerifyHash(hash1, mnpair.second.keyIDMasternode, mnv.vchSig1, strError); // we don't care about mnv with signature in old format } else { - fFound = CMessageSigner::VerifyMessage(mnpair.second.pubKeyMasternode, mnv.vchSig1, strMessage1, strError); + fFound = CMessageSigner::VerifyMessage(mnpair.second.keyIDMasternode, mnv.vchSig1, strMessage1, strError); } if (fFound) { // found it! @@ -1297,23 +1297,23 @@ void CMasternodeMan::ProcessVerifyReply(CNode* pnode, CMasternodeVerification& m netfulfilledman.AddFulfilledRequest(pnode->addr, strprintf("%s", NetMsgType::MNVERIFY)+"-done"); // we can only broadcast it if we are an activated masternode - if(activeMasternode.outpoint.IsNull()) continue; + if(activeMasternodeInfo.outpoint.IsNull()) continue; // update ... mnv.addr = mnpair.second.addr; mnv.masternodeOutpoint1 = mnpair.second.outpoint; - mnv.masternodeOutpoint2 = activeMasternode.outpoint; + mnv.masternodeOutpoint2 = activeMasternodeInfo.outpoint; // ... and sign it std::string strError; if (sporkManager.IsSporkActive(SPORK_6_NEW_SIGS)) { uint256 hash2 = mnv.GetSignatureHash2(blockHash); - if(!CHashSigner::SignHash(hash2, activeMasternode.keyMasternode, mnv.vchSig2)) { + if(!CHashSigner::SignHash(hash2, activeMasternodeInfo.keyMasternode, mnv.vchSig2)) { LogPrintf("MasternodeMan::ProcessVerifyReply -- SignHash() failed\n"); return; } - if(!CHashSigner::VerifyHash(hash2, activeMasternode.pubKeyMasternode, mnv.vchSig2, strError)) { + if(!CHashSigner::VerifyHash(hash2, activeMasternodeInfo.keyIDMasternode, mnv.vchSig2, strError)) { LogPrintf("MasternodeMan::ProcessVerifyReply -- VerifyHash() failed, error: %s\n", strError); return; } @@ -1321,12 +1321,12 @@ void CMasternodeMan::ProcessVerifyReply(CNode* pnode, CMasternodeVerification& m std::string strMessage2 = strprintf("%s%d%s%s%s", mnv.addr.ToString(false), mnv.nonce, blockHash.ToString(), mnv.masternodeOutpoint1.ToStringShort(), mnv.masternodeOutpoint2.ToStringShort()); - if(!CMessageSigner::SignMessage(strMessage2, mnv.vchSig2, activeMasternode.keyMasternode)) { + if(!CMessageSigner::SignMessage(strMessage2, mnv.vchSig2, activeMasternodeInfo.keyMasternode)) { LogPrintf("MasternodeMan::ProcessVerifyReply -- SignMessage() failed\n"); return; } - if(!CMessageSigner::VerifyMessage(activeMasternode.pubKeyMasternode, mnv.vchSig2, strMessage2, strError)) { + if(!CMessageSigner::VerifyMessage(activeMasternodeInfo.keyIDMasternode, mnv.vchSig2, strMessage2, strError)) { LogPrintf("MasternodeMan::ProcessVerifyReply -- VerifyMessage() failed, error: %s\n", strError); return; } @@ -1436,12 +1436,12 @@ void CMasternodeMan::ProcessVerifyBroadcast(CNode* pnode, const CMasternodeVerif uint256 hash1 = mnv.GetSignatureHash1(blockHash); uint256 hash2 = mnv.GetSignatureHash2(blockHash); - if(!CHashSigner::VerifyHash(hash1, pmn1->pubKeyMasternode, mnv.vchSig1, strError)) { + if(!CHashSigner::VerifyHash(hash1, pmn1->keyIDMasternode, mnv.vchSig1, strError)) { LogPrintf("MasternodeMan::ProcessVerifyBroadcast -- VerifyHash() failed, error: %s\n", strError); return; } - if(!CHashSigner::VerifyHash(hash2, pmn2->pubKeyMasternode, mnv.vchSig2, strError)) { + if(!CHashSigner::VerifyHash(hash2, pmn2->keyIDMasternode, mnv.vchSig2, strError)) { LogPrintf("MasternodeMan::ProcessVerifyBroadcast -- VerifyHash() failed, error: %s\n", strError); return; } @@ -1450,12 +1450,12 @@ void CMasternodeMan::ProcessVerifyBroadcast(CNode* pnode, const CMasternodeVerif std::string strMessage2 = strprintf("%s%d%s%s%s", mnv.addr.ToString(false), mnv.nonce, blockHash.ToString(), mnv.masternodeOutpoint1.ToStringShort(), mnv.masternodeOutpoint2.ToStringShort()); - if(!CMessageSigner::VerifyMessage(pmn1->pubKeyMasternode, mnv.vchSig1, strMessage1, strError)) { + if(!CMessageSigner::VerifyMessage(pmn1->keyIDMasternode, mnv.vchSig1, strMessage1, strError)) { LogPrintf("CMasternodeMan::ProcessVerifyBroadcast -- VerifyMessage() for masternode1 failed, error: %s\n", strError); return; } - if(!CMessageSigner::VerifyMessage(pmn2->pubKeyMasternode, mnv.vchSig2, strMessage2, strError)) { + if(!CMessageSigner::VerifyMessage(pmn2->keyIDMasternode, mnv.vchSig2, strMessage2, strError)) { LogPrintf("CMasternodeMan::ProcessVerifyBroadcast -- VerifyMessage() for masternode2 failed, error: %s\n", strError); return; } @@ -1567,13 +1567,13 @@ bool CMasternodeMan::CheckMnbAndUpdateMasternodeList(CNode* pfrom, CMasternodeBr Add(mnb); masternodeSync.BumpAssetLastTime("CMasternodeMan::CheckMnbAndUpdateMasternodeList - new"); // if it matches our Masternode privkey... - if(fMasternodeMode && mnb.pubKeyMasternode == activeMasternode.pubKeyMasternode) { + if(fMasternodeMode && mnb.keyIDMasternode == activeMasternodeInfo.keyIDMasternode) { mnb.nPoSeBanScore = -MASTERNODE_POSE_BAN_MAX_SCORE; if(mnb.nProtocolVersion == PROTOCOL_VERSION) { // ... and PROTOCOL_VERSION, then we've been remotely activated ... LogPrintf("CMasternodeMan::CheckMnbAndUpdateMasternodeList -- Got NEW Masternode entry: masternode=%s sigTime=%lld addr=%s\n", mnb.outpoint.ToStringShort(), mnb.sigTime, mnb.addr.ToString()); - activeMasternode.ManageState(connman); + legacyActiveMasternodeManager.ManageState(connman); } else { // ... otherwise we need to reactivate our node, do not add it to the list and do not relay // but also do not ban the node we get this message from @@ -1643,11 +1643,11 @@ void CMasternodeMan::RemoveGovernanceObject(uint256 nGovernanceObjectHash) } } -void CMasternodeMan::CheckMasternode(const CPubKey& pubKeyMasternode, bool fForce) +void CMasternodeMan::CheckMasternode(const CKeyID& keyIDMasternode, bool fForce) { LOCK2(cs_main, cs); for (auto& mnpair : mapMasternodes) { - if (mnpair.second.pubKeyMasternode == pubKeyMasternode) { + if (mnpair.second.keyIDMasternode == keyIDMasternode) { mnpair.second.Check(fForce); return; } diff --git a/src/masternodeman.h b/src/masternodeman.h index 11e7751c9e3b..e3bf617a1709 100644 --- a/src/masternodeman.h +++ b/src/masternodeman.h @@ -169,6 +169,7 @@ class CMasternodeMan bool Has(const COutPoint& outpoint); bool GetMasternodeInfo(const COutPoint& outpoint, masternode_info_t& mnInfoRet); + bool GetMasternodeInfo(const CKeyID& keyIDMasternode, masternode_info_t& mnInfoRet); bool GetMasternodeInfo(const CPubKey& pubKeyMasternode, masternode_info_t& mnInfoRet); bool GetMasternodeInfo(const CScript& payee, masternode_info_t& mnInfoRet); @@ -229,7 +230,7 @@ class CMasternodeMan bool AddGovernanceVote(const COutPoint& outpoint, uint256 nGovernanceObjectHash); void RemoveGovernanceObject(uint256 nGovernanceObjectHash); - void CheckMasternode(const CPubKey& pubKeyMasternode, bool fForce); + void CheckMasternode(const CKeyID& keyIDMasternode, bool fForce); bool IsMasternodePingedWithin(const COutPoint& outpoint, int nSeconds, int64_t nTimeToCheckAt = -1); void SetMasternodeLastPing(const COutPoint& outpoint, const CMasternodePing& mnp); diff --git a/src/net_processing.cpp b/src/net_processing.cpp index a4e8446f8ce8..7fb8f1202b63 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -1973,7 +1973,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr // we have no idea about (e.g we were offline)? How to handle them? } - if(!dstx.CheckSignature(mn.pubKeyMasternode)) { + if(!dstx.CheckSignature(mn.keyIDMasternode)) { LogPrint("privatesend", "DSTX -- CheckSignature() failed for %s\n", hashTx.ToString()); return false; } diff --git a/src/privatesend-client.cpp b/src/privatesend-client.cpp index 5c915c7a7429..253e7aae6a44 100644 --- a/src/privatesend-client.cpp +++ b/src/privatesend-client.cpp @@ -56,7 +56,7 @@ void CPrivateSendClient::ProcessMessage(CNode* pfrom, const std::string& strComm masternode_info_t infoMn; if(!mnodeman.GetMasternodeInfo(dsq.masternodeOutpoint, infoMn)) return; - if(!dsq.CheckSignature(infoMn.pubKeyMasternode)) { + if(!dsq.CheckSignature(infoMn.keyIDMasternode)) { // we probably have outdated info mnodeman.AskForMN(pfrom, dsq.masternodeOutpoint, connman); return; diff --git a/src/privatesend-server.cpp b/src/privatesend-server.cpp index c6dbff6a2590..0b544466249a 100644 --- a/src/privatesend-server.cpp +++ b/src/privatesend-server.cpp @@ -48,7 +48,7 @@ void CPrivateSendServer::ProcessMessage(CNode* pfrom, const std::string& strComm if(dsa.nInputCount < 0 || dsa.nInputCount > PRIVATESEND_ENTRY_MAX_SIZE) return; masternode_info_t mnInfo; - if(!mnodeman.GetMasternodeInfo(activeMasternode.outpoint, mnInfo)) { + if(!mnodeman.GetMasternodeInfo(activeMasternodeInfo.outpoint, mnInfo)) { PushStatus(pfrom, STATUS_REJECTED, ERR_MN_LIST, connman); return; } @@ -105,7 +105,7 @@ void CPrivateSendServer::ProcessMessage(CNode* pfrom, const std::string& strComm masternode_info_t mnInfo; if(!mnodeman.GetMasternodeInfo(dsq.masternodeOutpoint, mnInfo)) return; - if(!dsq.CheckSignature(mnInfo.pubKeyMasternode)) { + if(!dsq.CheckSignature(mnInfo.keyIDMasternode)) { // we probably have outdated info mnodeman.AskForMN(pfrom, dsq.masternodeOutpoint, connman); return; @@ -363,7 +363,7 @@ void CPrivateSendServer::CommitFinalTransaction(CConnman& connman) // create and sign masternode dstx transaction if(!CPrivateSend::GetDSTX(hashTx)) { - CDarksendBroadcastTx dstxNew(finalTransaction, activeMasternode.outpoint, GetAdjustedTime()); + CDarksendBroadcastTx dstxNew(finalTransaction, activeMasternodeInfo.outpoint, GetAdjustedTime()); dstxNew.Sign(); CPrivateSend::AddDSTX(dstxNew); } @@ -524,7 +524,7 @@ void CPrivateSendServer::CheckForCompleteQueue(CConnman& connman) if(nState == POOL_STATE_QUEUE && IsSessionReady()) { SetState(POOL_STATE_ACCEPTING_ENTRIES); - CDarksendQueue dsq(nSessionDenom, nSessionInputCount, activeMasternode.outpoint, GetAdjustedTime(), true); + CDarksendQueue dsq(nSessionDenom, nSessionInputCount, activeMasternodeInfo.outpoint, GetAdjustedTime(), true); LogPrint("privatesend", "CPrivateSendServer::CheckForCompleteQueue -- queue is ready, signing and relaying (%s)\n", dsq.ToString()); dsq.Sign(); dsq.Relay(connman); @@ -739,7 +739,7 @@ bool CPrivateSendServer::CreateNewSession(const CDarksendAccept& dsa, PoolMessag if(!fUnitTest) { //broadcast that I'm accepting entries, only if it's the first entry through - CDarksendQueue dsq(dsa.nDenom, dsa.nInputCount, activeMasternode.outpoint, GetAdjustedTime(), false); + CDarksendQueue dsq(dsa.nDenom, dsa.nInputCount, activeMasternodeInfo.outpoint, GetAdjustedTime(), false); LogPrint("privatesend", "CPrivateSendServer::CreateNewSession -- signing and relaying new queue: %s\n", dsq.ToString()); dsq.Sign(); dsq.Relay(connman); diff --git a/src/privatesend.cpp b/src/privatesend.cpp index de585b728f68..1d08836addba 100644 --- a/src/privatesend.cpp +++ b/src/privatesend.cpp @@ -47,12 +47,12 @@ bool CDarksendQueue::Sign() if (sporkManager.IsSporkActive(SPORK_6_NEW_SIGS)) { uint256 hash = GetSignatureHash(); - if (!CHashSigner::SignHash(hash, activeMasternode.keyMasternode, vchSig)) { + if (!CHashSigner::SignHash(hash, activeMasternodeInfo.keyMasternode, vchSig)) { LogPrintf("CDarksendQueue::Sign -- SignHash() failed\n"); return false; } - if (!CHashSigner::VerifyHash(hash, activeMasternode.pubKeyMasternode, vchSig, strError)) { + if (!CHashSigner::VerifyHash(hash, activeMasternodeInfo.keyIDMasternode, vchSig, strError)) { LogPrintf("CDarksendQueue::Sign -- VerifyHash() failed, error: %s\n", strError); return false; } @@ -62,12 +62,12 @@ bool CDarksendQueue::Sign() std::to_string(nTime) + std::to_string(fReady); - if(!CMessageSigner::SignMessage(strMessage, vchSig, activeMasternode.keyMasternode)) { + if(!CMessageSigner::SignMessage(strMessage, vchSig, activeMasternodeInfo.keyMasternode)) { LogPrintf("CDarksendQueue::Sign -- SignMessage() failed, %s\n", ToString()); return false; } - if(!CMessageSigner::VerifyMessage(activeMasternode.pubKeyMasternode, vchSig, strMessage, strError)) { + if(!CMessageSigner::VerifyMessage(activeMasternodeInfo.keyIDMasternode, vchSig, strMessage, strError)) { LogPrintf("CDarksendQueue::Sign -- VerifyMessage() failed, error: %s\n", strError); return false; } @@ -76,14 +76,14 @@ bool CDarksendQueue::Sign() return true; } -bool CDarksendQueue::CheckSignature(const CPubKey& pubKeyMasternode) const +bool CDarksendQueue::CheckSignature(const CKeyID& keyIDMasternode) const { std::string strError = ""; if (sporkManager.IsSporkActive(SPORK_6_NEW_SIGS)) { uint256 hash = GetSignatureHash(); - if (!CHashSigner::VerifyHash(hash, pubKeyMasternode, vchSig, strError)) { + if (!CHashSigner::VerifyHash(hash, keyIDMasternode, vchSig, strError)) { // we don't care about queues with old signature format LogPrintf("CDarksendQueue::CheckSignature -- VerifyHash() failed, error: %s\n", strError); return false; @@ -94,7 +94,7 @@ bool CDarksendQueue::CheckSignature(const CPubKey& pubKeyMasternode) const std::to_string(nTime) + std::to_string(fReady); - if(!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { + if(!CMessageSigner::VerifyMessage(keyIDMasternode, vchSig, strMessage, strError)) { LogPrintf("CDarksendQueue::CheckSignature -- Got bad Masternode queue signature: %s; error: %s\n", ToString(), strError); return false; } @@ -127,24 +127,24 @@ bool CDarksendBroadcastTx::Sign() if (sporkManager.IsSporkActive(SPORK_6_NEW_SIGS)) { uint256 hash = GetSignatureHash(); - if (!CHashSigner::SignHash(hash, activeMasternode.keyMasternode, vchSig)) { + if (!CHashSigner::SignHash(hash, activeMasternodeInfo.keyMasternode, vchSig)) { LogPrintf("CDarksendBroadcastTx::Sign -- SignHash() failed\n"); return false; } - if (!CHashSigner::VerifyHash(hash, activeMasternode.pubKeyMasternode, vchSig, strError)) { + if (!CHashSigner::VerifyHash(hash, activeMasternodeInfo.keyIDMasternode, vchSig, strError)) { LogPrintf("CDarksendBroadcastTx::Sign -- VerifyHash() failed, error: %s\n", strError); return false; } } else { std::string strMessage = tx->GetHash().ToString() + std::to_string(sigTime); - if(!CMessageSigner::SignMessage(strMessage, vchSig, activeMasternode.keyMasternode)) { + if(!CMessageSigner::SignMessage(strMessage, vchSig, activeMasternodeInfo.keyMasternode)) { LogPrintf("CDarksendBroadcastTx::Sign -- SignMessage() failed\n"); return false; } - if(!CMessageSigner::VerifyMessage(activeMasternode.pubKeyMasternode, vchSig, strMessage, strError)) { + if(!CMessageSigner::VerifyMessage(activeMasternodeInfo.keyIDMasternode, vchSig, strMessage, strError)) { LogPrintf("CDarksendBroadcastTx::Sign -- VerifyMessage() failed, error: %s\n", strError); return false; } @@ -153,14 +153,14 @@ bool CDarksendBroadcastTx::Sign() return true; } -bool CDarksendBroadcastTx::CheckSignature(const CPubKey& pubKeyMasternode) const +bool CDarksendBroadcastTx::CheckSignature(const CKeyID& keyIDMasternode) const { std::string strError = ""; if (sporkManager.IsSporkActive(SPORK_6_NEW_SIGS)) { uint256 hash = GetSignatureHash(); - if (!CHashSigner::VerifyHash(hash, pubKeyMasternode, vchSig, strError)) { + if (!CHashSigner::VerifyHash(hash, keyIDMasternode, vchSig, strError)) { // we don't care about dstxes with old signature format LogPrintf("CDarksendBroadcastTx::CheckSignature -- VerifyHash() failed, error: %s\n", strError); return false; @@ -168,7 +168,7 @@ bool CDarksendBroadcastTx::CheckSignature(const CPubKey& pubKeyMasternode) const } else { std::string strMessage = tx->GetHash().ToString() + std::to_string(sigTime); - if(!CMessageSigner::VerifyMessage(pubKeyMasternode, vchSig, strMessage, strError)) { + if(!CMessageSigner::VerifyMessage(keyIDMasternode, vchSig, strMessage, strError)) { LogPrintf("CDarksendBroadcastTx::CheckSignature -- Got bad dstx signature, error: %s\n", strError); return false; } diff --git a/src/privatesend.h b/src/privatesend.h index e04f046b5048..b2e2474f46de 100644 --- a/src/privatesend.h +++ b/src/privatesend.h @@ -249,7 +249,7 @@ class CDarksendQueue */ bool Sign(); /// Check if we have a valid Masternode address - bool CheckSignature(const CPubKey& pubKeyMasternode) const; + bool CheckSignature(const CKeyID& keyIDMasternode) const; bool Relay(CConnman &connman); @@ -341,7 +341,7 @@ class CDarksendBroadcastTx uint256 GetSignatureHash() const; bool Sign(); - bool CheckSignature(const CPubKey& pubKeyMasternode) const; + bool CheckSignature(const CKeyID& keyIDMasternode) const; void SetConfirmedHeight(int nConfirmedHeightIn) { nConfirmedHeight = nConfirmedHeightIn; } bool IsExpired(int nHeight); diff --git a/src/qt/masternodelist.cpp b/src/qt/masternodelist.cpp index 6805c320b0f8..266a143351a4 100644 --- a/src/qt/masternodelist.cpp +++ b/src/qt/masternodelist.cpp @@ -215,7 +215,7 @@ void MasternodeList::updateMyMasternodeInfo(QString strAlias, QString strAddr, c QTableWidgetItem *activeSecondsItem = new QTableWidgetItem(QString::fromStdString(DurationToDHMS(fFound ? (infoMn.nTimeLastPing - infoMn.sigTime) : 0))); QTableWidgetItem *lastSeenItem = new QTableWidgetItem(QString::fromStdString(DateTimeStrFormat("%Y-%m-%d %H:%M", fFound ? infoMn.nTimeLastPing + GetOffsetFromUtc() : 0))); - QTableWidgetItem *pubkeyItem = new QTableWidgetItem(QString::fromStdString(fFound ? CBitcoinAddress(infoMn.pubKeyCollateralAddress.GetID()).ToString() : "")); + QTableWidgetItem *pubkeyItem = new QTableWidgetItem(QString::fromStdString(fFound ? CBitcoinAddress(infoMn.keyIDCollateralAddress).ToString() : "")); ui->tableWidgetMyMasternodes->setItem(nNewRow, 0, aliasItem); ui->tableWidgetMyMasternodes->setItem(nNewRow, 1, addrItem); @@ -302,7 +302,7 @@ void MasternodeList::updateNodeList() QTableWidgetItem *statusItem = new QTableWidgetItem(QString::fromStdString(mn.GetStatus())); QTableWidgetItem *activeSecondsItem = new QTableWidgetItem(QString::fromStdString(DurationToDHMS(mn.lastPing.sigTime - mn.sigTime))); QTableWidgetItem *lastSeenItem = new QTableWidgetItem(QString::fromStdString(DateTimeStrFormat("%Y-%m-%d %H:%M", mn.lastPing.sigTime + offsetFromUtc))); - QTableWidgetItem *pubkeyItem = new QTableWidgetItem(QString::fromStdString(CBitcoinAddress(mn.pubKeyCollateralAddress.GetID()).ToString())); + QTableWidgetItem *pubkeyItem = new QTableWidgetItem(QString::fromStdString(CBitcoinAddress(mn.keyIDCollateralAddress).ToString())); if (strCurrentFilter != "") { diff --git a/src/rpc/governance.cpp b/src/rpc/governance.cpp index c4cd91e33218..d9248859d5c0 100644 --- a/src/rpc/governance.cpp +++ b/src/rpc/governance.cpp @@ -223,10 +223,10 @@ UniValue gobject(const JSONRPCRequest& request) throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Must wait for client to sync with masternode network. Try again in a minute or so."); } - bool fMnFound = mnodeman.Has(activeMasternode.outpoint); + bool fMnFound = mnodeman.Has(activeMasternodeInfo.outpoint); - DBG( std::cout << "gobject: submit activeMasternode.pubKeyMasternode = " << activeMasternode.pubKeyMasternode.GetHash().ToString() - << ", outpoint = " << activeMasternode.outpoint.ToStringShort() + DBG( std::cout << "gobject: submit activeMasternodeInfo.keyIDMasternode = " << activeMasternodeInfo.keyIDMasternode.ToString() + << ", outpoint = " << activeMasternodeInfo.outpoint.ToStringShort() << ", params.size() = " << request.params.size() << ", fMnFound = " << fMnFound << std::endl; ); @@ -274,8 +274,8 @@ UniValue gobject(const JSONRPCRequest& request) // Attempt to sign triggers if we are a MN if(govobj.GetObjectType() == GOVERNANCE_OBJECT_TRIGGER) { if(fMnFound) { - govobj.SetMasternodeOutpoint(activeMasternode.outpoint); - govobj.Sign(activeMasternode.keyMasternode, activeMasternode.pubKeyMasternode); + govobj.SetMasternodeOutpoint(activeMasternodeInfo.outpoint); + govobj.Sign(activeMasternodeInfo.keyMasternode, activeMasternodeInfo.keyIDMasternode); } else { LogPrintf("gobject(submit) -- Object submission rejected because node is not a masternode\n"); @@ -357,7 +357,7 @@ UniValue gobject(const JSONRPCRequest& request) UniValue returnObj(UniValue::VOBJ); CMasternode mn; - bool fMnFound = mnodeman.Get(activeMasternode.outpoint, mn); + bool fMnFound = mnodeman.Get(activeMasternodeInfo.outpoint, mn); if(!fMnFound) { nFailed++; @@ -370,7 +370,7 @@ UniValue gobject(const JSONRPCRequest& request) } CGovernanceVote vote(mn.outpoint, hash, eVoteSignal, eVoteOutcome); - if(!vote.Sign(activeMasternode.keyMasternode, activeMasternode.pubKeyMasternode)) { + if(!vote.Sign(activeMasternodeInfo.keyMasternode, activeMasternodeInfo.keyIDMasternode)) { nFailed++; statusObj.push_back(Pair("result", "failed")); statusObj.push_back(Pair("errorMessage", "Failure to sign.")); @@ -443,8 +443,6 @@ UniValue gobject(const JSONRPCRequest& request) std::vector vchMasterNodeSignature; std::string strMasterNodeSignMessage; - CPubKey pubKeyCollateralAddress; - CKey keyCollateralAddress; CPubKey pubKeyMasternode; CKey keyMasternode; @@ -480,7 +478,7 @@ UniValue gobject(const JSONRPCRequest& request) } CGovernanceVote vote(mn.outpoint, hash, eVoteSignal, eVoteOutcome); - if(!vote.Sign(keyMasternode, pubKeyMasternode)){ + if(!vote.Sign(keyMasternode, pubKeyMasternode.GetID())){ nFailed++; statusObj.push_back(Pair("result", "failed")); statusObj.push_back(Pair("errorMessage", "Failure to sign.")); diff --git a/src/rpc/masternode.cpp b/src/rpc/masternode.cpp index 6508df0d95ee..97cf1d1c71fd 100644 --- a/src/rpc/masternode.cpp +++ b/src/rpc/masternode.cpp @@ -253,7 +253,7 @@ UniValue masternode(const JSONRPCRequest& request) obj.push_back(Pair("IP:port", mnInfo.addr.ToString())); obj.push_back(Pair("protocol", mnInfo.nProtocolVersion)); obj.push_back(Pair("outpoint", mnInfo.outpoint.ToStringShort())); - obj.push_back(Pair("payee", CBitcoinAddress(mnInfo.pubKeyCollateralAddress.GetID()).ToString())); + obj.push_back(Pair("payee", CBitcoinAddress(mnInfo.keyIDCollateralAddress).ToString())); obj.push_back(Pair("lastseen", mnInfo.nTimeLastPing)); obj.push_back(Pair("activeseconds", mnInfo.nTimeLastPing - mnInfo.sigTime)); return obj; @@ -430,15 +430,15 @@ UniValue masternode(const JSONRPCRequest& request) UniValue mnObj(UniValue::VOBJ); - mnObj.push_back(Pair("outpoint", activeMasternode.outpoint.ToStringShort())); - mnObj.push_back(Pair("service", activeMasternode.service.ToString())); + mnObj.push_back(Pair("outpoint", activeMasternodeInfo.outpoint.ToStringShort())); + mnObj.push_back(Pair("service", activeMasternodeInfo.service.ToString())); CMasternode mn; - if(mnodeman.Get(activeMasternode.outpoint, mn)) { - mnObj.push_back(Pair("payee", CBitcoinAddress(mn.pubKeyCollateralAddress.GetID()).ToString())); + if(mnodeman.Get(activeMasternodeInfo.outpoint, mn)) { + mnObj.push_back(Pair("payee", CBitcoinAddress(mn.keyIDCollateralAddress).ToString())); } - mnObj.push_back(Pair("status", activeMasternode.GetStatus())); + mnObj.push_back(Pair("status", legacyActiveMasternodeManager.GetStatus())); return mnObj; } @@ -538,7 +538,7 @@ UniValue masternodelist(const JSONRPCRequest& request) " payee - Print Dash address associated with a masternode (can be additionally filtered,\n" " partial match)\n" " protocol - Print protocol of a masternode (can be additionally filtered, exact match)\n" - " pubkey - Print the masternode (not collateral) public key\n" + " keyid - Print the masternode (not collateral) key id\n" " rank - Print rank of a masternode based on current block\n" " sentinel - Print sentinel version of a masternode (can be additionally filtered, exact match)\n" " status - Print masternode status: PRE_ENABLED / ENABLED / EXPIRED / SENTINEL_PING_EXPIRED / NEW_START_REQUIRED /\n" @@ -592,7 +592,7 @@ UniValue masternodelist(const JSONRPCRequest& request) streamFull << std::setw(18) << mn.GetStatus() << " " << mn.nProtocolVersion << " " << - CBitcoinAddress(mn.pubKeyCollateralAddress.GetID()).ToString() << " " << + CBitcoinAddress(mn.keyIDCollateralAddress).ToString() << " " << (int64_t)mn.lastPing.sigTime << " " << std::setw(8) << (int64_t)(mn.lastPing.sigTime - mn.sigTime) << " " << std::setw(10) << mn.GetLastPaidTime() << " " << std::setw(6) << @@ -607,7 +607,7 @@ UniValue masternodelist(const JSONRPCRequest& request) streamInfo << std::setw(18) << mn.GetStatus() << " " << mn.nProtocolVersion << " " << - CBitcoinAddress(mn.pubKeyCollateralAddress.GetID()).ToString() << " " << + CBitcoinAddress(mn.keyIDCollateralAddress).ToString() << " " << (int64_t)mn.lastPing.sigTime << " " << std::setw(8) << (int64_t)(mn.lastPing.sigTime - mn.sigTime) << " " << mn.lastPing.GetSentinelString() << " " << @@ -656,7 +656,7 @@ UniValue masternodelist(const JSONRPCRequest& request) if (strFilter !="" && strOutpoint.find(strFilter) == std::string::npos) continue; obj.push_back(Pair(strOutpoint, (int64_t)mn.lastPing.sigTime)); } else if (strMode == "payee") { - CBitcoinAddress address(mn.pubKeyCollateralAddress.GetID()); + CBitcoinAddress address(mn.keyIDCollateralAddress); std::string strPayee = address.ToString(); if (strFilter !="" && strPayee.find(strFilter) == std::string::npos && strOutpoint.find(strFilter) == std::string::npos) continue; @@ -665,9 +665,9 @@ UniValue masternodelist(const JSONRPCRequest& request) if (strFilter !="" && strFilter != strprintf("%d", mn.nProtocolVersion) && strOutpoint.find(strFilter) == std::string::npos) continue; obj.push_back(Pair(strOutpoint, mn.nProtocolVersion)); - } else if (strMode == "pubkey") { + } else if (strMode == "keyid") { if (strFilter !="" && strOutpoint.find(strFilter) == std::string::npos) continue; - obj.push_back(Pair(strOutpoint, HexStr(mn.pubKeyMasternode))); + obj.push_back(Pair(strOutpoint, HexStr(mn.keyIDMasternode))); } else if (strMode == "status") { std::string strStatus = mn.GetStatus(); if (strFilter !="" && strStatus.find(strFilter) == std::string::npos && @@ -852,8 +852,8 @@ UniValue masternodebroadcast(const JSONRPCRequest& request) nSuccessful++; resultObj.push_back(Pair("outpoint", mnb.outpoint.ToStringShort())); resultObj.push_back(Pair("addr", mnb.addr.ToString())); - resultObj.push_back(Pair("pubKeyCollateralAddress", CBitcoinAddress(mnb.pubKeyCollateralAddress.GetID()).ToString())); - resultObj.push_back(Pair("pubKeyMasternode", CBitcoinAddress(mnb.pubKeyMasternode.GetID()).ToString())); + resultObj.push_back(Pair("keyIDCollateralAddress", CBitcoinAddress(mnb.keyIDCollateralAddress).ToString())); + resultObj.push_back(Pair("keyIDMasternode", CBitcoinAddress(mnb.keyIDMasternode).ToString())); resultObj.push_back(Pair("vchSig", EncodeBase64(&mnb.vchSig[0], mnb.vchSig.size()))); resultObj.push_back(Pair("sigTime", mnb.sigTime)); resultObj.push_back(Pair("protocolVersion", mnb.nProtocolVersion)); @@ -944,7 +944,7 @@ UniValue sentinelping(const JSONRPCRequest& request) ); } - activeMasternode.UpdateSentinelPing(StringVersionToInt(request.params[0].get_str())); + legacyActiveMasternodeManager.UpdateSentinelPing(StringVersionToInt(request.params[0].get_str())); return true; } From 4d3518fe0486cd1a764b5b734115318bad7053ec Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Sun, 12 Aug 2018 17:27:09 +0200 Subject: [PATCH 045/400] Refactor MN payee logic in preparation for DIP3 (#2215) * Refactor block payee filling/validation 1. Move out old budget validation into it's own function (IsOldBudgetBlockValueValid) 2. Refactor IsBlockValueValid to bail out early instead of using deep nested if/else blocks. IMHO, I feel that this makes the code much easier to read and less error prone. 3. Refactor/rename CreateSuperblock and CMasternodePayments::FillBlockPayee to be getters without actually modifying the coinbase TX. The coinbase is now only modified from the global FillBlockPayments function. Makes later changes in DIP3 easier (allowing superblock and MN rewards in same block) * Use __func__ for logging in block payee code * Fix code style nit --- src/governance-classes.cpp | 41 ++--- src/governance-classes.h | 2 +- src/masternode-payments.cpp | 289 ++++++++++++++++++++---------------- src/masternode-payments.h | 4 +- 4 files changed, 184 insertions(+), 152 deletions(-) diff --git a/src/governance-classes.cpp b/src/governance-classes.cpp index 6722efe26622..e21232fa6252 100644 --- a/src/governance-classes.cpp +++ b/src/governance-classes.cpp @@ -366,14 +366,14 @@ bool CSuperblockManager::GetBestSuperblock(CSuperblock_sptr& pSuperblockRet, int } /** -* Create Superblock Payments +* Get Superblock Payments * -* - Create the correct payment structure for a given superblock +* - Returns payments for superblock */ -void CSuperblockManager::CreateSuperblock(CMutableTransaction& txNewRet, int nBlockHeight, std::vector& voutSuperblockRet) +bool CSuperblockManager::GetSuperblockPayments(int nBlockHeight, std::vector& voutSuperblockRet) { - DBG( std::cout << "CSuperblockManager::CreateSuperblock Start" << std::endl; ); + DBG( std::cout << "CSuperblockManager::GetSuperblockPayments Start" << std::endl; ); LOCK(governance.cs); @@ -381,18 +381,18 @@ void CSuperblockManager::CreateSuperblock(CMutableTransaction& txNewRet, int nBl CSuperblock_sptr pSuperblock; if(!CSuperblockManager::GetBestSuperblock(pSuperblock, nBlockHeight)) { - LogPrint("gobject", "CSuperblockManager::CreateSuperblock -- Can't find superblock for height %d\n", nBlockHeight); - DBG( std::cout << "CSuperblockManager::CreateSuperblock Failed to get superblock for height, returning" << std::endl; ); - return; + LogPrint("gobject", "CSuperblockManager::GetSuperblockPayments -- Can't find superblock for height %d\n", nBlockHeight); + DBG( std::cout << "CSuperblockManager::GetSuperblockPayments Failed to get superblock for height, returning" << std::endl; ); + return false; } // make sure it's empty, just in case voutSuperblockRet.clear(); - // CONFIGURE SUPERBLOCK OUTPUTS + // GET SUPERBLOCK OUTPUTS - // Superblock payments are appended to the end of the coinbase vout vector - DBG( std::cout << "CSuperblockManager::CreateSuperblock Number payments: " << pSuperblock->CountPayments() << std::endl; ); + // Superblock payments will be appended to the end of the coinbase vout vector + DBG( std::cout << "CSuperblockManager::GetSuperblockPayments Number payments: " << pSuperblock->CountPayments() << std::endl; ); // TODO: How many payments can we add before things blow up? // Consider at least following limits: @@ -400,13 +400,12 @@ void CSuperblockManager::CreateSuperblock(CMutableTransaction& txNewRet, int nBl // - max "budget" available for(int i = 0; i < pSuperblock->CountPayments(); i++) { CGovernancePayment payment; - DBG( std::cout << "CSuperblockManager::CreateSuperblock i = " << i << std::endl; ); + DBG( std::cout << "CSuperblockManager::GetSuperblockPayments i = " << i << std::endl; ); if(pSuperblock->GetPayment(i, payment)) { - DBG( std::cout << "CSuperblockManager::CreateSuperblock Payment found " << std::endl; ); + DBG( std::cout << "CSuperblockManager::GetSuperblockPayments Payment found " << std::endl; ); // SET COINBASE OUTPUT TO SUPERBLOCK SETTING CTxOut txout = CTxOut(payment.nAmount, payment.script); - txNewRet.vout.push_back(txout); voutSuperblockRet.push_back(txout); // PRINT NICE LOG OUTPUT FOR SUPERBLOCK PAYMENT @@ -417,15 +416,17 @@ void CSuperblockManager::CreateSuperblock(CMutableTransaction& txNewRet, int nBl // TODO: PRINT NICE N.N DASH OUTPUT - DBG( std::cout << "CSuperblockManager::CreateSuperblock Before LogPrintf call, nAmount = " << payment.nAmount << std::endl; ); + DBG( std::cout << "CSuperblockManager::GetSuperblockPayments Before LogPrintf call, nAmount = " << payment.nAmount << std::endl; ); LogPrintf("NEW Superblock : output %d (addr %s, amount %d)\n", i, address2.ToString(), payment.nAmount); - DBG( std::cout << "CSuperblockManager::CreateSuperblock After LogPrintf call " << std::endl; ); + DBG( std::cout << "CSuperblockManager::GetSuperblockPayments After LogPrintf call " << std::endl; ); } else { - DBG( std::cout << "CSuperblockManager::CreateSuperblock Payment not found " << std::endl; ); + DBG( std::cout << "CSuperblockManager::GetSuperblockPayments Payment not found " << std::endl; ); } } - DBG( std::cout << "CSuperblockManager::CreateSuperblock End" << std::endl; ); + DBG( std::cout << "CSuperblockManager::GetSuperblockPayments End" << std::endl; ); + + return true; } bool CSuperblockManager::IsValid(const CTransaction& txNew, int nBlockHeight, CAmount blockReward) @@ -679,7 +680,7 @@ bool CSuperblock::IsValid(const CTransaction& txNew, int nBlockHeight, CAmount b int nOutputs = txNew.vout.size(); int nPayments = CountPayments(); - int nMinerPayments = nOutputs - nPayments; + int nMinerAndMasternodePayments = nOutputs - nPayments; LogPrint("gobject", "CSuperblock::IsValid nOutputs = %d, nPayments = %d, GetDataAsHexString = %s\n", nOutputs, nPayments, GetGovernanceObject()->GetDataAsHexString()); @@ -687,7 +688,7 @@ bool CSuperblock::IsValid(const CTransaction& txNew, int nBlockHeight, CAmount b // We require an exact match (including order) between the expected // superblock payments and the payments actually in the block. - if(nMinerPayments < 0) { + if(nMinerAndMasternodePayments < 0) { // This means the block cannot have all the superblock payments // so it is not valid. // TODO: could that be that we just hit coinbase size limit? @@ -703,7 +704,7 @@ bool CSuperblock::IsValid(const CTransaction& txNew, int nBlockHeight, CAmount b return false; } - // miner should not get more than he would usually get + // miner and masternodes should not get more than they would usually get CAmount nBlockValue = txNew.GetValueOut(); if(nBlockValue > blockReward + nPaymentsTotalAmount) { LogPrintf("CSuperblock::IsValid -- ERROR: Block invalid, block value limit exceeded: block %lld, limit %lld\n", nBlockValue, blockReward + nPaymentsTotalAmount); diff --git a/src/governance-classes.h b/src/governance-classes.h index bb6aa0d45255..ccd14f793c4d 100644 --- a/src/governance-classes.h +++ b/src/governance-classes.h @@ -67,7 +67,7 @@ class CSuperblockManager static bool IsSuperblockTriggered(int nBlockHeight); - static void CreateSuperblock(CMutableTransaction& txNewRet, int nBlockHeight, std::vector& voutSuperblockRet); + static bool GetSuperblockPayments(int nBlockHeight, std::vector& voutSuperblockRet); static void ExecuteBestSuperblock(int nBlockHeight); static std::string GetRequiredPaymentsString(int nBlockHeight); diff --git a/src/masternode-payments.cpp b/src/masternode-payments.cpp index e737de6effc7..dd28b5e41011 100644 --- a/src/masternode-payments.cpp +++ b/src/masternode-payments.cpp @@ -23,6 +23,45 @@ CCriticalSection cs_vecPayees; CCriticalSection cs_mapMasternodeBlocks; CCriticalSection cs_mapMasternodePaymentVotes; +bool IsOldBudgetBlockValueValid(const CBlock& block, int nBlockHeight, CAmount blockReward, std::string& strErrorRet) { + const Consensus::Params& consensusParams = Params().GetConsensus(); + + if (nBlockHeight >= consensusParams.nSuperblockStartBlock) { + // switched to new budget system (superblocks) + return true; + } + + bool isBlockRewardValueMet = (block.vtx[0]->GetValueOut() <= blockReward); + + // we are still using budgets, but we have no data about them anymore, + // all we know is predefined budget cycle and window + + int nOffset = nBlockHeight % consensusParams.nBudgetPaymentsCycleBlocks; + if(nBlockHeight >= consensusParams.nBudgetPaymentsStartBlock && + nOffset < consensusParams.nBudgetPaymentsWindowBlocks) { + // NOTE: old budget system is disabled since 12.1 + if(masternodeSync.IsSynced()) { + // no old budget blocks should be accepted here on mainnet, + // testnet/devnet/regtest should produce regular blocks only + LogPrint("gobject", "%s -- WARNING: Client synced but old budget system is disabled, checking block value against block reward\n", __func__); + if(!isBlockRewardValueMet) { + strErrorRet = strprintf("coinbase pays too much at height %d (actual=%d vs limit=%d), exceeded block reward, old budgets are disabled", + nBlockHeight, block.vtx[0]->GetValueOut(), blockReward); + } + return isBlockRewardValueMet; + } + // when not synced, rely on online nodes (all networks) + LogPrint("gobject", "%s -- WARNING: Skipping old budget block value checks, accepting block\n", __func__); + return true; + } + // LogPrint("gobject", "%s -- Block is not in budget cycle window, checking block value against block reward\n", __func__); + if(!isBlockRewardValueMet) { + strErrorRet = strprintf("coinbase pays too much at height %d (actual=%d vs limit=%d), exceeded block reward, block is not in old budget cycle window", + nBlockHeight, block.vtx[0]->GetValueOut(), blockReward); + } + return isBlockRewardValueMet; +} + /** * IsBlockValueValid * @@ -38,105 +77,82 @@ bool IsBlockValueValid(const CBlock& block, int nBlockHeight, CAmount blockRewar { strErrorRet = ""; + if (!IsOldBudgetBlockValueValid(block, nBlockHeight, blockReward, strErrorRet)) { + return false; + } + bool isBlockRewardValueMet = (block.vtx[0]->GetValueOut() <= blockReward); if(fDebug) LogPrintf("block.vtx[0]->GetValueOut() %lld <= blockReward %lld\n", block.vtx[0]->GetValueOut(), blockReward); - // we are still using budgets, but we have no data about them anymore, - // all we know is predefined budget cycle and window + CAmount nSuperblockMaxValue = blockReward + CSuperblock::GetPaymentsLimit(nBlockHeight); + bool isSuperblockMaxValueMet = (block.vtx[0]->GetValueOut() <= nSuperblockMaxValue); - const Consensus::Params& consensusParams = Params().GetConsensus(); + LogPrint("gobject", "block.vtx[0]->GetValueOut() %lld <= nSuperblockMaxValue %lld\n", block.vtx[0]->GetValueOut(), nSuperblockMaxValue); - if(nBlockHeight < consensusParams.nSuperblockStartBlock) { - int nOffset = nBlockHeight % consensusParams.nBudgetPaymentsCycleBlocks; - if(nBlockHeight >= consensusParams.nBudgetPaymentsStartBlock && - nOffset < consensusParams.nBudgetPaymentsWindowBlocks) { - // NOTE: old budget system is disabled since 12.1 - if(masternodeSync.IsSynced()) { - // no old budget blocks should be accepted here on mainnet, - // testnet/devnet/regtest should produce regular blocks only - LogPrint("gobject", "IsBlockValueValid -- WARNING: Client synced but old budget system is disabled, checking block value against block reward\n"); - if(!isBlockRewardValueMet) { - strErrorRet = strprintf("coinbase pays too much at height %d (actual=%d vs limit=%d), exceeded block reward, old budgets are disabled", - nBlockHeight, block.vtx[0]->GetValueOut(), blockReward); - } - return isBlockRewardValueMet; - } - // when not synced, rely on online nodes (all networks) - LogPrint("gobject", "IsBlockValueValid -- WARNING: Skipping old budget block value checks, accepting block\n"); - return true; - } - // LogPrint("gobject", "IsBlockValueValid -- Block is not in budget cycle window, checking block value against block reward\n"); - if(!isBlockRewardValueMet) { - strErrorRet = strprintf("coinbase pays too much at height %d (actual=%d vs limit=%d), exceeded block reward, block is not in old budget cycle window", + if (!CSuperblock::IsValidBlockHeight(nBlockHeight)) { + // can't possibly be a superblock, so lets just check for block reward limits + if (!isBlockRewardValueMet) { + strErrorRet = strprintf("coinbase pays too much at height %d (actual=%d vs limit=%d), exceeded block reward, only regular blocks are allowed at this height", nBlockHeight, block.vtx[0]->GetValueOut(), blockReward); } return isBlockRewardValueMet; } - // superblocks started + // bail out in case superblock limits were exceeded + if (!isSuperblockMaxValueMet) { + strErrorRet = strprintf("coinbase pays too much at height %d (actual=%d vs limit=%d), exceeded superblock max value", + nBlockHeight, block.vtx[0]->GetValueOut(), nSuperblockMaxValue); + return false; + } - CAmount nSuperblockMaxValue = blockReward + CSuperblock::GetPaymentsLimit(nBlockHeight); - bool isSuperblockMaxValueMet = (block.vtx[0]->GetValueOut() <= nSuperblockMaxValue); + if(!masternodeSync.IsSynced() || fLiteMode) { + if(fDebug) LogPrintf("%s -- WARNING: Not enough data, checked superblock max bounds only\n", __func__); + // not enough data for full checks but at least we know that the superblock limits were honored. + // We rely on the network to have followed the correct chain in this case + return true; + } - LogPrint("gobject", "block.vtx[0]->GetValueOut() %lld <= nSuperblockMaxValue %lld\n", block.vtx[0]->GetValueOut(), nSuperblockMaxValue); + // we are synced and possibly on a superblock now - if(!masternodeSync.IsSynced() || fLiteMode) { - // not enough data but at least it must NOT exceed superblock max value - if(CSuperblock::IsValidBlockHeight(nBlockHeight)) { - if(fDebug) LogPrintf("IsBlockPayeeValid -- WARNING: Not enough data, checking superblock max bounds only\n"); - if(!isSuperblockMaxValueMet) { - strErrorRet = strprintf("coinbase pays too much at height %d (actual=%d vs limit=%d), exceeded superblock max value", - nBlockHeight, block.vtx[0]->GetValueOut(), nSuperblockMaxValue); - } - return isSuperblockMaxValueMet; - } + if (!sporkManager.IsSporkActive(SPORK_9_SUPERBLOCKS_ENABLED)) { + // should NOT allow superblocks at all, when superblocks are disabled + // revert to block reward limits in this case + LogPrint("gobject", "%s -- Superblocks are disabled, no superblocks allowed\n", __func__); if(!isBlockRewardValueMet) { - strErrorRet = strprintf("coinbase pays too much at height %d (actual=%d vs limit=%d), exceeded block reward, only regular blocks are allowed at this height", + strErrorRet = strprintf("coinbase pays too much at height %d (actual=%d vs limit=%d), exceeded block reward, superblocks are disabled", nBlockHeight, block.vtx[0]->GetValueOut(), blockReward); } - // it MUST be a regular block otherwise return isBlockRewardValueMet; } - // we are synced, let's try to check as much data as we can - - if(sporkManager.IsSporkActive(SPORK_9_SUPERBLOCKS_ENABLED)) { - if(CSuperblockManager::IsSuperblockTriggered(nBlockHeight)) { - if(CSuperblockManager::IsValid(*block.vtx[0], nBlockHeight, blockReward)) { - LogPrint("gobject", "IsBlockValueValid -- Valid superblock at height %d: %s", nBlockHeight, block.vtx[0]->ToString()); - // all checks are done in CSuperblock::IsValid, nothing to do here - return true; - } - - // triggered but invalid? that's weird - LogPrintf("IsBlockValueValid -- ERROR: Invalid superblock detected at height %d: %s", nBlockHeight, block.vtx[0]->ToString()); - // should NOT allow invalid superblocks, when superblocks are enabled - strErrorRet = strprintf("invalid superblock detected at height %d", nBlockHeight); - return false; - } - LogPrint("gobject", "IsBlockValueValid -- No triggered superblock detected at height %d\n", nBlockHeight); + if (!CSuperblockManager::IsSuperblockTriggered(nBlockHeight)) { + // we are on a valid superblock height but a superblock was not triggered + // revert to block reward limits in this case if(!isBlockRewardValueMet) { strErrorRet = strprintf("coinbase pays too much at height %d (actual=%d vs limit=%d), exceeded block reward, no triggered superblock detected", nBlockHeight, block.vtx[0]->GetValueOut(), blockReward); } - } else { - // should NOT allow superblocks at all, when superblocks are disabled - LogPrint("gobject", "IsBlockValueValid -- Superblocks are disabled, no superblocks allowed\n"); - if(!isBlockRewardValueMet) { - strErrorRet = strprintf("coinbase pays too much at height %d (actual=%d vs limit=%d), exceeded block reward, superblocks are disabled", - nBlockHeight, block.vtx[0]->GetValueOut(), blockReward); - } + return isBlockRewardValueMet; } - // it MUST be a regular block - return isBlockRewardValueMet; + // this actually also checks for correct payees and not only amount + if (!CSuperblockManager::IsValid(*block.vtx[0], nBlockHeight, blockReward)) { + // triggered but invalid? that's weird + LogPrintf("%s -- ERROR: Invalid superblock detected at height %d: %s", __func__, nBlockHeight, block.vtx[0]->ToString()); + // should NOT allow invalid superblocks, when superblocks are enabled + strErrorRet = strprintf("invalid superblock detected at height %d", nBlockHeight); + return false; + } + + // we got a valid superblock + return true; } bool IsBlockPayeeValid(const CTransaction& txNew, int nBlockHeight, CAmount blockReward) { if(!masternodeSync.IsSynced() || fLiteMode) { //there is no budget data to use to check anything, let's just accept the longest chain - if(fDebug) LogPrintf("IsBlockPayeeValid -- WARNING: Not enough data, skipping block payee checks\n"); + if(fDebug) LogPrintf("%s -- WARNING: Not enough data, skipping block payee checks\n", __func__); return true; } @@ -149,7 +165,7 @@ bool IsBlockPayeeValid(const CTransaction& txNew, int nBlockHeight, CAmount bloc // NOTE: old budget system is disabled since 12.1 and we should never enter this branch // anymore when sync is finished (on mainnet). We have no old budget data but these blocks // have tons of confirmations and can be safely accepted without payee verification - LogPrint("gobject", "IsBlockPayeeValid -- WARNING: Client synced but old budget system is disabled, accepting any payee\n"); + LogPrint("gobject", "%s -- WARNING: Client synced but old budget system is disabled, accepting any payee\n", __func__); return true; } @@ -159,33 +175,33 @@ bool IsBlockPayeeValid(const CTransaction& txNew, int nBlockHeight, CAmount bloc if(sporkManager.IsSporkActive(SPORK_9_SUPERBLOCKS_ENABLED)) { if(CSuperblockManager::IsSuperblockTriggered(nBlockHeight)) { if(CSuperblockManager::IsValid(txNew, nBlockHeight, blockReward)) { - LogPrint("gobject", "IsBlockPayeeValid -- Valid superblock at height %d: %s", nBlockHeight, txNew.ToString()); + LogPrint("gobject", "%s -- Valid superblock at height %d: %s", __func__, nBlockHeight, txNew.ToString()); return true; + } else { + LogPrintf("%s -- ERROR: Invalid superblock detected at height %d: %s", __func__, nBlockHeight, txNew.ToString()); + // should NOT allow such superblocks, when superblocks are enabled + return false; } - - LogPrintf("IsBlockPayeeValid -- ERROR: Invalid superblock detected at height %d: %s", nBlockHeight, txNew.ToString()); - // should NOT allow such superblocks, when superblocks are enabled - return false; + } else { + LogPrint("gobject", "%s -- No triggered superblock detected at height %d\n", __func__, nBlockHeight); } - // continue validation, should pay MN - LogPrint("gobject", "IsBlockPayeeValid -- No triggered superblock detected at height %d\n", nBlockHeight); } else { // should NOT allow superblocks at all, when superblocks are disabled - LogPrint("gobject", "IsBlockPayeeValid -- Superblocks are disabled, no superblocks allowed\n"); + LogPrint("gobject", "%s -- Superblocks are disabled, no superblocks allowed\n", __func__); } - // IF THIS ISN'T A SUPERBLOCK OR SUPERBLOCK IS INVALID, IT SHOULD PAY A MASTERNODE DIRECTLY - if(mnpayments.IsTransactionValid(txNew, nBlockHeight)) { - LogPrint("mnpayments", "IsBlockPayeeValid -- Valid masternode payment at height %d: %s", nBlockHeight, txNew.ToString()); + // If this isn't a superblock or spork15 is activated, check for correct masternode payment + if(mnpayments.IsTransactionValid(txNew, nBlockHeight, blockReward)) { + LogPrint("mnpayments", "%s -- Valid masternode payment at height %d: %s", __func__, nBlockHeight, txNew.ToString()); return true; } if(sporkManager.IsSporkActive(SPORK_8_MASTERNODE_PAYMENT_ENFORCEMENT)) { - LogPrintf("IsBlockPayeeValid -- ERROR: Invalid masternode payment detected at height %d: %s", nBlockHeight, txNew.ToString()); + LogPrintf("%s -- ERROR: Invalid masternode payment detected at height %d: %s", __func__, nBlockHeight, txNew.ToString()); return false; } - LogPrintf("IsBlockPayeeValid -- WARNING: Masternode payment enforcement is disabled, accepting any payee\n"); + LogPrintf("%s -- WARNING: Masternode payment enforcement is disabled, accepting any payee\n", __func__); return true; } @@ -195,14 +211,33 @@ void FillBlockPayments(CMutableTransaction& txNew, int nBlockHeight, CAmount blo // (height should be validated inside) if(sporkManager.IsSporkActive(SPORK_9_SUPERBLOCKS_ENABLED) && CSuperblockManager::IsSuperblockTriggered(nBlockHeight)) { - LogPrint("gobject", "FillBlockPayments -- triggered superblock creation at height %d\n", nBlockHeight); - CSuperblockManager::CreateSuperblock(txNew, nBlockHeight, voutSuperblockRet); - return; + LogPrint("gobject", "%s -- triggered superblock creation at height %d\n", __func__, nBlockHeight); + CSuperblockManager::GetSuperblockPayments(nBlockHeight, voutSuperblockRet); + } + + // TODO this is a placeholder until DIP3 is merged, which will allow superblock payments and MN reward payments + // in the same block. We set this to false for now, which means that we'll always get into the next if statement + // when a superblock payment is present + bool allowSuperblockAndMNReward = false; + + // don't allow payments to superblocks AND masternodes before spork15 activation + if (!voutSuperblockRet.empty() && !allowSuperblockAndMNReward) { + txNew.vout.insert(txNew.vout.end(), voutSuperblockRet.begin(), voutSuperblockRet.end()); + return; } - // FILL BLOCK PAYEE WITH MASTERNODE PAYMENT OTHERWISE - mnpayments.FillBlockPayee(txNew, nBlockHeight, blockReward, txoutMasternodeRet); - LogPrint("mnpayments", "FillBlockPayments -- nBlockHeight %d blockReward %lld txoutMasternodeRet %s txNew %s", + if (!mnpayments.GetMasternodeTxOut(nBlockHeight, blockReward, txoutMasternodeRet)) { + // no idea whom to pay (MN list empty?), lets hope for the best + return; + } + + txNew.vout.emplace_back(txoutMasternodeRet); + txNew.vout.insert(txNew.vout.end(), voutSuperblockRet.begin(), voutSuperblockRet.end()); + + // subtract MN payment from miner reward + txNew.vout[0].nValue -= txoutMasternodeRet.nValue; + + LogPrint("mnpayments", "%s -- nBlockHeight %d blockReward %lld txoutMasternodeRet %s txNew %s", __func__, nBlockHeight, blockReward, txoutMasternodeRet.ToString(), txNew.ToString()); } @@ -244,10 +279,10 @@ bool CMasternodePayments::UpdateLastVote(const CMasternodePaymentVote& vote) /** * FillBlockPayee * -* Fill Masternode ONLY payment block +* Get masternode payment tx output */ -void CMasternodePayments::FillBlockPayee(CMutableTransaction& txNew, int nBlockHeight, CAmount blockReward, CTxOut& txoutMasternodeRet) const +bool CMasternodePayments::GetMasternodeTxOut(int nBlockHeight, CAmount blockReward, CTxOut& txoutMasternodeRet) const { // make sure it's not filled yet txoutMasternodeRet = CTxOut(); @@ -260,8 +295,8 @@ void CMasternodePayments::FillBlockPayee(CMutableTransaction& txNew, int nBlockH masternode_info_t mnInfo; if(!mnodeman.GetNextMasternodeInQueueForPayment(nBlockHeight, true, nCount, mnInfo)) { // ...and we can't calculate it on our own - LogPrintf("CMasternodePayments::FillBlockPayee -- Failed to detect masternode to pay\n"); - return; + LogPrintf("CMasternodePayments::%s -- Failed to detect masternode to pay\n", __func__); + return false; } // fill payee with locally calculated winner and hope for the best payee = GetScriptForDestination(mnInfo.keyIDCollateralAddress); @@ -269,18 +304,15 @@ void CMasternodePayments::FillBlockPayee(CMutableTransaction& txNew, int nBlockH // GET MASTERNODE PAYMENT VARIABLES SETUP CAmount masternodePayment = GetMasternodePayment(nBlockHeight, blockReward); - - // split reward between miner ... - txNew.vout[0].nValue -= masternodePayment; - // ... and masternode txoutMasternodeRet = CTxOut(masternodePayment, payee); - txNew.vout.push_back(txoutMasternodeRet); CTxDestination address1; ExtractDestination(payee, address1); CBitcoinAddress address2(address1); - LogPrintf("CMasternodePayments::FillBlockPayee -- Masternode payment %lld to %s\n", masternodePayment, address2.ToString()); + LogPrintf("CMasternodePayments::%s -- Masternode payment %lld to %s\n", __func__, masternodePayment, address2.ToString()); + + return true; } int CMasternodePayments::GetMinMasternodePaymentsProto() const { @@ -445,12 +477,12 @@ bool CMasternodePaymentVote::Sign() uint256 hash = GetSignatureHash(); if(!CHashSigner::SignHash(hash, activeMasternodeInfo.keyMasternode, vchSig)) { - LogPrintf("CMasternodePaymentVote::Sign -- SignHash() failed\n"); + LogPrintf("CMasternodePaymentVote::%s -- SignHash() failed\n", __func__); return false; } if (!CHashSigner::VerifyHash(hash, activeMasternodeInfo.keyIDMasternode, vchSig, strError)) { - LogPrintf("CMasternodePaymentVote::Sign -- VerifyHash() failed, error: %s\n", strError); + LogPrintf("CMasternodePaymentVote::%s -- VerifyHash() failed, error: %s\n", __func__, strError); return false; } } else { @@ -459,12 +491,12 @@ bool CMasternodePaymentVote::Sign() ScriptToAsmStr(payee); if(!CMessageSigner::SignMessage(strMessage, vchSig, activeMasternodeInfo.keyMasternode)) { - LogPrintf("CMasternodePaymentVote::Sign -- SignMessage() failed\n"); + LogPrintf("CMasternodePaymentVote::%s -- SignMessage() failed\n", __func__); return false; } if(!CMessageSigner::VerifyMessage(activeMasternodeInfo.keyIDMasternode, vchSig, strMessage, strError)) { - LogPrintf("CMasternodePaymentVote::Sign -- VerifyMessage() failed, error: %s\n", strError); + LogPrintf("CMasternodePaymentVote::%s -- VerifyMessage() failed, error: %s\n", __func__, strError); return false; } } @@ -518,7 +550,7 @@ bool CMasternodePayments::AddOrUpdatePaymentVote(const CMasternodePaymentVote& v auto it = mapMasternodeBlocks.emplace(vote.nBlockHeight, CMasternodeBlockPayees(vote.nBlockHeight)).first; it->second.AddPayee(vote); - LogPrint("mnpayments", "CMasternodePayments::AddOrUpdatePaymentVote -- added, hash=%s\n", nVoteHash.ToString()); + LogPrint("mnpayments", "CMasternodePayments::%s -- added, hash=%s\n", __func__, nVoteHash.ToString()); return true; } @@ -551,7 +583,7 @@ bool CMasternodeBlockPayees::GetBestPayee(CScript& payeeRet) const LOCK(cs_vecPayees); if(vecPayees.empty()) { - LogPrint("mnpayments", "CMasternodeBlockPayees::GetBestPayee -- ERROR: couldn't find any payee\n"); + LogPrint("mnpayments", "CMasternodeBlockPayees::%s -- ERROR: couldn't find any payee\n", __func__); return false; } @@ -576,7 +608,7 @@ bool CMasternodeBlockPayees::HasPayeeWithVotes(const CScript& payeeIn, int nVote } } - LogPrint("mnpayments", "CMasternodeBlockPayees::HasPayeeWithVotes -- ERROR: couldn't find any payee with %d+ votes\n", nVotesReq); + LogPrint("mnpayments", "CMasternodeBlockPayees::%s -- ERROR: couldn't find any payee with %d+ votes\n", __func__, nVotesReq); return false; } @@ -604,7 +636,7 @@ bool CMasternodeBlockPayees::IsTransactionValid(const CTransaction& txNew) const if (payee.GetVoteCount() >= MNPAYMENTS_SIGNATURES_REQUIRED) { for (const auto& txout : txNew.vout) { if (payee.GetPayee() == txout.scriptPubKey && nMasternodePayment == txout.nValue) { - LogPrint("mnpayments", "CMasternodeBlockPayees::IsTransactionValid -- Found required payment\n"); + LogPrint("mnpayments", "CMasternodeBlockPayees::%s -- Found required payment\n", __func__); return true; } } @@ -621,7 +653,7 @@ bool CMasternodeBlockPayees::IsTransactionValid(const CTransaction& txNew) const } } - LogPrintf("CMasternodeBlockPayees::IsTransactionValid -- ERROR: Missing required payment, possible payees: '%s', amount: %f DASH\n", strPayeesPossible, (float)nMasternodePayment/COIN); + LogPrintf("CMasternodeBlockPayees::%s -- ERROR: Missing required payment, possible payees: '%s', amount: %f DASH\n", __func__, strPayeesPossible, (float)nMasternodePayment/COIN); return false; } @@ -657,10 +689,9 @@ std::string CMasternodePayments::GetRequiredPaymentsString(int nBlockHeight) con return it == mapMasternodeBlocks.end() ? "Unknown" : it->second.GetRequiredPaymentsString(); } -bool CMasternodePayments::IsTransactionValid(const CTransaction& txNew, int nBlockHeight) const +bool CMasternodePayments::IsTransactionValid(const CTransaction& txNew, int nBlockHeight, CAmount blockReward) const { LOCK(cs_mapMasternodeBlocks); - const auto it = mapMasternodeBlocks.find(nBlockHeight); return it == mapMasternodeBlocks.end() ? true : it->second.IsTransactionValid(txNew); } @@ -678,14 +709,14 @@ void CMasternodePayments::CheckAndRemove() CMasternodePaymentVote vote = (*it).second; if(nCachedBlockHeight - vote.nBlockHeight > nLimit) { - LogPrint("mnpayments", "CMasternodePayments::CheckAndRemove -- Removing old Masternode payment: nBlockHeight=%d\n", vote.nBlockHeight); + LogPrint("mnpayments", "CMasternodePayments::%s -- Removing old Masternode payment: nBlockHeight=%d\n", __func__, vote.nBlockHeight); mapMasternodePaymentVotes.erase(it++); mapMasternodeBlocks.erase(vote.nBlockHeight); } else { ++it; } } - LogPrintf("CMasternodePayments::CheckAndRemove -- %s\n", ToString()); + LogPrintf("CMasternodePayments::%s -- %s\n", __func__, ToString()); } bool CMasternodePaymentVote::IsValid(CNode* pnode, int nValidationHeight, std::string& strError, CConnman& connman) const @@ -723,7 +754,7 @@ bool CMasternodePaymentVote::IsValid(CNode* pnode, int nValidationHeight, std::s int nRank; if(!mnodeman.GetMasternodeRank(masternodeOutpoint, nRank, nBlockHeight - 101, nMinRequiredProtocol)) { - LogPrint("mnpayments", "CMasternodePaymentVote::IsValid -- Can't calculate rank for masternode %s\n", + LogPrint("mnpayments", "CMasternodePaymentVote::%s -- Can't calculate rank for masternode %s\n", __func__, masternodeOutpoint.ToStringShort()); return false; } @@ -736,7 +767,7 @@ bool CMasternodePaymentVote::IsValid(CNode* pnode, int nValidationHeight, std::s if(nRank > MNPAYMENTS_SIGNATURES_TOTAL*2 && nBlockHeight > nValidationHeight) { LOCK(cs_main); strError = strprintf("Masternode %s is not in the top %d (%d)", masternodeOutpoint.ToStringShort(), MNPAYMENTS_SIGNATURES_TOTAL*2, nRank); - LogPrintf("CMasternodePaymentVote::IsValid -- Error: %s\n", strError); + LogPrintf("CMasternodePaymentVote::%s -- Error: %s\n", __func__, strError); Misbehaving(pnode->GetId(), 20); } // Still invalid however @@ -760,30 +791,30 @@ bool CMasternodePayments::ProcessBlock(int nBlockHeight, CConnman& connman) int nRank; if (!mnodeman.GetMasternodeRank(activeMasternodeInfo.outpoint, nRank, nBlockHeight - 101, GetMinMasternodePaymentsProto())) { - LogPrint("mnpayments", "CMasternodePayments::ProcessBlock -- Unknown Masternode\n"); + LogPrint("mnpayments", "CMasternodePayments::%s -- Unknown Masternode\n", __func__); return false; } if (nRank > MNPAYMENTS_SIGNATURES_TOTAL) { - LogPrint("mnpayments", "CMasternodePayments::ProcessBlock -- Masternode not in the top %d (%d)\n", MNPAYMENTS_SIGNATURES_TOTAL, nRank); + LogPrint("mnpayments", "CMasternodePayments::%s -- Masternode not in the top %d (%d)\n", __func__, MNPAYMENTS_SIGNATURES_TOTAL, nRank); return false; } // LOCATE THE NEXT MASTERNODE WHICH SHOULD BE PAID - LogPrintf("CMasternodePayments::ProcessBlock -- Start: nBlockHeight=%d, masternode=%s\n", nBlockHeight, activeMasternodeInfo.outpoint.ToStringShort()); + LogPrintf("CMasternodePayments::%s -- Start: nBlockHeight=%d, masternode=%s\n", __func__, nBlockHeight, activeMasternodeInfo.outpoint.ToStringShort()); // pay to the oldest MN that still had no payment but its input is old enough and it was active long enough int nCount = 0; masternode_info_t mnInfo; if (!mnodeman.GetNextMasternodeInQueueForPayment(nBlockHeight, true, nCount, mnInfo)) { - LogPrintf("CMasternodePayments::ProcessBlock -- ERROR: Failed to find masternode to pay\n"); + LogPrintf("CMasternodePayments::%s -- ERROR: Failed to find masternode to pay\n", __func__); return false; } - LogPrintf("CMasternodePayments::ProcessBlock -- Masternode found by GetNextMasternodeInQueueForPayment(): %s\n", mnInfo.outpoint.ToStringShort()); + LogPrintf("CMasternodePayments::%s -- Masternode found by GetNextMasternodeInQueueForPayment(): %s\n", __func__, mnInfo.outpoint.ToStringShort()); CScript payee = GetScriptForDestination(mnInfo.keyIDCollateralAddress); @@ -794,13 +825,13 @@ bool CMasternodePayments::ProcessBlock(int nBlockHeight, CConnman& connman) ExtractDestination(payee, address1); CBitcoinAddress address2(address1); - LogPrintf("CMasternodePayments::ProcessBlock -- vote: payee=%s, nBlockHeight=%d\n", address2.ToString(), nBlockHeight); + LogPrintf("CMasternodePayments::%s -- vote: payee=%s, nBlockHeight=%d\n", address2.ToString(), nBlockHeight); // SIGN MESSAGE TO NETWORK WITH OUR MASTERNODE KEYS - LogPrintf("CMasternodePayments::ProcessBlock -- Signing vote\n"); + LogPrintf("CMasternodePayments::%s -- Signing vote\n", __func__); if (voteNew.Sign()) { - LogPrintf("CMasternodePayments::ProcessBlock -- AddOrUpdatePaymentVote()\n"); + LogPrintf("CMasternodePayments::%s -- AddOrUpdatePaymentVote()\n", __func__); if (AddOrUpdatePaymentVote(voteNew)) { voteNew.Relay(connman); @@ -817,13 +848,13 @@ void CMasternodePayments::CheckBlockVotes(int nBlockHeight) CMasternodeMan::rank_pair_vec_t mns; if (!mnodeman.GetMasternodeRanks(mns, nBlockHeight - 101, GetMinMasternodePaymentsProto())) { - LogPrintf("CMasternodePayments::CheckBlockVotes -- nBlockHeight=%d, GetMasternodeRanks failed\n", nBlockHeight); + LogPrintf("CMasternodePayments::%s -- nBlockHeight=%d, GetMasternodeRanks failed\n", __func__, nBlockHeight); return; } std::string debugStr; - debugStr += strprintf("CMasternodePayments::CheckBlockVotes -- nBlockHeight=%d,\n Expected voting MNs:\n", nBlockHeight); + debugStr += strprintf("CMasternodePayments::%s -- nBlockHeight=%d,\n Expected voting MNs:\n", __func__, nBlockHeight); LOCK2(cs_mapMasternodeBlocks, cs_mapMasternodePaymentVotes); @@ -885,7 +916,7 @@ void CMasternodePaymentVote::Relay(CConnman& connman) const { // Do not relay until fully synced if(!masternodeSync.IsSynced()) { - LogPrint("mnpayments", "CMasternodePayments::Relay -- won't relay until fully synced\n"); + LogPrint("mnpayments", "CMasternodePayments::%s -- won't relay until fully synced\n", __func__); return; } @@ -974,7 +1005,7 @@ void CMasternodePayments::Sync(CNode* pnode, CConnman& connman) const } } - LogPrintf("CMasternodePayments::Sync -- Sent %d votes to peer=%d\n", nInvCount, pnode->id); + LogPrintf("CMasternodePayments::%s -- Sent %d votes to peer=%d\n", __func__, nInvCount, pnode->id); CNetMsgMaker msgMaker(pnode->GetSendVersion()); connman.PushMessage(pnode, msgMaker.Make(NetMsgType::SYNCSTATUSCOUNT, MASTERNODE_SYNC_MNW, nInvCount)); } @@ -999,7 +1030,7 @@ void CMasternodePayments::RequestLowDataPaymentBlocks(CNode* pnode, CConnman& co vToFetch.push_back(CInv(MSG_MASTERNODE_PAYMENT_BLOCK, pindex->GetBlockHash())); // We should not violate GETDATA rules if(vToFetch.size() == MAX_INV_SZ) { - LogPrintf("CMasternodePayments::RequestLowDataPaymentBlocks -- asking peer=%d for %d blocks\n", pnode->id, MAX_INV_SZ); + LogPrintf("CMasternodePayments::%s -- asking peer=%d for %d blocks\n", __func__, pnode->id, MAX_INV_SZ); connman.PushMessage(pnode, msgMaker.Make(NetMsgType::GETDATA, vToFetch)); // Start filling new batch vToFetch.clear(); @@ -1045,7 +1076,7 @@ void CMasternodePayments::RequestLowDataPaymentBlocks(CNode* pnode, CConnman& co } // We should not violate GETDATA rules if(vToFetch.size() == MAX_INV_SZ) { - LogPrintf("CMasternodePayments::RequestLowDataPaymentBlocks -- asking peer=%d for %d payment blocks\n", pnode->id, MAX_INV_SZ); + LogPrintf("CMasternodePayments::%s -- asking peer=%d for %d payment blocks\n", __func__, pnode->id, MAX_INV_SZ); connman.PushMessage(pnode, msgMaker.Make(NetMsgType::GETDATA, vToFetch)); // Start filling new batch vToFetch.clear(); @@ -1053,7 +1084,7 @@ void CMasternodePayments::RequestLowDataPaymentBlocks(CNode* pnode, CConnman& co } // Ask for the rest of it if(!vToFetch.empty()) { - LogPrintf("CMasternodePayments::RequestLowDataPaymentBlocks -- asking peer=%d for %d payment blocks\n", pnode->id, vToFetch.size()); + LogPrintf("CMasternodePayments::%s -- asking peer=%d for %d payment blocks\n", __func__, pnode->id, vToFetch.size()); connman.PushMessage(pnode, msgMaker.Make(NetMsgType::GETDATA, vToFetch)); } } @@ -1085,7 +1116,7 @@ void CMasternodePayments::UpdatedBlockTip(const CBlockIndex *pindex, CConnman& c if(!pindex) return; nCachedBlockHeight = pindex->nHeight; - LogPrint("mnpayments", "CMasternodePayments::UpdatedBlockTip -- nCachedBlockHeight=%d\n", nCachedBlockHeight); + LogPrint("mnpayments", "CMasternodePayments::%s -- nCachedBlockHeight=%d\n", __func__, nCachedBlockHeight); int nFutureBlock = nCachedBlockHeight + 10; diff --git a/src/masternode-payments.h b/src/masternode-payments.h index 3db062d6ffe0..dca936a12378 100644 --- a/src/masternode-payments.h +++ b/src/masternode-payments.h @@ -214,7 +214,7 @@ class CMasternodePayments void CheckAndRemove(); bool GetBlockPayee(int nBlockHeight, CScript& payeeRet) const; - bool IsTransactionValid(const CTransaction& txNew, int nBlockHeight) const; + bool IsTransactionValid(const CTransaction& txNew, int nBlockHeight, CAmount blockReward) const; bool IsScheduled(const masternode_info_t& mnInfo, int nNotBlockHeight) const; bool UpdateLastVote(const CMasternodePaymentVote& vote); @@ -222,7 +222,7 @@ class CMasternodePayments int GetMinMasternodePaymentsProto() const; void ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStream& vRecv, CConnman& connman); std::string GetRequiredPaymentsString(int nBlockHeight) const; - void FillBlockPayee(CMutableTransaction& txNew, int nBlockHeight, CAmount blockReward, CTxOut& txoutMasternodeRet) const; + bool GetMasternodeTxOut(int nBlockHeight, CAmount blockReward, CTxOut& txoutMasternodeRet) const; std::string ToString() const; int GetBlockCount() const { return mapMasternodeBlocks.size(); } From 7cf9572c26dfbae456ad2c749418a8a70f9e0113 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Mon, 13 Aug 2018 18:07:52 +0200 Subject: [PATCH 046/400] Backport Bitcoin #11881: Remove Python2 support (#2224) * Merge #11881: Remove Python2 support 1874058 Make base58 python contrib code work with python3 (Evan Klitzke) bc6fdf2 Change all python files to use Python3 (John Newbery) Pull request description: Following discussion here: https://github.com/bitcoin/bitcoin/pull/11843#issuecomment-351033742 It's easier for maintainers if all python tools/scripts support only a single version of Python. There are only a few scripts that aren't explicitly python3 at this point, so this PR changes those remaining scripts to explicitly require python3. Tree-SHA512: 5d38eef6e0fc7d8515e23a1f4c75e8b4160fd0fe23cba52a1f41689b114e54a9e503e0724829e8b41982ef98f2d113df80d9e238213b74f09ceaed0344a19e24 * Merge #12829: Python3 fixup f50975b [contrib] fixup symbol-check.py Python3 support (John Newbery) 5de2b18 [contrib] fixup security-check.py Python3 support (John Newbery) Pull request description: security-check.py and symbol-check.py were broken by #11881. Fix them. Tree-SHA512: 86de3d6dc3292b1ae4cc04c2d7d7dbbf39c9270551d7b224b8d8b19e3184c30c897dbf823200403706d06bb405c0decad5cfd690cb2c0312992a235a4ffcf6bf --- contrib/devtools/check-doc.py | 24 ++++---- contrib/devtools/clang-format-diff.py | 19 +++--- contrib/devtools/optimize-pngs.py | 30 +++++----- contrib/devtools/security-check.py | 47 ++++++++------- contrib/devtools/symbol-check.py | 69 +++++++++++----------- contrib/devtools/update-translations.py | 3 +- contrib/macdeploy/custom_dsstore.py | 3 +- contrib/macdeploy/macdeployqtplus | 27 ++------- contrib/testgen/base58.py | 20 ++++--- contrib/testgen/gen_base58_test_vectors.py | 25 ++++---- doc/release-notes.md | 5 ++ share/qt/extract_strings_qt.py | 3 +- share/rpcuser/rpcuser.py | 2 +- 13 files changed, 135 insertions(+), 142 deletions(-) diff --git a/contrib/devtools/check-doc.py b/contrib/devtools/check-doc.py index fa1e137587a6..464e2a8a46b6 100755 --- a/contrib/devtools/check-doc.py +++ b/contrib/devtools/check-doc.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Copyright (c) 2015 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -15,29 +15,29 @@ FOLDER_GREP = 'src' FOLDER_TEST = 'src/test/' -CMD_ROOT_DIR = '`git rev-parse --show-toplevel`/%s' % FOLDER_GREP -CMD_GREP_ARGS = r"egrep -r -I '(map(Multi)?Args(\.count\(|\[)|Get(Bool)?Arg\()\"\-[^\"]+?\"' %s | grep -v '%s'" % (CMD_ROOT_DIR, FOLDER_TEST) -CMD_GREP_DOCS = r"egrep -r -I 'HelpMessageOpt\(\"\-[^\"=]+?(=|\")' %s" % (CMD_ROOT_DIR) +CMD_ROOT_DIR = '`git rev-parse --show-toplevel`/{}'.format(FOLDER_GREP) +CMD_GREP_ARGS = r"egrep -r -I '(map(Multi)?Args(\.count\(|\[)|Get(Bool)?Arg\()\"\-[^\"]+?\"' {} | grep -v '{}'".format(CMD_ROOT_DIR, FOLDER_TEST) +CMD_GREP_DOCS = r"egrep -r -I 'HelpMessageOpt\(\"\-[^\"=]+?(=|\")' {}".format(CMD_ROOT_DIR) REGEX_ARG = re.compile(r'(?:map(?:Multi)?Args(?:\.count\(|\[)|Get(?:Bool)?Arg\()\"(\-[^\"]+?)\"') REGEX_DOC = re.compile(r'HelpMessageOpt\(\"(\-[^\"=]+?)(?:=|\")') # list unsupported, deprecated and duplicate args as they need no documentation SET_DOC_OPTIONAL = set(['-rpcssl', '-benchmark', '-h', '-help', '-socks', '-tor', '-debugnet', '-whitelistalwaysrelay', '-blockminsize']) def main(): - used = check_output(CMD_GREP_ARGS, shell=True) - docd = check_output(CMD_GREP_DOCS, shell=True) + used = check_output(CMD_GREP_ARGS, shell=True, universal_newlines=True) + docd = check_output(CMD_GREP_DOCS, shell=True, universal_newlines=True) args_used = set(re.findall(REGEX_ARG,used)) args_docd = set(re.findall(REGEX_DOC,docd)).union(SET_DOC_OPTIONAL) args_need_doc = args_used.difference(args_docd) args_unknown = args_docd.difference(args_used) - print "Args used : %s" % len(args_used) - print "Args documented : %s" % len(args_docd) - print "Args undocumented: %s" % len(args_need_doc) - print args_need_doc - print "Args unknown : %s" % len(args_unknown) - print args_unknown + print("Args used : {}".format(len(args_used))) + print("Args documented : {}".format(len(args_docd))) + print("Args undocumented: {}".format(len(args_need_doc))) + print(args_need_doc) + print("Args unknown : {}".format(len(args_unknown))) + print(args_unknown) exit(len(args_need_doc)) diff --git a/contrib/devtools/clang-format-diff.py b/contrib/devtools/clang-format-diff.py index 7ea49b65e177..ca1bd8854fc6 100755 --- a/contrib/devtools/clang-format-diff.py +++ b/contrib/devtools/clang-format-diff.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # #===- clang-format-diff.py - ClangFormat Diff Reformatter ----*- python -*--===# # @@ -69,10 +69,10 @@ import argparse import difflib +import io import re import string import subprocess -import StringIO import sys @@ -133,9 +133,9 @@ def main(): ['-lines', str(start_line) + ':' + str(end_line)]) # Reformat files containing changes in place. - for filename, lines in lines_by_file.iteritems(): + for filename, lines in lines_by_file.items(): if args.i and args.verbose: - print 'Formatting', filename + print('Formatting {}'.format(filename)) command = [binary, filename] if args.i: command.append('-i') @@ -143,8 +143,11 @@ def main(): command.append('-sort-includes') command.extend(lines) command.extend(['-style=file', '-fallback-style=none']) - p = subprocess.Popen(command, stdout=subprocess.PIPE, - stderr=None, stdin=subprocess.PIPE) + p = subprocess.Popen(command, + stdout=subprocess.PIPE, + stderr=None, + stdin=subprocess.PIPE, + universal_newlines=True) stdout, stderr = p.communicate() if p.returncode != 0: sys.exit(p.returncode) @@ -152,11 +155,11 @@ def main(): if not args.i: with open(filename) as f: code = f.readlines() - formatted_code = StringIO.StringIO(stdout).readlines() + formatted_code = io.StringIO(stdout).readlines() diff = difflib.unified_diff(code, formatted_code, filename, filename, '(before formatting)', '(after formatting)') - diff_string = string.join(diff, '') + diff_string = ''.join(diff) if len(diff_string) > 0: sys.stdout.write(diff_string) diff --git a/contrib/devtools/optimize-pngs.py b/contrib/devtools/optimize-pngs.py index ce4cca8e5136..e8375a78bebd 100755 --- a/contrib/devtools/optimize-pngs.py +++ b/contrib/devtools/optimize-pngs.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Copyright (c) 2014-2015 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -10,7 +10,7 @@ import sys import subprocess import hashlib -from PIL import Image +from PIL import Image # pip3 install Pillow def file_hash(filename): '''Return hash of raw file contents''' @@ -27,7 +27,7 @@ def content_hash(filename): pngcrush = 'pngcrush' git = 'git' folders = ["src/qt/res/movies", "src/qt/res/icons", "src/qt/res/icons/crownium", "src/qt/res/icons/drkblue", "src/qt/res/icons/light", "src/qt/res/icons/light-retro", "src/qt/res/icons/trad", "src/qt/res/images", "src/qt/res/images/crownium", "src/qt/res/images/drkblue", "src/qt/res/images/light", "src/qt/res/images/light-retro", "src/qt/res/images/trad", "share/pixmaps"] -basePath = subprocess.check_output([git, 'rev-parse', '--show-toplevel']).rstrip('\n') +basePath = subprocess.check_output([git, 'rev-parse', '--show-toplevel'], universal_newlines=True).rstrip('\n') totalSaveBytes = 0 noHashChange = True @@ -37,42 +37,40 @@ def content_hash(filename): for file in os.listdir(absFolder): extension = os.path.splitext(file)[1] if extension.lower() == '.png': - print("optimizing "+file+"..."), + print("optimizing {}...".format(file), end =' ') file_path = os.path.join(absFolder, file) fileMetaMap = {'file' : file, 'osize': os.path.getsize(file_path), 'sha256Old' : file_hash(file_path)} fileMetaMap['contentHashPre'] = content_hash(file_path) - pngCrushOutput = "" try: - pngCrushOutput = subprocess.check_output( - [pngcrush, "-brute", "-ow", "-rem", "gAMA", "-rem", "cHRM", "-rem", "iCCP", "-rem", "sRGB", "-rem", "alla", "-rem", "text", file_path], - stderr=subprocess.STDOUT).rstrip('\n') + subprocess.call([pngcrush, "-brute", "-ow", "-rem", "gAMA", "-rem", "cHRM", "-rem", "iCCP", "-rem", "sRGB", "-rem", "alla", "-rem", "text", file_path], + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) except: - print "pngcrush is not installed, aborting..." + print("pngcrush is not installed, aborting...") sys.exit(0) #verify - if "Not a PNG file" in subprocess.check_output([pngcrush, "-n", "-v", file_path], stderr=subprocess.STDOUT): - print "PNG file "+file+" is corrupted after crushing, check out pngcursh version" + if "Not a PNG file" in subprocess.check_output([pngcrush, "-n", "-v", file_path], stderr=subprocess.STDOUT, universal_newlines=True): + print("PNG file "+file+" is corrupted after crushing, check out pngcursh version") sys.exit(1) fileMetaMap['sha256New'] = file_hash(file_path) fileMetaMap['contentHashPost'] = content_hash(file_path) if fileMetaMap['contentHashPre'] != fileMetaMap['contentHashPost']: - print "Image contents of PNG file "+file+" before and after crushing don't match" + print("Image contents of PNG file {} before and after crushing don't match".format(file)) sys.exit(1) fileMetaMap['psize'] = os.path.getsize(file_path) outputArray.append(fileMetaMap) - print("done\n"), + print("done") -print "summary:\n+++++++++++++++++" +print("summary:\n+++++++++++++++++") for fileDict in outputArray: oldHash = fileDict['sha256Old'] newHash = fileDict['sha256New'] totalSaveBytes += fileDict['osize'] - fileDict['psize'] noHashChange = noHashChange and (oldHash == newHash) - print fileDict['file']+"\n size diff from: "+str(fileDict['osize'])+" to: "+str(fileDict['psize'])+"\n old sha256: "+oldHash+"\n new sha256: "+newHash+"\n" + print(fileDict['file']+"\n size diff from: "+str(fileDict['osize'])+" to: "+str(fileDict['psize'])+"\n old sha256: "+oldHash+"\n new sha256: "+newHash+"\n") -print "completed. Checksum stable: "+str(noHashChange)+". Total reduction: "+str(totalSaveBytes)+" bytes" +print("completed. Checksum stable: "+str(noHashChange)+". Total reduction: "+str(totalSaveBytes)+" bytes") diff --git a/contrib/devtools/security-check.py b/contrib/devtools/security-check.py index c90541e27119..aa73bc61d0ec 100755 --- a/contrib/devtools/security-check.py +++ b/contrib/devtools/security-check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Copyright (c) 2015-2016 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -8,7 +8,6 @@ Otherwise the exit status will be 1 and it will log which executables failed which checks. Needs `readelf` (for ELF) and `objdump` (for PE). ''' -from __future__ import division,print_function,unicode_literals import subprocess import sys import os @@ -21,38 +20,38 @@ def check_ELF_PIE(executable): ''' Check for position independent executable (PIE), allowing for address space randomization. ''' - p = subprocess.Popen([READELF_CMD, '-h', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) + p = subprocess.Popen([READELF_CMD, '-h', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, universal_newlines=True) (stdout, stderr) = p.communicate() if p.returncode: raise IOError('Error opening file') ok = False - for line in stdout.split(b'\n'): + for line in stdout.splitlines(): line = line.split() - if len(line)>=2 and line[0] == b'Type:' and line[1] == b'DYN': + if len(line)>=2 and line[0] == 'Type:' and line[1] == 'DYN': ok = True return ok def get_ELF_program_headers(executable): '''Return type and flags for ELF program headers''' - p = subprocess.Popen([READELF_CMD, '-l', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) + p = subprocess.Popen([READELF_CMD, '-l', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, universal_newlines=True) (stdout, stderr) = p.communicate() if p.returncode: raise IOError('Error opening file') in_headers = False count = 0 headers = [] - for line in stdout.split(b'\n'): - if line.startswith(b'Program Headers:'): + for line in stdout.splitlines(): + if line.startswith('Program Headers:'): in_headers = True - if line == b'': + if line == '': in_headers = False if in_headers: if count == 1: # header line - ofs_typ = line.find(b'Type') - ofs_offset = line.find(b'Offset') - ofs_flags = line.find(b'Flg') - ofs_align = line.find(b'Align') + ofs_typ = line.find('Type') + ofs_offset = line.find('Offset') + ofs_flags = line.find('Flg') + ofs_align = line.find('Align') if ofs_typ == -1 or ofs_offset == -1 or ofs_flags == -1 or ofs_align == -1: raise ValueError('Cannot parse elfread -lW output') elif count > 1: @@ -69,9 +68,9 @@ def check_ELF_NX(executable): have_wx = False have_gnu_stack = False for (typ, flags) in get_ELF_program_headers(executable): - if typ == b'GNU_STACK': + if typ == 'GNU_STACK': have_gnu_stack = True - if b'W' in flags and b'E' in flags: # section is both writable and executable + if 'W' in flags and 'E' in flags: # section is both writable and executable have_wx = True return have_gnu_stack and not have_wx @@ -88,17 +87,17 @@ def check_ELF_RELRO(executable): # However, the dynamic linker need to write to this area so these are RW. # Glibc itself takes care of mprotecting this area R after relocations are finished. # See also http://permalink.gmane.org/gmane.comp.gnu.binutils/71347 - if typ == b'GNU_RELRO': + if typ == 'GNU_RELRO': have_gnu_relro = True have_bindnow = False - p = subprocess.Popen([READELF_CMD, '-d', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) + p = subprocess.Popen([READELF_CMD, '-d', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, universal_newlines=True) (stdout, stderr) = p.communicate() if p.returncode: raise IOError('Error opening file') - for line in stdout.split(b'\n'): + for line in stdout.splitlines(): tokens = line.split() - if len(tokens)>1 and tokens[1] == b'(BIND_NOW)' or (len(tokens)>2 and tokens[1] == b'(FLAGS)' and b'BIND_NOW' in tokens[2]): + if len(tokens)>1 and tokens[1] == '(BIND_NOW)' or (len(tokens)>2 and tokens[1] == '(FLAGS)' and 'BIND_NOW' in tokens[2]): have_bindnow = True return have_gnu_relro and have_bindnow @@ -106,13 +105,13 @@ def check_ELF_Canary(executable): ''' Check for use of stack canary ''' - p = subprocess.Popen([READELF_CMD, '--dyn-syms', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) + p = subprocess.Popen([READELF_CMD, '--dyn-syms', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, universal_newlines=True) (stdout, stderr) = p.communicate() if p.returncode: raise IOError('Error opening file') ok = False - for line in stdout.split(b'\n'): - if b'__stack_chk_fail' in line: + for line in stdout.splitlines(): + if '__stack_chk_fail' in line: ok = True return ok @@ -122,13 +121,13 @@ def get_PE_dll_characteristics(executable): Returns a tuple (arch,bits) where arch is 'i386:x86-64' or 'i386' and bits is the DllCharacteristics value. ''' - p = subprocess.Popen([OBJDUMP_CMD, '-x', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) + p = subprocess.Popen([OBJDUMP_CMD, '-x', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, universal_newlines=True) (stdout, stderr) = p.communicate() if p.returncode: raise IOError('Error opening file') arch = '' bits = 0 - for line in stdout.split('\n'): + for line in stdout.splitlines(): tokens = line.split() if len(tokens)>=2 and tokens[0] == 'architecture:': arch = tokens[1].rstrip(',') diff --git a/contrib/devtools/symbol-check.py b/contrib/devtools/symbol-check.py index 8f8685006e11..c23ee5624c00 100755 --- a/contrib/devtools/symbol-check.py +++ b/contrib/devtools/symbol-check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Copyright (c) 2014 Wladimir J. van der Laan # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -11,7 +11,6 @@ find ../gitian-builder/build -type f -executable | xargs python contrib/devtools/symbol-check.py ''' -from __future__ import division, print_function, unicode_literals import subprocess import re import sys @@ -47,28 +46,28 @@ # Ignore symbols that are exported as part of every executable IGNORE_EXPORTS = { -b'_edata', b'_end', b'_init', b'__bss_start', b'_fini', b'_IO_stdin_used' +'_edata', '_end', '_init', '__bss_start', '_fini', '_IO_stdin_used' } READELF_CMD = os.getenv('READELF', '/usr/bin/readelf') CPPFILT_CMD = os.getenv('CPPFILT', '/usr/bin/c++filt') # Allowed NEEDED libraries ALLOWED_LIBRARIES = { # bitcoind and bitcoin-qt -b'libgcc_s.so.1', # GCC base support -b'libc.so.6', # C library -b'libpthread.so.0', # threading -b'libanl.so.1', # DNS resolve -b'libm.so.6', # math library -b'librt.so.1', # real-time (clock) -b'ld-linux-x86-64.so.2', # 64-bit dynamic linker -b'ld-linux.so.2', # 32-bit dynamic linker +'libgcc_s.so.1', # GCC base support +'libc.so.6', # C library +'libpthread.so.0', # threading +'libanl.so.1', # DNS resolve +'libm.so.6', # math library +'librt.so.1', # real-time (clock) +'ld-linux-x86-64.so.2', # 64-bit dynamic linker +'ld-linux.so.2', # 32-bit dynamic linker # bitcoin-qt only -b'libX11-xcb.so.1', # part of X11 -b'libX11.so.6', # part of X11 -b'libxcb.so.1', # part of X11 -b'libfontconfig.so.1', # font support -b'libfreetype.so.6', # font parsing -b'libdl.so.2' # programming interface to dynamic linker +'libX11-xcb.so.1', # part of X11 +'libX11.so.6', # part of X11 +'libxcb.so.1', # part of X11 +'libfontconfig.so.1', # font support +'libfreetype.so.6', # font parsing +'libdl.so.2' # programming interface to dynamic linker } class CPPFilt(object): @@ -78,10 +77,10 @@ class CPPFilt(object): Use a pipe to the 'c++filt' command. ''' def __init__(self): - self.proc = subprocess.Popen(CPPFILT_CMD, stdin=subprocess.PIPE, stdout=subprocess.PIPE) + self.proc = subprocess.Popen(CPPFILT_CMD, stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True) def __call__(self, mangled): - self.proc.stdin.write(mangled + b'\n') + self.proc.stdin.write(mangled + '\n') self.proc.stdin.flush() return self.proc.stdout.readline().rstrip() @@ -95,43 +94,43 @@ def read_symbols(executable, imports=True): Parse an ELF executable and return a list of (symbol,version) tuples for dynamic, imported symbols. ''' - p = subprocess.Popen([READELF_CMD, '--dyn-syms', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) + p = subprocess.Popen([READELF_CMD, '--dyn-syms', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, universal_newlines=True) (stdout, stderr) = p.communicate() if p.returncode: raise IOError('Could not read symbols for %s: %s' % (executable, stderr.strip())) syms = [] - for line in stdout.split(b'\n'): + for line in stdout.splitlines(): line = line.split() - if len(line)>7 and re.match(b'[0-9]+:$', line[0]): - (sym, _, version) = line[7].partition(b'@') - is_import = line[6] == b'UND' - if version.startswith(b'@'): + if len(line)>7 and re.match('[0-9]+:$', line[0]): + (sym, _, version) = line[7].partition('@') + is_import = line[6] == 'UND' + if version.startswith('@'): version = version[1:] if is_import == imports: syms.append((sym, version)) return syms def check_version(max_versions, version): - if b'_' in version: - (lib, _, ver) = version.rpartition(b'_') + if '_' in version: + (lib, _, ver) = version.rpartition('_') else: lib = version ver = '0' - ver = tuple([int(x) for x in ver.split(b'.')]) + ver = tuple([int(x) for x in ver.split('.')]) if not lib in max_versions: return False return ver <= max_versions[lib] def read_libraries(filename): - p = subprocess.Popen([READELF_CMD, '-d', '-W', filename], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) + p = subprocess.Popen([READELF_CMD, '-d', '-W', filename], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, universal_newlines=True) (stdout, stderr) = p.communicate() if p.returncode: raise IOError('Error opening file') libraries = [] - for line in stdout.split(b'\n'): + for line in stdout.splitlines(): tokens = line.split() - if len(tokens)>2 and tokens[1] == b'(NEEDED)': - match = re.match(b'^Shared library: \[(.*)\]$', b' '.join(tokens[2:])) + if len(tokens)>2 and tokens[1] == '(NEEDED)': + match = re.match('^Shared library: \[(.*)\]$', ' '.join(tokens[2:])) if match: libraries.append(match.group(1)) else: @@ -145,18 +144,18 @@ def read_libraries(filename): # Check imported symbols for sym,version in read_symbols(filename, True): if version and not check_version(MAX_VERSIONS, version): - print('%s: symbol %s from unsupported version %s' % (filename, cppfilt(sym).decode('utf-8'), version.decode('utf-8'))) + print('%s: symbol %s from unsupported version %s' % (filename, cppfilt(sym), version)) retval = 1 # Check exported symbols for sym,version in read_symbols(filename, False): if sym in IGNORE_EXPORTS: continue - print('%s: export of symbol %s not allowed' % (filename, cppfilt(sym).decode('utf-8'))) + print('%s: export of symbol %s not allowed' % (filename, cppfilt(sym))) retval = 1 # Check dependency libraries for library_name in read_libraries(filename): if library_name not in ALLOWED_LIBRARIES: - print('%s: NEEDED library %s is not allowed' % (filename, library_name.decode('utf-8'))) + print('%s: NEEDED library %s is not allowed' % (filename, library_name)) retval = 1 exit(retval) diff --git a/contrib/devtools/update-translations.py b/contrib/devtools/update-translations.py index 75c60faf7438..67a7dffe4c0c 100755 --- a/contrib/devtools/update-translations.py +++ b/contrib/devtools/update-translations.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Copyright (c) 2014 Wladimir J. van der Laan # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -15,7 +15,6 @@ TODO: - auto-add new translations to the build system according to the translation process ''' -from __future__ import division, print_function import subprocess import re import sys diff --git a/contrib/macdeploy/custom_dsstore.py b/contrib/macdeploy/custom_dsstore.py index f0bdbd85debc..8b70cf7c684e 100755 --- a/contrib/macdeploy/custom_dsstore.py +++ b/contrib/macdeploy/custom_dsstore.py @@ -1,8 +1,7 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Copyright (c) 2013-2015 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. -from __future__ import division,print_function,unicode_literals import biplist from ds_store import DSStore from mac_alias import Alias diff --git a/contrib/macdeploy/macdeployqtplus b/contrib/macdeploy/macdeployqtplus index 71d43d8f4750..61654c849da0 100755 --- a/contrib/macdeploy/macdeployqtplus +++ b/contrib/macdeploy/macdeployqtplus @@ -1,5 +1,4 @@ -#!/usr/bin/env python -from __future__ import division, print_function, unicode_literals +#!/usr/bin/env python3 # # Copyright (C) 2011 Patrick "p2k" Schneider # @@ -203,7 +202,7 @@ def getFrameworks(binaryPath, verbose): if verbose >= 3: print("Inspecting with otool: " + binaryPath) otoolbin=os.getenv("OTOOL", "otool") - otool = subprocess.Popen([otoolbin, "-L", binaryPath], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + otool = subprocess.Popen([otoolbin, "-L", binaryPath], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) o_stdout, o_stderr = otool.communicate() if otool.returncode != 0: if verbose >= 1: @@ -211,7 +210,7 @@ def getFrameworks(binaryPath, verbose): sys.stderr.flush() raise RuntimeError("otool failed with return code %d" % otool.returncode) - otoolLines = o_stdout.decode().split("\n") + otoolLines = o_stdout.split("\n") otoolLines.pop(0) # First line is the inspected binary if ".framework" in binaryPath or binaryPath.endswith(".dylib"): otoolLines.pop(0) # Frameworks and dylibs list themselves as a dependency. @@ -716,22 +715,6 @@ elif config.sign: if config.dmg is not None: - #Patch in check_output for Python 2.6 - if "check_output" not in dir( subprocess ): - def f(*popenargs, **kwargs): - if 'stdout' in kwargs: - raise ValueError('stdout argument not allowed, it will be overridden.') - process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs) - output, unused_err = process.communicate() - retcode = process.poll() - if retcode: - cmd = kwargs.get("args") - if cmd is None: - cmd = popenargs[0] - raise CalledProcessError(retcode, cmd) - return output - subprocess.check_output = f - def runHDIUtil(verb, image_basename, **kwargs): hdiutil_args = ["hdiutil", verb, image_basename + ".dmg"] if "capture_stdout" in kwargs: @@ -749,7 +732,7 @@ if config.dmg is not None: if not value is True: hdiutil_args.append(str(value)) - return run(hdiutil_args) + return run(hdiutil_args, universal_newlines=True) if verbose >= 2: if fancy is None: @@ -791,7 +774,7 @@ if config.dmg is not None: except subprocess.CalledProcessError as e: sys.exit(e.returncode) - m = re.search("/Volumes/(.+$)", output.decode()) + m = re.search("/Volumes/(.+$)", output) disk_root = m.group(0) disk_name = m.group(1) diff --git a/contrib/testgen/base58.py b/contrib/testgen/base58.py index 56edf292c106..a11d63e2bcb8 100644 --- a/contrib/testgen/base58.py +++ b/contrib/testgen/base58.py @@ -28,7 +28,9 @@ def b58encode(v): """ long_value = 0 for (i, c) in enumerate(v[::-1]): - long_value += (256**i) * ord(c) + if isinstance(c, str): + c = ord(c) + long_value += (256**i) * c result = '' while long_value >= __b58base: @@ -41,7 +43,7 @@ def b58encode(v): # leading 0-bytes in the input become leading-1s nPad = 0 for c in v: - if c == '\0': nPad += 1 + if c == 0: nPad += 1 else: break return (__b58chars[0]*nPad) + result @@ -50,8 +52,10 @@ def b58decode(v, length = None): """ decode v into a string of len bytes """ long_value = 0 - for (i, c) in enumerate(v[::-1]): - long_value += __b58chars.find(c) * (__b58base**i) + for i, c in enumerate(v[::-1]): + pos = __b58chars.find(c) + assert pos != -1 + long_value += pos * (__b58base**i) result = bytes() while long_value >= 256: @@ -62,10 +66,12 @@ def b58decode(v, length = None): nPad = 0 for c in v: - if c == __b58chars[0]: nPad += 1 - else: break + if c == __b58chars[0]: + nPad += 1 + continue + break - result = chr(0)*nPad + result + result = bytes(nPad) + result if length is not None and len(result) != length: return None diff --git a/contrib/testgen/gen_base58_test_vectors.py b/contrib/testgen/gen_base58_test_vectors.py index a0b4b7d20105..ccdcfa5269c1 100755 --- a/contrib/testgen/gen_base58_test_vectors.py +++ b/contrib/testgen/gen_base58_test_vectors.py @@ -1,11 +1,11 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Copyright (c) 2012 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. ''' Generate valid and invalid base58 address and private key test vectors. -Usage: +Usage: gen_base58_test_vectors.py valid 50 > ../../src/test/data/base58_keys_valid.json gen_base58_test_vectors.py invalid 50 > ../../src/test/data/base58_keys_invalid.json ''' @@ -46,8 +46,8 @@ def is_valid(v): if result is None: return False for template in templates: - prefix = str(bytearray(template[0])) - suffix = str(bytearray(template[2])) + prefix = bytearray(template[0]) + suffix = bytearray(template[2]) if result.startswith(prefix) and result.endswith(suffix): if (len(result) - len(prefix) - len(suffix)) == template[1]: return True @@ -57,20 +57,23 @@ def gen_valid_vectors(): '''Generate valid test vectors''' while True: for template in templates: - prefix = str(bytearray(template[0])) - payload = os.urandom(template[1]) - suffix = str(bytearray(template[2])) + prefix = bytearray(template[0]) + payload = bytearray(os.urandom(template[1])) + suffix = bytearray(template[2]) rv = b58encode_chk(prefix + payload + suffix) assert is_valid(rv) - metadata = dict([(x,y) for (x,y) in zip(metadata_keys,template[3]) if y is not None]) - yield (rv, b2a_hex(payload), metadata) + metadata = {x: y for x, y in zip(metadata_keys,template[3]) if y is not None} + hexrepr = b2a_hex(payload) + if isinstance(hexrepr, bytes): + hexrepr = hexrepr.decode('utf8') + yield (rv, hexrepr, metadata) def gen_invalid_vector(template, corrupt_prefix, randomize_payload_size, corrupt_suffix): '''Generate possibly invalid vector''' if corrupt_prefix: prefix = os.urandom(1) else: - prefix = str(bytearray(template[0])) + prefix = bytearray(template[0]) if randomize_payload_size: payload = os.urandom(max(int(random.expovariate(0.5)), 50)) @@ -80,7 +83,7 @@ def gen_invalid_vector(template, corrupt_prefix, randomize_payload_size, corrupt if corrupt_suffix: suffix = os.urandom(len(template[2])) else: - suffix = str(bytearray(template[2])) + suffix = bytearray(template[2]) return b58encode_chk(prefix + payload + suffix) diff --git a/doc/release-notes.md b/doc/release-notes.md index faf879084f50..a27374915620 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -86,6 +86,11 @@ See detailed [change log](https://github.com/dashpay/dash/compare/v0.12.3.1...da - [`f833e2ed6`](https://github.com/dashpay/dash/commit/f833e2ed6) Bump to 0.12.3.2 (#2173) +Python Support +-------------- + +Support for Python 2 has been discontinued for all test files and tools. + Credits ======= diff --git a/share/qt/extract_strings_qt.py b/share/qt/extract_strings_qt.py index 43b43e76c7cd..811c88f5a3a1 100755 --- a/share/qt/extract_strings_qt.py +++ b/share/qt/extract_strings_qt.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Copyright (c) 2012-2016 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -6,7 +6,6 @@ Extract _("...") strings for translation and convert to Qt stringdefs so that they can be picked up by Qt linguist. ''' -from __future__ import division,print_function,unicode_literals from subprocess import Popen, PIPE import operator import os diff --git a/share/rpcuser/rpcuser.py b/share/rpcuser/rpcuser.py index f806a810e08c..ab3d8c4ed3de 100755 --- a/share/rpcuser/rpcuser.py +++ b/share/rpcuser/rpcuser.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # Copyright (c) 2015 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. From 1767e3457edbf685c5dce27611f5c9b503a0be5e Mon Sep 17 00:00:00 2001 From: gladcow Date: Mon, 13 Aug 2018 23:21:21 +0300 Subject: [PATCH 047/400] Save/load spork cache (#2206) * CSporkManager class serialization * Read/write sporks.dat file * Move mapSporks into CSporkManager and serialize it * fix GetSporkByHash * spork tests * add missed cs lock * clear mapSporksByHash in CSporkManager::Clear * use spork active rpc call to hide spork inner logic * set small pause between rpc calls in cycles --- qa/pull-tester/rpc-tests.py | 1 + qa/rpc-tests/sporks.py | 87 +++++++++++++++++++++++++++++++++++++ src/init.cpp | 9 ++++ src/net_processing.cpp | 10 +++-- src/spork.cpp | 35 +++++++++++++-- src/spork.h | 23 ++++++++-- 6 files changed, 156 insertions(+), 9 deletions(-) create mode 100755 qa/rpc-tests/sporks.py diff --git a/qa/pull-tester/rpc-tests.py b/qa/pull-tester/rpc-tests.py index 3d2916d0d368..2bd823f688ac 100755 --- a/qa/pull-tester/rpc-tests.py +++ b/qa/pull-tester/rpc-tests.py @@ -167,6 +167,7 @@ 'listsinceblock.py', 'p2p-leaktests.py', 'p2p-compactblocks.py', + 'sporks.py', ] if ENABLE_ZMQ: testScripts.append('zmq_test.py') diff --git a/qa/rpc-tests/sporks.py b/qa/rpc-tests/sporks.py new file mode 100755 index 000000000000..ceae32914d2f --- /dev/null +++ b/qa/rpc-tests/sporks.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python3 +# Copyright (c) 2018 The Dash Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +from test_framework.mininode import * +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import * +from time import * + +''' +''' + +class SporkTest(BitcoinTestFramework): + def __init__(self): + super().__init__() + self.num_nodes = 3 + self.setup_clean_chain = True + self.is_network_split = False + + def setup_network(self): + self.nodes = [] + self.nodes.append(start_node(0, self.options.tmpdir, + ["-debug", "-sporkkey=cP4EKFyJsHT39LDqgdcB43Y3YXjNyjb5Fuas1GQSeAtjnZWmZEQK"])) + self.nodes.append(start_node(1, self.options.tmpdir, + ["-debug"])) + self.nodes.append(start_node(2, self.options.tmpdir, + ["-debug"])) + # connect only 2 first nodes at start + connect_nodes(self.nodes[0], 1) + + def get_test_spork_state(self, node): + info = node.spork('active') + # use InstantSend spork for tests + return info['SPORK_2_INSTANTSEND_ENABLED'] + + def set_test_spork_state(self, node, state): + if state: + value = 0 + else: + value = 4070908800 + # use InstantSend spork for tests + node.spork('SPORK_2_INSTANTSEND_ENABLED', value) + + def run_test(self): + # check test spork default state + assert(self.get_test_spork_state(self.nodes[0])) + assert(self.get_test_spork_state(self.nodes[1])) + assert(self.get_test_spork_state(self.nodes[2])) + + # check spork propagation for connected nodes + self.set_test_spork_state(self.nodes[0], False) + start = time() + sent = False + while True: + if not self.get_test_spork_state(self.nodes[1]): + sent = True + break + if time() > start + 10: + break + sleep(0.1) + assert(sent) + + # restart nodes to check spork persistence + stop_node(self.nodes[0], 0) + stop_node(self.nodes[1], 1) + self.nodes[0] = start_node(0, self.options.tmpdir, ["-debug"]) + self.nodes[1] = start_node(1, self.options.tmpdir, ["-debug"]) + assert(not self.get_test_spork_state(self.nodes[0])) + assert(not self.get_test_spork_state(self.nodes[1])) + + # connect new node and check spork propagation after restoring from cache + connect_nodes(self.nodes[1], 2) + start = time() + sent = False + while True: + if not self.get_test_spork_state(self.nodes[2]): + sent = True + break + if time() > start + 10: + break + sleep(0.1) + assert(sent) + + +if __name__ == '__main__': + SporkTest().main() diff --git a/src/init.cpp b/src/init.cpp index f88419bf27b8..187e7555fe2b 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -261,6 +261,8 @@ void PrepareShutdown() CFlatDB flatdb5("instantsend.dat", "magicInstantSendCache"); flatdb5.Dump(instantsend); } + CFlatDB flatdb6("sporks.dat", "magicSporkCache"); + flatdb6.Dump(sporkManager); } UnregisterNodeSignals(GetNodeSignals()); @@ -1960,6 +1962,13 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler) return InitError(_("Failed to load InstantSend data cache from") + "\n" + (pathDB / strDBName).string()); } } + + strDBName = "sporks.dat"; + uiInterface.InitMessage(_("Loading sporks cache...")); + CFlatDB flatdb6(strDBName, "magicSporkCache"); + if(!flatdb6.Load(sporkManager)) { + return InitError(_("Failed to load sporks cache from") + "\n" + (pathDB / strDBName).string()); + } } diff --git a/src/net_processing.cpp b/src/net_processing.cpp index 7fb8f1202b63..2373141cb74f 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -929,7 +929,10 @@ bool static AlreadyHave(const CInv& inv) EXCLUSIVE_LOCKS_REQUIRED(cs_main) return instantsend.AlreadyHave(inv.hash); case MSG_SPORK: - return mapSporks.count(inv.hash); + { + CSporkMessage spork; + return sporkManager.GetSporkByHash(inv.hash, spork); + } case MSG_MASTERNODE_PAYMENT_VOTE: return mnpayments.mapMasternodePaymentVotes.count(inv.hash); @@ -1165,8 +1168,9 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam } if (!push && inv.type == MSG_SPORK) { - if(mapSporks.count(inv.hash)) { - connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::SPORK, mapSporks[inv.hash])); + CSporkMessage spork; + if(sporkManager.GetSporkByHash(inv.hash, spork)) { + connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::SPORK, spork)); push = true; } } diff --git a/src/spork.cpp b/src/spork.cpp index bc86c396f66e..dd8ed7c07f5a 100644 --- a/src/spork.cpp +++ b/src/spork.cpp @@ -15,7 +15,6 @@ CSporkManager sporkManager; -std::map mapSporks; std::map mapSporkDefaults = { {SPORK_2_INSTANTSEND_ENABLED, 0}, // ON {SPORK_3_INSTANTSEND_BLOCK_FILTERING, 0}, // ON @@ -28,6 +27,15 @@ std::map mapSporkDefaults = { {SPORK_14_REQUIRE_SENTINEL_FLAG, 4070908800ULL}, // OFF }; +void CSporkManager::Clear() +{ + LOCK(cs); + mapSporksActive.clear(); + mapSporksByHash.clear(); + sporkPubKeyID.SetNull(); + sporkPrivKey = CKey(); +} + void CSporkManager::ProcessSpork(CNode* pfrom, const std::string& strCommand, CDataStream& vRecv, CConnman& connman) { if(fLiteMode) return; // disable all Dash specific functionality @@ -69,7 +77,7 @@ void CSporkManager::ProcessSpork(CNode* pfrom, const std::string& strCommand, CD { LOCK(cs); // make sure to not lock this together with cs_main - mapSporks[hash] = spork; + mapSporksByHash[hash] = spork; mapSporksActive[spork.nSporkID] = spork; } spork.Relay(connman); @@ -122,7 +130,7 @@ bool CSporkManager::UpdateSpork(int nSporkID, int64_t nValue, CConnman& connman) if(spork.Sign(sporkPrivKey)) { spork.Relay(connman); LOCK(cs); - mapSporks[spork.GetHash()] = spork; + mapSporksByHash[spork.GetHash()] = spork; mapSporksActive[nSporkID] = spork; return true; } @@ -197,6 +205,20 @@ std::string CSporkManager::GetSporkNameByID(int nSporkID) } } +bool CSporkManager::GetSporkByHash(const uint256& hash, CSporkMessage &sporkRet) +{ + LOCK(cs); + + const auto it = mapSporksByHash.find(hash); + + if (it == mapSporksByHash.end()) + return false; + + sporkRet = it->second; + + return true; +} + bool CSporkManager::SetSporkAddress(const std::string& strAddress) { LOCK(cs); CBitcoinAddress address(strAddress); @@ -235,6 +257,13 @@ bool CSporkManager::SetPrivKey(const std::string& strPrivKey) } } +std::string CSporkManager::ToString() const +{ + LOCK(cs); + return strprintf("Sporks: %llu", mapSporksActive.size()); +} + + uint256 CSporkMessage::GetHash() const { return SerializeHash(*this); diff --git a/src/spork.h b/src/spork.h index a627ef35e049..338fed334719 100644 --- a/src/spork.h +++ b/src/spork.h @@ -31,7 +31,6 @@ static const int SPORK_START = SPORK_ static const int SPORK_END = SPORK_14_REQUIRE_SENTINEL_FLAG; extern std::map mapSporkDefaults; -extern std::map mapSporks; extern CSporkManager sporkManager; // @@ -86,8 +85,8 @@ class CSporkMessage class CSporkManager { private: - CCriticalSection cs; - std::vector vchSig; + mutable CCriticalSection cs; + std::map mapSporksByHash; std::map mapSporksActive; CKeyID sporkPubKeyID; @@ -97,6 +96,20 @@ class CSporkManager CSporkManager() {} + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action) { + READWRITE(sporkPubKeyID); + READWRITE(mapSporksByHash); + READWRITE(mapSporksActive); + // we don't serialize private key to prevent its leakage + } + + void Clear(); + /// Dummy implementation for CFlatDB + void CheckAndRemove() {} + void ProcessSpork(CNode* pfrom, const std::string& strCommand, CDataStream& vRecv, CConnman& connman); void ExecuteSpork(int nSporkID, int nValue); bool UpdateSpork(int nSporkID, int64_t nValue, CConnman& connman); @@ -106,8 +119,12 @@ class CSporkManager int GetSporkIDByName(const std::string& strName); std::string GetSporkNameByID(int nSporkID); + bool GetSporkByHash(const uint256& hash, CSporkMessage &sporkRet); + bool SetSporkAddress(const std::string& strAddress); bool SetPrivKey(const std::string& strPrivKey); + + std::string ToString() const; }; #endif From c09f57bd78eb8415e9f17a39838b124889eb5203 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Mon, 13 Aug 2018 22:21:42 +0200 Subject: [PATCH 048/400] Backport move to Ubuntu Bionic and GCC7 in Gitian builds (#2225) * Add stdin, stdout, stderr to ignored export list * Merge #13171: Change gitian-descriptors to use bionic instead c1afe3232fa10e290fb355cf37ea4c7bc1084065 Change gitian-descriptors to use bionic instead (Chun Kuan Lee) Pull request description: I have tested this with Ubuntu Bionic host with lxc 3.0.0, the gitian-build for Windows and MacOSX work fine, but there is an issue about it for Linux. Failed at check-symbol: ``` test/test_bitcoin: symbol __divmoddi4 from unsupported version GCC_7.0.0 test/test_bitcoin: symbol log2f from unsupported version GLIBC_2.27 qt/bitcoin-qt: symbol __divmoddi4 from unsupported version GCC_7.0.0 qt/bitcoin-qt: symbol log2f from unsupported version GLIBC_2.27 ``` I think this should be fixed in `./configure --enable-glibc-back-compat` Should not be merged before #13177 devrandom/gitian-builder#178 Close #12511 Tree-SHA512: 257d75d5b6864e105279f7a7b992fbbd7903cdbe3300b66dacec0a783d267707d9dbbfe0e64a36983ca1eca50a2a5e1cdb222b6d3745ccc3e5fc5636c88b581f * Use IN6ADDR_ANY_INIT instead of in6addr_any This is the same fix as https://github.com/bitcoin/bitcoin/commit/fc6a9f2ab18ca8466d65d14c263c4f78f9ccebbf Couldn't backport the original commit as we are missing some refactorings. --- contrib/devtools/symbol-check.py | 2 +- contrib/gitian-build.sh | 6 +++--- contrib/gitian-descriptors/gitian-linux.yml | 16 ++++++++-------- contrib/gitian-descriptors/gitian-osx-signer.yml | 2 +- contrib/gitian-descriptors/gitian-osx.yml | 4 ++-- contrib/gitian-descriptors/gitian-win-signer.yml | 2 +- contrib/gitian-descriptors/gitian-win.yml | 9 +++++---- src/init.cpp | 2 +- 8 files changed, 22 insertions(+), 21 deletions(-) diff --git a/contrib/devtools/symbol-check.py b/contrib/devtools/symbol-check.py index c23ee5624c00..c945fcbde94d 100755 --- a/contrib/devtools/symbol-check.py +++ b/contrib/devtools/symbol-check.py @@ -46,7 +46,7 @@ # Ignore symbols that are exported as part of every executable IGNORE_EXPORTS = { -'_edata', '_end', '_init', '__bss_start', '_fini', '_IO_stdin_used' +'_edata', '_end', '_init', '__bss_start', '_fini', '_IO_stdin_used', 'stdin', 'stdout', 'stderr' } READELF_CMD = os.getenv('READELF', '/usr/bin/readelf') CPPFILT_CMD = os.getenv('CPPFILT', '/usr/bin/c++filt') diff --git a/contrib/gitian-build.sh b/contrib/gitian-build.sh index b0d9b5ca485e..8044fbf57575 100755 --- a/contrib/gitian-build.sh +++ b/contrib/gitian-build.sh @@ -259,13 +259,13 @@ then if [[ -n "$USE_LXC" ]] then sudo apt-get install lxc - bin/make-base-vm --suite trusty --arch amd64 --lxc + bin/make-base-vm --suite bionic --arch amd64 --lxc elif [[ -n "$USE_DOCKER" ]] then sudo apt-get install docker-ce - bin/make-base-vm --suite trusty --arch amd64 --docker + bin/make-base-vm --suite bionic --arch amd64 --docker else - bin/make-base-vm --suite trusty --arch amd64 + bin/make-base-vm --suite bionic --arch amd64 fi popd fi diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index f69f7063203c..f9993948c4d0 100755 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -2,23 +2,23 @@ name: "dash-linux-0.12" enable_cache: true suites: -- "trusty" +- "bionic" architectures: - "amd64" packages: - "curl" - "g++-aarch64-linux-gnu" -- "g++-4.8-aarch64-linux-gnu" -- "gcc-4.8-aarch64-linux-gnu" +- "g++-7-aarch64-linux-gnu" +- "gcc-7-aarch64-linux-gnu" - "binutils-aarch64-linux-gnu" - "g++-arm-linux-gnueabihf" -- "g++-4.8-arm-linux-gnueabihf" -- "gcc-4.8-arm-linux-gnueabihf" +- "g++-7-arm-linux-gnueabihf" +- "gcc-7-arm-linux-gnueabihf" - "binutils-arm-linux-gnueabihf" -- "g++-4.8-multilib" -- "gcc-4.8-multilib" +- "g++-7-multilib" +- "gcc-7-multilib" - "binutils-gold" -- "git-core" +- "git" - "pkg-config" - "autoconf" - "libtool" diff --git a/contrib/gitian-descriptors/gitian-osx-signer.yml b/contrib/gitian-descriptors/gitian-osx-signer.yml index 8fb6beeda8e2..214c5425ff63 100644 --- a/contrib/gitian-descriptors/gitian-osx-signer.yml +++ b/contrib/gitian-descriptors/gitian-osx-signer.yml @@ -1,7 +1,7 @@ --- name: "dash-dmg-signer" suites: -- "trusty" +- "bionic" architectures: - "amd64" packages: diff --git a/contrib/gitian-descriptors/gitian-osx.yml b/contrib/gitian-descriptors/gitian-osx.yml index 28097c609a53..5218e9047dfc 100644 --- a/contrib/gitian-descriptors/gitian-osx.yml +++ b/contrib/gitian-descriptors/gitian-osx.yml @@ -2,14 +2,14 @@ name: "dash-osx-0.12" enable_cache: true suites: -- "trusty" +- "bionic" architectures: - "amd64" packages: - "ca-certificates" - "curl" - "g++" -- "git-core" +- "git" - "pkg-config" - "autoconf" - "librsvg2-bin" diff --git a/contrib/gitian-descriptors/gitian-win-signer.yml b/contrib/gitian-descriptors/gitian-win-signer.yml index 16750642cb11..feb94ff920c8 100644 --- a/contrib/gitian-descriptors/gitian-win-signer.yml +++ b/contrib/gitian-descriptors/gitian-win-signer.yml @@ -1,7 +1,7 @@ --- name: "dash-win-signer" suites: -- "trusty" +- "bionic" architectures: - "amd64" packages: diff --git a/contrib/gitian-descriptors/gitian-win.yml b/contrib/gitian-descriptors/gitian-win.yml index a19c6bbd0946..1fc5afa1833d 100755 --- a/contrib/gitian-descriptors/gitian-win.yml +++ b/contrib/gitian-descriptors/gitian-win.yml @@ -2,13 +2,13 @@ name: "dash-win-0.12" enable_cache: true suites: -- "trusty" +- "bionic" architectures: - "amd64" packages: - "curl" - "g++" -- "git-core" +- "git" - "pkg-config" - "autoconf" - "libtool" @@ -22,6 +22,7 @@ packages: - "ca-certificates" - "python" - "python3" +- "rename" remotes: - "url": "https://github.com/dashpay/dash.git" "dir": "dash" @@ -30,7 +31,7 @@ script: | WRAP_DIR=$HOME/wrapped HOSTS="i686-w64-mingw32 x86_64-w64-mingw32" CONFIGFLAGS="--enable-reduce-exports --disable-bench --disable-gui-tests" - FAKETIME_HOST_PROGS="g++ ar ranlib nm windres strip objcopy" + FAKETIME_HOST_PROGS="ar ranlib nm windres strip objcopy" FAKETIME_PROGS="date makensis zip" HOST_CFLAGS="-O2 -g" HOST_CXXFLAGS="-O2 -g" @@ -109,7 +110,7 @@ script: | for prog in gcc g++; do echo '#!/bin/bash' > ${WRAP_DIR}/${i}-${prog} echo "# GCCVERSION=${GCCVERSION}" >> ${WRAP_DIR}/${i}-${prog} - echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} + echo "REAL=\`which -a ${i}-${prog}-posix | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} echo '# Add the gcc version to the wrapper so that ccache takes this into account (we use CCACHE_COMPILERCHECK=content)' >> ${WRAP_DIR}/${i}-${prog} echo "# `${prog} --version | head -1`" >> ${WRAP_DIR}/${i}-${prog} echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog} diff --git a/src/init.cpp b/src/init.cpp index 187e7555fe2b..26b80208ddec 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1546,7 +1546,7 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler) if (!mapMultiArgs.count("-bind") && !mapMultiArgs.count("-whitebind")) { struct in_addr inaddr_any; inaddr_any.s_addr = INADDR_ANY; - fBound |= Bind(connman, CService(in6addr_any, GetListenPort()), BF_NONE); + fBound |= Bind(connman, CService((in6_addr)IN6ADDR_ANY_INIT, GetListenPort()), BF_NONE); fBound |= Bind(connman, CService(inaddr_any, GetListenPort()), !fBound ? BF_REPORT_ERROR : BF_NONE); } if (!fBound) From 50eb98d9017b99579d0150197a479cb754c69b56 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Tue, 14 Aug 2018 11:58:38 +0200 Subject: [PATCH 049/400] Prepare for DIP3 operator reward payments and switch to array in getblocktemplate (#2216) * Prepare for DIP3 operator reward payments and switch to array in getblocktemplate This commit allows to later split MN rewards into multiple recipients, e.g. the owner reward and operator reward. It also updates the getblocktemplate output to return an array of MN payments instead of a single entry. This should allow MN miners and pool operators to prepare themself for the upcoming changes in regard to operator rewards. * txoutsMasternode -> voutMasternode * More renaming * Consider all masternode payments when looking for a known masternode --- src/masternode-payments.cpp | 108 ++++++++++++++++++++++++------------ src/masternode-payments.h | 6 +- src/miner.cpp | 4 +- src/miner.h | 4 +- src/rpc/mining.cpp | 34 +++++++----- src/validation.cpp | 13 ++++- 6 files changed, 109 insertions(+), 60 deletions(-) diff --git a/src/masternode-payments.cpp b/src/masternode-payments.cpp index dd28b5e41011..e4894e4ea68f 100644 --- a/src/masternode-payments.cpp +++ b/src/masternode-payments.cpp @@ -205,14 +205,14 @@ bool IsBlockPayeeValid(const CTransaction& txNew, int nBlockHeight, CAmount bloc return true; } -void FillBlockPayments(CMutableTransaction& txNew, int nBlockHeight, CAmount blockReward, CTxOut& txoutMasternodeRet, std::vector& voutSuperblockRet) +void FillBlockPayments(CMutableTransaction& txNew, int nBlockHeight, CAmount blockReward, std::vector& voutMasternodePaymentsRet, std::vector& voutSuperblockPaymentsRet) { // only create superblocks if spork is enabled AND if superblock is actually triggered // (height should be validated inside) if(sporkManager.IsSporkActive(SPORK_9_SUPERBLOCKS_ENABLED) && CSuperblockManager::IsSuperblockTriggered(nBlockHeight)) { LogPrint("gobject", "%s -- triggered superblock creation at height %d\n", __func__, nBlockHeight); - CSuperblockManager::GetSuperblockPayments(nBlockHeight, voutSuperblockRet); + CSuperblockManager::GetSuperblockPayments(nBlockHeight, voutSuperblockPaymentsRet); } // TODO this is a placeholder until DIP3 is merged, which will allow superblock payments and MN reward payments @@ -221,24 +221,30 @@ void FillBlockPayments(CMutableTransaction& txNew, int nBlockHeight, CAmount blo bool allowSuperblockAndMNReward = false; // don't allow payments to superblocks AND masternodes before spork15 activation - if (!voutSuperblockRet.empty() && !allowSuperblockAndMNReward) { - txNew.vout.insert(txNew.vout.end(), voutSuperblockRet.begin(), voutSuperblockRet.end()); + if (!voutSuperblockPaymentsRet.empty() && !allowSuperblockAndMNReward) { + txNew.vout.insert(txNew.vout.end(), voutSuperblockPaymentsRet.begin(), voutSuperblockPaymentsRet.end()); return; } - if (!mnpayments.GetMasternodeTxOut(nBlockHeight, blockReward, txoutMasternodeRet)) { + if (!mnpayments.GetMasternodeTxOuts(nBlockHeight, blockReward, voutMasternodePaymentsRet)) { // no idea whom to pay (MN list empty?), lets hope for the best return; } - txNew.vout.emplace_back(txoutMasternodeRet); - txNew.vout.insert(txNew.vout.end(), voutSuperblockRet.begin(), voutSuperblockRet.end()); + txNew.vout.insert(txNew.vout.end(), voutMasternodePaymentsRet.begin(), voutMasternodePaymentsRet.end()); + txNew.vout.insert(txNew.vout.end(), voutSuperblockPaymentsRet.begin(), voutSuperblockPaymentsRet.end()); - // subtract MN payment from miner reward - txNew.vout[0].nValue -= txoutMasternodeRet.nValue; + std::string voutMasternodeStr; + for (const auto& txout : voutMasternodePaymentsRet) { + // subtract MN payment from miner reward + txNew.vout[0].nValue -= txout.nValue; + if (!voutMasternodeStr.empty()) + voutMasternodeStr += ","; + voutMasternodeStr += txout.ToString(); + } - LogPrint("mnpayments", "%s -- nBlockHeight %d blockReward %lld txoutMasternodeRet %s txNew %s", __func__, - nBlockHeight, blockReward, txoutMasternodeRet.ToString(), txNew.ToString()); + LogPrint("mnpayments", "%s -- nBlockHeight %d blockReward %lld voutMasternodePaymentsRet \"%s\" txNew %s", __func__, + nBlockHeight, blockReward, voutMasternodeStr, txNew.ToString()); } std::string GetRequiredPaymentsString(int nBlockHeight) @@ -277,19 +283,17 @@ bool CMasternodePayments::UpdateLastVote(const CMasternodePaymentVote& vote) } /** -* FillBlockPayee +* GetMasternodeTxOuts * -* Get masternode payment tx output +* Get masternode payment tx outputs */ -bool CMasternodePayments::GetMasternodeTxOut(int nBlockHeight, CAmount blockReward, CTxOut& txoutMasternodeRet) const +bool CMasternodePayments::GetMasternodeTxOuts(int nBlockHeight, CAmount blockReward, std::vector& voutMasternodePaymentsRet) const { // make sure it's not filled yet - txoutMasternodeRet = CTxOut(); - - CScript payee; + voutMasternodePaymentsRet.clear(); - if(!GetBlockPayee(nBlockHeight, payee)) { + if(!GetBlockTxOuts(nBlockHeight, blockReward, voutMasternodePaymentsRet)) { // no masternode detected... int nCount = 0; masternode_info_t mnInfo; @@ -299,18 +303,18 @@ bool CMasternodePayments::GetMasternodeTxOut(int nBlockHeight, CAmount blockRewa return false; } // fill payee with locally calculated winner and hope for the best - payee = GetScriptForDestination(mnInfo.keyIDCollateralAddress); + CScript payee = GetScriptForDestination(mnInfo.keyIDCollateralAddress); + CAmount masternodePayment = GetMasternodePayment(nBlockHeight, blockReward); + voutMasternodePaymentsRet.emplace_back(masternodePayment, payee); } - // GET MASTERNODE PAYMENT VARIABLES SETUP - CAmount masternodePayment = GetMasternodePayment(nBlockHeight, blockReward); - txoutMasternodeRet = CTxOut(masternodePayment, payee); - - CTxDestination address1; - ExtractDestination(payee, address1); - CBitcoinAddress address2(address1); + for (const auto& txout : voutMasternodePaymentsRet) { + CTxDestination address1; + ExtractDestination(txout.scriptPubKey, address1); + CBitcoinAddress address2(address1); - LogPrintf("CMasternodePayments::%s -- Masternode payment %lld to %s\n", __func__, masternodePayment, address2.ToString()); + LogPrintf("CMasternodePayments::%s -- Masternode payment %lld to %s\n", __func__, txout.nValue, address2.ToString()); + } return true; } @@ -504,12 +508,20 @@ bool CMasternodePaymentVote::Sign() return true; } -bool CMasternodePayments::GetBlockPayee(int nBlockHeight, CScript& payeeRet) const +bool CMasternodePayments::GetBlockTxOuts(int nBlockHeight, CAmount blockReward, std::vector& voutMasternodePaymentsRet) const { - LOCK(cs_mapMasternodeBlocks); + voutMasternodePaymentsRet.clear(); + + CAmount masternodeReward = GetMasternodePayment(nBlockHeight, blockReward); + LOCK(cs_mapMasternodeBlocks); auto it = mapMasternodeBlocks.find(nBlockHeight); - return it != mapMasternodeBlocks.end() && it->second.GetBestPayee(payeeRet); + CScript payee; + if (it == mapMasternodeBlocks.end() || !it->second.GetBestPayee(payee)) { + return false; + } + voutMasternodePaymentsRet.emplace_back(masternodeReward, payee); + return true; } // Is this masternode scheduled to get paid soon? @@ -523,11 +535,14 @@ bool CMasternodePayments::IsScheduled(const masternode_info_t& mnInfo, int nNotB CScript mnpayee; mnpayee = GetScriptForDestination(mnInfo.keyIDCollateralAddress); - CScript payee; for(int64_t h = nCachedBlockHeight; h <= nCachedBlockHeight + 8; h++){ if(h == nNotBlockHeight) continue; - if(GetBlockPayee(h, payee) && mnpayee == payee) { - return true; + std::vector voutMasternodePayments; + if(GetBlockTxOuts(h, 0, voutMasternodePayments)) { + for (const auto& txout : voutMasternodePayments) { + if (txout.scriptPubKey == mnpayee) + return true; + } } } @@ -691,9 +706,30 @@ std::string CMasternodePayments::GetRequiredPaymentsString(int nBlockHeight) con bool CMasternodePayments::IsTransactionValid(const CTransaction& txNew, int nBlockHeight, CAmount blockReward) const { - LOCK(cs_mapMasternodeBlocks); - const auto it = mapMasternodeBlocks.find(nBlockHeight); - return it == mapMasternodeBlocks.end() ? true : it->second.IsTransactionValid(txNew); + std::vector voutMasternodePayments; + if (!GetBlockTxOuts(nBlockHeight, blockReward, voutMasternodePayments)) { + LogPrintf("CMasternodePayments::%s -- ERROR failed to get payees for block at height %s\n", __func__, nBlockHeight); + return false; + } + + for (const auto& txout : voutMasternodePayments) { + bool found = false; + for (const auto& txout2 : txNew.vout) { + if (txout == txout2) { + found = true; + break; + } + } + if (!found) { + CTxDestination dest; + if (!ExtractDestination(txout.scriptPubKey, dest)) + assert(false); + LogPrintf("CMasternodePayments::%s -- ERROR failed to find expected payee %s in block at height %s\n", __func__, CBitcoinAddress(dest).ToString(), nBlockHeight); + return false; + } + } + + return true; } void CMasternodePayments::CheckAndRemove() diff --git a/src/masternode-payments.h b/src/masternode-payments.h index dca936a12378..93d25901627b 100644 --- a/src/masternode-payments.h +++ b/src/masternode-payments.h @@ -35,7 +35,7 @@ extern CMasternodePayments mnpayments; /// TODO: all 4 functions do not belong here really, they should be refactored/moved somewhere (main.cpp ?) bool IsBlockValueValid(const CBlock& block, int nBlockHeight, CAmount blockReward, std::string& strErrorRet); bool IsBlockPayeeValid(const CTransaction& txNew, int nBlockHeight, CAmount blockReward); -void FillBlockPayments(CMutableTransaction& txNew, int nBlockHeight, CAmount blockReward, CTxOut& txoutMasternodeRet, std::vector& voutSuperblockRet); +void FillBlockPayments(CMutableTransaction& txNew, int nBlockHeight, CAmount blockReward, std::vector& voutMasternodePaymentsRet, std::vector& voutSuperblockPaymentsRet); std::string GetRequiredPaymentsString(int nBlockHeight); class CMasternodePayee @@ -213,7 +213,7 @@ class CMasternodePayments void RequestLowDataPaymentBlocks(CNode* pnode, CConnman& connman) const; void CheckAndRemove(); - bool GetBlockPayee(int nBlockHeight, CScript& payeeRet) const; + bool GetBlockTxOuts(int nBlockHeight, CAmount blockReward, std::vector& voutMasternodePaymentsRet) const; bool IsTransactionValid(const CTransaction& txNew, int nBlockHeight, CAmount blockReward) const; bool IsScheduled(const masternode_info_t& mnInfo, int nNotBlockHeight) const; @@ -222,7 +222,7 @@ class CMasternodePayments int GetMinMasternodePaymentsProto() const; void ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStream& vRecv, CConnman& connman); std::string GetRequiredPaymentsString(int nBlockHeight) const; - bool GetMasternodeTxOut(int nBlockHeight, CAmount blockReward, CTxOut& txoutMasternodeRet) const; + bool GetMasternodeTxOuts(int nBlockHeight, CAmount blockReward, std::vector& voutMasternodePaymentsRet) const; std::string ToString() const; int GetBlockCount() const { return mapMasternodeBlocks.size(); } diff --git a/src/miner.cpp b/src/miner.cpp index 82f1df413cb5..73a127125338 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -170,9 +170,9 @@ std::unique_ptr BlockAssembler::CreateNewBlock(const CScript& sc // Update coinbase transaction with additional info about masternode and governance payments, // get some info back to pass to getblocktemplate - FillBlockPayments(coinbaseTx, nHeight, blockReward, pblocktemplate->txoutMasternode, pblocktemplate->voutSuperblock); + FillBlockPayments(coinbaseTx, nHeight, blockReward, pblocktemplate->voutMasternodePayments, pblocktemplate->voutSuperblockPayments); // LogPrintf("CreateNewBlock -- nBlockHeight %d blockReward %lld txoutMasternode %s coinbaseTx %s", - // nHeight, blockReward, pblocktemplate->txoutMasternode.ToString(), coinbaseTx.ToString()); + // nHeight, blockReward, pblocktemplate->txoutsMasternode.ToString(), coinbaseTx.ToString()); pblock->vtx[0] = MakeTransactionRef(std::move(coinbaseTx)); pblocktemplate->vTxFees[0] = -nFees; diff --git a/src/miner.h b/src/miner.h index 427635057c41..9b78776a00d5 100644 --- a/src/miner.h +++ b/src/miner.h @@ -31,8 +31,8 @@ struct CBlockTemplate std::vector vTxFees; std::vector vTxSigOps; uint32_t nPrevBits; // nBits of previous block (for subsidy calculation) - CTxOut txoutMasternode; // masternode payment - std::vector voutSuperblock; // superblock payment + std::vector voutMasternodePayments; // masternode payment + std::vector voutSuperblockPayments; // superblock payment }; // Container for tracking updates to ancestor feerate as we include (parent) diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp index 9e4a029010ff..b0f83b225bc3 100644 --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -387,10 +387,12 @@ UniValue getblocktemplate(const JSONRPCRequest& request) " \"bits\" : \"xxxxxxxx\", (string) compressed target of next block\n" " \"previousbits\" : \"xxxxxxxx\", (string) compressed target of current highest block\n" " \"height\" : n (numeric) The height of the next block\n" - " \"masternode\" : { (json object) required masternode payee that must be included in the next block\n" - " \"payee\" : \"xxxx\", (string) payee address\n" - " \"script\" : \"xxxx\", (string) payee scriptPubKey\n" - " \"amount\": n (numeric) required amount to pay\n" + " \"masternode\" : [ (array) required masternode payments that must be included in the next block\n" + " {\n" + " \"payee\" : \"xxxx\", (string) payee address\n" + " \"script\" : \"xxxx\", (string) payee scriptPubKey\n" + " \"amount\": n (numeric) required amount to pay\n" + " }\n" " },\n" " \"masternode_payments_started\" : true|false, (boolean) true, if masternode payments started\n" " \"masternode_payments_enforced\" : true|false, (boolean) true, if masternode payments are enforced\n" @@ -491,10 +493,10 @@ UniValue getblocktemplate(const JSONRPCRequest& request) } // when enforcement is on we need information about a masternode payee or otherwise our block is going to be orphaned by the network - CScript payee; + std::vector voutMasternodePayments; if (sporkManager.IsSporkActive(SPORK_8_MASTERNODE_PAYMENT_ENFORCEMENT) && !masternodeSync.IsWinnersListSynced() - && !mnpayments.GetBlockPayee(chainActive.Height() + 1, payee)) + && !mnpayments.GetBlockTxOuts(chainActive.Height() + 1, 0, voutMasternodePayments)) throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Dash Core is downloading masternode winners..."); // next bock is a superblock and we need governance info to correctly construct it @@ -700,22 +702,26 @@ UniValue getblocktemplate(const JSONRPCRequest& request) result.push_back(Pair("previousbits", strprintf("%08x", pblocktemplate->nPrevBits))); result.push_back(Pair("height", (int64_t)(pindexPrev->nHeight+1))); - UniValue masternodeObj(UniValue::VOBJ); - if(pblocktemplate->txoutMasternode != CTxOut()) { + UniValue masternodeObj(UniValue::VARR); + for (const auto& txout : pblocktemplate->voutMasternodePayments) { CTxDestination address1; - ExtractDestination(pblocktemplate->txoutMasternode.scriptPubKey, address1); + ExtractDestination(txout.scriptPubKey, address1); CBitcoinAddress address2(address1); - masternodeObj.push_back(Pair("payee", address2.ToString().c_str())); - masternodeObj.push_back(Pair("script", HexStr(pblocktemplate->txoutMasternode.scriptPubKey))); - masternodeObj.push_back(Pair("amount", pblocktemplate->txoutMasternode.nValue)); + + UniValue obj(UniValue::VOBJ); + obj.push_back(Pair("payee", address2.ToString().c_str())); + obj.push_back(Pair("script", HexStr(txout.scriptPubKey))); + obj.push_back(Pair("amount", txout.nValue)); + masternodeObj.push_back(obj); } + result.push_back(Pair("masternode", masternodeObj)); result.push_back(Pair("masternode_payments_started", pindexPrev->nHeight + 1 > consensusParams.nMasternodePaymentsStartBlock)); result.push_back(Pair("masternode_payments_enforced", sporkManager.IsSporkActive(SPORK_8_MASTERNODE_PAYMENT_ENFORCEMENT))); UniValue superblockObjArray(UniValue::VARR); - if(pblocktemplate->voutSuperblock.size()) { - for (const auto& txout : pblocktemplate->voutSuperblock) { + if(pblocktemplate->voutSuperblockPayments.size()) { + for (const auto& txout : pblocktemplate->voutSuperblockPayments) { UniValue entry(UniValue::VOBJ); CTxDestination address1; ExtractDestination(txout.scriptPubKey, address1); diff --git a/src/validation.cpp b/src/validation.cpp index d5d9f4d0fc72..73080a4751ab 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -1948,13 +1948,20 @@ int32_t ComputeBlockVersion(const CBlockIndex* pindexPrev, const Consensus::Para ThresholdState state = VersionBitsState(pindexPrev, params, pos, versionbitscache); const struct BIP9DeploymentInfo& vbinfo = VersionBitsDeploymentInfo[pos]; if (vbinfo.check_mn_protocol && state == THRESHOLD_STARTED && !fAssumeMasternodeIsUpgraded) { - CScript payee; + std::vector voutMasternodePayments; masternode_info_t mnInfo; - if (!mnpayments.GetBlockPayee(pindexPrev->nHeight + 1, payee)) { + if (!mnpayments.GetBlockTxOuts(pindexPrev->nHeight + 1, 0, voutMasternodePayments)) { // no votes for this block continue; } - if (!mnodeman.GetMasternodeInfo(payee, mnInfo)) { + bool mnKnown = false; + for (const auto& txout : voutMasternodePayments) { + if (mnodeman.GetMasternodeInfo(txout.scriptPubKey, mnInfo)) { + mnKnown = true; + break; + } + } + if (!mnKnown) { // unknown masternode continue; } From 3d654b981441d355e8cf4f3606dbf6602fadcae1 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Tue, 14 Aug 2018 21:36:15 +0200 Subject: [PATCH 050/400] Build bionic base image in Jenkinsfile.gitian & update docs (#2226) * Build bionic base image in Jenkinsfile.gitian We updated gitian builds to use bionic, so we should also update the Jenkinsfile * Update docs --- Jenkinsfile.gitian | 2 +- contrib/gitian-descriptors/README.md | 2 +- doc/gitian-building.md | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Jenkinsfile.gitian b/Jenkinsfile.gitian index 27e25693ccbc..7e1a6117f79b 100644 --- a/Jenkinsfile.gitian +++ b/Jenkinsfile.gitian @@ -88,7 +88,7 @@ for(int i = 0; i < targets.size(); i++) { } stage("${target}/base-vm") { dir('gitian-builder') { - sh "./bin/make-base-vm --suite trusty --arch amd64 --docker" + sh "./bin/make-base-vm --suite bionic --arch amd64 --docker" } } diff --git a/contrib/gitian-descriptors/README.md b/contrib/gitian-descriptors/README.md index 1660cd3db0ff..7b4993b6694e 100644 --- a/contrib/gitian-descriptors/README.md +++ b/contrib/gitian-descriptors/README.md @@ -26,7 +26,7 @@ Once you've got the right hardware and software: # Create base images cd gitian-builder - bin/make-base-vm --suite trusty --arch amd64 + bin/make-base-vm --suite bionic --arch amd64 cd .. # Get inputs (see doc/release-process.md for exact inputs needed and where to get them) diff --git a/doc/gitian-building.md b/doc/gitian-building.md index 60ea38464d44..2538751a4e14 100644 --- a/doc/gitian-building.md +++ b/doc/gitian-building.md @@ -326,7 +326,7 @@ Execute the following as user `debian`: ```bash cd gitian-builder -bin/make-base-vm --lxc --arch amd64 --suite trusty +bin/make-base-vm --lxc --arch amd64 --suite bionic ``` There will be a lot of warnings printed during the build of the image. These can be ignored. @@ -378,7 +378,7 @@ Output from `gbuild` will look something like Resolving deltas: 100% (41590/41590), done. From https://github.com/dashpay/dash ... (new tags, new branch etc) - --- Building for trusty amd64 --- + --- Building for bionic amd64 --- Stopping target if it is up Making a new image copy stdin: is not a tty @@ -427,14 +427,14 @@ So, if you use LXC: export PATH="$PATH":/path/to/gitian-builder/libexec export USE_LXC=1 cd /path/to/gitian-builder -./libexec/make-clean-vm --suite trusty --arch amd64 +./libexec/make-clean-vm --suite bionic --arch amd64 -LXC_ARCH=amd64 LXC_SUITE=trusty on-target -u root apt-get update -LXC_ARCH=amd64 LXC_SUITE=trusty on-target -u root \ +LXC_ARCH=amd64 LXC_SUITE=bionic on-target -u root apt-get update +LXC_ARCH=amd64 LXC_SUITE=bionic on-target -u root \ -e DEBIAN_FRONTEND=noninteractive apt-get --no-install-recommends -y install \ $( sed -ne '/^packages:/,/[^-] .*/ {/^- .*/{s/"//g;s/- //;p}}' ../dash/contrib/gitian-descriptors/*|sort|uniq ) -LXC_ARCH=amd64 LXC_SUITE=trusty on-target -u root apt-get -q -y purge grub -LXC_ARCH=amd64 LXC_SUITE=trusty on-target -u root -e DEBIAN_FRONTEND=noninteractive apt-get -y dist-upgrade +LXC_ARCH=amd64 LXC_SUITE=bionic on-target -u root apt-get -q -y purge grub +LXC_ARCH=amd64 LXC_SUITE=bionic on-target -u root -e DEBIAN_FRONTEND=noninteractive apt-get -y dist-upgrade ``` And then set offline mode for apt-cacher-ng: From 2e06f8133f6c7dbb5ec9aef8712bbc315900fb3d Mon Sep 17 00:00:00 2001 From: gladcow Date: Tue, 21 Aug 2018 17:07:32 +0300 Subject: [PATCH 051/400] fix missed format parameter (#2229) --- src/masternode-payments.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/masternode-payments.cpp b/src/masternode-payments.cpp index e4894e4ea68f..d52c49dda61c 100644 --- a/src/masternode-payments.cpp +++ b/src/masternode-payments.cpp @@ -861,7 +861,7 @@ bool CMasternodePayments::ProcessBlock(int nBlockHeight, CConnman& connman) ExtractDestination(payee, address1); CBitcoinAddress address2(address1); - LogPrintf("CMasternodePayments::%s -- vote: payee=%s, nBlockHeight=%d\n", address2.ToString(), nBlockHeight); + LogPrintf("CMasternodePayments::%s -- vote: payee=%s, nBlockHeight=%d\n", __func__, address2.ToString(), nBlockHeight); // SIGN MESSAGE TO NETWORK WITH OUR MASTERNODE KEYS From 98ed90cbb427440186f02f578d9a0e5d9f9cd4b1 Mon Sep 17 00:00:00 2001 From: PastaPastaPasta Date: Tue, 21 Aug 2018 09:07:54 -0500 Subject: [PATCH 052/400] adds rpc calls for `setprivatesendrounds` and `setprivatesendamount` (#2230) * adds rpc calls for `setprivatesendrounds` and `setprivatesendamount` * tabs -> spaces * @gladcow change request * Whops tab -> spaces * @Udjin changes, not the CAmount -> int * int stuff * Throw error when rounds / amount isn't within range --- src/rpc/client.cpp | 2 ++ src/wallet/rpcwallet.cpp | 57 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/src/rpc/client.cpp b/src/rpc/client.cpp index c5b07d6d0da6..e1c6fb2ad544 100644 --- a/src/rpc/client.cpp +++ b/src/rpc/client.cpp @@ -139,6 +139,8 @@ static const CRPCConvertParam vRPCConvertParams[] = { "setban", 3, "absolute" }, { "setbip69enabled", 0, "enabled" }, { "setnetworkactive", 0, "state" }, + { "setprivatesendrounds", 0, "rounds" }, + { "setprivatesendamount", 0, "amount" }, { "getmempoolancestors", 1, "verbose" }, { "getmempooldescendants", 1, "verbose" }, { "spork", 1, "value" }, diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index d3dd34e864bf..33d500dcae06 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -21,6 +21,7 @@ #include "wallet.h" #include "walletdb.h" #include "keepass.h" +#include "privatesend-client.h" #include @@ -2364,6 +2365,60 @@ UniValue settxfee(const JSONRPCRequest& request) return true; } +UniValue setprivatesendrounds(const JSONRPCRequest& request) +{ + if (!EnsureWalletIsAvailable(request.fHelp)) + return NullUniValue; + + if (request.fHelp || request.params.size() != 1) + throw std::runtime_error( + "setprivatesendrounds rounds\n" + "\nSet the number of rounds for PrivateSend mixing.\n" + "\nArguments:\n" + "1. rounds (numeric, required) The default number of rounds is " + std::to_string(DEFAULT_PRIVATESEND_ROUNDS) + + " Cannot be more than " + std::to_string(MAX_PRIVATESEND_ROUNDS) + " nor less than " + std::to_string(MIN_PRIVATESEND_ROUNDS) + + "\nExamples:\n" + + HelpExampleCli("setprivatesendrounds", "4") + + HelpExampleRpc("setprivatesendrounds", "16") + ); + + int nRounds = request.params[0].get_int(); + + if (nRounds > MAX_PRIVATESEND_ROUNDS || nRounds < MIN_PRIVATESEND_ROUNDS) + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid number of rounds"); + + privateSendClient.nPrivateSendRounds = nRounds; + + return NullUniValue; +} + +UniValue setprivatesendamount(const JSONRPCRequest& request) +{ + if (!EnsureWalletIsAvailable(request.fHelp)) + return NullUniValue; + + if (request.fHelp || request.params.size() != 1) + throw std::runtime_error( + "setprivatesendamount amount\n" + "\nSet the goal amount in " + CURRENCY_UNIT + " for PrivateSend mixing.\n" + "\nArguments:\n" + "1. amount (numeric, required) The default amount is " + std::to_string(DEFAULT_PRIVATESEND_AMOUNT) + + " Cannot be more than " + std::to_string(MAX_PRIVATESEND_AMOUNT) + " nor less than " + std::to_string(MIN_PRIVATESEND_AMOUNT) + + "\nExamples:\n" + + HelpExampleCli("setprivatesendamount", "500") + + HelpExampleRpc("setprivatesendamount", "208") + ); + + int nAmount = request.params[0].get_int(); + + if (nAmount > MAX_PRIVATESEND_AMOUNT || nAmount < MIN_PRIVATESEND_AMOUNT) + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid amount of " + CURRENCY_UNIT + " as mixing goal amount"); + + privateSendClient.nPrivateSendAmount = nAmount; + + return NullUniValue; +} + UniValue getwalletinfo(const JSONRPCRequest& request) { if (!EnsureWalletIsAvailable(request.fHelp)) @@ -2887,6 +2942,8 @@ static const CRPCCommand commands[] = { "wallet", "sendtoaddress", &sendtoaddress, false, {"address","amount","comment","comment_to","subtractfeefromamount"} }, { "wallet", "setaccount", &setaccount, true, {"address","account"} }, { "wallet", "settxfee", &settxfee, true, {"amount"} }, + { "wallet", "setprivatesendrounds", &setprivatesendrounds, true, {"rounds"} }, + { "wallet", "setprivatesendamount", &setprivatesendamount, true, {"amount"} }, { "wallet", "signmessage", &signmessage, true, {"address","message"} }, { "wallet", "walletlock", &walletlock, true, {} }, { "wallet", "walletpassphrasechange", &walletpassphrasechange, true, {"oldpassphrase","newpassphrase"} }, From 2997d6d268395de6831f87f87fc21195f8da1920 Mon Sep 17 00:00:00 2001 From: Nathan Marley Date: Tue, 21 Aug 2018 07:08:11 -0700 Subject: [PATCH 053/400] add compressed option to `masternode genkey` (#2232) * add compressed option to `masternode genkey` * use ParseBoolV method * adjust help message for masternode genkey --- src/rpc/masternode.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/rpc/masternode.cpp b/src/rpc/masternode.cpp index 97cf1d1c71fd..aedfce5772e5 100644 --- a/src/rpc/masternode.cpp +++ b/src/rpc/masternode.cpp @@ -145,7 +145,7 @@ UniValue masternode(const JSONRPCRequest& request) " check - Force check all masternodes and remove invalid ones\n" " count - Get information about number of masternodes (DEPRECATED options: 'total', 'ps', 'enabled', 'qualify', 'all')\n" " current - Print info on current masternode winner to be paid the next block (calculated locally)\n" - " genkey - Generate new masternodeprivkey\n" + " genkey - Generate new masternodeprivkey, optional param: 'compressed' (boolean, optional, default=false) generate compressed privkey\n" #ifdef ENABLE_WALLET " outputs - Print masternode compatible outputs\n" " start-alias - Start single remote masternode by assigned alias configured in masternode.conf\n" @@ -375,8 +375,13 @@ UniValue masternode(const JSONRPCRequest& request) if (strCommand == "genkey") { + bool fCompressed = false; + if (request.params.size() > 1) { + fCompressed = ParseBoolV(request.params[1], "compressed"); + } + CKey secret; - secret.MakeNewKey(false); + secret.MakeNewKey(fCompressed); return CBitcoinSecret(secret).ToString(); } From b92bd8997a224b34fca9b073cc8ec5a5d158492c Mon Sep 17 00:00:00 2001 From: gladcow Date: Tue, 21 Aug 2018 17:08:42 +0300 Subject: [PATCH 054/400] Fix mninfo search by payee (#2233) --- src/masternodeman.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/masternodeman.cpp b/src/masternodeman.cpp index bd89f275820d..386f2969e921 100644 --- a/src/masternodeman.cpp +++ b/src/masternodeman.cpp @@ -493,7 +493,14 @@ bool CMasternodeMan::GetMasternodeInfo(const CScript& payee, masternode_info_t& if (!ExtractDestination(payee, dest) || !boost::get(&dest)) return false; CKeyID keyId = *boost::get(&dest); - return GetMasternodeInfo(keyId, mnInfoRet); + LOCK(cs); + for (const auto& mnpair : mapMasternodes) { + if (mnpair.second.keyIDCollateralAddress == keyId) { + mnInfoRet = mnpair.second.GetInfo(); + return true; + } + } + return false; } bool CMasternodeMan::Has(const COutPoint& outpoint) From 8da88ecf680e7c42d56a1b0b4701115ae18b8563 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Tue, 21 Aug 2018 17:34:26 +0200 Subject: [PATCH 055/400] Don't crash when formatting in logging throws exceptions (#2231) * Don't crash when formatting in logging throws exceptions * Preserve exception like output --- src/util.h | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/util.h b/src/util.h index 468613100e87..98c924328c62 100644 --- a/src/util.h +++ b/src/util.h @@ -94,20 +94,33 @@ bool LogAcceptCategory(const char* category); /** Send a string to the log output */ int LogPrintStr(const std::string &str); +/** Formats a string without throwing exceptions. Instead, it'll return an error string instead of formatted string. */ +template +std::string SafeStringFormat(const std::string& fmt, const Args&... args) +{ + try { + return tinyformat::format(fmt, args...); + } catch (std::runtime_error& e) { + std::string message = tinyformat::format("\n****TINYFORMAT ERROR****\n err=\"%s\"\n fmt=\"%s\"\n", e.what(), fmt); + fprintf(stderr, "%s", message.c_str()); + return message; + } +} + #define LogPrint(category, ...) do { \ if (LogAcceptCategory((category))) { \ - LogPrintStr(tinyformat::format(__VA_ARGS__)); \ + LogPrintStr(SafeStringFormat(__VA_ARGS__)); \ } \ } while(0) #define LogPrintf(...) do { \ - LogPrintStr(tinyformat::format(__VA_ARGS__)); \ + LogPrintStr(SafeStringFormat(__VA_ARGS__)); \ } while(0) template bool error(const char* fmt, const Args&... args) { - LogPrintStr("ERROR: " + tinyformat::format(fmt, args...) + "\n"); + LogPrintStr("ERROR: " + SafeStringFormat(fmt, args...) + "\n"); return false; } From 73c2ddde7a818e08d0dc55045f92b346ffaef698 Mon Sep 17 00:00:00 2001 From: Nathan Marley Date: Wed, 22 Aug 2018 07:46:27 -0700 Subject: [PATCH 056/400] extract sporkmanager from sporkmessage (#2234) The SporkMessage is a lower-level construct which shouldn't be aware of SporkManager. This commit moves the `sporkManager.IsSporkActive()` calls outside the SporkMessage functions. This follows the dependency injection pattern and makes it easier to test SporkMessage as well. --- src/spork.cpp | 14 +++++++------- src/spork.h | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/spork.cpp b/src/spork.cpp index dd8ed7c07f5a..adf3f315e1eb 100644 --- a/src/spork.cpp +++ b/src/spork.cpp @@ -68,7 +68,7 @@ void CSporkManager::ProcessSpork(CNode* pfrom, const std::string& strCommand, CD } } - if(!spork.CheckSignature(sporkPubKeyID)) { + if(!spork.CheckSignature(sporkPubKeyID, IsSporkActive(SPORK_6_NEW_SIGS))) { LOCK(cs_main); LogPrintf("CSporkManager::ProcessSpork -- ERROR: invalid signature\n"); Misbehaving(pfrom->GetId(), 100); @@ -127,7 +127,7 @@ bool CSporkManager::UpdateSpork(int nSporkID, int64_t nValue, CConnman& connman) { CSporkMessage spork = CSporkMessage(nSporkID, nValue, GetAdjustedTime()); - if(spork.Sign(sporkPrivKey)) { + if(spork.Sign(sporkPrivKey, IsSporkActive(SPORK_6_NEW_SIGS))) { spork.Relay(connman); LOCK(cs); mapSporksByHash[spork.GetHash()] = spork; @@ -244,7 +244,7 @@ bool CSporkManager::SetPrivKey(const std::string& strPrivKey) } CSporkMessage spork; - if (spork.Sign(key)) { + if (spork.Sign(key, IsSporkActive(SPORK_6_NEW_SIGS))) { LOCK(cs); // Test signing successful, proceed LogPrintf("CSporkManager::SetPrivKey -- Successfully initialized as spork signer\n"); @@ -274,7 +274,7 @@ uint256 CSporkMessage::GetSignatureHash() const return GetHash(); } -bool CSporkMessage::Sign(const CKey& key) +bool CSporkMessage::Sign(const CKey& key, bool fSporkSixActive) { if (!key.IsValid()) { LogPrintf("CSporkMessage::Sign -- signing key is not valid\n"); @@ -284,7 +284,7 @@ bool CSporkMessage::Sign(const CKey& key) CKeyID pubKeyId = key.GetPubKey().GetID(); std::string strError = ""; - if (sporkManager.IsSporkActive(SPORK_6_NEW_SIGS)) { + if (fSporkSixActive) { uint256 hash = GetSignatureHash(); if(!CHashSigner::SignHash(hash, key, vchSig)) { @@ -313,11 +313,11 @@ bool CSporkMessage::Sign(const CKey& key) return true; } -bool CSporkMessage::CheckSignature(const CKeyID& pubKeyId) const +bool CSporkMessage::CheckSignature(const CKeyID& pubKeyId, bool fSporkSixActive) const { std::string strError = ""; - if (sporkManager.IsSporkActive(SPORK_6_NEW_SIGS)) { + if (fSporkSixActive) { uint256 hash = GetSignatureHash(); if (!CHashSigner::VerifyHash(hash, pubKeyId, vchSig, strError)) { diff --git a/src/spork.h b/src/spork.h index 338fed334719..60153efc0694 100644 --- a/src/spork.h +++ b/src/spork.h @@ -76,8 +76,8 @@ class CSporkMessage uint256 GetHash() const; uint256 GetSignatureHash() const; - bool Sign(const CKey& key); - bool CheckSignature(const CKeyID& pubKeyId) const; + bool Sign(const CKey& key, bool fSporkSixActive); + bool CheckSignature(const CKeyID& pubKeyId, bool fSporkSixActive) const; void Relay(CConnman& connman); }; From e415fd049a9d9111034356c049eca181bcb850d1 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Mon, 27 Aug 2018 14:48:45 +0200 Subject: [PATCH 057/400] Revert CMasternodePayments::IsTransactionValid to the logic before the recent refactorings (#2237) partially reverts #2216 --- src/masternode-payments.cpp | 27 +++------------------------ 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/src/masternode-payments.cpp b/src/masternode-payments.cpp index d52c49dda61c..5548f328e364 100644 --- a/src/masternode-payments.cpp +++ b/src/masternode-payments.cpp @@ -706,30 +706,9 @@ std::string CMasternodePayments::GetRequiredPaymentsString(int nBlockHeight) con bool CMasternodePayments::IsTransactionValid(const CTransaction& txNew, int nBlockHeight, CAmount blockReward) const { - std::vector voutMasternodePayments; - if (!GetBlockTxOuts(nBlockHeight, blockReward, voutMasternodePayments)) { - LogPrintf("CMasternodePayments::%s -- ERROR failed to get payees for block at height %s\n", __func__, nBlockHeight); - return false; - } - - for (const auto& txout : voutMasternodePayments) { - bool found = false; - for (const auto& txout2 : txNew.vout) { - if (txout == txout2) { - found = true; - break; - } - } - if (!found) { - CTxDestination dest; - if (!ExtractDestination(txout.scriptPubKey, dest)) - assert(false); - LogPrintf("CMasternodePayments::%s -- ERROR failed to find expected payee %s in block at height %s\n", __func__, CBitcoinAddress(dest).ToString(), nBlockHeight); - return false; - } - } - - return true; + LOCK(cs_mapMasternodeBlocks); + const auto it = mapMasternodeBlocks.find(nBlockHeight); + return it == mapMasternodeBlocks.end() ? true : it->second.IsTransactionValid(txNew); } void CMasternodePayments::CheckAndRemove() From b6896387ae5985fd24af8db89a9faba82fe6a2ae Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Tue, 28 Aug 2018 13:43:58 +0200 Subject: [PATCH 058/400] Move DIP1 transaction size checks out of ContextualCheckBlock and use ContextualCheckTransaction instead (#2238) * Pass consensus params to ContextualCheckTransaction As we do with ContextualCheckBlock * Use ContextualCheckTransaction in ContextualCheckBlock instead of duplicating the check * Fix pindexPrev parameter signature in ContextualCheckTransaction --- src/validation.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index 73080a4751ab..a1a138416dc9 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -556,10 +556,10 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state, bool fChe return true; } -bool ContextualCheckTransaction(const CTransaction& tx, CValidationState &state, CBlockIndex * const pindexPrev) +bool ContextualCheckTransaction(const CTransaction& tx, CValidationState &state, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev) { int nHeight = pindexPrev == NULL ? 0 : pindexPrev->nHeight + 1; - bool fDIP0001Active_context = nHeight >= Params().GetConsensus().DIP0001Height; + bool fDIP0001Active_context = nHeight >= consensusParams.DIP0001Height; // Size limits if (fDIP0001Active_context && ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION) > MAX_STANDARD_TX_SIZE) @@ -614,7 +614,7 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C if (!CheckTransaction(tx, state)) return false; // state filled in by CheckTransaction - if (!ContextualCheckTransaction(tx, state, chainActive.Tip())) + if (!ContextualCheckTransaction(tx, state, Params().GetConsensus(), chainActive.Tip())) return error("%s: ContextualCheckTransaction: %s, %s", __func__, hash.ToString(), FormatStateMessage(state)); // Coinbase is only valid in a block, not as a loose transaction @@ -3470,8 +3470,8 @@ bool ContextualCheckBlock(const CBlock& block, CValidationState& state, const Co if (!IsFinalTx(*tx, nHeight, nLockTimeCutoff)) { return state.DoS(10, false, REJECT_INVALID, "bad-txns-nonfinal", false, "non-final transaction"); } - if (fDIP0001Active_context && ::GetSerializeSize(*tx, SER_NETWORK, PROTOCOL_VERSION) > MAX_STANDARD_TX_SIZE) { - return state.DoS(10, false, REJECT_INVALID, "bad-txns-oversized", false, "contains an over-sized transaction"); + if (!ContextualCheckTransaction(*tx, state, consensusParams, pindexPrev)) { + return false; } nSigOps += GetLegacySigOpCount(*tx); } From d20100ecd4590d54b0be1b0012e269ea93ea83a4 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Wed, 14 Feb 2018 21:31:42 +0100 Subject: [PATCH 059/400] DIP0003 deployment --- src/chainparams.cpp | 10 ++++++++++ src/consensus/params.h | 1 + src/dsnotificationinterface.cpp | 1 + src/init.cpp | 5 +++++ src/rpc/blockchain.cpp | 1 + src/validation.cpp | 10 ++++++++++ src/validation.h | 2 ++ src/versionbits.cpp | 5 +++++ 8 files changed, 35 insertions(+) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index c605d7d60d0b..b7edaa7bda0f 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -457,6 +457,13 @@ class CDevNetParams : public CChainParams { consensus.vDeployments[Consensus::DEPLOYMENT_BIP147].nWindowSize = 100; consensus.vDeployments[Consensus::DEPLOYMENT_BIP147].nThreshold = 50; // 50% of 100 + // Deployment of DIP0003 + consensus.vDeployments[Consensus::DEPLOYMENT_DIP0003].bit = 3; + consensus.vDeployments[Consensus::DEPLOYMENT_DIP0003].nStartTime = 1535752800; // Sep 1st, 2018 + consensus.vDeployments[Consensus::DEPLOYMENT_DIP0003].nTimeout = 1567288800; // Sep 1st, 2019 + consensus.vDeployments[Consensus::DEPLOYMENT_DIP0003].nWindowSize = 100; + consensus.vDeployments[Consensus::DEPLOYMENT_DIP0003].nThreshold = 50; // 50% of 100 + // The best chain should have at least this much work. consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000000000000000000000000"); @@ -573,6 +580,9 @@ class CRegTestParams : public CChainParams { consensus.vDeployments[Consensus::DEPLOYMENT_BIP147].bit = 2; consensus.vDeployments[Consensus::DEPLOYMENT_BIP147].nStartTime = 0; consensus.vDeployments[Consensus::DEPLOYMENT_BIP147].nTimeout = 999999999999ULL; + consensus.vDeployments[Consensus::DEPLOYMENT_DIP0003].bit = 3; + consensus.vDeployments[Consensus::DEPLOYMENT_DIP0003].nStartTime = 0; + consensus.vDeployments[Consensus::DEPLOYMENT_DIP0003].nTimeout = 999999999999ULL; // The best chain should have at least this much work. consensus.nMinimumChainWork = uint256S("0x00"); diff --git a/src/consensus/params.h b/src/consensus/params.h index ccba1d4996c7..524d094fd8ab 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -18,6 +18,7 @@ enum DeploymentPos DEPLOYMENT_CSV, // Deployment of BIP68, BIP112, and BIP113. DEPLOYMENT_DIP0001, // Deployment of DIP0001 and lower transaction fees. DEPLOYMENT_BIP147, // Deployment of BIP147 (NULLDUMMY) + DEPLOYMENT_DIP0003, // Deployment of DIP0002 and DIP0003 (txv3 and deterministic MN lists) // NOTE: Also add new deployments to VersionBitsDeploymentInfo in versionbits.cpp MAX_VERSION_BITS_DEPLOYMENTS }; diff --git a/src/dsnotificationinterface.cpp b/src/dsnotificationinterface.cpp index d417c80c7261..00be55b55652 100644 --- a/src/dsnotificationinterface.cpp +++ b/src/dsnotificationinterface.cpp @@ -39,6 +39,7 @@ void CDSNotificationInterface::UpdatedBlockTip(const CBlockIndex *pindexNew, con // Update global DIP0001 activation status fDIP0001ActiveAtTip = pindexNew->nHeight >= Params().GetConsensus().DIP0001Height; + fDIP0003ActiveAtTip = (VersionBitsState(pindexNew->pprev, Params().GetConsensus(), Consensus::DEPLOYMENT_DIP0003, versionbitscache) == THRESHOLD_ACTIVE); if (fInitialDownload) return; diff --git a/src/init.cpp b/src/init.cpp index 26b80208ddec..b35f6fa825ba 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1704,6 +1704,11 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler) break; } + // Needs to be called after chain is initialized + if (chainActive.Tip() && chainActive.Tip()->pprev) { + fDIP0003ActiveAtTip = VersionBitsState(chainActive.Tip()->pprev, Params().GetConsensus(), Consensus::DEPLOYMENT_DIP0003, versionbitscache) == THRESHOLD_ACTIVE; + } + uiInterface.InitMessage(_("Verifying blocks...")); if (fHavePruned && GetArg("-checkblocks", DEFAULT_CHECKBLOCKS) > MIN_BLOCKS_TO_KEEP) { LogPrintf("Prune: pruned datadir may not have more than %d blocks; only checking available blocks", diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index 481402b176f5..de5aee549dcf 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -1274,6 +1274,7 @@ UniValue getblockchaininfo(const JSONRPCRequest& request) softforks.push_back(SoftForkDesc("bip65", 4, tip, consensusParams)); BIP9SoftForkDescPushBack(bip9_softforks, "csv", consensusParams, Consensus::DEPLOYMENT_CSV); BIP9SoftForkDescPushBack(bip9_softforks, "dip0001", consensusParams, Consensus::DEPLOYMENT_DIP0001); + BIP9SoftForkDescPushBack(bip9_softforks, "dip0003", consensusParams, Consensus::DEPLOYMENT_DIP0003); BIP9SoftForkDescPushBack(bip9_softforks, "bip147", consensusParams, Consensus::DEPLOYMENT_BIP147); obj.push_back(Pair("softforks", softforks)); obj.push_back(Pair("bip9_softforks", bip9_softforks)); diff --git a/src/validation.cpp b/src/validation.cpp index a1a138416dc9..c616ce83b7d8 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -89,6 +89,7 @@ int64_t nMaxTipAge = DEFAULT_MAX_TIP_AGE; bool fEnableReplacement = DEFAULT_ENABLE_REPLACEMENT; std::atomic fDIP0001ActiveAtTip{false}; +std::atomic fDIP0003ActiveAtTip{false}; uint256 hashAssumeValid; @@ -1885,6 +1886,9 @@ static DisconnectResult DisconnectBlock(const CBlock& block, CValidationState& s } } + if (pindex->pprev && pindex->pprev->pprev && VersionBitsState(pindex->pprev->pprev, Params().GetConsensus(), Consensus::DEPLOYMENT_DIP0003, versionbitscache) != THRESHOLD_ACTIVE) { + fDIP0003ActiveAtTip = false; + } // move best block pointer to prevout block view.SetBestBlock(pindex->pprev->GetBlockHash()); @@ -2153,6 +2157,12 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd flags |= SCRIPT_VERIFY_NULLDUMMY; } + if (!fJustCheck && VersionBitsState(pindex->pprev, chainparams.GetConsensus(), Consensus::DEPLOYMENT_DIP0003, versionbitscache) == THRESHOLD_ACTIVE) { + if (!fDIP0003ActiveAtTip) + LogPrintf("ConnectBlock -- DIP0003 got activated at height %d\n", pindex->nHeight); + fDIP0003ActiveAtTip = true; + } + int64_t nTime2 = GetTimeMicros(); nTimeForks += nTime2 - nTime1; LogPrint("bench", " - Fork checks: %.2fms [%.2fs]\n", 0.001 * (nTime2 - nTime1), nTimeForks * 0.000001); diff --git a/src/validation.h b/src/validation.h index 18d7b8b8881f..8c45bbb4e2f3 100644 --- a/src/validation.h +++ b/src/validation.h @@ -189,6 +189,8 @@ extern bool fLargeWorkInvalidChainFound; extern std::map mapRejectedBlocks; extern std::atomic fDIP0001ActiveAtTip; +extern std::atomic fDIP0003ActiveAtTip; + /** Block hash whose ancestors we will assume to have valid scripts without checking them. */ extern uint256 hashAssumeValid; diff --git a/src/versionbits.cpp b/src/versionbits.cpp index af37b6350ae3..f7a5ce1d2bf9 100644 --- a/src/versionbits.cpp +++ b/src/versionbits.cpp @@ -26,6 +26,11 @@ const struct BIP9DeploymentInfo VersionBitsDeploymentInfo[Consensus::MAX_VERSION /*.name =*/ "bip147", /*.gbt_force =*/ true, /*.check_mn_protocol =*/ false, + }, + { + /*.name =*/ "dip0003", + /*.gbt_force =*/ true, + /*.check_mn_protocol =*/ false, } }; From a3c4ee3fda66710f64d593ff9026ff4ad8b5c096 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Mon, 12 Feb 2018 14:44:32 +0100 Subject: [PATCH 060/400] DIP2 changes to CTransaction and CMutableTransaction --- src/consensus/consensus.h | 2 ++ src/primitives/transaction.cpp | 22 +++++++++++++--------- src/primitives/transaction.h | 30 +++++++++++++++++++++++++----- src/rpc/rawtransaction.cpp | 7 +++++++ src/script/interpreter.cpp | 5 ++++- 5 files changed, 51 insertions(+), 15 deletions(-) diff --git a/src/consensus/consensus.h b/src/consensus/consensus.h index ee199b875ce3..0efe580c1e08 100644 --- a/src/consensus/consensus.h +++ b/src/consensus/consensus.h @@ -18,6 +18,8 @@ inline unsigned int MaxBlockSigOps(bool fDIP0001Active /*= false */) { return MaxBlockSize(fDIP0001Active) / 50; } +/** The maximum allowed size of version 3 extra payload */ +static const unsigned int MAX_TX_EXTRA_PAYLOAD = 10000; /** Coinbase transaction outputs can only be spent after this number of new blocks (network rule) */ static const int COINBASE_MATURITY = 100; diff --git a/src/primitives/transaction.cpp b/src/primitives/transaction.cpp index f2afae047c8e..892cec4f690a 100644 --- a/src/primitives/transaction.cpp +++ b/src/primitives/transaction.cpp @@ -60,8 +60,8 @@ std::string CTxOut::ToString() const return strprintf("CTxOut(nValue=%d.%08d, scriptPubKey=%s)", nValue / COIN, nValue % COIN, HexStr(scriptPubKey).substr(0, 30)); } -CMutableTransaction::CMutableTransaction() : nVersion(CTransaction::CURRENT_VERSION), nLockTime(0) {} -CMutableTransaction::CMutableTransaction(const CTransaction& tx) : nVersion(tx.nVersion), vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime) {} +CMutableTransaction::CMutableTransaction() : nVersion(CTransaction::CURRENT_VERSION), nType(TRANSACTION_NORMAL), nLockTime(0) {} +CMutableTransaction::CMutableTransaction(const CTransaction& tx) : nVersion(tx.nVersion), nType(tx.nType), vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime), vExtraPayload(tx.vExtraPayload) {} uint256 CMutableTransaction::GetHash() const { @@ -71,12 +71,14 @@ uint256 CMutableTransaction::GetHash() const std::string CMutableTransaction::ToString() const { std::string str; - str += strprintf("CMutableTransaction(hash=%s, ver=%d, vin.size=%u, vout.size=%u, nLockTime=%u)\n", + str += strprintf("CMutableTransaction(hash=%s, ver=%d, type=%d, vin.size=%u, vout.size=%u, nLockTime=%u, vExtraPayload.size=%d)\n", GetHash().ToString().substr(0,10), nVersion, + nType, vin.size(), vout.size(), - nLockTime); + nLockTime, + vExtraPayload.size()); for (unsigned int i = 0; i < vin.size(); i++) str += " " + vin[i].ToString() + "\n"; for (unsigned int i = 0; i < vout.size(); i++) @@ -90,9 +92,9 @@ uint256 CTransaction::ComputeHash() const } /* For backward compatibility, the hash is initialized to 0. TODO: remove the need for this default constructor entirely. */ -CTransaction::CTransaction() : nVersion(CTransaction::CURRENT_VERSION), vin(), vout(), nLockTime(0), hash() {} -CTransaction::CTransaction(const CMutableTransaction &tx) : nVersion(tx.nVersion), vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime), hash(ComputeHash()) {} -CTransaction::CTransaction(CMutableTransaction &&tx) : nVersion(tx.nVersion), vin(std::move(tx.vin)), vout(std::move(tx.vout)), nLockTime(tx.nLockTime), hash(ComputeHash()) {} +CTransaction::CTransaction() : nVersion(CTransaction::CURRENT_VERSION), nType(TRANSACTION_NORMAL), vin(), vout(), nLockTime(0), hash() {} +CTransaction::CTransaction(const CMutableTransaction &tx) : nVersion(tx.nVersion), nType(tx.nType), vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime), vExtraPayload(tx.vExtraPayload), hash(ComputeHash()) {} +CTransaction::CTransaction(CMutableTransaction &&tx) : nVersion(tx.nVersion), nType(tx.nType), vin(std::move(tx.vin)), vout(std::move(tx.vout)), nLockTime(tx.nLockTime), vExtraPayload(tx.vExtraPayload), hash(ComputeHash()) {} CAmount CTransaction::GetValueOut() const { @@ -140,12 +142,14 @@ unsigned int CTransaction::GetTotalSize() const std::string CTransaction::ToString() const { std::string str; - str += strprintf("CTransaction(hash=%s, ver=%d, vin.size=%u, vout.size=%u, nLockTime=%u)\n", + str += strprintf("CTransaction(hash=%s, ver=%d, type=%d, vin.size=%u, vout.size=%u, nLockTime=%u, vExtraPayload.size=%d)\n", GetHash().ToString().substr(0,10), nVersion, + nType, vin.size(), vout.size(), - nLockTime); + nLockTime, + vExtraPayload.size()); for (unsigned int i = 0; i < vin.size(); i++) str += " " + vin[i].ToString() + "\n"; for (unsigned int i = 0; i < vout.size(); i++) diff --git a/src/primitives/transaction.h b/src/primitives/transaction.h index e29af2bcef65..23ec4f698b3f 100644 --- a/src/primitives/transaction.h +++ b/src/primitives/transaction.h @@ -11,6 +11,11 @@ #include "serialize.h" #include "uint256.h" +/** Transaction types */ +enum { + TRANSACTION_NORMAL = 0, +}; + /** An outpoint - a combination of a transaction hash and an index n into its vout */ class COutPoint { @@ -215,17 +220,19 @@ class CTransaction // adapting relay policy by bumping MAX_STANDARD_VERSION, and then later date // bumping the default CURRENT_VERSION at which point both CURRENT_VERSION and // MAX_STANDARD_VERSION will be equal. - static const int32_t MAX_STANDARD_VERSION=2; + static const int32_t MAX_STANDARD_VERSION=3; // The local variables are made const to prevent unintended modification // without updating the cached hash value. However, CTransaction is not // actually immutable; deserialization and assignment are implemented, // and bypass the constness. This is safe, as they update the entire // structure, including the hash. - const int32_t nVersion; + const int16_t nVersion; + const int16_t nType; const std::vector vin; const std::vector vout; const uint32_t nLockTime; + const std::vector vExtraPayload; // only available for special transaction types private: /** Memory only. */ @@ -243,10 +250,13 @@ class CTransaction template inline void Serialize(Stream& s) const { - s << this->nVersion; + int32_t n32bitVersion = this->nVersion | (this->nType << 16); + s << n32bitVersion; s << vin; s << vout; s << nLockTime; + if (this->nVersion >= 3 && this->nType != TRANSACTION_NORMAL) + s << vExtraPayload; } /** This deserializing constructor is provided instead of an Unserialize method. @@ -301,10 +311,12 @@ class CTransaction /** A mutable version of CTransaction. */ struct CMutableTransaction { - int32_t nVersion; + int16_t nVersion; + int16_t nType; std::vector vin; std::vector vout; uint32_t nLockTime; + std::vector vExtraPayload; // only available for special transaction types CMutableTransaction(); CMutableTransaction(const CTransaction& tx); @@ -313,10 +325,18 @@ struct CMutableTransaction template inline void SerializationOp(Stream& s, Operation ser_action) { - READWRITE(this->nVersion); + int32_t n32bitVersion = this->nVersion | (this->nType << 16); + READWRITE(n32bitVersion); + if (ser_action.ForRead()) { + this->nVersion = (int16_t) (n32bitVersion & 0xffff); + this->nType = (int16_t) ((n32bitVersion >> 16) & 0xffff); + } READWRITE(vin); READWRITE(vout); READWRITE(nLockTime); + if (this->nVersion >= 3 && this->nType != TRANSACTION_NORMAL) { + READWRITE(vExtraPayload); + } } template diff --git a/src/rpc/rawtransaction.cpp b/src/rpc/rawtransaction.cpp index e773e6518c5f..0c02ce00ff14 100644 --- a/src/rpc/rawtransaction.cpp +++ b/src/rpc/rawtransaction.cpp @@ -65,6 +65,7 @@ void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry) entry.push_back(Pair("txid", txid.GetHex())); entry.push_back(Pair("size", (int)::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION))); entry.push_back(Pair("version", tx.nVersion)); + entry.push_back(Pair("type", tx.nType)); entry.push_back(Pair("locktime", (int64_t)tx.nLockTime)); UniValue vin(UniValue::VARR); BOOST_FOREACH(const CTxIn& txin, tx.vin) { @@ -121,6 +122,11 @@ void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry) } entry.push_back(Pair("vout", vout)); + if (!tx.vExtraPayload.empty()) { + entry.push_back(Pair("extraPayloadSize", (int)tx.vExtraPayload.size())); + entry.push_back(Pair("extraPayload", HexStr(tx.vExtraPayload))); + } + if (!hashBlock.IsNull()) { entry.push_back(Pair("blockhash", hashBlock.GetHex())); BlockMap::iterator mi = mapBlockIndex.find(hashBlock); @@ -500,6 +506,7 @@ UniValue decoderawtransaction(const JSONRPCRequest& request) " \"txid\" : \"id\", (string) The transaction id\n" " \"size\" : n, (numeric) The transaction size\n" " \"version\" : n, (numeric) The version\n" + " \"type\" : n, (numeric) The type\n" " \"locktime\" : ttt, (numeric) The lock time\n" " \"vin\" : [ (array of json objects)\n" " {\n" diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 80c804b92948..d86696cb8b56 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -1098,7 +1098,8 @@ class CTransactionSignatureSerializer { template void Serialize(S &s) const { // Serialize nVersion - ::Serialize(s, txTo.nVersion); + int32_t n32bitVersion = txTo.nVersion | (txTo.nType << 16); + ::Serialize(s, n32bitVersion); // Serialize vin unsigned int nInputs = fAnyoneCanPay ? 1 : txTo.vin.size(); ::WriteCompactSize(s, nInputs); @@ -1111,6 +1112,8 @@ class CTransactionSignatureSerializer { SerializeOutput(s, nOutput); // Serialize nLockTime ::Serialize(s, txTo.nLockTime); + if (txTo.nVersion >= 3 && txTo.nType != TRANSACTION_NORMAL) + ::Serialize(s, txTo.vExtraPayload); } }; From d6c5a72e2f725d81d365729a804b55c4834899df Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Tue, 13 Feb 2018 13:33:23 +0100 Subject: [PATCH 061/400] Basic validation of version 3 TXs in CheckTransaction --- src/validation.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/validation.cpp b/src/validation.cpp index c616ce83b7d8..998d800e8970 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -518,6 +518,8 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state, bool fChe // Size limits if (::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION) > MAX_LEGACY_BLOCK_SIZE) return state.DoS(100, false, REJECT_INVALID, "bad-txns-oversize"); + if (tx.vExtraPayload.size() > MAX_TX_EXTRA_PAYLOAD) + return state.DoS(100, false, REJECT_INVALID, "bad-txns-payload-oversize"); // Check for negative or overflow output values CAmount nValueOut = 0; @@ -561,6 +563,20 @@ bool ContextualCheckTransaction(const CTransaction& tx, CValidationState &state, { int nHeight = pindexPrev == NULL ? 0 : pindexPrev->nHeight + 1; bool fDIP0001Active_context = nHeight >= consensusParams.DIP0001Height; + bool fDIP0003Active_context = VersionBitsState(pindexPrev, consensusParams, Consensus::DEPLOYMENT_DIP0003, versionbitscache) == THRESHOLD_ACTIVE; + + if (fDIP0003Active_context) { + // check version 3 transaction types + if (tx.nVersion >= 3) { + if (tx.nType != TRANSACTION_NORMAL) { + return state.DoS(100, false, REJECT_INVALID, "bad-txns-type"); + } + if (tx.IsCoinBase() && tx.nType != TRANSACTION_NORMAL) + return state.DoS(100, false, REJECT_INVALID, "bad-txns-cb-type"); + } else if (tx.nType != TRANSACTION_NORMAL) { + return state.DoS(100, false, REJECT_INVALID, "bad-txns-type"); + } + } // Size limits if (fDIP0001Active_context && ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION) > MAX_STANDARD_TX_SIZE) From cebf71bbc3b5e4206a2c7046a1b84897d4618031 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Tue, 13 Feb 2018 13:34:35 +0100 Subject: [PATCH 062/400] Stubs for special TX validation and processing --- src/Makefile.am | 2 ++ src/evo/specialtx.cpp | 84 +++++++++++++++++++++++++++++++++++++++++++ src/evo/specialtx.h | 19 ++++++++++ src/validation.cpp | 12 +++++++ 4 files changed, 117 insertions(+) create mode 100644 src/evo/specialtx.cpp create mode 100644 src/evo/specialtx.h diff --git a/src/Makefile.am b/src/Makefile.am index b015c2388077..9b4ef09fc5c0 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -106,6 +106,7 @@ BITCOIN_CORE_H = \ core_io.h \ core_memusage.h \ cuckoocache.h \ + evo/specialtx.h \ privatesend.h \ privatesend-client.h \ privatesend-server.h \ @@ -216,6 +217,7 @@ libdash_server_a_SOURCES = \ chain.cpp \ checkpoints.cpp \ dsnotificationinterface.cpp \ + evo/specialtx.cpp \ httprpc.cpp \ httpserver.cpp \ init.cpp \ diff --git a/src/evo/specialtx.cpp b/src/evo/specialtx.cpp new file mode 100644 index 000000000000..f648f7f106be --- /dev/null +++ b/src/evo/specialtx.cpp @@ -0,0 +1,84 @@ +// Copyright (c) 2017 The Dash Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "primitives/transaction.h" +#include "primitives/block.h" +#include "consensus/validation.h" +#include "hash.h" +#include "clientversion.h" +#include "validation.h" +#include "chainparams.h" + +#include "specialtx.h" + +bool CheckSpecialTx(const CTransaction& tx, const CBlockIndex* pindex, CValidationState& state) +{ + AssertLockHeld(cs_main); + + if (tx.nVersion < 3 || tx.nType == TRANSACTION_NORMAL) + return true; + + if (pindex && VersionBitsState(pindex->pprev, Params().GetConsensus(), Consensus::DEPLOYMENT_DIP0003, versionbitscache) != THRESHOLD_ACTIVE) { + return state.DoS(10, false, REJECT_INVALID, "bad-tx-type"); + } + + switch (tx.nType) { + } + + return state.DoS(10, false, REJECT_INVALID, "bad-tx-type"); +} + +bool ProcessSpecialTx(const CTransaction& tx, const CBlockIndex* pindex, CValidationState& state) +{ + if (tx.nVersion < 3 || tx.nType == TRANSACTION_NORMAL) + return true; + + switch (tx.nType) { + } + + return state.DoS(100, false, REJECT_INVALID, "bad-tx-type"); +} + +bool UndoSpecialTx(const CTransaction& tx, const CBlockIndex* pindex) +{ + if (tx.nVersion < 3 || tx.nType == TRANSACTION_NORMAL) + return true; + + switch (tx.nType) { + } + + return false; +} + +bool ProcessSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CValidationState& state) +{ + for (int i = 0; i < (int)block.vtx.size(); i++) { + const CTransaction& tx = *block.vtx[i]; + if (!CheckSpecialTx(tx, pindex, state)) + return false; + if (!ProcessSpecialTx(tx, pindex, state)) + return false; + } + + return true; +} + +bool UndoSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex) +{ + for (int i = (int)block.vtx.size() - 1; i >= 0; --i) { + const CTransaction& tx = *block.vtx[i]; + if (!UndoSpecialTx(tx, pindex)) + return false; + } + return true; +} + +uint256 CalcTxInputsHash(const CTransaction& tx) +{ + CHashWriter hw(CLIENT_VERSION, SER_GETHASH); + for (const auto& in : tx.vin) { + hw << in.prevout; + } + return hw.GetHash(); +} diff --git a/src/evo/specialtx.h b/src/evo/specialtx.h new file mode 100644 index 000000000000..2eaf2c9cc57d --- /dev/null +++ b/src/evo/specialtx.h @@ -0,0 +1,19 @@ +// Copyright (c) 2017 The Dash Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef DASH_SPECIALTX_H +#define DASH_SPECIALTX_H + +class CTransaction; +class CBlock; +class CBlockIndex; +class CValidationState; + +bool CheckSpecialTx(const CTransaction& tx, const CBlockIndex* pindex, CValidationState& state); +bool ProcessSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CValidationState& state); +bool UndoSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex); + +uint256 CalcTxInputsHash(const CTransaction& tx); + +#endif//DASH_SPECIALTX_H diff --git a/src/validation.cpp b/src/validation.cpp index 998d800e8970..315ba19405c6 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -42,6 +42,8 @@ #include "masternodeman.h" #include "masternode-payments.h" +#include "evo/specialtx.h" + #include #include @@ -634,6 +636,9 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C if (!ContextualCheckTransaction(tx, state, Params().GetConsensus(), chainActive.Tip())) return error("%s: ContextualCheckTransaction: %s, %s", __func__, hash.ToString(), FormatStateMessage(state)); + if (!CheckSpecialTx(tx, chainActive.Tip(), state)) + return false; + // Coinbase is only valid in a block, not as a loose transaction if (tx.IsCoinBase()) return state.DoS(100, false, REJECT_INVALID, "coinbase"); @@ -1791,6 +1796,10 @@ static DisconnectResult DisconnectBlock(const CBlock& block, CValidationState& s std::vector > addressUnspentIndex; std::vector > spentIndex; + if (!UndoSpecialTxsInBlock(block, pindex)) { + return DISCONNECT_FAILED; + } + // undo transactions in reverse order for (int i = block.vtx.size() - 1; i >= 0; i--) { const CTransaction &tx = *(block.vtx[i]); @@ -2336,6 +2345,9 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd int64_t nTime3 = GetTimeMicros(); nTimeConnect += nTime3 - nTime2; LogPrint("bench", " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs]\n", (unsigned)block.vtx.size(), 0.001 * (nTime3 - nTime2), 0.001 * (nTime3 - nTime2) / block.vtx.size(), nInputs <= 1 ? 0 : 0.001 * (nTime3 - nTime2) / (nInputs-1), nTimeConnect * 0.000001); + if (!ProcessSpecialTxsInBlock(block, pindex, state)) + return false; + // DASH : MODIFIED TO CHECK MASTERNODE PAYMENTS AND SUPERBLOCKS // It's possible that we simply don't have enough data and this could fail From 61bbe54ab3b0f00712311749c21a8666d5a2dd08 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Wed, 14 Feb 2018 12:05:25 +0100 Subject: [PATCH 063/400] Add Get-/SetTxPayload helpers --- src/evo/specialtx.h | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/evo/specialtx.h b/src/evo/specialtx.h index 2eaf2c9cc57d..903380124bcc 100644 --- a/src/evo/specialtx.h +++ b/src/evo/specialtx.h @@ -5,7 +5,10 @@ #ifndef DASH_SPECIALTX_H #define DASH_SPECIALTX_H -class CTransaction; +#include "streams.h" +#include "version.h" +#include "primitives/transaction.h" + class CBlock; class CBlockIndex; class CValidationState; @@ -14,6 +17,36 @@ bool CheckSpecialTx(const CTransaction& tx, const CBlockIndex* pindex, CValidati bool ProcessSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CValidationState& state); bool UndoSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex); +template +inline bool GetTxPayload(const std::vector& payload, T& obj) +{ + CDataStream ds(payload, SER_NETWORK, PROTOCOL_VERSION); + try { + ds >> obj; + } catch (std::exception& e) { + return false; + } + return ds.empty(); +} +template +inline bool GetTxPayload(const CMutableTransaction& tx, T& obj) +{ + return GetTxPayload(tx.vExtraPayload, obj); +} +template +inline bool GetTxPayload(const CTransaction& tx, T& obj) +{ + return GetTxPayload(tx.vExtraPayload, obj); +} + +template +void SetTxPayload(CMutableTransaction& tx, const T& payload) +{ + CDataStream ds(SER_NETWORK, PROTOCOL_VERSION); + ds << payload; + tx.vExtraPayload.assign(ds.begin(), ds.end()); +} + uint256 CalcTxInputsHash(const CTransaction& tx); #endif//DASH_SPECIALTX_H From b606bde9a99a26e8bf8b5eb33376043b00a973f1 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Fri, 23 Feb 2018 11:37:14 +0100 Subject: [PATCH 064/400] Support version 3 transaction serialization in mininode.py --- qa/rpc-tests/test_framework/mininode.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/qa/rpc-tests/test_framework/mininode.py b/qa/rpc-tests/test_framework/mininode.py index 668326286f02..d2fd22718d64 100755 --- a/qa/rpc-tests/test_framework/mininode.py +++ b/qa/rpc-tests/test_framework/mininode.py @@ -357,33 +357,44 @@ class CTransaction(object): def __init__(self, tx=None): if tx is None: self.nVersion = 1 + self.nType = 0 self.vin = [] self.vout = [] self.nLockTime = 0 + self.vExtraPayload = None self.sha256 = None self.hash = None else: self.nVersion = tx.nVersion + self.nType = tx.nType self.vin = copy.deepcopy(tx.vin) self.vout = copy.deepcopy(tx.vout) self.nLockTime = tx.nLockTime + self.vExtraPayload = tx.vExtraPayload self.sha256 = tx.sha256 self.hash = tx.hash def deserialize(self, f): - self.nVersion = struct.unpack("> 16) & 0xffff self.vin = deser_vector(f, CTxIn) self.vout = deser_vector(f, CTxOut) self.nLockTime = struct.unpack(" Date: Wed, 28 Feb 2018 10:10:36 +0100 Subject: [PATCH 065/400] Account for extraPayload when calculating fees in FundTransaction --- src/wallet/wallet.cpp | 13 +++++++++++-- src/wallet/wallet.h | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 6ae8b8b2499b..85c9ac1dd5d7 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2962,9 +2962,13 @@ bool CWallet::FundTransaction(CMutableTransaction& tx, CAmount& nFeeRet, bool ov BOOST_FOREACH(const CTxIn& txin, tx.vin) coinControl.Select(txin.prevout); + int nExtraPayloadSize = 0; + if (tx.nVersion >= 3 && tx.nType != TRANSACTION_NORMAL) + nExtraPayloadSize = (int)tx.vExtraPayload.size(); + CReserveKey reservekey(this); CWalletTx wtx; - if (!CreateTransaction(vecSend, wtx, reservekey, nFeeRet, nChangePosInOut, strFailReason, &coinControl, false)) + if (!CreateTransaction(vecSend, wtx, reservekey, nFeeRet, nChangePosInOut, strFailReason, &coinControl, false, ALL_COINS, false, nExtraPayloadSize)) return false; if (nChangePosInOut != -1) @@ -3403,7 +3407,7 @@ bool CWallet::ConvertList(std::vector vecTxIn, std::vector& vecA } bool CWallet::CreateTransaction(const std::vector& vecSend, CWalletTx& wtxNew, CReserveKey& reservekey, CAmount& nFeeRet, - int& nChangePosInOut, std::string& strFailReason, const CCoinControl* coinControl, bool sign, AvailableCoinsType nCoinType, bool fUseInstantSend) + int& nChangePosInOut, std::string& strFailReason, const CCoinControl* coinControl, bool sign, AvailableCoinsType nCoinType, bool fUseInstantSend, int nExtraPayloadSize) { CAmount nFeePay = fUseInstantSend ? CTxLockRequest().GetMinFee() : 0; @@ -3705,6 +3709,11 @@ bool CWallet::CreateTransaction(const std::vector& vecSend, CWalletT unsigned int nBytes = ::GetSerializeSize(txNew, SER_NETWORK, PROTOCOL_VERSION); + if (nExtraPayloadSize != 0) { + // account for extra payload in fee calculation + nBytes += GetSizeOfCompactSize(nExtraPayloadSize) + nExtraPayloadSize; + } + if (nBytes > MAX_STANDARD_TX_SIZE) { // Do not create oversized transactions (bad-txns-oversize). strFailReason = _("Transaction too large"); diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 3f443332f685..2fe6be7314af 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -936,7 +936,7 @@ class CWallet : public CCryptoKeyStore, public CValidationInterface * @note passing nChangePosInOut as -1 will result in setting a random position */ bool CreateTransaction(const std::vector& vecSend, CWalletTx& wtxNew, CReserveKey& reservekey, CAmount& nFeeRet, int& nChangePosInOut, - std::string& strFailReason, const CCoinControl *coinControl = NULL, bool sign = true, AvailableCoinsType nCoinType=ALL_COINS, bool fUseInstantSend=false); + std::string& strFailReason, const CCoinControl *coinControl = NULL, bool sign = true, AvailableCoinsType nCoinType=ALL_COINS, bool fUseInstantSend=false, int nExtraPayloadSize = 0); bool CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey, CConnman* connman, CValidationState& state, const std::string& strCommand="tx"); bool CreateCollateralTransaction(CMutableTransaction& txCollateral, std::string& strReason); From fb4d301a2069b3d90c5138bc4d12e40bd250c91d Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Tue, 28 Aug 2018 15:45:29 +0200 Subject: [PATCH 066/400] Add extraPayloadSize/extraPayload fields to RPC help --- src/rpc/rawtransaction.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/rpc/rawtransaction.cpp b/src/rpc/rawtransaction.cpp index 0c02ce00ff14..283afacf89e3 100644 --- a/src/rpc/rawtransaction.cpp +++ b/src/rpc/rawtransaction.cpp @@ -202,6 +202,8 @@ UniValue getrawtransaction(const JSONRPCRequest& request) " }\n" " ,...\n" " ],\n" + " \"extraPayloadSize\" : n (numeric) Size of DIP2 extra payload. Only present if it's a special TX\n" + " \"extraPayload\" : \"hex\" (string) Hex encoded DIP2 extra payload data. Only present if it's a special TX\n" " \"blockhash\" : \"hash\", (string) the block hash\n" " \"confirmations\" : n, (numeric) The confirmations\n" " \"time\" : ttt, (numeric) The transaction time in seconds since epoch (Jan 1 1970 GMT)\n" @@ -537,6 +539,8 @@ UniValue decoderawtransaction(const JSONRPCRequest& request) " }\n" " ,...\n" " ],\n" + " \"extraPayloadSize\" : n (numeric) Size of DIP2 extra payload. Only present if it's a special TX\n" + " \"extraPayload\" : \"hex\" (string) Hex encoded DIP2 extra payload data. Only present if it's a special TX\n" "}\n" "\nExamples:\n" From 40eee1775fc711d9e049bdc33e1f1aee9e413e73 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Wed, 29 Aug 2018 13:02:54 +0300 Subject: [PATCH 067/400] Fix sync in regtest (again) (#2241) Should only call SwitchToNextAsset() while being in specific state and not on every tick --- src/masternode-sync.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/masternode-sync.cpp b/src/masternode-sync.cpp index 272a31da387c..e9ecf8ebde66 100644 --- a/src/masternode-sync.cpp +++ b/src/masternode-sync.cpp @@ -186,8 +186,10 @@ void CMasternodeSync::ProcessTick(CConnman& connman) { if (nRequestedMasternodeAssets == MASTERNODE_SYNC_WAITING) { connman.PushMessage(pnode, msgMaker.Make(NetMsgType::GETSPORKS)); //get current network sporks + SwitchToNextAsset(connman); } else if (nRequestedMasternodeAssets == MASTERNODE_SYNC_LIST) { mnodeman.DsegUpdate(pnode, connman); + SwitchToNextAsset(connman); } else if (nRequestedMasternodeAssets == MASTERNODE_SYNC_MNW) { //sync payment votes if(pnode->nVersion == 70208) { @@ -195,10 +197,11 @@ void CMasternodeSync::ProcessTick(CConnman& connman) } else { connman.PushMessage(pnode, msgMaker.Make(NetMsgType::MASTERNODEPAYMENTSYNC)); //sync payment votes } + SwitchToNextAsset(connman); } else if (nRequestedMasternodeAssets == MASTERNODE_SYNC_GOVERNANCE) { SendGovernanceSyncRequest(pnode, connman); + SwitchToNextAsset(connman); } - SwitchToNextAsset(connman); connman.ReleaseNodeVector(vNodesCopy); return; } From 799e3c3126f42db17cf5160641498665690c51e0 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Wed, 29 Aug 2018 12:03:18 +0200 Subject: [PATCH 068/400] Perform Jenkins builds in /dash-src all the time to fix caching issues (#2242) --- Jenkinsfile | 70 +++++++++++++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 237332da361c..a27dae758be4 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -25,29 +25,9 @@ for(int i = 0; i < targets.size(); i++) { def UID = sh(returnStdout: true, script: 'id -u').trim() def HOME = sh(returnStdout: true, script: 'echo $HOME').trim() def pwd = sh(returnStdout: true, script: 'pwd').trim() - def hasCache = false checkout scm - // restore cache - try { - copyArtifacts(projectName: "dashpay-dash/${BRANCH_NAME}", optional: true, selector: lastSuccessful(), filter: "ci-cache-${target}.tar.gz") - } catch (Exception e) { - } - if (fileExists("ci-cache-${target}.tar.gz")) { - hasCache = true - echo "Using cache from dashpay-dash/${BRANCH_NAME}" - } else { - try { - copyArtifacts(projectName: 'dashpay-dash/develop', optional: true, selector: lastSuccessful(), filter: "ci-cache-${target}.tar.gz"); - } catch (Exception e) { - } - if (fileExists("ci-cache-${target}.tar.gz")) { - hasCache = true - echo "Using cache from dashpay-dash/develop" - } - } - def env = [ "BUILD_TARGET=${target}", "PULL_REQUEST=false", @@ -61,29 +41,55 @@ for(int i = 0; i < targets.size(); i++) { builderImage = docker.build("${builderImageName}", "--build-arg BUILD_TARGET=${target} ci -f ci/Dockerfile.builder") } - if (hasCache) { - sh "cd ${pwd} && tar xzfv ci-cache-${target}.tar.gz" - } else { - sh "mkdir -p ${pwd}/ci-cache-${target}" - } - builderImage.inside("-t") { + // copy source into fixed path + // we must build under the same path everytime as otherwise caches won't work properly + sh "cp -ra ${pwd}/. /dash-src/" + + // restore cache + def hasCache = false + try { + copyArtifacts(projectName: "dashpay-dash/${BRANCH_NAME}", optional: true, selector: lastSuccessful(), filter: "ci-cache-${target}.tar.gz") + } catch (Exception e) { + } + if (fileExists("ci-cache-${target}.tar.gz")) { + hasCache = true + echo "Using cache from dashpay-dash/${BRANCH_NAME}" + } else { + try { + copyArtifacts(projectName: 'dashpay-dash/develop', optional: true, selector: lastSuccessful(), filter: "ci-cache-${target}.tar.gz"); + } catch (Exception e) { + } + if (fileExists("ci-cache-${target}.tar.gz")) { + hasCache = true + echo "Using cache from dashpay-dash/develop" + } + } + + if (hasCache) { + sh "cd /dash-src && tar xzf ${pwd}/ci-cache-${target}.tar.gz" + } else { + sh "mkdir -p /dash-src/ci-cache-${target}" + } + stage("${target}/depends") { - sh './ci/build_depends.sh' + sh 'cd /dash-src && ./ci/build_depends.sh' } stage("${target}/build") { - sh './ci/build_src.sh' + sh 'cd /dash-src && ./ci/build_src.sh' } stage("${target}/test") { - sh './ci/test_unittests.sh' + sh 'cd /dash-src && ./ci/test_unittests.sh' } stage("${target}/test") { - sh './ci/test_integrationtests.sh' + sh 'cd /dash-src && ./ci/test_integrationtests.sh' } + + // archive cache and copy it into the jenkins workspace + sh "cd /dash-src && tar czfv ci-cache-${target}.tar.gz ci-cache-${target} && cp ci-cache-${target}.tar.gz ${pwd}/" } - // archive cache - sh "tar czfv ci-cache-${target}.tar.gz ci-cache-${target}" + // upload cache archiveArtifacts artifacts: "ci-cache-${target}.tar.gz", fingerprint: true } } From 1c256580445881c7084367e5b6da5a70cae8a1ea Mon Sep 17 00:00:00 2001 From: gladcow Date: Wed, 29 Aug 2018 14:36:35 +0300 Subject: [PATCH 069/400] Refactor `masternode` and `gobject` RPCs to support `help command subCommand` syntax (#2240) * Support help for masternode rpc call subcommands * Support help for gobject rpc call subcommands * squash ifs for conditions to show help * remove code duplication for masternode list and masternodelist help calls --- src/rpc/governance.cpp | 1285 +++++++++++++++++++++++----------------- src/rpc/masternode.cpp | 901 ++++++++++++++++++---------- 2 files changed, 1332 insertions(+), 854 deletions(-) diff --git a/src/rpc/governance.cpp b/src/rpc/governance.cpp index d9248859d5c0..536ac551d4f6 100644 --- a/src/rpc/governance.cpp +++ b/src/rpc/governance.cpp @@ -26,358 +26,449 @@ bool EnsureWalletIsAvailable(bool avoidException); -UniValue gobject(const JSONRPCRequest& request) +void gobject_count_help() { - std::string strCommand; - if (request.params.size() >= 1) - strCommand = request.params[0].get_str(); - - if (request.fHelp || - ( -#ifdef ENABLE_WALLET - strCommand != "prepare" && -#endif // ENABLE_WALLET - strCommand != "vote-many" && strCommand != "vote-conf" && strCommand != "vote-alias" && strCommand != "submit" && strCommand != "count" && - strCommand != "deserialize" && strCommand != "get" && strCommand != "getvotes" && strCommand != "getcurrentvotes" && strCommand != "list" && strCommand != "diff" && - strCommand != "check" )) - throw std::runtime_error( - "gobject \"command\"...\n" - "Manage governance objects\n" - "\nAvailable commands:\n" - " check - Validate governance object data (proposal only)\n" -#ifdef ENABLE_WALLET - " prepare - Prepare governance object by signing and creating tx\n" -#endif // ENABLE_WALLET - " submit - Submit governance object to network\n" - " deserialize - Deserialize governance object from hex string to JSON\n" - " count - Count governance objects and votes (additional param: 'json' or 'all', default: 'json')\n" - " get - Get governance object by hash\n" - " getvotes - Get all votes for a governance object hash (including old votes)\n" - " getcurrentvotes - Get only current (tallying) votes for a governance object hash (does not include old votes)\n" - " list - List governance objects (can be filtered by signal and/or object type)\n" - " diff - List differences since last diff\n" - " vote-alias - Vote on a governance object by masternode alias (using masternode.conf setup)\n" - " vote-conf - Vote on a governance object by masternode configured in dash.conf\n" - " vote-many - Vote on a governance object by all masternodes (using masternode.conf setup)\n" + throw std::runtime_error( + "gobject count (\"mode\")\n" + "Count governance objects and votes\n" + "\nArguments:\n" + "1. \"mode\" (string, optional, default: \"json\") Output format: json (\"json\") or string in free form (\"all\")\n" ); +} +UniValue gobject_count(const JSONRPCRequest& request) +{ + if (request.fHelp || request.params.size() > 2) + gobject_count_help(); - if(strCommand == "count") { - std::string strMode{"json"}; + std::string strMode{"json"}; - if (request.params.size() == 2) { - strMode = request.params[1].get_str(); - } + if (request.params.size() == 2) { + strMode = request.params[1].get_str(); + } - if (request.params.size() > 2 || (strMode != "json" && strMode != "all")) { - throw JSONRPCError(RPC_INVALID_PARAMETER, "Correct usage is 'gobject count ( \"json\"|\"all\" )'"); - } + if (strMode != "json" && strMode != "all") + gobject_count_help(); - return strMode == "json" ? governance.ToJson() : governance.ToString(); - } - /* - ------ Example Governance Item ------ + return strMode == "json" ? governance.ToJson() : governance.ToString(); +} - gobject submit 6e622bb41bad1fb18e7f23ae96770aeb33129e18bd9efe790522488e580a0a03 0 1 1464292854 "beer-reimbursement" 5b5b22636f6e7472616374222c207b2270726f6a6563745f6e616d65223a20225c22626565722d7265696d62757273656d656e745c22222c20227061796d656e745f61646472657373223a20225c225879324c4b4a4a64655178657948726e34744744514238626a6876464564615576375c22222c2022656e645f64617465223a202231343936333030343030222c20226465736372697074696f6e5f75726c223a20225c227777772e646173687768616c652e6f72672f702f626565722d7265696d62757273656d656e745c22222c2022636f6e74726163745f75726c223a20225c22626565722d7265696d62757273656d656e742e636f6d2f3030312e7064665c22222c20227061796d656e745f616d6f756e74223a20223233342e323334323232222c2022676f7665726e616e63655f6f626a6563745f6964223a2037342c202273746172745f64617465223a202231343833323534303030227d5d5d1 - */ +void gobject_deserialize_help() +{ + throw std::runtime_error( + "gobject deserialize \"hex_data\"\n" + "Deserialize governance object from hex string to JSON\n" + "\nArguments:\n" + "1. \"hex_data\" (string, required) data in hex string form\n" + ); +} - // DEBUG : TEST DESERIALIZATION OF GOVERNANCE META DATA - if(strCommand == "deserialize") - { - if (request.params.size() != 2) { - throw JSONRPCError(RPC_INVALID_PARAMETER, "Correct usage is 'gobject deserialize '"); - } +UniValue gobject_deserialize(const JSONRPCRequest& request) +{ + if (request.fHelp || request.params.size() != 2) + gobject_deserialize_help(); - std::string strHex = request.params[1].get_str(); + std::string strHex = request.params[1].get_str(); - std::vector v = ParseHex(strHex); - std::string s(v.begin(), v.end()); + std::vector v = ParseHex(strHex); + std::string s(v.begin(), v.end()); - UniValue u(UniValue::VOBJ); - u.read(s); + UniValue u(UniValue::VOBJ); + u.read(s); - return u.write().c_str(); - } + return u.write().c_str(); +} - // VALIDATE A GOVERNANCE OBJECT PRIOR TO SUBMISSION - if(strCommand == "check") - { - if (request.params.size() != 2) { - throw JSONRPCError(RPC_INVALID_PARAMETER, "Correct usage is 'gobject check '"); - } +void gobject_check_help() +{ + throw std::runtime_error( + "gobject check \"hex_data\"\n" + "Validate governance object data (proposal only)\n" + "\nArguments:\n" + "1. \"hex_data\" (string, required) data in hex string form\n" + ); +} - // ASSEMBLE NEW GOVERNANCE OBJECT FROM USER PARAMETERS +UniValue gobject_check(const JSONRPCRequest& request) +{ + if (request.fHelp || request.params.size() != 2) + gobject_check_help(); - uint256 hashParent; + // ASSEMBLE NEW GOVERNANCE OBJECT FROM USER PARAMETERS - int nRevision = 1; + uint256 hashParent; - int64_t nTime = GetAdjustedTime(); - std::string strDataHex = request.params[1].get_str(); + int nRevision = 1; - CGovernanceObject govobj(hashParent, nRevision, nTime, uint256(), strDataHex); + int64_t nTime = GetAdjustedTime(); + std::string strDataHex = request.params[1].get_str(); - if(govobj.GetObjectType() == GOVERNANCE_OBJECT_PROPOSAL) { - CProposalValidator validator(strDataHex); - if(!validator.Validate()) { - throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid proposal data, error messages:" + validator.GetErrorMessages()); - } - } - else { - throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid object type, only proposals can be validated"); + CGovernanceObject govobj(hashParent, nRevision, nTime, uint256(), strDataHex); + + if(govobj.GetObjectType() == GOVERNANCE_OBJECT_PROPOSAL) { + CProposalValidator validator(strDataHex); + if(!validator.Validate()) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid proposal data, error messages:" + validator.GetErrorMessages()); } + } + else { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid object type, only proposals can be validated"); + } - UniValue objResult(UniValue::VOBJ); + UniValue objResult(UniValue::VOBJ); - objResult.push_back(Pair("Object status", "OK")); + objResult.push_back(Pair("Object status", "OK")); - return objResult; - } + return objResult; +} #ifdef ENABLE_WALLET - // PREPARE THE GOVERNANCE OBJECT BY CREATING A COLLATERAL TRANSACTION - if(strCommand == "prepare") - { - if (!EnsureWalletIsAvailable(request.fHelp)) - return NullUniValue; - - if (request.params.size() != 5) { - throw JSONRPCError(RPC_INVALID_PARAMETER, "Correct usage is 'gobject prepare