// Copyright (c) 2011-2016 The Cryptonote developers // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #pragma once #include "INode.h" #include "ITransaction.h" #include "CryptoNoteProtocol/ICryptoNoteProtocolQuery.h" #include "CryptoNoteProtocol/ICryptoNoteProtocolObserver.h" #include "CryptoNoteCore/ICore.h" #include "CryptoNoteCore/ICoreObserver.h" #include "Common/ObserverManager.h" #include "BlockchainExplorer/BlockchainExplorerDataBuilder.h" #include #include namespace CryptoNote { class core; class InProcessNode : public INode, public CryptoNote::ICryptoNoteProtocolObserver, public CryptoNote::ICoreObserver { public: InProcessNode(CryptoNote::ICore& core, CryptoNote::ICryptoNoteProtocolQuery& protocol); InProcessNode(const InProcessNode&) = delete; InProcessNode(InProcessNode&&) = delete; InProcessNode& operator=(const InProcessNode&) = delete; InProcessNode& operator=(InProcessNode&&) = delete; virtual ~InProcessNode(); virtual void init(const Callback& callback) override; virtual bool shutdown() override; virtual bool addObserver(INodeObserver* observer) override; virtual bool removeObserver(INodeObserver* observer) override; virtual size_t getPeerCount() const override; virtual uint32_t getLastLocalBlockHeight() const override; virtual uint32_t getLastKnownBlockHeight() const override; virtual uint32_t getLocalBlockCount() const override; virtual uint32_t getKnownBlockCount() const override; virtual uint64_t getLastLocalBlockTimestamp() const override; virtual void getNewBlocks(std::vector&& knownBlockIds, std::vector& newBlocks, uint32_t& startHeight, const Callback& callback) override; virtual void getTransactionOutsGlobalIndices(const Crypto::Hash& transactionHash, std::vector& outsGlobalIndices, const Callback& callback) override; virtual void getRandomOutsByAmounts(std::vector&& amounts, uint64_t outsCount, std::vector& result, const Callback& callback) override; virtual void relayTransaction(const CryptoNote::Transaction& transaction, const Callback& callback) override; virtual void queryBlocks(std::vector&& knownBlockIds, uint64_t timestamp, std::vector& newBlocks, uint32_t& startHeight, const Callback& callback) override; virtual void getPoolSymmetricDifference(std::vector&& knownPoolTxIds, Crypto::Hash knownBlockId, bool& isBcActual, std::vector>& newTxs, std::vector& deletedTxIds, const Callback& callback) override; virtual void getMultisignatureOutputByGlobalIndex(uint64_t amount, uint32_t gindex, MultisignatureOutput& out, const Callback& callback) override; virtual void getBlocks(const std::vector& blockHeights, std::vector>& blocks, const Callback& callback) override; virtual void getBlocks(const std::vector& blockHashes, std::vector& blocks, const Callback& callback) override; virtual void getBlocks(uint64_t timestampBegin, uint64_t timestampEnd, uint32_t blocksNumberLimit, std::vector& blocks, uint32_t& blocksNumberWithinTimestamps, const Callback& callback) override; virtual void getTransactions(const std::vector& transactionHashes, std::vector& transactions, const Callback& callback) override; virtual void getTransactionsByPaymentId(const Crypto::Hash& paymentId, std::vector& transactions, const Callback& callback) override; virtual void getPoolTransactions(uint64_t timestampBegin, uint64_t timestampEnd, uint32_t transactionsNumberLimit, std::vector& transactions, uint64_t& transactionsNumberWithinTimestamps, const Callback& callback) override; virtual void isSynchronized(bool& syncStatus, const Callback& callback) override; private: virtual void peerCountUpdated(size_t count) override; virtual void lastKnownBlockHeightUpdated(uint32_t height) override; virtual void blockchainSynchronized(uint32_t topHeight) override; virtual void blockchainUpdated() override; virtual void poolUpdated() override; void getNewBlocksAsync(std::vector& knownBlockIds, std::vector& newBlocks, uint32_t& startHeight, const Callback& callback); std::error_code doGetNewBlocks(std::vector&& knownBlockIds, std::vector& newBlocks, uint32_t& startHeight); void getTransactionOutsGlobalIndicesAsync(const Crypto::Hash& transactionHash, std::vector& outsGlobalIndices, const Callback& callback); std::error_code doGetTransactionOutsGlobalIndices(const Crypto::Hash& transactionHash, std::vector& outsGlobalIndices); void getRandomOutsByAmountsAsync(std::vector& amounts, uint64_t outsCount, std::vector& result, const Callback& callback); std::error_code doGetRandomOutsByAmounts(std::vector&& amounts, uint64_t outsCount, std::vector& result); void relayTransactionAsync(const CryptoNote::Transaction& transaction, const Callback& callback); std::error_code doRelayTransaction(const CryptoNote::Transaction& transaction); void queryBlocksLiteAsync(std::vector& knownBlockIds, uint64_t timestamp, std::vector& newBlocks, uint32_t& startHeight, const Callback& callback); std::error_code doQueryBlocksLite(std::vector&& knownBlockIds, uint64_t timestamp, std::vector& newBlocks, uint32_t& startHeight); void getPoolSymmetricDifferenceAsync(std::vector&& knownPoolTxIds, Crypto::Hash knownBlockId, bool& isBcActual, std::vector>& newTxs, std::vector& deletedTxIds, const Callback& callback); void getOutByMSigGIndexAsync(uint64_t amount, uint32_t gindex, MultisignatureOutput& out, const Callback& callback); void getBlocksAsync(const std::vector& blockHeights, std::vector>& blocks, const Callback& callback); std::error_code doGetBlocks(const std::vector& blockHeights, std::vector>& blocks); void getBlocksAsync(const std::vector& blockHashes, std::vector& blocks, const Callback& callback); std::error_code doGetBlocks(const std::vector& blockHashes, std::vector& blocks); void getBlocksAsync(uint64_t timestampBegin, uint64_t timestampEnd, uint32_t blocksNumberLimit, std::vector& blocks, uint32_t& blocksNumberWithinTimestamps, const Callback& callback); std::error_code doGetBlocks(uint64_t timestampBegin, uint64_t timestampEnd, uint32_t blocksNumberLimit, std::vector& blocks, uint32_t& blocksNumberWithinTimestamps); void getTransactionsAsync(const std::vector& transactionHashes, std::vector& transactions, const Callback& callback); std::error_code doGetTransactions(const std::vector& transactionHashes, std::vector& transactions); void getPoolTransactionsAsync(uint64_t timestampBegin, uint64_t timestampEnd, uint32_t transactionsNumberLimit, std::vector& transactions, uint64_t& transactionsNumberWithinTimestamps, const Callback& callback); std::error_code doGetPoolTransactions(uint64_t timestampBegin, uint64_t timestampEnd, uint32_t transactionsNumberLimit, std::vector& transactions, uint64_t& transactionsNumberWithinTimestamps); void getTransactionsByPaymentIdAsync(const Crypto::Hash& paymentId, std::vector& transactions, const Callback& callback); std::error_code doGetTransactionsByPaymentId(const Crypto::Hash& paymentId, std::vector& transactions); void isSynchronizedAsync(bool& syncStatus, const Callback& callback); std::error_code doIsSynchronized(bool& syncStatus); void workerFunc(); bool doShutdown(); enum State { NOT_INITIALIZED, INITIALIZED }; State state; CryptoNote::ICore& core; CryptoNote::ICryptoNoteProtocolQuery& protocol; Tools::ObserverManager observerManager; boost::asio::io_service ioService; std::unique_ptr workerThread; std::unique_ptr work; BlockchainExplorerDataBuilder blockchainExplorerDataBuilder; mutable std::mutex mutex; }; } //namespace CryptoNote