danicoin/src/Transfers/TransfersConsumer.h

81 lines
3.2 KiB
C
Raw Normal View History

// 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 "IBlockchainSynchronizer.h"
#include "ITransfersSynchronizer.h"
#include "TransfersSubscription.h"
#include "TypeHelpers.h"
#include "crypto/crypto.h"
#include "IObservableImpl.h"
#include <unordered_set>
namespace CryptoNote {
class INode;
2015-12-09 13:19:03 +00:00
class TransfersConsumer: public IObservableImpl<IBlockchainConsumerObserver, IBlockchainConsumer> {
public:
2015-07-30 15:22:07 +00:00
TransfersConsumer(const CryptoNote::Currency& currency, INode& node, const Crypto::SecretKey& viewSecret);
ITransfersSubscription& addSubscription(const AccountSubscription& subscription);
// returns true if no subscribers left
2015-07-30 15:22:07 +00:00
bool removeSubscription(const AccountPublicAddress& address);
ITransfersSubscription* getSubscription(const AccountPublicAddress& acc);
void getSubscriptions(std::vector<AccountPublicAddress>& subscriptions);
2015-12-09 13:19:03 +00:00
void initTransactionPool(const std::unordered_set<Crypto::Hash>& uncommitedTransactions);
// IBlockchainConsumer
virtual SynchronizationStart getSyncStart() override;
2015-07-30 15:22:07 +00:00
virtual void onBlockchainDetach(uint32_t height) override;
virtual bool onNewBlocks(const CompleteBlock* blocks, uint32_t startHeight, uint32_t count) override;
virtual std::error_code onPoolUpdated(const std::vector<std::unique_ptr<ITransactionReader>>& addedTransactions, const std::vector<Crypto::Hash>& deletedTransactions) override;
2015-12-09 13:19:03 +00:00
virtual const std::unordered_set<Crypto::Hash>& getKnownPoolTxIds() const override;
virtual std::error_code addUnconfirmedTransaction(const ITransactionReader& transaction) override;
virtual void removeUnconfirmedTransaction(const Crypto::Hash& transactionHash) override;
private:
template <typename F>
void forEachSubscription(F action) {
for (const auto& kv : m_subscriptions) {
action(*kv.second);
}
}
struct PreprocessInfo {
2015-07-30 15:22:07 +00:00
std::unordered_map<Crypto::PublicKey, std::vector<TransactionOutputInformationIn>> outputs;
std::vector<uint32_t> globalIdxs;
};
2015-08-11 14:33:19 +00:00
std::error_code preprocessOutputs(const TransactionBlockInfo& blockInfo, const ITransactionReader& tx, PreprocessInfo& info);
std::error_code processTransaction(const TransactionBlockInfo& blockInfo, const ITransactionReader& tx);
2015-12-09 13:19:03 +00:00
void processTransaction(const TransactionBlockInfo& blockInfo, const ITransactionReader& tx, const PreprocessInfo& info);
void processOutputs(const TransactionBlockInfo& blockInfo, TransfersSubscription& sub, const ITransactionReader& tx,
const std::vector<TransactionOutputInformationIn>& outputs, const std::vector<uint32_t>& globalIdxs, bool& contains, bool& updated);
2015-07-30 15:22:07 +00:00
std::error_code getGlobalIndices(const Crypto::Hash& transactionHash, std::vector<uint32_t>& outsGlobalIndices);
void updateSyncStart();
SynchronizationStart m_syncStart;
2015-07-30 15:22:07 +00:00
const Crypto::SecretKey m_viewSecret;
// map { spend public key -> subscription }
2015-07-30 15:22:07 +00:00
std::unordered_map<Crypto::PublicKey, std::unique_ptr<TransfersSubscription>> m_subscriptions;
std::unordered_set<Crypto::PublicKey> m_spendKeys;
2015-12-09 13:19:03 +00:00
std::unordered_set<Crypto::Hash> m_poolTxs;
INode& m_node;
2015-05-27 12:08:46 +00:00
const CryptoNote::Currency& m_currency;
};
}