aboutsummaryrefslogtreecommitdiff
path: root/src/cryptonote_basic/miner.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/cryptonote_basic/miner.h')
-rw-r--r--src/cryptonote_basic/miner.h126
1 files changed, 126 insertions, 0 deletions
diff --git a/src/cryptonote_basic/miner.h b/src/cryptonote_basic/miner.h
new file mode 100644
index 000000000..f24f6e960
--- /dev/null
+++ b/src/cryptonote_basic/miner.h
@@ -0,0 +1,126 @@
+// Copyright (c) 2014-2016, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
+
+#pragma once
+
+#include <boost/program_options.hpp>
+#include <atomic>
+#include "cryptonote_basic.h"
+#include "difficulty.h"
+#include "math_helper.h"
+
+
+namespace cryptonote
+{
+
+ struct i_miner_handler
+ {
+ virtual bool handle_block_found(block& b) = 0;
+ virtual bool get_block_template(block& b, const account_public_address& adr, difficulty_type& diffic, uint64_t& height, const blobdata& ex_nonce) = 0;
+ protected:
+ ~i_miner_handler(){};
+ };
+
+ /************************************************************************/
+ /* */
+ /************************************************************************/
+ class miner
+ {
+ public:
+ miner(i_miner_handler* phandler);
+ ~miner();
+ bool init(const boost::program_options::variables_map& vm, bool testnet);
+ static void init_options(boost::program_options::options_description& desc);
+ bool set_block_template(const block& bl, const difficulty_type& diffic, uint64_t height);
+ bool on_block_chain_update();
+ bool start(const account_public_address& adr, size_t threads_count, const boost::thread::attributes& attrs);
+ uint64_t get_speed() const;
+ uint32_t get_threads_count() const;
+ void send_stop_signal();
+ bool stop();
+ bool is_mining() const;
+ const account_public_address& get_mining_address() const;
+ bool on_idle();
+ void on_synchronized();
+ //synchronous analog (for fast calls)
+ static bool find_nonce_for_given_block(block& bl, const difficulty_type& diffic, uint64_t height);
+ void pause();
+ void resume();
+ void do_print_hashrate(bool do_hr);
+
+ private:
+ bool worker_thread();
+ bool request_block_template();
+ void merge_hr();
+
+ struct miner_config
+ {
+ uint64_t current_extra_message_index;
+
+ BEGIN_KV_SERIALIZE_MAP()
+ KV_SERIALIZE(current_extra_message_index)
+ END_KV_SERIALIZE_MAP()
+ };
+
+
+ volatile uint32_t m_stop;
+ epee::critical_section m_template_lock;
+ block m_template;
+ std::atomic<uint32_t> m_template_no;
+ std::atomic<uint32_t> m_starter_nonce;
+ difficulty_type m_diffic;
+ uint64_t m_height;
+ volatile uint32_t m_thread_index;
+ volatile uint32_t m_threads_total;
+ std::atomic<int32_t> m_pausers_count;
+ epee::critical_section m_miners_count_lock;
+
+ std::list<boost::thread> m_threads;
+ epee::critical_section m_threads_lock;
+ i_miner_handler* m_phandler;
+ account_public_address m_mine_address;
+ epee::math_helper::once_a_time_seconds<5> m_update_block_template_interval;
+ epee::math_helper::once_a_time_seconds<2> m_update_merge_hr_interval;
+ std::vector<blobdata> m_extra_messages;
+ miner_config m_config;
+ std::string m_config_folder_path;
+ std::atomic<uint64_t> m_last_hr_merge_time;
+ std::atomic<uint64_t> m_hashes;
+ std::atomic<uint64_t> m_current_hash_rate;
+ epee::critical_section m_last_hash_rates_lock;
+ std::list<uint64_t> m_last_hash_rates;
+ bool m_do_print_hashrate;
+ bool m_do_mining;
+
+ };
+}
+
+
+