From 213ae90641f72a8367439498271c3f5339a1f6b5 Mon Sep 17 00:00:00 2001 From: Harry Kalodner Date: Tue, 24 Apr 2018 16:23:47 -0400 Subject: [PATCH] Switch DataAccess to hold unique_ptr to remove includes --- example/example.cpp | 28 --------- include/blocksci/address/equiv_address.hpp | 2 +- include/blocksci/chain/block.hpp | 16 ++--- include/blocksci/chain/blockchain.hpp | 8 +-- .../blocksci/{core => chain}/chain_access.hpp | 8 +-- include/blocksci/chain/chain_fwd.hpp | 1 + include/blocksci/chain/input.hpp | 7 ++- include/blocksci/chain/output.hpp | 9 +-- include/blocksci/chain/transaction.hpp | 25 +++----- include/blocksci/cluster/cluster.hpp | 7 +-- include/blocksci/core.hpp | 2 - include/blocksci/core/core_fwd.hpp | 3 - include/blocksci/core/raw_address.hpp | 2 + .../scripts/multisig_pubkey_script.hpp | 3 +- include/blocksci/scripts/multisig_script.hpp | 3 +- .../blocksci/scripts/nonstandard_script.hpp | 4 +- include/blocksci/scripts/nulldata_script.hpp | 3 +- include/blocksci/scripts/pubkey_script.hpp | 8 ++- .../{core => scripts}/script_access.hpp | 6 +- .../blocksci/scripts/scripthash_script.hpp | 6 +- include/blocksci/scripts/scripts_fwd.hpp | 2 + include/blocksci/util/data_access.hpp | 62 ++++++++++++------- include/blocksci/util/state.hpp | 4 +- python/src/tx_py.cpp | 2 - src/CMakeLists.txt | 15 ++--- src/address/address.cpp | 14 +++-- src/address/equiv_address.cpp | 16 ++--- src/{core => chain}/chain_access.cpp | 2 +- src/chain/transaction.cpp | 17 ++++- src/cluster/cluster.cpp | 9 ++- src/cluster/cluster_manager.cpp | 2 +- src/core/raw_address.cpp | 6 +- src/index/address_index.cpp | 1 + src/index/address_output_range.cpp | 11 ++-- src/scripts/pubkey_base_script.cpp | 3 +- src/{core => scripts}/script_access.cpp | 2 +- src/util/data_access.cpp | 38 ++++++++++++ 37 files changed, 202 insertions(+), 155 deletions(-) rename include/blocksci/{core => chain}/chain_access.hpp (96%) rename include/blocksci/{core => scripts}/script_access.hpp (94%) rename src/{core => chain}/chain_access.cpp (97%) rename src/{core => scripts}/script_access.cpp (97%) create mode 100644 src/util/data_access.cpp diff --git a/example/example.cpp b/example/example.cpp index 2a5f354c..deaf72cc 100644 --- a/example/example.cpp +++ b/example/example.cpp @@ -13,12 +13,9 @@ #include #include #include -#include #include #include -//#include - #include #include @@ -90,8 +87,6 @@ int main(int argc, const char * argv[]) { // std::cout << out << std::endl; // } - std::cout << chain.getAccess().hashIndex.countTxes() << std::endl; - RANGES_FOR(auto block, chain) { RANGES_FOR(auto tx, block) { std::cout << tx << std::endl; @@ -122,29 +117,6 @@ int main(int argc, const char * argv[]) { // // std::cout << count << "\n"; -// const std::string query = "Select index FROM txes WHERE locktime > 0"; -// hsql::SQLParserResult result; -// hsql::SQLParser::parse(query, &result); -// -// if (result.isValid() && result.size() > 0) { -// const hsql::SQLStatement* statement = result.getStatement(0); -// -// if (statement->isType(hsql::kStmtSelect)) { -// const hsql::SelectStatement* select = (const hsql::SelectStatement*) statement; -// /* ... */ -// } -// } -// -// HashIndex hashIndex{chain.access.config}; -// RANGES_FOR(auto block, chain) { -// RANGES_FOR(auto tx, block) { -// assert(hashIndex.getTxIndex(tx.getHash()) == tx.txNum); -// } -// -// } - - return 0; - // auto block = chain[100000]; // auto tx = block[0]; // std::cout << tx.getHash().GetHex() << "\n"; diff --git a/include/blocksci/address/equiv_address.hpp b/include/blocksci/address/equiv_address.hpp index a97f37a0..3347a466 100644 --- a/include/blocksci/address/equiv_address.hpp +++ b/include/blocksci/address/equiv_address.hpp @@ -60,7 +60,7 @@ namespace blocksci { return scriptEquivalent; } - ranges::any_view getOutputPointers() const; + ranges::any_view getOutputPointers(); int64_t calculateBalance(BlockHeight height); ranges::any_view getOutputs(); std::vector getInputs(); diff --git a/include/blocksci/chain/block.hpp b/include/blocksci/chain/block.hpp index 11f0fb5e..533cbe58 100644 --- a/include/blocksci/chain/block.hpp +++ b/include/blocksci/chain/block.hpp @@ -39,8 +39,8 @@ namespace blocksci { public: cursor() = default; cursor(const Block &block_, uint32_t txNum) : block(&block_), currentTxIndex(txNum) { - if (currentTxIndex < block->access->chain.txCount()) { - currentTxPos = reinterpret_cast(block->access->chain.getTx(currentTxIndex)); + if (currentTxIndex < block->access->getChain().txCount()) { + currentTxPos = reinterpret_cast(block->access->getChain().getTx(currentTxIndex)); } else { currentTxPos = nullptr; } @@ -77,13 +77,13 @@ namespace blocksci { void prev() { currentTxIndex--; - currentTxPos = reinterpret_cast(block->access->chain.getTx(currentTxIndex)); + currentTxPos = reinterpret_cast(block->access->getChain().getTx(currentTxIndex)); } void advance(int amount) { currentTxIndex += static_cast(amount); - if (currentTxIndex < block->access->chain.txCount()) { - currentTxPos = reinterpret_cast(block->access->chain.getTx(currentTxIndex)); + if (currentTxIndex < block->access->getChain().txCount()) { + currentTxPos = reinterpret_cast(block->access->getChain().getTx(currentTxIndex)); } else { currentTxPos = nullptr; } @@ -100,7 +100,7 @@ namespace blocksci { public: Block() = default; - Block(BlockHeight blockNum_, DataAccess &access_) : access(&access_), rawBlock(access->chain.getBlock(blockNum_)), blockNum(blockNum_) { + Block(BlockHeight blockNum_, DataAccess &access_) : access(&access_), rawBlock(access->getChain().getBlock(blockNum_)), blockNum(blockNum_) { } DataAccess &getAccess() const { @@ -148,7 +148,7 @@ namespace blocksci { } ranges::optional getTimeSeen() const { - return access->mempoolIndex.getBlockTimestamp(blockNum); + return access->getMempoolIndex().getBlockTimestamp(blockNum); } uint32_t bits() const { @@ -207,7 +207,7 @@ namespace blocksci { } std::vector getCoinbase() const { - return access->chain.getCoinbase(rawBlock->coinbaseOffset); + return access->getChain().getCoinbase(rawBlock->coinbaseOffset); } Transaction coinbaseTx() const { diff --git a/include/blocksci/chain/blockchain.hpp b/include/blocksci/chain/blockchain.hpp index b98204fd..595a3176 100644 --- a/include/blocksci/chain/blockchain.hpp +++ b/include/blocksci/chain/blockchain.hpp @@ -164,13 +164,13 @@ namespace blocksci { public: Blockchain() = default; explicit Blockchain(const DataConfiguration &config) : access(config) { - lastBlockHeight = access.chain.blockCount(); + lastBlockHeight = access.getChain().blockCount(); } explicit Blockchain(const std::string &dataDirectory) : Blockchain(DataConfiguration{dataDirectory, true, BlockHeight{0}}) {} void reload() { access.reload(); - lastBlockHeight = access.chain.blockCount(); + lastBlockHeight = access.getChain().blockCount(); } DataAccess &getAccess() { return access; } @@ -183,12 +183,12 @@ namespace blocksci { } uint32_t addressCount(AddressType::Enum type) const { - return access.scripts.scriptCount(dedupType(type)); + return access.getScripts().scriptCount(dedupType(type)); } template auto scripts() { - return ranges::view::ints(uint32_t{1}, access.scripts.scriptCount(dedupType(type)) + 1) | ranges::view::transform([&](uint32_t scriptNum) { + return ranges::view::ints(uint32_t{1}, access.getScripts().scriptCount(dedupType(type)) + 1) | ranges::view::transform([&](uint32_t scriptNum) { return ScriptAddress(scriptNum, access); }); } diff --git a/include/blocksci/core/chain_access.hpp b/include/blocksci/chain/chain_access.hpp similarity index 96% rename from include/blocksci/core/chain_access.hpp rename to include/blocksci/chain/chain_access.hpp index f33629be..438b8ff3 100644 --- a/include/blocksci/core/chain_access.hpp +++ b/include/blocksci/chain/chain_access.hpp @@ -9,10 +9,10 @@ #ifndef chain_access_hpp #define chain_access_hpp -#include "bitcoin_uint256.hpp" -#include "core_fwd.hpp" -#include "file_mapper.hpp" -#include "raw_block.hpp" +#include +#include +#include +#include #include #include diff --git a/include/blocksci/chain/chain_fwd.hpp b/include/blocksci/chain/chain_fwd.hpp index 89494f8e..3bd380e1 100644 --- a/include/blocksci/chain/chain_fwd.hpp +++ b/include/blocksci/chain/chain_fwd.hpp @@ -9,6 +9,7 @@ #define chain_fwd_h namespace blocksci { + class ChainAccess; class Blockchain; class Block; class Transaction; diff --git a/include/blocksci/chain/input.hpp b/include/blocksci/chain/input.hpp index fd171bde..27ccfb18 100644 --- a/include/blocksci/chain/input.hpp +++ b/include/blocksci/chain/input.hpp @@ -9,6 +9,7 @@ #ifndef raw_input_hpp #define raw_input_hpp +#include "chain_access.hpp" #include "inout_pointer.hpp" #include @@ -41,10 +42,10 @@ namespace blocksci { Input(const InputPointer &pointer_, BlockHeight blockHeight_, const Inout &inout_, const uint32_t *sequenceNum_, DataAccess &access_) : access(&access_), inout(&inout_), sequenceNum(sequenceNum_), pointer(pointer_), blockHeight(blockHeight_) { - assert(pointer.isValid(access_.chain)); + assert(pointer.isValid(access_.getChain())); } Input(const InputPointer &pointer_, DataAccess &access_) : - Input(pointer_, access_.chain.getBlockHeight(pointer_.txNum), access_.chain.getTx(pointer_.txNum)->getInput(pointer_.inoutNum), &access_.chain.getSequenceNumbers(pointer_.txNum)[pointer_.inoutNum], access_) {} + Input(pointer_, access_.getChain().getBlockHeight(pointer_.txNum), access_.getChain().getTx(pointer_.txNum)->getInput(pointer_.inoutNum), &access_.getChain().getSequenceNumbers(pointer_.txNum)[pointer_.inoutNum], access_) {} DataAccess &getAccess() const { return *access; @@ -66,7 +67,7 @@ namespace blocksci { Block block() const; BlockHeight age() const { - return blockHeight - access->chain.getBlockHeight(inout->getLinkedTxNum()); + return blockHeight - access->getChain().getBlockHeight(inout->getLinkedTxNum()); } bool operator==(const Inout &other) const { diff --git a/include/blocksci/chain/output.hpp b/include/blocksci/chain/output.hpp index f96458f6..dee4f891 100644 --- a/include/blocksci/chain/output.hpp +++ b/include/blocksci/chain/output.hpp @@ -9,6 +9,7 @@ #ifndef output_hpp #define output_hpp +#include "chain_access.hpp" #include "inout_pointer.hpp" #include @@ -38,8 +39,8 @@ namespace blocksci { Output(const OutputPointer &pointer_, BlockHeight blockHeight_, const Inout &inout_, DataAccess &access_) : access(&access_), inout(&inout_), blockHeight(blockHeight_), pointer(pointer_) { - assert(pointer.isValid(access_.chain)); - if (inout->getLinkedTxNum() < access->chain.maxLoadedTx()) { + assert(pointer.isValid(access_.getChain())); + if (inout->getLinkedTxNum() < access->getChain().maxLoadedTx()) { spendingTxIndex = inout->getLinkedTxNum(); } else { spendingTxIndex = 0; @@ -47,7 +48,7 @@ namespace blocksci { } Output(const OutputPointer &pointer_, DataAccess &access_) : - Output(pointer_, -1, access_.chain.getTx(pointer_.txNum)->getOutput(pointer_.inoutNum), access_) {} + Output(pointer_, -1, access_.getChain().getTx(pointer_.txNum)->getOutput(pointer_.inoutNum), access_) {} DataAccess &getAccess() const { return *access; @@ -55,7 +56,7 @@ namespace blocksci { BlockHeight getBlockHeight() const { if (blockHeight == -1) { - blockHeight = access->chain.getBlockHeight(pointer.txNum); + blockHeight = access->getChain().getBlockHeight(pointer.txNum); } return blockHeight; } diff --git a/include/blocksci/chain/transaction.hpp b/include/blocksci/chain/transaction.hpp index 3ec692ea..1e8da073 100644 --- a/include/blocksci/chain/transaction.hpp +++ b/include/blocksci/chain/transaction.hpp @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -26,16 +27,6 @@ namespace blocksci { InvalidHashException() : std::runtime_error("No Match for hash") {} }; - namespace internal { - inline uint32_t getTxIndex(const uint256 &hash, HashIndex &index) { - auto txIndex = index.getTxIndex(hash); - if (txIndex == 0) { - throw InvalidHashException(); - } - return txIndex; - } - } - class BLOCKSCI_EXPORT Transaction { private: DataAccess *access; @@ -48,13 +39,13 @@ namespace blocksci { Transaction() = default; - Transaction(const RawTransaction *data_, uint32_t txNum_, BlockHeight blockHeight_, DataAccess &access_) : access(&access_), data(data_), sequenceNumbers(access_.chain.getSequenceNumbers(txNum_)), txNum(txNum_), blockHeight(blockHeight_) {} + Transaction(const RawTransaction *data_, uint32_t txNum_, BlockHeight blockHeight_, DataAccess &access_) : access(&access_), data(data_), sequenceNumbers(access_.getChain().getSequenceNumbers(txNum_)), txNum(txNum_), blockHeight(blockHeight_) {} - Transaction(uint32_t index, DataAccess &access_) : Transaction(index, access_.chain.getBlockHeight(index), access_) {} + Transaction(uint32_t index, DataAccess &access_) : Transaction(index, access_.getChain().getBlockHeight(index), access_) {} - Transaction(uint32_t index, BlockHeight height, DataAccess &access_) : Transaction(access_.chain.getTx(index), index, height, access_) {} + Transaction(uint32_t index, BlockHeight height, DataAccess &access_) : Transaction(access_.getChain().getTx(index), index, height, access_) {} - Transaction(const uint256 &hash, DataAccess &access) : Transaction(internal::getTxIndex(hash, access.hashIndex), access) {} + Transaction(const uint256 &hash, DataAccess &access); Transaction(const std::string &hash, DataAccess &access) : Transaction(uint256S(hash), access) {} DataAccess &getAccess() const { @@ -62,15 +53,15 @@ namespace blocksci { } uint256 getHash() const { - return *access->chain.getTxHash(txNum); + return *access->getChain().getTxHash(txNum); } ranges::optional getTimeSeen() const { - return access->mempoolIndex.getTxTimestamp(txNum); + return access->getMempoolIndex().getTxTimestamp(txNum); } bool observedInMempool() const { - return access->mempoolIndex.observed(txNum); + return access->getMempoolIndex().observed(txNum); } std::string toString() const { diff --git a/include/blocksci/cluster/cluster.hpp b/include/blocksci/cluster/cluster.hpp index 6305f4a6..4f0f35b4 100644 --- a/include/blocksci/cluster/cluster.hpp +++ b/include/blocksci/cluster/cluster.hpp @@ -76,12 +76,7 @@ namespace blocksci { Cluster(uint32_t clusterNum_, const ClusterAccess &access_) : clusterAccess(access_), clusterNum(clusterNum_) {} - auto getAddresses() const { - auto &addressIndex = clusterAccess.access.addressIndex; - return getPossibleAddresses() | ranges::view::filter([&addressIndex](const Address &address) { - return addressIndex.checkIfTopLevel(address); - }); - } + ranges::any_view
getAddresses() const; auto taggedAddresses(const std::unordered_map &tags) const { return getAddresses() | ranges::view::transform([tags](Address && address) -> ranges::optional { diff --git a/include/blocksci/core.hpp b/include/blocksci/core.hpp index ea9e4435..77fe66aa 100644 --- a/include/blocksci/core.hpp +++ b/include/blocksci/core.hpp @@ -10,8 +10,6 @@ #define core_group_header_h #include -#include -#include #include #include #include diff --git a/include/blocksci/core/core_fwd.hpp b/include/blocksci/core/core_fwd.hpp index 26effa9a..d7f6e9fa 100644 --- a/include/blocksci/core/core_fwd.hpp +++ b/include/blocksci/core/core_fwd.hpp @@ -41,9 +41,6 @@ namespace blocksci { class uint256; class uint160; - - class ChainAccess; - class ScriptAccess; } // namespace blocksci #endif /* blocksci_core_fwd_hpp */ diff --git a/include/blocksci/core/raw_address.hpp b/include/blocksci/core/raw_address.hpp index 92ca2cdd..f6600d1c 100644 --- a/include/blocksci/core/raw_address.hpp +++ b/include/blocksci/core/raw_address.hpp @@ -16,6 +16,8 @@ #include namespace blocksci { + class ScriptAccess; + struct BLOCKSCI_EXPORT RawAddress { uint32_t scriptNum; AddressType::Enum type; diff --git a/include/blocksci/scripts/multisig_pubkey_script.hpp b/include/blocksci/scripts/multisig_pubkey_script.hpp index 93aded90..c7868072 100644 --- a/include/blocksci/scripts/multisig_pubkey_script.hpp +++ b/include/blocksci/scripts/multisig_pubkey_script.hpp @@ -9,6 +9,7 @@ #define multisig_pubkey_script_hpp #include "pubkey_base_script.hpp" +#include "script_access.hpp" #include #include @@ -22,7 +23,7 @@ namespace blocksci { public: constexpr static AddressType::Enum addressType = AddressType::MULTISIG_PUBKEY; - ScriptAddress(uint32_t addressNum_, DataAccess &access_) : PubkeyAddressBase(addressNum_, addressType, access_.scripts.getScriptData(addressNum_), access_) {} + ScriptAddress(uint32_t addressNum_, DataAccess &access_) : PubkeyAddressBase(addressNum_, addressType, access_.getScripts().getScriptData(addressNum_), access_) {} std::string addressString() const; diff --git a/include/blocksci/scripts/multisig_script.hpp b/include/blocksci/scripts/multisig_script.hpp index 26fb0208..11259ac0 100644 --- a/include/blocksci/scripts/multisig_script.hpp +++ b/include/blocksci/scripts/multisig_script.hpp @@ -10,6 +10,7 @@ #define multisig_script_hpp #include "script.hpp" +#include "script_access.hpp" #include #include @@ -26,7 +27,7 @@ namespace blocksci { } public: constexpr static AddressType::Enum addressType = AddressType::MULTISIG; - ScriptAddress(uint32_t addressNum_, DataAccess &access_) : ScriptBase(addressNum_, addressType, access_, access_.scripts.getScriptData(addressNum_)) {} + ScriptAddress(uint32_t addressNum_, DataAccess &access_) : ScriptBase(addressNum_, addressType, access_, access_.getScripts().getScriptData(addressNum_)) {} std::string toString() const { std::stringstream ss; diff --git a/include/blocksci/scripts/nonstandard_script.hpp b/include/blocksci/scripts/nonstandard_script.hpp index b9a185bf..f4bf8abb 100644 --- a/include/blocksci/scripts/nonstandard_script.hpp +++ b/include/blocksci/scripts/nonstandard_script.hpp @@ -10,9 +10,11 @@ #define nonstandard_script_hpp #include "script.hpp" +#include "script_access.hpp" #include "script_view.hpp" #include +#include #include #include @@ -47,7 +49,7 @@ namespace blocksci { constexpr static AddressType::Enum addressType = AddressType::NONSTANDARD; ScriptAddress() = default; - ScriptAddress(uint32_t addressNum_, DataAccess &access_) : ScriptAddress(addressNum_, access_.scripts.getScriptData(addressNum_), access_) {} + ScriptAddress(uint32_t addressNum_, DataAccess &access_) : ScriptAddress(addressNum_, access_.getScripts().getScriptData(addressNum_), access_) {} std::string inputString() const { auto inputScript = getInputScript(); diff --git a/include/blocksci/scripts/nulldata_script.hpp b/include/blocksci/scripts/nulldata_script.hpp index 822b8ecc..a71d6fe5 100644 --- a/include/blocksci/scripts/nulldata_script.hpp +++ b/include/blocksci/scripts/nulldata_script.hpp @@ -10,6 +10,7 @@ #define nulldata_script_hpp #include "script.hpp" +#include "script_access.hpp" #include #include @@ -29,7 +30,7 @@ namespace blocksci { public: constexpr static AddressType::Enum addressType = AddressType::NULL_DATA; - ScriptAddress(uint32_t addressNum_, DataAccess &access_) : ScriptBase(addressNum_, addressType, access_, access_.scripts.getScriptData(addressNum_)) {} + ScriptAddress(uint32_t addressNum_, DataAccess &access_) : ScriptBase(addressNum_, addressType, access_, access_.getScripts().getScriptData(addressNum_)) {} std::string toString() const { return "NulldataAddressData()"; diff --git a/include/blocksci/scripts/pubkey_script.hpp b/include/blocksci/scripts/pubkey_script.hpp index 20c71323..c6db0a7e 100644 --- a/include/blocksci/scripts/pubkey_script.hpp +++ b/include/blocksci/scripts/pubkey_script.hpp @@ -10,8 +10,10 @@ #define pubkey_script_hpp #include "pubkey_base_script.hpp" +#include "script_access.hpp" #include +#include #include #include @@ -24,7 +26,7 @@ namespace blocksci { constexpr static AddressType::Enum addressType = AddressType::PUBKEY; - ScriptAddress(uint32_t addressNum_, DataAccess &access_) : PubkeyAddressBase(addressNum_, addressType, access_.scripts.getScriptData(addressNum_), access_) {} + ScriptAddress(uint32_t addressNum_, DataAccess &access_) : PubkeyAddressBase(addressNum_, addressType, access_.getScripts().getScriptData(addressNum_), access_) {} std::string addressString() const; @@ -46,7 +48,7 @@ namespace blocksci { constexpr static AddressType::Enum addressType = AddressType::PUBKEYHASH; - ScriptAddress(uint32_t addressNum_, DataAccess &access_) : PubkeyAddressBase(addressNum_, addressType, access_.scripts.getScriptData(addressNum_), access_) {} + ScriptAddress(uint32_t addressNum_, DataAccess &access_) : PubkeyAddressBase(addressNum_, addressType, access_.getScripts().getScriptData(addressNum_), access_) {} std::string addressString() const; @@ -68,7 +70,7 @@ namespace blocksci { constexpr static AddressType::Enum addressType = AddressType::WITNESS_PUBKEYHASH; - ScriptAddress(uint32_t addressNum_, DataAccess &access_) : PubkeyAddressBase(addressNum_, addressType, access_.scripts.getScriptData(addressNum_), access_) {} + ScriptAddress(uint32_t addressNum_, DataAccess &access_) : PubkeyAddressBase(addressNum_, addressType, access_.getScripts().getScriptData(addressNum_), access_) {} std::string addressString() const; diff --git a/include/blocksci/core/script_access.hpp b/include/blocksci/scripts/script_access.hpp similarity index 94% rename from include/blocksci/core/script_access.hpp rename to include/blocksci/scripts/script_access.hpp index ea5a50dc..14951e55 100644 --- a/include/blocksci/core/script_access.hpp +++ b/include/blocksci/scripts/script_access.hpp @@ -9,9 +9,9 @@ #ifndef script_access_hpp #define script_access_hpp -#include "file_mapper.hpp" -#include "script_data.hpp" -#include "script_info.hpp" +#include +#include +#include #include #include diff --git a/include/blocksci/scripts/scripthash_script.hpp b/include/blocksci/scripts/scripthash_script.hpp index 0e3d0807..ab43acc8 100644 --- a/include/blocksci/scripts/scripthash_script.hpp +++ b/include/blocksci/scripts/scripthash_script.hpp @@ -10,8 +10,10 @@ #define scripthash_script_hpp #include "script.hpp" +#include "script_access.hpp" #include +#include #include #include @@ -57,7 +59,7 @@ namespace blocksci { public: constexpr static AddressType::Enum addressType = AddressType::SCRIPTHASH; - ScriptAddress(uint32_t addressNum_, DataAccess &access_) : ScriptHashBase(addressNum_, addressType, access_.scripts.getScriptData(addressNum_), access_) {} + ScriptAddress(uint32_t addressNum_, DataAccess &access_) : ScriptHashBase(addressNum_, addressType, access_.getScripts().getScriptData(addressNum_), access_) {} uint160 getAddressHash() const { return getUint160Address(); @@ -79,7 +81,7 @@ namespace blocksci { public: constexpr static AddressType::Enum addressType = AddressType::WITNESS_SCRIPTHASH; - ScriptAddress(uint32_t addressNum_, DataAccess &access_) : ScriptHashBase(addressNum_, addressType, access_.scripts.getScriptData(addressNum_), access_) {} + ScriptAddress(uint32_t addressNum_, DataAccess &access_) : ScriptHashBase(addressNum_, addressType, access_.getScripts().getScriptData(addressNum_), access_) {} uint256 getAddressHash() const { return getUint256Address(); diff --git a/include/blocksci/scripts/scripts_fwd.hpp b/include/blocksci/scripts/scripts_fwd.hpp index 627673e4..c4f67a01 100644 --- a/include/blocksci/scripts/scripts_fwd.hpp +++ b/include/blocksci/scripts/scripts_fwd.hpp @@ -29,6 +29,8 @@ namespace blocksci { template class ScriptAddress; + + class ScriptAccess; using ScriptVariant = to_variadic_t, mpark::variant>; diff --git a/include/blocksci/util/data_access.hpp b/include/blocksci/util/data_access.hpp index 4b619771..c6da9515 100644 --- a/include/blocksci/util/data_access.hpp +++ b/include/blocksci/util/data_access.hpp @@ -13,38 +13,54 @@ #include -#include -#include -#include -#include -#include +#include namespace blocksci { + class ChainAccess; + class ScriptAccess; + class AddressIndex; + class HashIndex; + class MempoolIndex; + class BLOCKSCI_EXPORT DataAccess { public: DataConfiguration config; - ChainAccess chain; - ScriptAccess scripts; - AddressIndex addressIndex; - HashIndex hashIndex; - MempoolIndex mempoolIndex; + + std::unique_ptr chain; + std::unique_ptr scripts; + std::unique_ptr addressIndex; + std::unique_ptr hashIndex; + std::unique_ptr mempoolIndex; - DataAccess() = default; - explicit DataAccess(DataConfiguration config_) : - config(std::move(config_)), - chain{config.chainDirectory(), config.blocksIgnored, config.errorOnReorg}, - scripts{config.scriptsDirectory()}, - addressIndex{config.addressDBFilePath(), true}, - hashIndex{config.hashIndexFilePath(), true}, - mempoolIndex{config.mempoolDirectory()} {} + DataAccess(); + explicit DataAccess(DataConfiguration config_); + DataAccess(DataAccess &&); + DataAccess &operator=(DataAccess &&); + ~DataAccess(); + + const ChainAccess &getChain() const { + return *chain; + } + + const ScriptAccess &getScripts() const { + return *scripts; + } + + const MempoolIndex &getMempoolIndex() const { + return *mempoolIndex; + } + + AddressIndex &getAddressIndex() { + return *addressIndex; + } + + HashIndex &getHashIndex() { + return *hashIndex; + } operator DataConfiguration() const { return config; } - void reload() { - chain.reload(); - scripts.reload(); - mempoolIndex.reload(); - } + void reload(); }; } diff --git a/include/blocksci/util/state.hpp b/include/blocksci/util/state.hpp index 27a88e4d..1d146e1e 100644 --- a/include/blocksci/util/state.hpp +++ b/include/blocksci/util/state.hpp @@ -8,9 +8,9 @@ #ifndef state_hpp #define state_hpp -#include +#include #include -#include +#include namespace blocksci { struct State { diff --git a/python/src/tx_py.cpp b/python/src/tx_py.cpp index 912f1364..8ecc3314 100644 --- a/python/src/tx_py.cpp +++ b/python/src/tx_py.cpp @@ -13,8 +13,6 @@ #include "self_apply_py.hpp" #include -#include -#include #include diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 270193a6..d3d3e6fc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -111,10 +111,10 @@ target_link_libraries( blocksci ) target_include_directories(blocksci PUBLIC - $ + $ $ $ - $ + $ $ $ ) @@ -146,6 +146,7 @@ set(ADDRESS_HEADERS set(CHAIN_HEADERS ${BLOCKSCI_HEADER_PREFIX}/chain/chain_fwd.hpp + ${BLOCKSCI_HEADER_PREFIX}/chain/chain_access.hpp ${BLOCKSCI_HEADER_PREFIX}/chain/algorithms.hpp ${BLOCKSCI_HEADER_PREFIX}/chain/block.hpp ${BLOCKSCI_HEADER_PREFIX}/chain/blockchain.hpp @@ -182,6 +183,7 @@ set(INDEX_HEADERS set(SCRIPT_HEADERS ${BLOCKSCI_HEADER_PREFIX}/scripts/scripts_fwd.hpp + ${BLOCKSCI_HEADER_PREFIX}/scripts/script_access.hpp ${BLOCKSCI_HEADER_PREFIX}/scripts/bitcoin_pubkey.hpp ${BLOCKSCI_HEADER_PREFIX}/scripts/bitcoin_script.hpp ${BLOCKSCI_HEADER_PREFIX}/scripts/multisig_script.hpp @@ -218,11 +220,9 @@ set(CORE_HEADERS ${BLOCKSCI_HEADER_PREFIX}/core/hash_combine.hpp ${BLOCKSCI_HEADER_PREFIX}/core/inout.hpp ${BLOCKSCI_HEADER_PREFIX}/core/in_place_array.hpp - ${BLOCKSCI_HEADER_PREFIX}/core/chain_access.hpp ${BLOCKSCI_HEADER_PREFIX}/core/raw_address.hpp ${BLOCKSCI_HEADER_PREFIX}/core/raw_block.hpp ${BLOCKSCI_HEADER_PREFIX}/core/raw_transaction.hpp - ${BLOCKSCI_HEADER_PREFIX}/core/script_access.hpp ${BLOCKSCI_HEADER_PREFIX}/core/script_data.hpp ${BLOCKSCI_HEADER_PREFIX}/core/script_info.hpp ) @@ -237,6 +237,7 @@ set(ADDRESS_SOURCES ) set(CHAIN_SOURCES + ${BLOCKSCI_SOURCE_PREFIX}/chain/chain_access.cpp ${BLOCKSCI_SOURCE_PREFIX}/chain/blockchain.cpp ${BLOCKSCI_SOURCE_PREFIX}/chain/block.cpp ${BLOCKSCI_SOURCE_PREFIX}/chain/inout_pointer.cpp @@ -274,6 +275,7 @@ set(SCRIPT_PRIVATE_HEADERS ) set(SCRIPT_SOURCES + ${BLOCKSCI_SOURCE_PREFIX}/scripts/script_access.cpp ${BLOCKSCI_SOURCE_PREFIX}/scripts/bitcoin_base58.cpp ${BLOCKSCI_SOURCE_PREFIX}/scripts/bitcoin_bech32.cpp ${BLOCKSCI_SOURCE_PREFIX}/scripts/bitcoin_pubkey.cpp @@ -293,9 +295,7 @@ set(CORE_SOURCES ${BLOCKSCI_SOURCE_PREFIX}/core/address_info.cpp ${BLOCKSCI_SOURCE_PREFIX}/core/dedup_address_info.cpp ${BLOCKSCI_SOURCE_PREFIX}/core/bitcoin_uint256.cpp - ${BLOCKSCI_SOURCE_PREFIX}/core/chain_access.cpp ${BLOCKSCI_SOURCE_PREFIX}/core/file_mapper.cpp - ${BLOCKSCI_SOURCE_PREFIX}/core/script_access.cpp ${BLOCKSCI_SOURCE_PREFIX}/core/script_data.cpp ${BLOCKSCI_SOURCE_PREFIX}/core/raw_address.cpp ) @@ -303,6 +303,7 @@ set(CORE_SOURCES set_source_files_properties(${BLOCKSCI_SOURCE_PREFIX}/scripts/bitcoin_bech32.cpp PROPERTIES COMPILE_FLAGS -Wno-everything) set(UTIL_SOURCES + ${BLOCKSCI_SOURCE_PREFIX}/util/data_access.cpp ${BLOCKSCI_SOURCE_PREFIX}/util/data_configuration.cpp ${BLOCKSCI_SOURCE_PREFIX}/util/hash.cpp ) @@ -341,7 +342,7 @@ target_sources(blocksci ) include(GenerateExportHeader) -generate_export_header(blocksci) +generate_export_header(blocksci EXPORT_FILE_NAME ${CMAKE_CURRENT_BINARY_DIR}/blocksci/blocksci_export.h) set_property(TARGET blocksci PROPERTY VERSION ${Upstream_VERSION}) diff --git a/src/address/address.cpp b/src/address/address.cpp index 1992400f..6a9bc65c 100644 --- a/src/address/address.cpp +++ b/src/address/address.cpp @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include #include #include @@ -18,7 +20,7 @@ namespace blocksci { ranges::any_view Address::getOutputPointers() const { - return access->addressIndex.getOutputPointers(*this); + return access->getAddressIndex().getOutputPointers(*this); } bool Address::isSpendable() const { @@ -53,13 +55,13 @@ namespace blocksci { if (decoded.first == 0) { if (decoded.second.size() == 20) { uint160 pubkeyHash(decoded.second.begin(), decoded.second.end()); - uint32_t addressNum = access.hashIndex.getPubkeyHashIndex(pubkeyHash); + uint32_t addressNum = access.getHashIndex().getPubkeyHashIndex(pubkeyHash); if (addressNum > 0) { return Address{addressNum, AddressType::WITNESS_PUBKEYHASH, access}; } } else if (decoded.second.size() == 32) { uint256 scriptHash(decoded.second.begin(), decoded.second.end()); - uint32_t addressNum = access.hashIndex.getScriptHashIndex(scriptHash); + uint32_t addressNum = access.getHashIndex().getScriptHashIndex(scriptHash); if (addressNum > 0) { return Address{addressNum, AddressType::WITNESS_SCRIPTHASH, access}; } @@ -76,9 +78,9 @@ namespace blocksci { } uint32_t addressNum = 0; if (type == AddressType::Enum::PUBKEYHASH) { - addressNum = access.hashIndex.getPubkeyHashIndex(hash); + addressNum = access.getHashIndex().getPubkeyHashIndex(hash); } else if (type == AddressType::Enum::SCRIPTHASH) { - addressNum = access.hashIndex.getScriptHashIndex(hash); + addressNum = access.getHashIndex().getScriptHashIndex(hash); } if (addressNum > 0) { return Address{addressNum, type, access}; @@ -89,7 +91,7 @@ namespace blocksci { template std::vector
getAddressesWithPrefixImp(const std::string &prefix, DataAccess &access) { std::vector
addresses; - auto count = access.scripts.scriptCount(dedupType(type)); + auto count = access.getScripts().scriptCount(dedupType(type)); for (uint32_t scriptNum = 1; scriptNum <= count; scriptNum++) { ScriptAddress script(scriptNum, access); if (script.addressString().compare(0, prefix.length(), prefix) == 0) { diff --git a/src/address/equiv_address.cpp b/src/address/equiv_address.cpp index fb7add22..4939bfe0 100644 --- a/src/address/equiv_address.cpp +++ b/src/address/equiv_address.cpp @@ -7,24 +7,24 @@ #include #include - -#include #include #include +#include +#include namespace blocksci { EquivAddress::EquivAddress(uint32_t scriptNum, EquivAddressType::Enum type, bool scriptEquivalent_, DataAccess &access_) : scriptEquivalent(scriptEquivalent_), access(access_) { for (auto equivType : equivAddressTypes(type)) { Address address(scriptNum, equivType, access); if (scriptEquivalent) { - auto nested = access.addressIndex.getPossibleNestedEquivalent(address); + auto nested = access.getAddressIndex().getPossibleNestedEquivalent(address); for (auto &nestedAddress : nested) { - if (access.addressIndex.checkIfExists(nestedAddress)) { + if (access.getAddressIndex().checkIfExists(nestedAddress)) { addresses.insert(nestedAddress); } } } else { - if (access.addressIndex.checkIfExists(address)) { + if (access.getAddressIndex().checkIfExists(address)) { addresses.insert(address); } } @@ -52,10 +52,10 @@ namespace blocksci { return ss.str(); } - ranges::any_view EquivAddress::getOutputPointers() const { - const auto &access_ = access; + ranges::any_view EquivAddress::getOutputPointers() { + auto &access_ = access; return addresses - | ranges::view::transform([&access_](const Address &address) { return access_.addressIndex.getOutputPointers(address); }) + | ranges::view::transform([&access_](const Address &address) { return access_.getAddressIndex().getOutputPointers(address); }) | ranges::view::join ; } diff --git a/src/core/chain_access.cpp b/src/chain/chain_access.cpp similarity index 97% rename from src/core/chain_access.cpp rename to src/chain/chain_access.cpp index f969bab5..135d4a72 100644 --- a/src/core/chain_access.cpp +++ b/src/chain/chain_access.cpp @@ -5,7 +5,7 @@ // Created by Harry Kalodner on 4/22/18. // -#include +#include #include #include diff --git a/src/chain/transaction.cpp b/src/chain/transaction.cpp index 7044a1eb..b4a12719 100644 --- a/src/chain/transaction.cpp +++ b/src/chain/transaction.cpp @@ -11,11 +11,24 @@ #include #include #include - +#include #include + +namespace { + uint32_t getTxIndex(const blocksci::uint256 &hash, blocksci::HashIndex &index) { + auto txIndex = index.getTxIndex(hash); + if (txIndex == 0) { + throw blocksci::InvalidHashException(); + } + return txIndex; + } +} + namespace blocksci { - + + Transaction::Transaction(const uint256 &hash, DataAccess &access) : Transaction(getTxIndex(hash, access.getHashIndex()), access) {} + bool isSegwitMarker(const Transaction &tx) { for (int i = tx.outputCount() - 1; i >= 0; i--) { auto output = tx.outputs()[i]; diff --git a/src/cluster/cluster.cpp b/src/cluster/cluster.cpp index f49360e5..3e0d55ff 100644 --- a/src/cluster/cluster.cpp +++ b/src/cluster/cluster.cpp @@ -20,6 +20,13 @@ namespace blocksci { + ranges::any_view
Cluster::getAddresses() const { + auto &addressIndex = clusterAccess.access.getAddressIndex(); + return getPossibleAddresses() | ranges::view::filter([&addressIndex](const Address &address) { + return addressIndex.checkIfTopLevel(address); + }); + } + ranges::optional Cluster::getTagged(const std::unordered_map &tags) const { bool isEmpty = [&]() { auto addresses = taggedAddresses(tags); @@ -41,7 +48,7 @@ namespace blocksci { for (auto &address : clusterAccess.getClusterScripts(clusterNum)) { if (address.type == dedupSearchType) { auto searchAddress = Address{address.scriptNum, type, clusterAccess.access}; - if (clusterAccess.access.addressIndex.checkIfTopLevel(searchAddress)) { + if (clusterAccess.access.getAddressIndex().checkIfTopLevel(searchAddress)) { ++count; } } diff --git a/src/cluster/cluster_manager.cpp b/src/cluster/cluster_manager.cpp index 2ef8067a..24a8d638 100644 --- a/src/cluster/cluster_manager.cpp +++ b/src/cluster/cluster_manager.cpp @@ -265,7 +265,7 @@ namespace blocksci { boost::filesystem::ofstream clusterOffsetFile(offsetFile, std::ios::binary); // Perform clustering - auto &scripts = chain.getAccess().scripts; + auto &scripts = chain.getAccess().getScripts(); size_t totalScriptCount = scripts.totalAddressCount(); std::unordered_map scriptStarts; diff --git a/src/core/raw_address.cpp b/src/core/raw_address.cpp index 751be55c..941c4ffe 100644 --- a/src/core/raw_address.cpp +++ b/src/core/raw_address.cpp @@ -5,12 +5,12 @@ // Created by Harry Kalodner on 4/10/18. // -#include #include -#include -#include #include +#include +#include +#include #include diff --git a/src/index/address_index.cpp b/src/index/address_index.cpp index 872b8d1c..95f9ca3b 100644 --- a/src/index/address_index.cpp +++ b/src/index/address_index.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include diff --git a/src/index/address_output_range.cpp b/src/index/address_output_range.cpp index 7aa07614..f5d1bbb9 100644 --- a/src/index/address_output_range.cpp +++ b/src/index/address_output_range.cpp @@ -6,11 +6,12 @@ // // +#include #include "address_index_priv.hpp" #include #include -#include +#include #include namespace blocksci { @@ -22,7 +23,7 @@ namespace blocksci { AddressOutputRange::cursor::cursor(const cursor &other) : access(other.access), rowNum(other.rowNum), currentTypeIndex(other.currentTypeIndex) { if (static_cast(currentTypeIndex) < AddressType::size) { - it = access->addressIndex.impl->getOutputIterator(static_cast(currentTypeIndex)); + it = access->getAddressIndex().impl->getOutputIterator(static_cast(currentTypeIndex)); it->SeekToFirst(); } else { it.reset(nullptr); @@ -36,7 +37,7 @@ namespace blocksci { rowNum = other.rowNum; currentTypeIndex = other.currentTypeIndex; if (static_cast(currentTypeIndex) < AddressType::size) { - it = access->addressIndex.impl->getOutputIterator(static_cast(currentTypeIndex)); + it = access->getAddressIndex().impl->getOutputIterator(static_cast(currentTypeIndex)); it->SeekToFirst(); } else { it.reset(nullptr); @@ -58,7 +59,7 @@ namespace blocksci { while (it == nullptr || !it->Valid()) { currentTypeIndex++; if (static_cast(currentTypeIndex) < AddressType::size) { - it = access->addressIndex.impl->getOutputIterator(static_cast(currentTypeIndex)); + it = access->getAddressIndex().impl->getOutputIterator(static_cast(currentTypeIndex)); it->SeekToFirst(); } else { it.reset(nullptr); @@ -85,7 +86,7 @@ namespace blocksci { if (!it->Valid()) { if (currentTypeIndex > 0) { currentTypeIndex--; - it = access->addressIndex.impl->getOutputIterator(static_cast(currentTypeIndex)); + it = access->getAddressIndex().impl->getOutputIterator(static_cast(currentTypeIndex)); it->SeekToLast(); } else { it.reset(nullptr); diff --git a/src/scripts/pubkey_base_script.cpp b/src/scripts/pubkey_base_script.cpp index 92c98680..fc6c6dab 100644 --- a/src/scripts/pubkey_base_script.cpp +++ b/src/scripts/pubkey_base_script.cpp @@ -6,10 +6,11 @@ // #include +#include #include namespace blocksci { std::vector
PubkeyAddressBase::getIncludingMultisigs() const { - return getAccess().addressIndex.getIncludingMultisigs(*this); + return getAccess().getAddressIndex().getIncludingMultisigs(*this); } } // namespace blocksci diff --git a/src/core/script_access.cpp b/src/scripts/script_access.cpp similarity index 97% rename from src/core/script_access.cpp rename to src/scripts/script_access.cpp index 9146a048..aeef0801 100644 --- a/src/core/script_access.cpp +++ b/src/scripts/script_access.cpp @@ -5,7 +5,7 @@ // Created by Harry Kalodner on 4/21/18. // -#include +#include #include #include diff --git a/src/util/data_access.cpp b/src/util/data_access.cpp new file mode 100644 index 00000000..4658d284 --- /dev/null +++ b/src/util/data_access.cpp @@ -0,0 +1,38 @@ +// +// data_access.cpp +// blocksci +// +// Created by Harry Kalodner on 4/24/18. +// +// + +#include + +#include +#include +#include +#include +#include + +namespace blocksci { + + DataAccess::DataAccess() = default; + + DataAccess::DataAccess(DataConfiguration config_) : + config(std::move(config_)), + chain{std::make_unique(config.chainDirectory(), config.blocksIgnored, config.errorOnReorg)}, + scripts{std::make_unique(config.scriptsDirectory())}, + addressIndex{std::make_unique(config.addressDBFilePath(), true)}, + hashIndex{std::make_unique(config.hashIndexFilePath(), true)}, + mempoolIndex{std::make_unique(config.mempoolDirectory())} {} + + DataAccess::DataAccess(DataAccess &&) = default; + DataAccess &DataAccess::operator=(DataAccess &&) = default; + DataAccess::~DataAccess() = default; + + void DataAccess::reload() { + chain->reload(); + scripts->reload(); + mempoolIndex->reload(); + } +}