aboutsummaryrefslogtreecommitdiff
path: root/src/blockchain_db
diff options
context:
space:
mode:
authormoneromooo-monero <moneromooo-monero@users.noreply.github.com>2017-01-15 16:05:55 +0000
committermoneromooo-monero <moneromooo-monero@users.noreply.github.com>2017-02-13 21:11:37 +0000
commit0288310e3b4e777dd4d120898319192f957996a2 (patch)
tree43faa373110305f0c4809f3c3e8421c5b973801a /src/blockchain_db
parentMerge pull request #1719 (diff)
downloadmonero-0288310e3b4e777dd4d120898319192f957996a2.tar.xz
blockchain_db: add "raw" blobdata getters for block and transaction
This speeds up operations such as serving blocks to syncing peers
Diffstat (limited to 'src/blockchain_db')
-rw-r--r--src/blockchain_db/blockchain_db.cpp39
-rw-r--r--src/blockchain_db/blockchain_db.h50
-rw-r--r--src/blockchain_db/lmdb/db_lmdb.cpp27
-rw-r--r--src/blockchain_db/lmdb/db_lmdb.h10
4 files changed, 90 insertions, 36 deletions
diff --git a/src/blockchain_db/blockchain_db.cpp b/src/blockchain_db/blockchain_db.cpp
index 7ac046bc9..c61a81379 100644
--- a/src/blockchain_db/blockchain_db.cpp
+++ b/src/blockchain_db/blockchain_db.cpp
@@ -200,6 +200,45 @@ void BlockchainDB::remove_transaction(const crypto::hash& tx_hash)
remove_transaction_data(tx_hash, tx);
}
+block BlockchainDB::get_block_from_height(const uint64_t& height) const
+{
+ blobdata bd = get_block_blob_from_height(height);
+ block b;
+ if (!parse_and_validate_block_from_blob(bd, b))
+ throw new DB_ERROR("Failed to parse block from blob retrieved from the db");
+
+ return b;
+}
+
+block BlockchainDB::get_block(const crypto::hash& h) const
+{
+ blobdata bd = get_block_blob(h);
+ block b;
+ if (!parse_and_validate_block_from_blob(bd, b))
+ throw new DB_ERROR("Failed to parse block from blob retrieved from the db");
+
+ return b;
+}
+
+bool BlockchainDB::get_tx(const crypto::hash& h, cryptonote::transaction &tx) const
+{
+ blobdata bd;
+ if (!get_tx_blob(h, bd))
+ return false;
+ if (!parse_and_validate_tx_from_blob(bd, tx))
+ throw new DB_ERROR("Failed to parse transaction from blob retrieved from the db");
+
+ return true;
+}
+
+transaction BlockchainDB::get_tx(const crypto::hash& h) const
+{
+ transaction tx;
+ if (!get_tx(h, tx))
+ throw new TX_DNE(std::string("tx with hash ").append(epee::string_tools::pod_to_hex(h)).append(" not found in db").c_str());
+ return tx;
+}
+
void BlockchainDB::reset_stats()
{
num_calls = 0;
diff --git a/src/blockchain_db/blockchain_db.h b/src/blockchain_db/blockchain_db.h
index 3fdb62a7b..da6738878 100644
--- a/src/blockchain_db/blockchain_db.h
+++ b/src/blockchain_db/blockchain_db.h
@@ -34,6 +34,7 @@
#include <string>
#include <exception>
#include "crypto/hash.h"
+#include "cryptonote_protocol/blobdatatype.h"
#include "cryptonote_basic/cryptonote_basic.h"
#include "cryptonote_basic/difficulty.h"
#include "cryptonote_basic/hardfork.h"
@@ -754,7 +755,20 @@ public:
*
* @return the block requested
*/
- virtual block get_block(const crypto::hash& h) const = 0;
+ virtual cryptonote::blobdata get_block_blob(const crypto::hash& h) const = 0;
+
+ /**
+ * @brief fetches the block with the given hash
+ *
+ * Returns the requested block.
+ *
+ * If the block does not exist, the subclass should throw BLOCK_DNE
+ *
+ * @param h the hash to look for
+ *
+ * @return the block requested
+ */
+ block get_block(const crypto::hash& h) const;
/**
* @brief gets the height of the block with a given hash
@@ -784,7 +798,7 @@ public:
virtual block_header get_block_header(const crypto::hash& h) const = 0;
/**
- * @brief fetch a block by height
+ * @brief fetch a block blob by height
*
* The subclass should return the block at the given height.
*
@@ -793,9 +807,21 @@ public:
*
* @param height the height to look for
*
+ * @return the block blob
+ */
+ virtual cryptonote::blobdata get_block_blob_from_height(const uint64_t& height) const = 0;
+
+ /**
+ * @brief fetch a block by height
+ *
+ * If the block does not exist, that is to say if the blockchain is not
+ * that high, then the subclass should throw BLOCK_DNE
+ *
+ * @param height the height to look for
+ *
* @return the block
*/
- virtual block get_block_from_height(const uint64_t& height) const = 0;
+ block get_block_from_height(const uint64_t& height) const;
/**
* @brief fetch a block's timestamp
@@ -1009,20 +1035,28 @@ public:
/**
* @brief fetches the transaction with the given hash
*
- * The subclass should return the transaction stored which has the given
- * hash.
- *
* If the transaction does not exist, the subclass should throw TX_DNE.
*
* @param h the hash to look for
*
* @return the transaction with the given hash
*/
- virtual transaction get_tx(const crypto::hash& h) const = 0;
+ transaction get_tx(const crypto::hash& h) const;
/**
* @brief fetches the transaction with the given hash
*
+ * If the transaction does not exist, the subclass should return false.
+ *
+ * @param h the hash to look for
+ *
+ * @return true iff the transaction was found
+ */
+ bool get_tx(const crypto::hash& h, transaction &tx) const;
+
+ /**
+ * @brief fetches the transaction blob with the given hash
+ *
* The subclass should return the transaction stored which has the given
* hash.
*
@@ -1032,7 +1066,7 @@ public:
*
* @return true iff the transaction was found
*/
- virtual bool get_tx(const crypto::hash& h, transaction &tx) const = 0;
+ virtual bool get_tx_blob(const crypto::hash& h, cryptonote::blobdata &tx) const = 0;
/**
* @brief fetches the total number of transactions ever
diff --git a/src/blockchain_db/lmdb/db_lmdb.cpp b/src/blockchain_db/lmdb/db_lmdb.cpp
index 0a35325e4..508b546c7 100644
--- a/src/blockchain_db/lmdb/db_lmdb.cpp
+++ b/src/blockchain_db/lmdb/db_lmdb.cpp
@@ -1429,12 +1429,12 @@ bool BlockchainLMDB::block_exists(const crypto::hash& h, uint64_t *height) const
return ret;
}
-block BlockchainLMDB::get_block(const crypto::hash& h) const
+cryptonote::blobdata BlockchainLMDB::get_block_blob(const crypto::hash& h) const
{
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
check_open();
- return get_block_from_height(get_block_height(h));
+ return get_block_blob_from_height(get_block_height(h));
}
uint64_t BlockchainLMDB::get_block_height(const crypto::hash& h) const
@@ -1467,7 +1467,7 @@ block_header BlockchainLMDB::get_block_header(const crypto::hash& h) const
return get_block(h);
}
-block BlockchainLMDB::get_block_from_height(const uint64_t& height) const
+cryptonote::blobdata BlockchainLMDB::get_block_blob_from_height(const uint64_t& height) const
{
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
check_open();
@@ -1488,13 +1488,9 @@ block BlockchainLMDB::get_block_from_height(const uint64_t& height) const
blobdata bd;
bd.assign(reinterpret_cast<char*>(result.mv_data), result.mv_size);
- block b;
- if (!parse_and_validate_block_from_blob(bd, b))
- throw0(DB_ERROR("Failed to parse block from blob retrieved from the db"));
-
TXN_POSTFIX_RDONLY();
- return b;
+ return bd;
}
uint64_t BlockchainLMDB::get_block_timestamp(const uint64_t& height) const
@@ -1809,7 +1805,7 @@ uint64_t BlockchainLMDB::get_tx_unlock_time(const crypto::hash& h) const
return ret;
}
-bool BlockchainLMDB::get_tx(const crypto::hash& h, transaction &tx) const
+bool BlockchainLMDB::get_tx_blob(const crypto::hash& h, cryptonote::blobdata &bd) const
{
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
check_open();
@@ -1832,26 +1828,13 @@ bool BlockchainLMDB::get_tx(const crypto::hash& h, transaction &tx) const
else if (get_result)
throw0(DB_ERROR(lmdb_error("DB error attempting to fetch tx from hash", get_result).c_str()));
- blobdata bd;
bd.assign(reinterpret_cast<char*>(result.mv_data), result.mv_size);
- if (!parse_and_validate_tx_from_blob(bd, tx))
- throw0(DB_ERROR("Failed to parse tx from blob retrieved from the db"));
-
TXN_POSTFIX_RDONLY();
return true;
}
-transaction BlockchainLMDB::get_tx(const crypto::hash& h) const
-{
- transaction tx;
-
- if (!get_tx(h, tx))
- throw1(TX_DNE(std::string("tx with hash ").append(epee::string_tools::pod_to_hex(h)).append(" not found in db").c_str()));
- return tx;
-}
-
uint64_t BlockchainLMDB::get_tx_count() const
{
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
diff --git a/src/blockchain_db/lmdb/db_lmdb.h b/src/blockchain_db/lmdb/db_lmdb.h
index e7faf8cdc..13d1ecf38 100644
--- a/src/blockchain_db/lmdb/db_lmdb.h
+++ b/src/blockchain_db/lmdb/db_lmdb.h
@@ -170,13 +170,13 @@ public:
virtual bool block_exists(const crypto::hash& h, uint64_t *height = NULL) const;
- virtual block get_block(const crypto::hash& h) const;
-
virtual uint64_t get_block_height(const crypto::hash& h) const;
virtual block_header get_block_header(const crypto::hash& h) const;
- virtual block get_block_from_height(const uint64_t& height) const;
+ virtual cryptonote::blobdata get_block_blob(const crypto::hash& h) const;
+
+ virtual cryptonote::blobdata get_block_blob_from_height(const uint64_t& height) const;
virtual uint64_t get_block_timestamp(const uint64_t& height) const;
@@ -207,9 +207,7 @@ public:
virtual uint64_t get_tx_unlock_time(const crypto::hash& h) const;
- virtual transaction get_tx(const crypto::hash& h) const;
-
- virtual bool get_tx(const crypto::hash& h, transaction &tx) const;
+ virtual bool get_tx_blob(const crypto::hash& h, cryptonote::blobdata &tx) const;
virtual uint64_t get_tx_count() const;