Skip to content

Commit

Permalink
cleanup: remove rollback code
Browse files Browse the repository at this point in the history
  • Loading branch information
maltemoeser committed Jun 7, 2020
1 parent 2e698e0 commit e1dab55
Show file tree
Hide file tree
Showing 9 changed files with 31 additions and 208 deletions.
42 changes: 12 additions & 30 deletions src/internal/address_index.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
#include <sstream>

namespace blocksci {

AddressIndex::AddressIndex(const filesystem::path &path, bool readonly) {
rocksdb::Options options;
// Optimize RocksDB. This is the easiest way to get RocksDB to perform well
Expand All @@ -35,7 +35,7 @@ namespace blocksci {
// Create the DB if it's not already present
options.create_if_missing = true;
options.create_missing_column_families = true;


// Initialize RocksDB column families
std::vector<rocksdb::ColumnFamilyDescriptor> columnDescriptors;
Expand All @@ -50,7 +50,7 @@ namespace blocksci {
columnDescriptors.emplace_back(ss.str(), rocksdb::ColumnFamilyOptions{});
});
columnDescriptors.emplace_back(rocksdb::kDefaultColumnFamilyName, rocksdb::ColumnFamilyOptions());

rocksdb::DB *dbPtr;
std::vector<rocksdb::ColumnFamilyHandle *> columnHandlePtrs;
if (readonly) {
Expand All @@ -69,23 +69,23 @@ namespace blocksci {
columnHandles.emplace_back(std::unique_ptr<rocksdb::ColumnFamilyHandle>(handle));
}
}

AddressIndex::~AddressIndex() = default;

void AddressIndex::compactDB() {
for (auto &column : columnHandles) {
db->CompactRange(rocksdb::CompactRangeOptions{}, column.get(), nullptr, nullptr);
}
}

const std::unique_ptr<rocksdb::ColumnFamilyHandle> &AddressIndex::getOutputColumn(AddressType::Enum type) const {
return columnHandles[static_cast<size_t>(type)];
}

const std::unique_ptr<rocksdb::ColumnFamilyHandle> &AddressIndex::getNestedColumn(AddressType::Enum type) const {
return columnHandles[AddressType::size + static_cast<size_t>(type)];
}

ranges::any_view<InoutPointer, ranges::category::forward> AddressIndex::getOutputPointers(const RawAddress &address) const {
auto prefixData = reinterpret_cast<const char *>(&address.scriptNum);
std::vector<char> prefix(prefixData, prefixData + sizeof(address.scriptNum)); // vector with scriptNum bytes
Expand All @@ -94,7 +94,7 @@ namespace blocksci {
InoutPointer outPoint;
uint8_t txNumData[4];
uint8_t outputNumData[2];

auto &key = pair.first; // Query result
key.data += sizeof(uint32_t); // Skip the scriptNum in the key (first 4 bytes), as it is known already
memcpy(txNumData, key.data, 4);
Expand All @@ -105,12 +105,12 @@ namespace blocksci {
return outPoint;
});
}

ranges::any_view<RawAddress> AddressIndex::getIncludingMultisigs(const RawAddress &searchAddress) const {
if (dedupType(searchAddress.type) != DedupAddressType::PUBKEY) {
return {};
}

auto prefixData = reinterpret_cast<const char *>(&searchAddress.scriptNum);
std::vector<char> prefix(prefixData, prefixData + sizeof(searchAddress.scriptNum));
auto rawDedupAddressRange = ColumnIterator(db.get(), getNestedColumn(AddressType::MULTISIG_PUBKEY).get(), prefix);
Expand All @@ -122,7 +122,7 @@ namespace blocksci {
return RawAddress{rawParent.scriptNum, AddressType::MULTISIG};
});
}

void AddressIndex::addNestedAddresses(std::vector<std::pair<blocksci::RawAddress, blocksci::DedupAddress>> nestedCache) {
rocksdb::WriteBatch batch;
for (auto &pair : nestedCache) {
Expand Down Expand Up @@ -161,24 +161,6 @@ namespace blocksci {
}
writeBatch(batch);
}

void AddressIndex::rollback(uint32_t txNum) {
for_each(AddressType::all(), [&](auto type) {
auto &column = getOutputColumn(type);
auto it = getOutputIterator(type);
rocksdb::WriteBatch batch;
for (it->SeekToFirst(); it->Valid(); it->Next()) {
auto key = it->key();
key.remove_prefix(sizeof(uint32_t));
InoutPointer outPoint;
memcpy(&outPoint, key.data(), sizeof(outPoint));
if (outPoint.txNum >= txNum) {
batch.Delete(column.get(), it->key());
}
}
assert(it->status().ok()); // Check for any errors found during the scan
});
}

/**
Retrieve a list of dedup addresses that wrap the address.
Expand Down
2 changes: 0 additions & 2 deletions src/internal/address_index.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,8 +108,6 @@ namespace blocksci {

/** Compact the underlying RocksDB database */
void compactDB();

void rollback(uint32_t txNum);
};
}

Expand Down
34 changes: 0 additions & 34 deletions src/internal/hash_index.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,40 +139,6 @@ namespace blocksci {
addAddresses(type, dataViews);
}

void HashIndex::rollback(uint32_t txCount, const std::array<uint32_t, DedupAddressType::size> &scriptCounts) {
// foreach over all ADDRESS_TYPE_LIST items (= a list of integers from AddressType::Enum)
blocksci::for_each(AddressType::all(), [&](auto tag) {
auto &column = getColumn(tag);
rocksdb::WriteBatch batch;
auto it = getIterator(tag);
for (it->SeekToFirst(); it->Valid(); it->Next()) {
uint32_t destNum;
memcpy(&destNum, it->value().data(), sizeof(destNum));
auto count = scriptCounts[static_cast<size_t>(tag)];
if (destNum >= count) {
batch.Delete(column.get(), it->key());
}
}
assert(it->status().ok());
writeBatch(batch);
});

// Delete all entries with value higher than txCount
{
auto it = getTxIterator();
rocksdb::WriteBatch batch;
for (it->SeekToFirst(); it->Valid(); it->Next()) {
uint32_t value;
memcpy(&value, it->value().data(), sizeof(value));
if (value >= txCount) {
batch.Delete(getTxColumn().get(), it->key());
}
}
writeBatch(batch);
assert(it->status().ok()); // Check for errors found during the scan
}
}

template<AddressType::Enum type>
ranges::any_view<std::pair<uint32_t, typename blocksci::AddressInfo<type>::IDType>> HashIndex::getAddressRange() {
using IDType = typename blocksci::AddressInfo<type>::IDType;
Expand Down
2 changes: 0 additions & 2 deletions src/internal/hash_index.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -176,8 +176,6 @@ namespace blocksci {
/** Add a mapping from tx hash to tx number to the hash index for all given rows */
void addTxes(std::vector<std::pair<uint256, uint32_t>> rows);

void rollback(uint32_t txCount, const std::array<uint32_t, DedupAddressType::size> &scriptCounts);

ranges::any_view<std::pair<MemoryView, MemoryView>> getRawAddressRange(AddressType::Enum type);

template<AddressType::Enum type>
Expand Down
11 changes: 0 additions & 11 deletions tools/parser/address_state.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,17 +66,6 @@ uint32_t AddressState::getNewAddressIndex(blocksci::DedupAddressType::Enum type)
return scriptNum;
}

void AddressState::rollback(const blocksci::State &state) {
blocksci::for_each(multiAddressMaps, [&](auto &multiAddressMap) {
for (auto multiAddressIt = multiAddressMap.begin(); multiAddressIt != multiAddressMap.end(); ++multiAddressIt) {
auto count = state.scriptCounts[static_cast<size_t>(multiAddressMap.type)];
if (multiAddressIt->second >= count) {
multiAddressMap.erase(multiAddressIt);
}
}
});
}

void AddressState::reset(const blocksci::State &state) {
reloadBloomFilters();
scriptIndexes.clear();
Expand Down
3 changes: 0 additions & 3 deletions tools/parser/address_state.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -187,9 +187,6 @@ class AddressState {

uint32_t getNewAddressIndex(blocksci::DedupAddressType::Enum type);

// Called before reseting index
void rollback(const blocksci::State &state);

// Called after resetting index
void reset(const blocksci::State &state);
};
Expand Down
7 changes: 0 additions & 7 deletions tools/parser/address_writer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,10 +124,3 @@ void AddressWriter::serializeInputImp(const ScriptInput<AddressType::WITNESS_UNK
data.add(input.data.script.begin(), input.data.script.end());
file.write<1>(input.scriptNum - 1, data);
}

void AddressWriter::rollback(const blocksci::State &state) {
blocksci::for_each(blocksci::DedupAddressType::all(), [&](auto tag) {
auto &file = std::get<ScriptFile<tag()>>(scriptFiles);
file.truncate(state.scriptCounts[static_cast<size_t>(tag)]);
});
}
30 changes: 14 additions & 16 deletions tools/parser/address_writer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,44 +36,44 @@ struct ScriptFile : public ScriptFileType_t<type> {

class AddressWriter {
using ScriptFilesTuple = blocksci::to_dedup_address_tuple_t<ScriptFile>;

ScriptFilesTuple scriptFiles;

template<blocksci::AddressType::Enum type>
void serializeInputImp(const ScriptInput<type> &, ScriptFile<dedupType(type)> &) {}

void serializeInputImp(const ScriptInput<blocksci::AddressType::PUBKEYHASH> &input, ScriptFile<blocksci::DedupAddressType::PUBKEY> &file);
void serializeInputImp(const ScriptInput<blocksci::AddressType::WITNESS_PUBKEYHASH> &input, ScriptFile<blocksci::DedupAddressType::PUBKEY> &file);
void serializeInputImp(const ScriptInput<blocksci::AddressType::SCRIPTHASH> &input, ScriptFile<blocksci::DedupAddressType::SCRIPTHASH> &file);
void serializeInputImp(const ScriptInput<blocksci::AddressType::WITNESS_SCRIPTHASH> &input, ScriptFile<blocksci::DedupAddressType::SCRIPTHASH> &file);
void serializeInputImp(const ScriptInput<blocksci::AddressType::NONSTANDARD> &input, ScriptFile<blocksci::DedupAddressType::NONSTANDARD> &file);
void serializeInputImp(const ScriptInput<blocksci::AddressType::WITNESS_UNKNOWN> &input, ScriptFile<blocksci::DedupAddressType::WITNESS_UNKNOWN> &file);

template<blocksci::AddressType::Enum type>
void serializeOutputImp(const ScriptOutput<type> &output, ScriptFile<dedupType(type)> &file, bool topLevel) {
auto data = file[output.scriptNum - 1];
data->saw(type, topLevel);
}

void serializeOutputImp(const ScriptOutput<blocksci::AddressType::PUBKEY> &output, ScriptFile<blocksci::DedupAddressType::PUBKEY> &file, bool topLevel);
void serializeOutputImp(const ScriptOutput<blocksci::AddressType::MULTISIG_PUBKEY> &output, ScriptFile<blocksci::DedupAddressType::PUBKEY> &file, bool topLevel);
void serializeOutputImp(const ScriptOutput<blocksci::AddressType::WITNESS_SCRIPTHASH> &output, ScriptFile<blocksci::DedupAddressType::SCRIPTHASH> &file, bool topLevel);
void serializeOutputImp(const ScriptOutput<blocksci::AddressType::NONSTANDARD> &output, ScriptFile<blocksci::DedupAddressType::NONSTANDARD> &file, bool topLevel);
void serializeOutputImp(const ScriptOutput<blocksci::AddressType::WITNESS_UNKNOWN> &output, ScriptFile<blocksci::DedupAddressType::WITNESS_UNKNOWN> &file, bool topLevel);

template<blocksci::AddressType::Enum type>
void serializeWrappedScript(const ScriptInputData<type> &, uint32_t, uint32_t) {}

void serializeWrappedScript(const ScriptInputData<blocksci::AddressType::Enum::SCRIPTHASH> &input, uint32_t txNum, uint32_t outputTxNum);
void serializeWrappedScript(const ScriptInputData<blocksci::AddressType::Enum::WITNESS_SCRIPTHASH> &input, uint32_t txNum, uint32_t outputTxNum);

public:

template <blocksci::DedupAddressType::Enum type>
ScriptFile<type> &getFile() {
return std::get<ScriptFile<type>>(scriptFiles);
}

template <blocksci::DedupAddressType::Enum type>
const ScriptFile<type> &getFile() const {
return std::get<ScriptFile<type>>(scriptFiles);
Expand Down Expand Up @@ -101,7 +101,7 @@ class AddressWriter {
});
return file.size();
}

template<blocksci::AddressType::Enum type>
void serializeExistingOutput(const ScriptOutput<type> &output, bool topLevel) {
assert(!output.isNew);
Expand Down Expand Up @@ -138,15 +138,13 @@ class AddressWriter {
serializeInputImp(input, file);
}
}

void rollback(const blocksci::State &state);


blocksci::OffsetType serializeNewOutput(const AnyScriptOutput &output, uint32_t txNum, bool topLevel);
void serializeExistingOutput(const AnyScriptOutput &output, bool topLevel);

void serializeInput(const AnyScriptInput &input, uint32_t txNum, uint32_t outputTxNum);
void serializeWrappedScript(const AnyScriptInput &input, uint32_t txNum, uint32_t outputTxNum);

AddressWriter(const ParserConfigurationBase &config);
};

Expand Down
Loading

0 comments on commit e1dab55

Please sign in to comment.