mirror of
https://github.com/dashpay/dash.git
synced 2024-12-29 05:49:11 +01:00
df6d458b85
* Remove orphan state wipe from UnloadBlockIndex.
As orphan state is now "network state", like in
d6ea737be1
,
UnloadBlockIndex is only used during init if we end up reindexing
to clear our block state so that we can start over. However, at
that time no connections have been brought up as CConnman hasn't
been started yet, so all of the network processing state logic is
empty when its called.
* Move network-msg-processing code out of main to its own file
* Rename the remaining main.{h,cpp} to validation.{h,cpp}
182 lines
5.3 KiB
C++
182 lines
5.3 KiB
C++
// 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.
|
|
|
|
#include "zmqnotificationinterface.h"
|
|
#include "zmqpublishnotifier.h"
|
|
|
|
#include "version.h"
|
|
#include "validation.h"
|
|
#include "streams.h"
|
|
#include "util.h"
|
|
|
|
void zmqError(const char *str)
|
|
{
|
|
LogPrint("zmq", "zmq: Error: %s, errno=%s\n", str, zmq_strerror(errno));
|
|
}
|
|
|
|
CZMQNotificationInterface::CZMQNotificationInterface() : pcontext(NULL)
|
|
{
|
|
}
|
|
|
|
CZMQNotificationInterface::~CZMQNotificationInterface()
|
|
{
|
|
Shutdown();
|
|
|
|
for (std::list<CZMQAbstractNotifier*>::iterator i=notifiers.begin(); i!=notifiers.end(); ++i)
|
|
{
|
|
delete *i;
|
|
}
|
|
}
|
|
|
|
CZMQNotificationInterface* CZMQNotificationInterface::CreateWithArguments(const std::map<std::string, std::string> &args)
|
|
{
|
|
CZMQNotificationInterface* notificationInterface = NULL;
|
|
std::map<std::string, CZMQNotifierFactory> factories;
|
|
std::list<CZMQAbstractNotifier*> notifiers;
|
|
|
|
factories["pubhashblock"] = CZMQAbstractNotifier::Create<CZMQPublishHashBlockNotifier>;
|
|
factories["pubhashtx"] = CZMQAbstractNotifier::Create<CZMQPublishHashTransactionNotifier>;
|
|
factories["pubhashtxlock"] = CZMQAbstractNotifier::Create<CZMQPublishHashTransactionLockNotifier>;
|
|
factories["pubrawblock"] = CZMQAbstractNotifier::Create<CZMQPublishRawBlockNotifier>;
|
|
factories["pubrawtx"] = CZMQAbstractNotifier::Create<CZMQPublishRawTransactionNotifier>;
|
|
factories["pubrawtxlock"] = CZMQAbstractNotifier::Create<CZMQPublishRawTransactionLockNotifier>;
|
|
|
|
for (std::map<std::string, CZMQNotifierFactory>::const_iterator i=factories.begin(); i!=factories.end(); ++i)
|
|
{
|
|
std::map<std::string, std::string>::const_iterator j = args.find("-zmq" + i->first);
|
|
if (j!=args.end())
|
|
{
|
|
CZMQNotifierFactory factory = i->second;
|
|
std::string address = j->second;
|
|
CZMQAbstractNotifier *notifier = factory();
|
|
notifier->SetType(i->first);
|
|
notifier->SetAddress(address);
|
|
notifiers.push_back(notifier);
|
|
}
|
|
}
|
|
|
|
if (!notifiers.empty())
|
|
{
|
|
notificationInterface = new CZMQNotificationInterface();
|
|
notificationInterface->notifiers = notifiers;
|
|
|
|
if (!notificationInterface->Initialize())
|
|
{
|
|
delete notificationInterface;
|
|
notificationInterface = NULL;
|
|
}
|
|
}
|
|
|
|
return notificationInterface;
|
|
}
|
|
|
|
// Called at startup to conditionally set up ZMQ socket(s)
|
|
bool CZMQNotificationInterface::Initialize()
|
|
{
|
|
LogPrint("zmq", "zmq: Initialize notification interface\n");
|
|
assert(!pcontext);
|
|
|
|
pcontext = zmq_init(1);
|
|
|
|
if (!pcontext)
|
|
{
|
|
zmqError("Unable to initialize context");
|
|
return false;
|
|
}
|
|
|
|
std::list<CZMQAbstractNotifier*>::iterator i=notifiers.begin();
|
|
for (; i!=notifiers.end(); ++i)
|
|
{
|
|
CZMQAbstractNotifier *notifier = *i;
|
|
if (notifier->Initialize(pcontext))
|
|
{
|
|
LogPrint("zmq", " Notifier %s ready (address = %s)\n", notifier->GetType(), notifier->GetAddress());
|
|
}
|
|
else
|
|
{
|
|
LogPrint("zmq", " Notifier %s failed (address = %s)\n", notifier->GetType(), notifier->GetAddress());
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (i!=notifiers.end())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// Called during shutdown sequence
|
|
void CZMQNotificationInterface::Shutdown()
|
|
{
|
|
LogPrint("zmq", "zmq: Shutdown notification interface\n");
|
|
if (pcontext)
|
|
{
|
|
for (std::list<CZMQAbstractNotifier*>::iterator i=notifiers.begin(); i!=notifiers.end(); ++i)
|
|
{
|
|
CZMQAbstractNotifier *notifier = *i;
|
|
LogPrint("zmq", " Shutdown notifier %s at %s\n", notifier->GetType(), notifier->GetAddress());
|
|
notifier->Shutdown();
|
|
}
|
|
zmq_ctx_destroy(pcontext);
|
|
|
|
pcontext = 0;
|
|
}
|
|
}
|
|
|
|
void CZMQNotificationInterface::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload)
|
|
{
|
|
if (fInitialDownload || pindexNew == pindexFork) // In IBD or blocks were disconnected without any new ones
|
|
return;
|
|
|
|
for (std::list<CZMQAbstractNotifier*>::iterator i = notifiers.begin(); i!=notifiers.end(); )
|
|
{
|
|
CZMQAbstractNotifier *notifier = *i;
|
|
if (notifier->NotifyBlock(pindexNew))
|
|
{
|
|
i++;
|
|
}
|
|
else
|
|
{
|
|
notifier->Shutdown();
|
|
i = notifiers.erase(i);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CZMQNotificationInterface::SyncTransaction(const CTransaction &tx, const CBlock *pblock)
|
|
{
|
|
for (std::list<CZMQAbstractNotifier*>::iterator i = notifiers.begin(); i!=notifiers.end(); )
|
|
{
|
|
CZMQAbstractNotifier *notifier = *i;
|
|
if (notifier->NotifyTransaction(tx))
|
|
{
|
|
i++;
|
|
}
|
|
else
|
|
{
|
|
notifier->Shutdown();
|
|
i = notifiers.erase(i);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CZMQNotificationInterface::NotifyTransactionLock(const CTransaction &tx)
|
|
{
|
|
for (std::list<CZMQAbstractNotifier*>::iterator i = notifiers.begin(); i!=notifiers.end(); )
|
|
{
|
|
CZMQAbstractNotifier *notifier = *i;
|
|
if (notifier->NotifyTransactionLock(tx))
|
|
{
|
|
i++;
|
|
}
|
|
else
|
|
{
|
|
notifier->Shutdown();
|
|
i = notifiers.erase(i);
|
|
}
|
|
}
|
|
}
|