From d48c134f6160bd3e813ea061456ee0731fe25fcf Mon Sep 17 00:00:00 2001 From: hkalodner Date: Wed, 6 Sep 2017 14:18:21 -0400 Subject: [PATCH 001/289] Initial round of changes to add segwit support --- src/blocksci/address/address.cpp | 2 +- .../address/address_first_seen_access.hpp | 2 +- src/blocksci/address/address_info.hpp | 83 +++++++++--------- src/blocksci/address/address_types.hpp | 6 +- src/blocksci/scripts/script_access.hpp | 34 +++++--- src/blocksci/scripts/script_data.hpp | 9 +- src/blocksci/scripts/script_info.cpp | 9 ++ src/blocksci/scripts/script_info.hpp | 86 +++++++++++++++++++ src/blocksci/scripts/script_pointer.cpp | 9 ++ src/blocksci/scripts/script_pointer.hpp | 14 +++ src/blocksci/scripts/script_type.cpp | 9 ++ src/blocksci/scripts/script_type.hpp | 35 ++++++++ src/blocksci/util.hpp | 28 ++++++ src/parser/chain_index.cpp | 5 +- src/parser/preproccessed_block.cpp | 37 +++++++- src/parser/preproccessed_block.hpp | 13 +++ 16 files changed, 312 insertions(+), 69 deletions(-) create mode 100644 src/blocksci/scripts/script_info.cpp create mode 100644 src/blocksci/scripts/script_info.hpp create mode 100644 src/blocksci/scripts/script_pointer.cpp create mode 100644 src/blocksci/scripts/script_pointer.hpp create mode 100644 src/blocksci/scripts/script_type.cpp create mode 100644 src/blocksci/scripts/script_type.hpp create mode 100644 src/blocksci/util.hpp diff --git a/src/blocksci/address/address.cpp b/src/blocksci/address/address.cpp index 49e812c2..07c5ab02 100644 --- a/src/blocksci/address/address.cpp +++ b/src/blocksci/address/address.cpp @@ -99,7 +99,7 @@ namespace blocksci { } } - auto addresses = access.findMatchingAddresses([&](const auto &nextAddress) { + auto addresses = access.findMatchingAddresses([&](const auto &nextAddress) { return rawAddresses.find(RawAddress(nextAddress)) != rawAddresses.end(); }); diff --git a/src/blocksci/address/address_first_seen_access.hpp b/src/blocksci/address/address_first_seen_access.hpp index cc6c07c0..b07dbc86 100644 --- a/src/blocksci/address/address_first_seen_access.hpp +++ b/src/blocksci/address/address_first_seen_access.hpp @@ -22,7 +22,7 @@ namespace blocksci { }; class AddressFirstSeenAccess { - using AddressFilesFirstSeenTuple = internal::to_script_type::type; + using AddressFilesFirstSeenTuple = internal::to_address_type::type; AddressFilesFirstSeenTuple addressFilesFirstSeen; public: diff --git a/src/blocksci/address/address_info.hpp b/src/blocksci/address/address_info.hpp index 7709e3a7..cb089eff 100644 --- a/src/blocksci/address/address_info.hpp +++ b/src/blocksci/address/address_info.hpp @@ -1,16 +1,19 @@ // -// script_info.hpp +// address_info.hpp // blocksci // // Created by Harry Kalodner on 3/18/17. // // -#ifndef script_info_hpp -#define script_info_hpp +#ifndef address_info_hpp +#define address_info_hpp #include "address_types.hpp" +#include +#include + #include #include @@ -18,20 +21,6 @@ #include namespace blocksci { - - struct PubkeyData; - struct PubkeyHashData; - struct ScriptHashData; - struct MultisigData; - struct NonstandardScriptData; - struct RawData; - - template - struct FixedSize; - - template - struct Indexed; - template struct AddressInfo; @@ -43,7 +32,7 @@ namespace blocksci { static constexpr bool hasNestedAddresses = false; static constexpr bool deduped = true; static constexpr AddressType::Enum addressAddressType = AddressType::Enum::PUBKEYHASH; - using storage = FixedSize; + static constexpr ScriptType::Enum scriptType = ScriptType::Enum::PUBKEY; }; template <> @@ -54,7 +43,18 @@ namespace blocksci { static constexpr bool hasNestedAddresses = false; static constexpr bool deduped = true; static constexpr AddressType::Enum addressAddressType = AddressType::Enum::PUBKEYHASH; - using storage = FixedSize; + static constexpr ScriptType::Enum scriptType = ScriptType::Enum::PUBKEY; + }; + + template <> + struct AddressInfo { + static constexpr char typeName[] = "witness_pubkeyhash"; + static constexpr int addressType = 0; + static constexpr bool spendable = true; + static constexpr bool hasNestedAddresses = false; + static constexpr bool deduped = true; + static constexpr AddressType::Enum addressAddressType = AddressType::Enum::PUBKEYHASH; + static constexpr ScriptType::Enum scriptType = ScriptType::Enum::PUBKEY; }; template <> @@ -65,7 +65,18 @@ namespace blocksci { static constexpr bool hasNestedAddresses = true; static constexpr bool deduped = true; static constexpr AddressType::Enum addressAddressType = AddressType::Enum::SCRIPTHASH; - using storage = FixedSize; + static constexpr ScriptType::Enum scriptType = ScriptType::Enum::SCRIPTHASH; + }; + + template <> + struct AddressInfo { + static constexpr char typeName[] = "witness_scripthash"; + static constexpr int addressType = 1; + static constexpr bool spendable = true; + static constexpr bool hasNestedAddresses = true; + static constexpr bool deduped = true; + static constexpr AddressType::Enum addressAddressType = AddressType::Enum::SCRIPTHASH; + static constexpr ScriptType::Enum scriptType = ScriptType::Enum::SCRIPTHASH; }; template <> @@ -76,7 +87,7 @@ namespace blocksci { static constexpr bool hasNestedAddresses = true; static constexpr bool deduped = true; static constexpr AddressType::Enum addressAddressType = AddressType::Enum::MULTISIG; - using storage = Indexed; + static constexpr ScriptType::Enum scriptType = ScriptType::Enum::MULTISIG; }; template <> @@ -87,7 +98,7 @@ namespace blocksci { static constexpr bool hasNestedAddresses = false; static constexpr bool deduped = false; static constexpr AddressType::Enum addressAddressType = AddressType::Enum::NONSTANDARD; - using storage = Indexed; + static constexpr ScriptType::Enum scriptType = ScriptType::Enum::NONSTANDARD; }; template <> @@ -98,13 +109,13 @@ namespace blocksci { static constexpr bool hasNestedAddresses = false; static constexpr bool deduped = false; static constexpr AddressType::Enum addressAddressType = AddressType::Enum::NULL_DATA; - using storage = Indexed; + static constexpr ScriptType::Enum scriptType = ScriptType::Enum::NULL_DATA; }; std::string GetTxnOutputType(AddressType::Enum t); template - struct ScriptTag { + struct AddressTag { static constexpr AddressType::Enum type = AddressType; }; @@ -119,16 +130,16 @@ namespace blocksci { }; template class K, typename T> - struct to_script_type; + struct to_address_type; template class K, AddressType::Enum Type> - struct to_script_type> { + struct to_address_type> { using type = K; }; template class K, typename... Types> - struct to_script_type> { - using type = std::tuple::type...>; + struct to_address_type> { + using type = std::tuple::type...>; }; template struct for_each_impl { @@ -143,16 +154,6 @@ namespace blocksci { } }; - template - constexpr auto index_apply_impl(F f, std::index_sequence) { - return f(std::integral_constant {}...); - } - - template - constexpr auto index_apply(F f) { - return index_apply_impl(f, std::make_index_sequence{}); - } - template class Functor, std::size_t... Is> constexpr auto make_dynamic_table_impl(std::index_sequence) -> std::array::f), sizeof...(Is)> { return {{Functor::f...}}; @@ -188,7 +189,7 @@ namespace blocksci { } template class K, typename... Types> - using to_script_variant_t = typename internal::to_variant::type>::type; + using to_script_variant_t = typename internal::to_variant::type>::type; template @@ -221,7 +222,7 @@ namespace blocksci { inline auto getAddressTypes() { return internal::index_apply([](auto... Is) { - return std::make_tuple(ScriptTag(AddressType::all)>{}...); + return std::make_tuple(AddressTag(AddressType::all)>{}...); }); } @@ -273,4 +274,4 @@ namespace blocksci { } } -#endif /* script_info_hpp */ +#endif /* address_info_hpp */ diff --git a/src/blocksci/address/address_types.hpp b/src/blocksci/address/address_types.hpp index a49e8006..6089a55d 100644 --- a/src/blocksci/address/address_types.hpp +++ b/src/blocksci/address/address_types.hpp @@ -13,8 +13,8 @@ #include #include -#define ADDRESS_TYPE_LIST VAL(NONSTANDARD), VAL(PUBKEY), VAL(PUBKEYHASH), VAL(SCRIPTHASH), VAL(MULTISIG), VAL(NULL_DATA) -#define ADDRESS_TYPE_SET VAL(NONSTANDARD) VAL(PUBKEY) VAL(PUBKEYHASH) VAL(SCRIPTHASH) VAL(MULTISIG) VAL(NULL_DATA) +#define ADDRESS_TYPE_LIST VAL(NONSTANDARD), VAL(PUBKEY), VAL(PUBKEYHASH), VAL(SCRIPTHASH), VAL(MULTISIG), VAL(NULL_DATA), VAL(WITNESS_PUBKEYHASH), VAL(WITNESS_SCRIPTHASH) +#define ADDRESS_TYPE_SET VAL(NONSTANDARD) VAL(PUBKEY) VAL(PUBKEYHASH) VAL(SCRIPTHASH) VAL(MULTISIG) VAL(NULL_DATA) VAL(WITNESS_PUBKEYHASH) VAL(WITNESS_SCRIPTHASH) namespace blocksci { @@ -27,7 +27,7 @@ namespace blocksci { #undef VAL }; #define VAL(x) Enum::x - static constexpr std::array all = {{ADDRESS_TYPE_LIST}}; + static constexpr std::array all = {{ADDRESS_TYPE_LIST}}; #undef VAL static constexpr size_t size = all.size(); diff --git a/src/blocksci/scripts/script_access.hpp b/src/blocksci/scripts/script_access.hpp index b99eaf1c..839041a6 100644 --- a/src/blocksci/scripts/script_access.hpp +++ b/src/blocksci/scripts/script_access.hpp @@ -9,9 +9,11 @@ #ifndef script_access_hpp #define script_access_hpp -#include +#include "script_info.hpp" #include "script_data.hpp" +#include + #include #include @@ -24,12 +26,12 @@ namespace blocksci { struct ScriptFileType; template - struct ScriptFileType> { + struct ScriptFileType> { using type = FixedSizeFileMapper; }; template - struct ScriptFileType> { + struct ScriptFileType> { using type = IndexedFileMapper; }; @@ -37,14 +39,14 @@ namespace blocksci { using ScriptFileType_t = typename ScriptFileType::type; - template - struct ScriptFile : public ScriptFileType_t::storage> { - using ScriptFileType_t::storage>::ScriptFileType_t; + template + struct ScriptFile : public ScriptFileType_t::storage> { + using ScriptFileType_t::storage>::ScriptFileType_t; }; class ScriptAccess { private: - using ScriptFilesTuple = internal::to_script_type::type; + using ScriptFilesTuple = internal::to_script_type::type; ScriptFilesTuple scriptFiles; @@ -53,18 +55,20 @@ namespace blocksci { ScriptAccess(const DataConfiguration &config); template - boost::optional
findAddress(uint160 rawAddress) const { - auto &file = std::get>(scriptFiles); - auto index = file.find([&](const auto &item) { return item.address == rawAddress; }); + boost::optional
findAddress(uint160 hash) const { + constexpr auto scriptType = AddressInfo::scriptType; + auto &file = std::get>(scriptFiles); + auto index = file.find([&](const auto &item) { return item.address == hash; }); if (index) { return Address(*index + 1, type); } return boost::none; } - template + template std::vector
findMatchingAddresses(Func func) const { - auto &file = std::get>(scriptFiles); + constexpr auto scriptType = AddressInfo::scriptType; + auto &file = std::get>(scriptFiles); auto addressNums = file.findAll(func); @@ -76,6 +80,12 @@ namespace blocksci { return addresses; } + template + AddressType::Enum getAddressType(uint32_t addressNum) const { + return AddressType::Enum::PUBKEYHASH; +// return std::get>(scriptFiles).getData(addressNum - 1); + } + template auto getScriptData(uint32_t addressNum) const { return std::get>(scriptFiles).getData(addressNum - 1); diff --git a/src/blocksci/scripts/script_data.hpp b/src/blocksci/scripts/script_data.hpp index 8d730e7d..8b22e8af 100644 --- a/src/blocksci/scripts/script_data.hpp +++ b/src/blocksci/scripts/script_data.hpp @@ -21,17 +21,10 @@ namespace blocksci { struct PubkeyData { CPubKey pubkey; - - size_t size() { - return sizeof(pubkey); - } - }; - - struct PubkeyHashData { uint160 address; size_t size() { - return sizeof(PubkeyHashData); + return sizeof(PubkeyData); } }; diff --git a/src/blocksci/scripts/script_info.cpp b/src/blocksci/scripts/script_info.cpp new file mode 100644 index 00000000..f92e05d1 --- /dev/null +++ b/src/blocksci/scripts/script_info.cpp @@ -0,0 +1,9 @@ +// +// script_info.cpp +// blocksci +// +// Created by Harry Kalodner on 9/6/17. +// +// + +#include "script_info.hpp" diff --git a/src/blocksci/scripts/script_info.hpp b/src/blocksci/scripts/script_info.hpp new file mode 100644 index 00000000..77f7ae30 --- /dev/null +++ b/src/blocksci/scripts/script_info.hpp @@ -0,0 +1,86 @@ +// +// script_info.hpp +// blocksci +// +// Created by Harry Kalodner on 9/6/17. +// +// + +#ifndef script_info_hpp +#define script_info_hpp + +#include "util.hpp" +#include "script_type.hpp" +#include + +namespace blocksci { + struct PubkeyData; + struct ScriptHashData; + struct MultisigData; + struct NonstandardScriptData; + struct RawData; + + template + struct FixedSize; + + template + struct Indexed; + + template + struct ScriptInfo; + + template <> + struct ScriptInfo { + using storage = FixedSize; + }; + + template <> + struct ScriptInfo { + using storage = FixedSize; + }; + + template <> + struct ScriptInfo { + using storage = Indexed; + }; + + template <> + struct ScriptInfo { + using storage = Indexed; + }; + + template <> + struct ScriptInfo { + using storage = Indexed; + }; + + template + struct ScriptTag { + static constexpr ScriptType::Enum type = ScriptType; + }; + + namespace internal { + template class K, typename T> + struct to_script_type; + + template class K, ScriptType::Enum Type> + struct to_script_type> { + using type = K; + }; + + template class K, typename... Types> + struct to_script_type> { + using type = std::tuple::type...>; + }; + } + + inline auto getScriptTypes() { + return internal::index_apply([](auto... Is) { + return std::make_tuple(ScriptTag(ScriptType::all)>{}...); + }); + } + + using ScriptInfoList = decltype(getScriptTypes()); +} + +#endif /* script_info_hpp */ diff --git a/src/blocksci/scripts/script_pointer.cpp b/src/blocksci/scripts/script_pointer.cpp new file mode 100644 index 00000000..2eeb0075 --- /dev/null +++ b/src/blocksci/scripts/script_pointer.cpp @@ -0,0 +1,9 @@ +// +// script_pointer.cpp +// blocksci +// +// Created by Harry Kalodner on 9/6/17. +// +// + +#include "script_pointer.hpp" diff --git a/src/blocksci/scripts/script_pointer.hpp b/src/blocksci/scripts/script_pointer.hpp new file mode 100644 index 00000000..ebfee29c --- /dev/null +++ b/src/blocksci/scripts/script_pointer.hpp @@ -0,0 +1,14 @@ +// +// script_pointer.hpp +// blocksci +// +// Created by Harry Kalodner on 9/6/17. +// +// + +#ifndef script_pointer_hpp +#define script_pointer_hpp + +#include + +#endif /* script_pointer_hpp */ diff --git a/src/blocksci/scripts/script_type.cpp b/src/blocksci/scripts/script_type.cpp new file mode 100644 index 00000000..449267bd --- /dev/null +++ b/src/blocksci/scripts/script_type.cpp @@ -0,0 +1,9 @@ +// +// script_type.cpp +// blocksci +// +// Created by Harry Kalodner on 9/6/17. +// +// + +#include "script_type.hpp" diff --git a/src/blocksci/scripts/script_type.hpp b/src/blocksci/scripts/script_type.hpp new file mode 100644 index 00000000..7c7c5e2a --- /dev/null +++ b/src/blocksci/scripts/script_type.hpp @@ -0,0 +1,35 @@ +// +// script_type.hpp +// blocksci +// +// Created by Harry Kalodner on 9/6/17. +// +// + +#ifndef script_type_hpp +#define script_type_hpp + +#include +#include + +#define SCRIPT_TYPE_LIST VAL(NONSTANDARD), VAL(PUBKEY), VAL(SCRIPTHASH), VAL(MULTISIG), VAL(NULL_DATA) +#define SCRIPT_TYPE_SET VAL(NONSTANDARD) VAL(PUBKEY) VAL(SCRIPTHASH) VAL(MULTISIG) VAL(NULL_DATA) +namespace blocksci { + + + struct ScriptType { + + enum class Enum { +#define VAL(x) x + SCRIPT_TYPE_LIST +#undef VAL + }; +#define VAL(x) Enum::x + static constexpr std::array all = {{SCRIPT_TYPE_LIST}}; +#undef VAL + + static constexpr size_t size = all.size(); + }; +} + +#endif /* script_type_hpp */ diff --git a/src/blocksci/util.hpp b/src/blocksci/util.hpp new file mode 100644 index 00000000..bc87a4be --- /dev/null +++ b/src/blocksci/util.hpp @@ -0,0 +1,28 @@ +// +// util.hpp +// blocksci +// +// Created by Harry Kalodner on 9/6/17. +// +// + +#ifndef util_h +#define util_h + +#include + +namespace blocksci { + namespace internal { + template + constexpr auto index_apply_impl(F f, std::index_sequence) { + return f(std::integral_constant {}...); + } + + template + constexpr auto index_apply(F f) { + return index_apply_impl(f, std::make_index_sequence{}); + } + } +} + +#endif /* util_h */ diff --git a/src/parser/chain_index.cpp b/src/parser/chain_index.cpp index bc36d613..a7b3ff76 100644 --- a/src/parser/chain_index.cpp +++ b/src/parser/chain_index.cpp @@ -90,9 +90,10 @@ void ChainIndex::updateFromFilesystem() { uint32_t length = readNext(&startPos); startPos += length; } - + // config.blockMagic + // uint32_t magic = 0; - while ((magic = readNext(&startPos)) == config.blockMagic) { + while ((magic = readNext(&startPos)) == 0xdab5bffa) { uint32_t length = readNext(&startPos); filePos = startPos - fileMap.data(); auto header = reinterpret_cast(startPos); diff --git a/src/parser/preproccessed_block.cpp b/src/parser/preproccessed_block.cpp index 1766626e..51792e90 100644 --- a/src/parser/preproccessed_block.cpp +++ b/src/parser/preproccessed_block.cpp @@ -68,11 +68,29 @@ scriptOutput(extractScriptData(scriptBegin, scriptBegin + scriptLength)) { *buffer += scriptLength; } +WitnessStackItem::WitnessStackItem(const char **buffer) : length(readVariableLengthInteger(buffer)), itemBegin(*buffer) { + *buffer += length; +} + void RawTransaction::load(const char **buffer) { + SHA256_CTX sha256CTX; + SHA256_Init(&sha256CTX); auto startPos = *buffer; + SHA256_Update(&sha256CTX, *buffer, sizeof(int32_t)); version = readNext(buffer); + + const char *inputStart = *buffer; auto inputCount = readVariableLengthInteger(buffer); + bool isSegwit = false; + if (inputCount == 0) { + auto flag = readNext(buffer); + assert(flag == 1); + isSegwit = true; + inputStart = *buffer; + inputCount = readVariableLengthInteger(buffer); + } + inputs.clear(); inputs.reserve(inputCount); for (decltype(inputCount) i = 0; i < inputCount; i++) { @@ -87,9 +105,26 @@ void RawTransaction::load(const char **buffer) { outputs.emplace_back(buffer); } + SHA256_Update(&sha256CTX, inputStart, *buffer - inputStart); + + if (isSegwit) { + for (decltype(inputCount) i = 0; i < inputCount; i++) { + auto &input = inputs[i]; + uint32_t stackItemCount = readVariableLengthInteger(buffer); + for (uint32_t i = 0; i < stackItemCount; i++) { + input.witnessStack.emplace_back(buffer); + } + } + } + + SHA256_Update(&sha256CTX, *buffer, sizeof(uint32_t)); + locktime = readNext(buffer); sizeBytes = static_cast(*buffer - startPos); - hash = doubleSha256(startPos, sizeBytes); + + SHA256_Final((unsigned char *)&hash, &sha256CTX); + hash = sha256(reinterpret_cast(&hash), sizeof(hash)); + // hash = doubleSha256(startPos, sizeBytes); } #endif diff --git a/src/parser/preproccessed_block.hpp b/src/parser/preproccessed_block.hpp index 1a647ce3..1167b71e 100644 --- a/src/parser/preproccessed_block.hpp +++ b/src/parser/preproccessed_block.hpp @@ -29,11 +29,23 @@ namespace blocksci { struct OutputPointer; } + + +struct WitnessStackItem { + uint32_t length; + const char *itemBegin; + + #ifdef BLOCKSCI_FILE_PARSER + WitnessStackItem(const char **buffer); + #endif +}; + struct RawInput { RawOutputPointer rawOutputPointer; uint32_t sequenceNum; const unsigned char *scriptBegin; const unsigned char *scriptEnd; + std::vector witnessStack; std::vector scriptBytes; @@ -82,6 +94,7 @@ struct RawTransaction { std::vector inputs; std::vector outputs; + RawTransaction() : txNum(0), hash(), From 976473c9dc6464950a3d916521ffd04220e760f8 Mon Sep 17 00:00:00 2001 From: hkalodner Date: Thu, 7 Sep 2017 00:56:26 -0400 Subject: [PATCH 002/289] Completed initial separation of ScriptType and AddressType --- src/blocksci/address/address.cpp | 67 ++--------------- src/blocksci/address/address.hpp | 13 +--- .../address/address_first_seen_access.cpp | 17 ----- .../address/address_first_seen_access.hpp | 41 ---------- src/blocksci/address/address_info.cpp | 4 +- src/blocksci/address/address_info.hpp | 75 +++---------------- src/blocksci/address/address_singleton.cpp | 19 +---- src/blocksci/address/raw_address_pointer.cpp | 8 +- src/blocksci/address/raw_address_pointer.hpp | 12 +-- src/blocksci/chain/transaction.cpp | 2 +- src/blocksci/chain/transaction.hpp | 4 +- src/blocksci/chain/transaction_access.cpp | 2 +- src/blocksci/data_access.cpp | 4 +- src/blocksci/data_access.hpp | 4 +- src/blocksci/scripts/bitcoin_base58.cpp | 8 +- src/blocksci/scripts/bitcoin_base58.hpp | 3 +- src/blocksci/scripts/multisig_script.cpp | 2 +- src/blocksci/scripts/multisig_script.hpp | 6 +- src/blocksci/scripts/nonstandard_script.cpp | 2 +- src/blocksci/scripts/nonstandard_script.hpp | 6 +- src/blocksci/scripts/nulldata_script.cpp | 2 +- src/blocksci/scripts/nulldata_script.hpp | 6 +- src/blocksci/scripts/pubkey_script.cpp | 2 +- src/blocksci/scripts/pubkey_script.hpp | 6 +- src/blocksci/scripts/pubkeyhash_script.cpp | 45 ----------- src/blocksci/scripts/pubkeyhash_script.hpp | 42 ----------- .../scripts/pubkeyhash_script_singleton.cpp | 19 ----- src/blocksci/scripts/script.cpp | 11 +-- src/blocksci/scripts/script.hpp | 5 +- src/blocksci/scripts/script_access.cpp | 14 ++-- src/blocksci/scripts/script_access.hpp | 38 +--------- .../scripts/script_first_seen_access.cpp | 17 +++++ .../scripts/script_first_seen_access.hpp | 41 ++++++++++ src/blocksci/scripts/script_info.cpp | 9 +++ src/blocksci/scripts/script_info.hpp | 5 ++ src/blocksci/scripts/script_pointer.cpp | 9 --- src/blocksci/scripts/script_pointer.hpp | 14 ---- src/blocksci/scripts/script_type.cpp | 6 ++ src/blocksci/scripts/script_type.hpp | 8 +- src/blocksci/scripts/scripthash_script.cpp | 2 +- src/blocksci/scripts/scripthash_script.hpp | 8 +- src/blocksci/scripts/scriptsfwd.hpp | 16 ++-- src/blocksci/util.hpp | 55 ++++++++++++++ src/parser/address_traverser.hpp | 2 +- src/parser/address_writer.cpp | 62 +++++++++------ src/parser/address_writer.hpp | 17 +++-- src/parser/block_processor.cpp | 2 +- src/parser/block_replayer.cpp | 2 +- src/parser/blockchain_state.cpp | 13 ++-- src/parser/blockchain_state.hpp | 6 +- src/parser/first_seen_index.cpp | 12 +-- src/parser/first_seen_index.hpp | 4 +- src/parser/main.cpp | 8 +- src/parser/script_input.cpp | 21 +++++- src/parser/script_input.hpp | 17 +++++ src/parser/script_output.cpp | 26 +++++-- src/parser/script_output.hpp | 27 ++++++- 57 files changed, 386 insertions(+), 512 deletions(-) delete mode 100644 src/blocksci/address/address_first_seen_access.cpp delete mode 100644 src/blocksci/address/address_first_seen_access.hpp delete mode 100644 src/blocksci/scripts/pubkeyhash_script.cpp delete mode 100644 src/blocksci/scripts/pubkeyhash_script.hpp delete mode 100644 src/blocksci/scripts/pubkeyhash_script_singleton.cpp create mode 100644 src/blocksci/scripts/script_first_seen_access.cpp create mode 100644 src/blocksci/scripts/script_first_seen_access.hpp delete mode 100644 src/blocksci/scripts/script_pointer.cpp delete mode 100644 src/blocksci/scripts/script_pointer.hpp diff --git a/src/blocksci/address/address.cpp b/src/blocksci/address/address.cpp index 07c5ab02..be77dbaa 100644 --- a/src/blocksci/address/address.cpp +++ b/src/blocksci/address/address.cpp @@ -9,13 +9,12 @@ #define BLOCKSCI_WITHOUT_SINGLETON #include "address.hpp" -#include "address_first_seen_access.hpp" #include "address_index.hpp" #include "address_info.hpp" #include "raw_address_pointer.hpp" +#include "scripts/script_first_seen_access.hpp" #include "scripts/script_access.hpp" #include "scripts/script.hpp" -#include "scripts/pubkeyhash_script.hpp" #include "scripts/scripthash_script.hpp" #include "scripts/scriptsfwd.hpp" #include "chain/transaction.hpp" @@ -50,14 +49,14 @@ namespace blocksci { template struct FirstSeenFunctor { - static uint32_t f(const AddressFirstSeenAccess &access, uint32_t addressNum) { - constexpr auto t = addressAddressType(type); + static uint32_t f(const ScriptFirstSeenAccess &access, uint32_t addressNum) { + constexpr auto t = scriptType(type); return access.getFirstTxNum(addressNum); } }; - uint32_t Address::getFirstTransactionIndex(const AddressFirstSeenAccess &access) const { - static constexpr auto table = make_dynamic_table(); + uint32_t Address::getFirstTransactionIndex(const ScriptFirstSeenAccess &access) const { + static constexpr auto table = make_dynamic_table(); static constexpr std::size_t size = AddressType::all.size(); auto index = static_cast(type); @@ -68,7 +67,7 @@ namespace blocksci { return table[index](access, addressNum); } - Transaction Address::getFirstTransaction(const ChainAccess &chain, const AddressFirstSeenAccess &scriptsFirstSeen) const { + Transaction Address::getFirstTransaction(const ChainAccess &chain, const ScriptFirstSeenAccess &scriptsFirstSeen) const { return Transaction::txWithIndex(chain, getFirstTransactionIndex(scriptsFirstSeen)); } @@ -76,60 +75,6 @@ namespace blocksci { return Script::create(access, *this); } - boost::optional
getAddressFromString(const DataConfiguration &config, const ScriptAccess &access, const std::string &addressString) { - auto rawAddress = RawAddress::create(config, addressString); - - if (rawAddress) { - if (rawAddress->type == AddressType::Enum::PUBKEYHASH) { - return access.findAddress(rawAddress->hash); - } else if (rawAddress->type == AddressType::Enum::SCRIPTHASH) { - return access.findAddress(rawAddress->hash); - } - } - return boost::none; - } - - std::vector
getAddressesFromStrings(const DataConfiguration &config, const ScriptAccess &access, const std::vector &addressStrings) { - - std::unordered_set rawAddresses; - for (auto &addressString : addressStrings) { - auto rawAddress = RawAddress::create(config, addressString); - if (rawAddress) { - rawAddresses.insert(*rawAddress); - } - } - - auto addresses = access.findMatchingAddresses([&](const auto &nextAddress) { - return rawAddresses.find(RawAddress(nextAddress)) != rawAddresses.end(); - }); - - auto otherAddresses = access.findMatchingAddresses([&](const auto &nextAddress) { - return rawAddresses.find(RawAddress(nextAddress)) != rawAddresses.end(); - }); - - addresses.insert(addresses.end(), otherAddresses.begin(), otherAddresses.end()); - - return addresses; - } - - template - std::vector
getAddressesWithPrefix(const DataConfiguration &config, const ScriptAccess &access, const std::string &prefix) { - return access.findMatchingAddresses([&](const auto &nextAddress) { - auto addressString = ScriptAddress(nextAddress.address).addressString(config); - return addressString.compare(0, prefix.length(), prefix) == 0; - }); - } - - std::vector
getAddressesWithPrefix(const DataConfiguration &config, const ScriptAccess &access, const std::string &prefix) { - if (prefix.compare(0, 1, "1") == 0) { - return getAddressesWithPrefix(config, access, prefix); - } else if (prefix.compare(0, 1, "3") == 0) { - return getAddressesWithPrefix(config, access, prefix); - } else { - return std::vector
(); - } - } - size_t addressCount(const ScriptAccess &access) { return access.totalAddressCount(); } diff --git a/src/blocksci/address/address.hpp b/src/blocksci/address/address.hpp index 8d8f63aa..8455df3a 100644 --- a/src/blocksci/address/address.hpp +++ b/src/blocksci/address/address.hpp @@ -23,7 +23,7 @@ namespace blocksci { struct Input; class ScriptAccess; class ChainAccess; - class AddressFirstSeenAccess; + class ScriptFirstSeenAccess; class AddressIndex; struct DataConfiguration; @@ -48,8 +48,8 @@ namespace blocksci { std::string toString() const; - Transaction getFirstTransaction(const ChainAccess &chain, const AddressFirstSeenAccess &scriptsFirstSeen) const; - uint32_t getFirstTransactionIndex(const AddressFirstSeenAccess &access) const; + Transaction getFirstTransaction(const ChainAccess &chain, const ScriptFirstSeenAccess &scriptsFirstSeen) const; + uint32_t getFirstTransactionIndex(const ScriptFirstSeenAccess &access) const; std::unique_ptr