mirror of
https://git.wownero.com/wownero/onion-wownero-blockchain-explorer.git
synced 2024-08-15 00:33:12 +00:00
std::thread changed to boost::thread and the emission refactored
This commit is contained in:
parent
7b9ee5732d
commit
c45abcba1b
5 changed files with 75 additions and 76 deletions
|
@ -212,8 +212,8 @@ disabled. To enable it use `--enable-emission-monitor` flag, e.g.,
|
||||||
xmrblocks --enable-emission-monitor
|
xmrblocks --enable-emission-monitor
|
||||||
```
|
```
|
||||||
|
|
||||||
This flag will enable emission monitoring thread. When first started, the thread
|
This flag will enable emission monitoring thread. When started, the thread
|
||||||
will scan entire blockchain, and calculate the emission based on each block.
|
will initially scan the entire blockchain, and calculate the cumulative emission based on each block.
|
||||||
Since it is a separate thread, the explorer will work as usual during this time.
|
Since it is a separate thread, the explorer will work as usual during this time.
|
||||||
Every 10000 blocks, the thread will save current emission in a file, by default,
|
Every 10000 blocks, the thread will save current emission in a file, by default,
|
||||||
in `~/.bitmonero/lmdb/emission_amount.txt`. This file is used so that we don't
|
in `~/.bitmonero/lmdb/emission_amount.txt`. This file is used so that we don't
|
||||||
|
@ -221,15 +221,16 @@ Every 10000 blocks, the thread will save current emission in a file, by default,
|
||||||
explorer restarts, the thread will first check if `~/.bitmonero/lmdb/emission_amount.txt`
|
explorer restarts, the thread will first check if `~/.bitmonero/lmdb/emission_amount.txt`
|
||||||
is present, read its values, and continue from there if possible. Subsequently, only the initial
|
is present, read its values, and continue from there if possible. Subsequently, only the initial
|
||||||
use of the tread is time consuming. Once the thread scans the entire blockchain, it updates
|
use of the tread is time consuming. Once the thread scans the entire blockchain, it updates
|
||||||
the emission with new blocks as they come.
|
the emission amount using new blocks as they come.
|
||||||
|
|
||||||
When the emission monitor is enabled, information about current emission of coinbase and fees is
|
When the emission monitor is enabled, information about current emission of coinbase and fees is
|
||||||
displied on the front page, e.g., :
|
displayed on the front page, e.g., :
|
||||||
|
|
||||||
```
|
```
|
||||||
Monero emission (fees) is 14485540.430 (52545.373) as of 1313448 block
|
Monero emission (fees) is 14485540.430 (52545.373) as of 1313448 block
|
||||||
```
|
```
|
||||||
|
|
||||||
|
To disable the monitor, simply restart the explorer without `--enable-emission-monitor` flag.
|
||||||
|
|
||||||
## Enable SSL (https)
|
## Enable SSL (https)
|
||||||
|
|
||||||
|
|
38
main.cpp
38
main.cpp
|
@ -17,7 +17,8 @@ namespace myxmr
|
||||||
{
|
{
|
||||||
struct jsonresponse: crow::response
|
struct jsonresponse: crow::response
|
||||||
{
|
{
|
||||||
jsonresponse(const nlohmann::json& _body) : crow::response {_body.dump()}
|
jsonresponse(const nlohmann::json& _body)
|
||||||
|
: crow::response {_body.dump()}
|
||||||
{
|
{
|
||||||
add_header("Access-Control-Allow-Origin", "*");
|
add_header("Access-Control-Allow-Origin", "*");
|
||||||
add_header("Access-Control-Allow-Headers", "Content-Type");
|
add_header("Access-Control-Allow-Headers", "Content-Type");
|
||||||
|
@ -26,21 +27,9 @@ struct jsonresponse: crow::response
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
class ExitHandler
|
int
|
||||||
|
main(int ac, const char* av[])
|
||||||
{
|
{
|
||||||
public:
|
|
||||||
void exit() { exitHandler(0); }
|
|
||||||
static void exitHandler(int) { s_shouldExit = true; }
|
|
||||||
bool shouldExit() const { return s_shouldExit; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
static bool s_shouldExit;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool ExitHandler::s_shouldExit = false;
|
|
||||||
|
|
||||||
int main(int ac, const char* av[]) {
|
|
||||||
|
|
||||||
// get command line options
|
// get command line options
|
||||||
xmreg::CmdLineOptions opts {ac, av};
|
xmreg::CmdLineOptions opts {ac, av};
|
||||||
|
|
||||||
|
@ -185,12 +174,8 @@ int main(int ac, const char* av[]) {
|
||||||
= testnet;
|
= testnet;
|
||||||
xmreg::CurrentBlockchainStatus::deamon_url
|
xmreg::CurrentBlockchainStatus::deamon_url
|
||||||
= deamon_url;
|
= deamon_url;
|
||||||
|
xmreg::CurrentBlockchainStatus::set_blockchain_variables(
|
||||||
if (!xmreg::CurrentBlockchainStatus::init_monero_blockchain())
|
&mcore, core_storage);
|
||||||
{
|
|
||||||
cerr << "Error accessing blockchain from CurrentBlockchainStatus." << endl;
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// launch the status monitoring thread so that it keeps track of blockchain
|
// launch the status monitoring thread so that it keeps track of blockchain
|
||||||
// info, e.g., current height. Information from this thread is used
|
// info, e.g., current height. Information from this thread is used
|
||||||
|
@ -551,5 +536,16 @@ int main(int ac, const char* av[]) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (enable_emission_monitor == true)
|
||||||
|
{
|
||||||
|
// finish Emission monitoring thread in a cotrolled manner.
|
||||||
|
xmreg::CurrentBlockchainStatus::m_thread.interrupt();
|
||||||
|
xmreg::CurrentBlockchainStatus::m_thread.join();
|
||||||
|
|
||||||
|
cout << "Emission monitoring thread joined." << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
cout << "The explorer is terminating." << endl;
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,27 +11,12 @@ using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool
|
void
|
||||||
CurrentBlockchainStatus::init_monero_blockchain()
|
CurrentBlockchainStatus::set_blockchain_variables(MicroCore* _mcore,
|
||||||
|
Blockchain* _core_storage)
|
||||||
{
|
{
|
||||||
// set monero log output level
|
mcore = _mcore;
|
||||||
uint32_t log_level = 0;
|
core_storage =_core_storage;
|
||||||
mlog_configure(mlog_get_default_log_path(""), true);
|
|
||||||
|
|
||||||
mcore = unique_ptr<xmreg::MicroCore>(new xmreg::MicroCore{});
|
|
||||||
|
|
||||||
// initialize the core using the blockchain path
|
|
||||||
if (!mcore->init(blockchain_path.string()))
|
|
||||||
{
|
|
||||||
cerr << "Error accessing blockchain." << endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// get the high level Blockchain object to interact
|
|
||||||
// with the blockchain lmdb database
|
|
||||||
core_storage = &(mcore->get_core());
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -62,7 +47,9 @@ CurrentBlockchainStatus::start_monitor_blockchain_thread()
|
||||||
|
|
||||||
if (!is_running)
|
if (!is_running)
|
||||||
{
|
{
|
||||||
m_thread = std::thread{[]()
|
m_thread = boost::thread{[]()
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
|
@ -70,23 +57,40 @@ CurrentBlockchainStatus::start_monitor_blockchain_thread()
|
||||||
|
|
||||||
current_height = core_storage->get_current_blockchain_height();
|
current_height = core_storage->get_current_blockchain_height();
|
||||||
|
|
||||||
|
// scan 10000 blocks for emissiom or if we are at the top of
|
||||||
|
// the blockchain, only few top blocks
|
||||||
update_current_emission_amount();
|
update_current_emission_amount();
|
||||||
|
|
||||||
|
cout << "current emission: " << string(current_emission) << endl;
|
||||||
|
|
||||||
save_current_emission_amount();
|
save_current_emission_amount();
|
||||||
|
|
||||||
if (current_emission.blk_no < current_height - blockchain_chunk_size)
|
if (current_emission.blk_no < current_height - blockchain_chunk_size)
|
||||||
{
|
{
|
||||||
std::this_thread::sleep_for(std::chrono::seconds(1));
|
// while we scan the blockchain from scrach, every 10000
|
||||||
|
// blocks take 1 second break
|
||||||
|
boost::this_thread::sleep_for(boost::chrono::seconds(1));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::this_thread::sleep_for(std::chrono::seconds(60));
|
// when we reach top of the blockchain, update
|
||||||
|
// the emission amount every minute.
|
||||||
|
boost::this_thread::sleep_for(boost::chrono::seconds(60));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // while (true)
|
||||||
}
|
}
|
||||||
}};
|
catch (boost::thread_interrupted&)
|
||||||
|
{
|
||||||
|
cout << "Emission monitoring thread interrupted." << endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}}; // m_thread = boost::thread{[]()
|
||||||
|
|
||||||
is_running = true;
|
is_running = true;
|
||||||
}
|
|
||||||
|
} // if (!is_running)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -117,8 +121,6 @@ CurrentBlockchainStatus::update_current_emission_amount()
|
||||||
current_emission.blk_no = emission_calculated.blk_no;
|
current_emission.blk_no = emission_calculated.blk_no;
|
||||||
|
|
||||||
total_emission_atomic = current_emission;
|
total_emission_atomic = current_emission;
|
||||||
|
|
||||||
cout << "total emission: " << string(current_emission) << endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CurrentBlockchainStatus::Emission
|
CurrentBlockchainStatus::Emission
|
||||||
|
@ -311,11 +313,10 @@ atomic<uint64_t> CurrentBlockchainStatus::current_height {0};
|
||||||
|
|
||||||
atomic<CurrentBlockchainStatus::Emission> CurrentBlockchainStatus::total_emission_atomic;
|
atomic<CurrentBlockchainStatus::Emission> CurrentBlockchainStatus::total_emission_atomic;
|
||||||
|
|
||||||
std::thread CurrentBlockchainStatus::m_thread;
|
boost::thread CurrentBlockchainStatus::m_thread;
|
||||||
|
|
||||||
atomic<bool> CurrentBlockchainStatus::is_running {false};
|
atomic<bool> CurrentBlockchainStatus::is_running {false};
|
||||||
|
|
||||||
cryptonote::Blockchain* CurrentBlockchainStatus::core_storage;
|
Blockchain* CurrentBlockchainStatus::core_storage {nullptr};
|
||||||
unique_ptr<xmreg::MicroCore> CurrentBlockchainStatus::mcore;
|
xmreg::MicroCore* CurrentBlockchainStatus::mcore {nullptr};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,20 +72,20 @@ struct CurrentBlockchainStatus
|
||||||
static atomic<Emission> total_emission_atomic;
|
static atomic<Emission> total_emission_atomic;
|
||||||
|
|
||||||
|
|
||||||
static std::thread m_thread;
|
static boost::thread m_thread;
|
||||||
|
|
||||||
static atomic<bool> is_running;
|
static atomic<bool> is_running;
|
||||||
|
|
||||||
// make object for accessing the blockchain here
|
// make object for accessing the blockchain here
|
||||||
static unique_ptr<xmreg::MicroCore> mcore;
|
static MicroCore* mcore;
|
||||||
|
static Blockchain* core_storage;
|
||||||
static cryptonote::Blockchain *core_storage;
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
start_monitor_blockchain_thread();
|
start_monitor_blockchain_thread();
|
||||||
|
|
||||||
static bool
|
static void
|
||||||
init_monero_blockchain();
|
set_blockchain_variables(MicroCore* _mcore,
|
||||||
|
Blockchain* _core_storage);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_current_emission_amount();
|
update_current_emission_amount();
|
||||||
|
|
|
@ -327,6 +327,7 @@ MicroCore::get_blk_timestamp(uint64_t blk_height)
|
||||||
*/
|
*/
|
||||||
MicroCore::~MicroCore()
|
MicroCore::~MicroCore()
|
||||||
{
|
{
|
||||||
|
m_blockchain_storage.get_db().close();
|
||||||
delete &m_blockchain_storage.get_db();
|
delete &m_blockchain_storage.get_db();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue