2017-04-17 19:55:43 +02:00
|
|
|
// Copyright (c) 2018 The Bitcoin Core developers
|
|
|
|
// Distributed under the MIT software license, see the accompanying
|
|
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
|
2020-10-01 16:05:57 +02:00
|
|
|
#ifndef BITCOIN_INTERFACES_NODE_H
|
|
|
|
#define BITCOIN_INTERFACES_NODE_H
|
2017-04-17 19:55:43 +02:00
|
|
|
|
2017-04-18 00:56:44 +02:00
|
|
|
#include <amount.h> // For CAmount
|
2017-04-17 21:37:36 +02:00
|
|
|
#include <net.h> // For CConnman::NumConnections
|
2019-11-04 13:18:19 +01:00
|
|
|
#include <net_types.h> // For banmap_t
|
2017-04-17 20:23:14 +02:00
|
|
|
#include <netaddress.h> // For Network
|
2019-06-21 16:13:15 +02:00
|
|
|
#include <support/allocators/secure.h> // For SecureString
|
2022-04-16 08:24:42 +02:00
|
|
|
#include <uint256.h>
|
2017-04-17 20:23:14 +02:00
|
|
|
|
2017-04-17 19:55:43 +02:00
|
|
|
#include <functional>
|
|
|
|
#include <memory>
|
2017-04-17 21:37:36 +02:00
|
|
|
#include <stddef.h>
|
|
|
|
#include <stdint.h>
|
2017-04-17 19:55:43 +02:00
|
|
|
#include <string>
|
2017-04-17 21:57:19 +02:00
|
|
|
#include <tuple>
|
|
|
|
#include <vector>
|
2017-04-17 19:55:43 +02:00
|
|
|
|
2019-01-21 18:45:59 +01:00
|
|
|
class BanMan;
|
fix: possible assert call if nHeight in CDeterministicMNList is higher then Tip (#5590)
## Issue being fixed or feature implemented
fix: possible assert call if nHeight in CDeterministicMNListDiff is
higher than Tip
Example of new log:
```
2023-09-28T17:35:50Z GetProjectedMNPayeesAtChainTip WARNING pindex is nullptr due to height=914160 chain height=914159
```
instead assert call:
```
...
#6 0x00007ffff7a33b86 in __assert_fail (assertion=0x55555783afd2 "pindex", file=0x5555577f2ed8 "llmq/utils.cpp", line=730,
function=0x5555577f2448 "bool llmq::utils::IsMNRewardReallocationActive(const CBlockIndex*)") at ./assert/assert.c:101
#7 0x0000555555ab7daf in llmq::utils::IsMNRewardReallocationActive (pindex=<optimized out>) at llmq/utils.cpp:730
#8 0x00005555559458ad in CDeterministicMNList::GetProjectedMNPayees (this=this@entry=0x7fffffffc690, pindex=0x0, nCount=<optimized out>, nCount@entry=2147483647)
at evo/deterministicmns.cpp:231
#9 0x000055555594614f in CDeterministicMNList::GetProjectedMNPayeesAtChainTip (this=this@entry=0x7fffffffc690, nCount=nCount@entry=2147483647) at evo/deterministicmns.cpp:216
#10 0x00005555558c9f51 in MasternodeList::updateDIP3List (this=this@entry=0x55555908cfd0) at qt/masternodelist.cpp:194
#11 0x00005555558ca9a0 in MasternodeList::updateDIP3ListScheduled (this=0x55555908cfd0) at qt/masternodelist.cpp:157
#12 0x000055555684a60f in void doActivate<false>(QObject*, int, void**) ()
#13 0x00005555568525b1 in QTimer::timerEvent(QTimerEvent*) ()
#14 0x0000555556844ce5 in QObject::event(QEvent*) ()
#15 0x0000555556ac3252 in QApplicationPrivate::notify_helper(QObject*, QEvent*) ()
#16 0x000055555681e6b8 in QCoreApplication::sendEvent(QObject*, QEvent*) ()
#17 0x000055555686de2a in QTimerInfoList::activateTimers() ()
#18 0x000055555686be84 in QEventDispatcherUNIX::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) ()
#19 0x00005555569bf8a2 in QXcbUnixEventDispatcher::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) ()
#20 0x000055555681caf6 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) ()
#21 0x0000555556825f8a in QCoreApplication::exec() ()
...
```
## What was done?
ClientModel returns now a pair: MNList and CBlockIndex; so, we always
know the which one has been used even if current chain is switched.
## How Has This Been Tested?
Run on my localhost from `c034ff0c2606142ba3e8894bc74f693b87374e5c` -
aborted with backtrace like above.
With both of commit - no assert more.
## Breaking Changes
N/A
## Checklist:
- [x] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have added or updated relevant unit/integration/functional/e2e
tests
- [ ] I have made corresponding changes to the documentation
- [x] I have assigned this pull request to a milestone
---------
Co-authored-by: UdjinM6 <UdjinM6@users.noreply.github.com>
2023-10-28 02:53:27 +02:00
|
|
|
class CBlockIndex;
|
2017-04-18 01:46:08 +02:00
|
|
|
class CCoinControl;
|
2017-04-17 21:37:36 +02:00
|
|
|
class CDeterministicMNList;
|
2017-04-18 01:46:08 +02:00
|
|
|
class CFeeRate;
|
Qt: Adds Governance tab (#4351)
* Qt: Adds settings option to showGovernanceTab
* Qt: Adds not-yet-functional Governance tab to UI
* library: adds hook into governance rom node interface
* Qt: WIP: puts CGovernanceObject hashes on Governance tab
WIP: basically ready to be filled out, most of the infra in place
now.
* Qt: Populates Governance table values
Governance table now contains real values for current columns. Display
columns may potentially change.
- want url in table if right click option opens url?
- What set of cols wanted? Show yes/no votes?
- Decide refresh functionality.
- Do we even want filter func? (checkbox show: proposal, trigger, active coming)
* qt: Shows Voting Status on Governance page
Towards DMT like Governance page, now shows voting status, but needs to
look at super blocks to determine if proposal period has passed and show
final funded or unfunded for past proposals.
* Qt: refactor governance tab to use Model-View arch
Refactors the QT Governance tab to use a Model-View architecture. The
list of Proposals is stored in a QAbstractItemModel, and a QTableView is
used to display.
This makes a much cleaner separation of concerns in the implementation.
Also, can now use the QSortFilterProxyModel to get responsive filtering.
Less internal state inside the GovernanceList, critical sections
removed.
- Needs update loop implemented.
- Needs Proposal detail widget implemented.
* qt: adds periodic update to gov proposal list
Periodically update list of governance related proposals.
* qt: populates governancelist voting status column
* qt: governancelist Porposal shows extra info on doubleClick
* qt: governancelist: reorder .cpp impl to match .h
* qt: governancelist: fixup based on CI
- Adds LOCK(cs_main) for call to pGovObj->IsValidLocally.
- retab, removes trailing whitespace in governancelist.{cpp,h}
* qt: clang-format for governancelist
* Fixes
- drop unused include
- use proper univalue "get_" functions
- shorter/translatable statuses
- shorter dates
- add missing css styles
* qt: addresses governancelist code review items
* qt: use enum to name columns of governancelist
* fix: clear context menu before adding new items
* fix: skip potential nullptr proposals
* improve: show proposal url in context menu
* refactor: tweak enum name, make sure it's int starting from 0, use full name
* fix: column count
* improve: make it sortable, sort by start_date by default
* qt: use full col name in voting status col change signal emit
* better sorting
* use mapToSource to fix data fetching
Co-authored-by: UdjinM6 <UdjinM6@users.noreply.github.com>
2021-10-30 03:14:25 +02:00
|
|
|
class CGovernanceObject;
|
2017-04-17 21:57:19 +02:00
|
|
|
class CNodeStats;
|
2017-04-18 22:42:30 +02:00
|
|
|
class Coin;
|
2017-04-17 22:38:51 +02:00
|
|
|
class RPCTimerInterface;
|
|
|
|
class UniValue;
|
2017-04-17 20:23:14 +02:00
|
|
|
class proxyType;
|
2022-04-07 06:43:16 +02:00
|
|
|
struct bilingual_str;
|
2020-08-31 10:10:52 +02:00
|
|
|
enum class SynchronizationState;
|
2017-04-17 21:57:19 +02:00
|
|
|
struct CNodeStateStats;
|
2022-04-05 11:09:41 +02:00
|
|
|
struct NodeContext;
|
2017-04-17 20:23:14 +02:00
|
|
|
|
2020-10-01 16:05:57 +02:00
|
|
|
namespace interfaces {
|
2017-04-17 19:55:43 +02:00
|
|
|
class Handler;
|
2023-08-24 10:10:24 +02:00
|
|
|
class WalletLoader;
|
2023-04-10 21:16:08 +02:00
|
|
|
struct BlockTip;
|
2017-04-17 19:55:43 +02:00
|
|
|
|
2020-08-28 02:50:50 +02:00
|
|
|
//! Interface for the src/evo part of a dash node (dashd process).
|
|
|
|
class EVO
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
virtual ~EVO() {}
|
fix: possible assert call if nHeight in CDeterministicMNList is higher then Tip (#5590)
## Issue being fixed or feature implemented
fix: possible assert call if nHeight in CDeterministicMNListDiff is
higher than Tip
Example of new log:
```
2023-09-28T17:35:50Z GetProjectedMNPayeesAtChainTip WARNING pindex is nullptr due to height=914160 chain height=914159
```
instead assert call:
```
...
#6 0x00007ffff7a33b86 in __assert_fail (assertion=0x55555783afd2 "pindex", file=0x5555577f2ed8 "llmq/utils.cpp", line=730,
function=0x5555577f2448 "bool llmq::utils::IsMNRewardReallocationActive(const CBlockIndex*)") at ./assert/assert.c:101
#7 0x0000555555ab7daf in llmq::utils::IsMNRewardReallocationActive (pindex=<optimized out>) at llmq/utils.cpp:730
#8 0x00005555559458ad in CDeterministicMNList::GetProjectedMNPayees (this=this@entry=0x7fffffffc690, pindex=0x0, nCount=<optimized out>, nCount@entry=2147483647)
at evo/deterministicmns.cpp:231
#9 0x000055555594614f in CDeterministicMNList::GetProjectedMNPayeesAtChainTip (this=this@entry=0x7fffffffc690, nCount=nCount@entry=2147483647) at evo/deterministicmns.cpp:216
#10 0x00005555558c9f51 in MasternodeList::updateDIP3List (this=this@entry=0x55555908cfd0) at qt/masternodelist.cpp:194
#11 0x00005555558ca9a0 in MasternodeList::updateDIP3ListScheduled (this=0x55555908cfd0) at qt/masternodelist.cpp:157
#12 0x000055555684a60f in void doActivate<false>(QObject*, int, void**) ()
#13 0x00005555568525b1 in QTimer::timerEvent(QTimerEvent*) ()
#14 0x0000555556844ce5 in QObject::event(QEvent*) ()
#15 0x0000555556ac3252 in QApplicationPrivate::notify_helper(QObject*, QEvent*) ()
#16 0x000055555681e6b8 in QCoreApplication::sendEvent(QObject*, QEvent*) ()
#17 0x000055555686de2a in QTimerInfoList::activateTimers() ()
#18 0x000055555686be84 in QEventDispatcherUNIX::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) ()
#19 0x00005555569bf8a2 in QXcbUnixEventDispatcher::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) ()
#20 0x000055555681caf6 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) ()
#21 0x0000555556825f8a in QCoreApplication::exec() ()
...
```
## What was done?
ClientModel returns now a pair: MNList and CBlockIndex; so, we always
know the which one has been used even if current chain is switched.
## How Has This Been Tested?
Run on my localhost from `c034ff0c2606142ba3e8894bc74f693b87374e5c` -
aborted with backtrace like above.
With both of commit - no assert more.
## Breaking Changes
N/A
## Checklist:
- [x] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have added or updated relevant unit/integration/functional/e2e
tests
- [ ] I have made corresponding changes to the documentation
- [x] I have assigned this pull request to a milestone
---------
Co-authored-by: UdjinM6 <UdjinM6@users.noreply.github.com>
2023-10-28 02:53:27 +02:00
|
|
|
virtual std::pair<CDeterministicMNList, const CBlockIndex*> getListAtChainTip() = 0;
|
2020-08-28 02:50:50 +02:00
|
|
|
};
|
|
|
|
|
Qt: Adds Governance tab (#4351)
* Qt: Adds settings option to showGovernanceTab
* Qt: Adds not-yet-functional Governance tab to UI
* library: adds hook into governance rom node interface
* Qt: WIP: puts CGovernanceObject hashes on Governance tab
WIP: basically ready to be filled out, most of the infra in place
now.
* Qt: Populates Governance table values
Governance table now contains real values for current columns. Display
columns may potentially change.
- want url in table if right click option opens url?
- What set of cols wanted? Show yes/no votes?
- Decide refresh functionality.
- Do we even want filter func? (checkbox show: proposal, trigger, active coming)
* qt: Shows Voting Status on Governance page
Towards DMT like Governance page, now shows voting status, but needs to
look at super blocks to determine if proposal period has passed and show
final funded or unfunded for past proposals.
* Qt: refactor governance tab to use Model-View arch
Refactors the QT Governance tab to use a Model-View architecture. The
list of Proposals is stored in a QAbstractItemModel, and a QTableView is
used to display.
This makes a much cleaner separation of concerns in the implementation.
Also, can now use the QSortFilterProxyModel to get responsive filtering.
Less internal state inside the GovernanceList, critical sections
removed.
- Needs update loop implemented.
- Needs Proposal detail widget implemented.
* qt: adds periodic update to gov proposal list
Periodically update list of governance related proposals.
* qt: populates governancelist voting status column
* qt: governancelist Porposal shows extra info on doubleClick
* qt: governancelist: reorder .cpp impl to match .h
* qt: governancelist: fixup based on CI
- Adds LOCK(cs_main) for call to pGovObj->IsValidLocally.
- retab, removes trailing whitespace in governancelist.{cpp,h}
* qt: clang-format for governancelist
* Fixes
- drop unused include
- use proper univalue "get_" functions
- shorter/translatable statuses
- shorter dates
- add missing css styles
* qt: addresses governancelist code review items
* qt: use enum to name columns of governancelist
* fix: clear context menu before adding new items
* fix: skip potential nullptr proposals
* improve: show proposal url in context menu
* refactor: tweak enum name, make sure it's int starting from 0, use full name
* fix: column count
* improve: make it sortable, sort by start_date by default
* qt: use full col name in voting status col change signal emit
* better sorting
* use mapToSource to fix data fetching
Co-authored-by: UdjinM6 <UdjinM6@users.noreply.github.com>
2021-10-30 03:14:25 +02:00
|
|
|
//! Interface for the src/governance part of a dash node (dashd process).
|
|
|
|
class GOV
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
virtual ~GOV() {}
|
2022-08-26 23:52:53 +02:00
|
|
|
virtual void getAllNewerThan(std::vector<CGovernanceObject> &objs, int64_t nMoreThanTime) = 0;
|
Qt: Adds Governance tab (#4351)
* Qt: Adds settings option to showGovernanceTab
* Qt: Adds not-yet-functional Governance tab to UI
* library: adds hook into governance rom node interface
* Qt: WIP: puts CGovernanceObject hashes on Governance tab
WIP: basically ready to be filled out, most of the infra in place
now.
* Qt: Populates Governance table values
Governance table now contains real values for current columns. Display
columns may potentially change.
- want url in table if right click option opens url?
- What set of cols wanted? Show yes/no votes?
- Decide refresh functionality.
- Do we even want filter func? (checkbox show: proposal, trigger, active coming)
* qt: Shows Voting Status on Governance page
Towards DMT like Governance page, now shows voting status, but needs to
look at super blocks to determine if proposal period has passed and show
final funded or unfunded for past proposals.
* Qt: refactor governance tab to use Model-View arch
Refactors the QT Governance tab to use a Model-View architecture. The
list of Proposals is stored in a QAbstractItemModel, and a QTableView is
used to display.
This makes a much cleaner separation of concerns in the implementation.
Also, can now use the QSortFilterProxyModel to get responsive filtering.
Less internal state inside the GovernanceList, critical sections
removed.
- Needs update loop implemented.
- Needs Proposal detail widget implemented.
* qt: adds periodic update to gov proposal list
Periodically update list of governance related proposals.
* qt: populates governancelist voting status column
* qt: governancelist Porposal shows extra info on doubleClick
* qt: governancelist: reorder .cpp impl to match .h
* qt: governancelist: fixup based on CI
- Adds LOCK(cs_main) for call to pGovObj->IsValidLocally.
- retab, removes trailing whitespace in governancelist.{cpp,h}
* qt: clang-format for governancelist
* Fixes
- drop unused include
- use proper univalue "get_" functions
- shorter/translatable statuses
- shorter dates
- add missing css styles
* qt: addresses governancelist code review items
* qt: use enum to name columns of governancelist
* fix: clear context menu before adding new items
* fix: skip potential nullptr proposals
* improve: show proposal url in context menu
* refactor: tweak enum name, make sure it's int starting from 0, use full name
* fix: column count
* improve: make it sortable, sort by start_date by default
* qt: use full col name in voting status col change signal emit
* better sorting
* use mapToSource to fix data fetching
Co-authored-by: UdjinM6 <UdjinM6@users.noreply.github.com>
2021-10-30 03:14:25 +02:00
|
|
|
};
|
|
|
|
|
2020-08-28 02:56:07 +02:00
|
|
|
//! Interface for the src/llmq part of a dash node (dashd process).
|
|
|
|
class LLMQ
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
virtual ~LLMQ() {}
|
|
|
|
virtual size_t getInstantSentLockCount() = 0;
|
|
|
|
};
|
|
|
|
|
2020-08-28 01:41:57 +02:00
|
|
|
//! Interface for the src/masternode part of a dash node (dashd process).
|
|
|
|
namespace Masternode
|
|
|
|
{
|
|
|
|
class Sync
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
virtual ~Sync() {}
|
|
|
|
virtual bool isBlockchainSynced() = 0;
|
|
|
|
virtual bool isSynced() = 0;
|
|
|
|
virtual std::string getSyncStatus() = 0;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2021-03-17 23:36:11 +01:00
|
|
|
namespace CoinJoin {
|
|
|
|
//! Interface for the global coinjoin options in src/coinjoin
|
2020-08-28 11:52:00 +02:00
|
|
|
class Options
|
|
|
|
{
|
|
|
|
public:
|
2023-09-05 03:34:35 +02:00
|
|
|
virtual int getSessions() = 0;
|
2020-08-28 11:52:00 +02:00
|
|
|
virtual int getRounds() = 0;
|
|
|
|
virtual int getAmount() = 0;
|
2023-09-05 03:34:35 +02:00
|
|
|
virtual int getDenomsGoal() = 0;
|
|
|
|
virtual int getDenomsHardCap() = 0;
|
2020-08-28 11:52:00 +02:00
|
|
|
|
|
|
|
virtual void setEnabled(bool fEnabled) = 0;
|
|
|
|
virtual void setMultiSessionEnabled(bool fEnabled) = 0;
|
2023-09-05 03:34:35 +02:00
|
|
|
virtual void setSessions(int sessions) = 0;
|
2020-08-28 11:52:00 +02:00
|
|
|
virtual void setRounds(int nRounds) = 0;
|
|
|
|
virtual void setAmount(CAmount amount) = 0;
|
2023-09-05 03:34:35 +02:00
|
|
|
virtual void setDenomsGoal(int denoms_goal) = 0;
|
|
|
|
virtual void setDenomsHardCap(int denoms_hardcap) = 0;
|
2020-08-28 11:52:00 +02:00
|
|
|
|
|
|
|
virtual bool isMultiSessionEnabled() = 0;
|
|
|
|
virtual bool isEnabled() = 0;
|
|
|
|
// Static helpers
|
|
|
|
virtual bool isCollateralAmount(CAmount nAmount) = 0;
|
|
|
|
virtual CAmount getMinCollateralAmount() = 0;
|
|
|
|
virtual CAmount getMaxCollateralAmount() = 0;
|
|
|
|
virtual CAmount getSmallestDenomination() = 0;
|
|
|
|
virtual bool isDenominated(CAmount nAmount) = 0;
|
2022-01-11 01:57:37 +01:00
|
|
|
virtual std::array<CAmount, 5> getStandardDenominations() = 0;
|
2020-08-28 11:52:00 +02:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2022-04-16 08:24:42 +02:00
|
|
|
//! Block and header tip information
|
|
|
|
struct BlockAndHeaderTipInfo
|
|
|
|
{
|
|
|
|
int block_height;
|
|
|
|
int64_t block_time;
|
|
|
|
uint256 block_hash;
|
|
|
|
int header_height;
|
|
|
|
int64_t header_time;
|
|
|
|
double verification_progress;
|
|
|
|
};
|
|
|
|
|
2020-08-28 02:50:50 +02:00
|
|
|
//! Top-level interface for a dash node (dashd process).
|
2017-04-17 19:55:43 +02:00
|
|
|
class Node
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
virtual ~Node() {}
|
|
|
|
|
2019-07-10 14:06:57 +02:00
|
|
|
//! Send init error.
|
2022-04-07 10:17:19 +02:00
|
|
|
virtual void initError(const bilingual_str& message) = 0;
|
2019-07-10 14:06:57 +02:00
|
|
|
|
2017-04-17 19:55:43 +02:00
|
|
|
//! Set command line arguments.
|
2018-05-30 19:42:58 +02:00
|
|
|
virtual bool parseParameters(int argc, const char* const argv[], std::string& error) = 0;
|
2017-04-17 19:55:43 +02:00
|
|
|
|
2019-09-12 14:59:58 +02:00
|
|
|
//! Set a command line argument
|
|
|
|
virtual void forceSetArg(const std::string& arg, const std::string& value) = 0;
|
|
|
|
|
2017-04-17 20:23:14 +02:00
|
|
|
//! Set a command line argument if it doesn't already have a value
|
|
|
|
virtual bool softSetArg(const std::string& arg, const std::string& value) = 0;
|
|
|
|
|
|
|
|
//! Set a command line boolean argument if it doesn't already have a value
|
|
|
|
virtual bool softSetBoolArg(const std::string& arg, bool value) = 0;
|
|
|
|
|
2017-04-17 19:55:43 +02:00
|
|
|
//! Load settings from configuration file.
|
2018-05-30 19:42:58 +02:00
|
|
|
virtual bool readConfigFiles(std::string& error) = 0;
|
2017-04-17 19:55:43 +02:00
|
|
|
|
|
|
|
//! Choose network parameters.
|
|
|
|
virtual void selectParams(const std::string& network) = 0;
|
|
|
|
|
2020-07-23 18:39:18 +02:00
|
|
|
//! Read and update <datadir>/settings.json file with saved settings. This
|
|
|
|
//! needs to be called after selectParams() because the settings file
|
|
|
|
//! location is network-specific.
|
|
|
|
virtual bool initSettings(std::string& error) = 0;
|
|
|
|
|
2019-01-12 01:33:11 +01:00
|
|
|
//! Get the (assumed) blockchain size.
|
|
|
|
virtual uint64_t getAssumedBlockchainSize() = 0;
|
|
|
|
|
|
|
|
//! Get the (assumed) chain state size.
|
|
|
|
virtual uint64_t getAssumedChainStateSize() = 0;
|
|
|
|
|
2018-03-23 22:14:39 +01:00
|
|
|
//! Get network name.
|
|
|
|
virtual std::string getNetwork() = 0;
|
|
|
|
|
2017-04-17 19:55:43 +02:00
|
|
|
//! Init logging.
|
|
|
|
virtual void initLogging() = 0;
|
|
|
|
|
|
|
|
//! Init parameter interaction.
|
|
|
|
virtual void initParameterInteraction() = 0;
|
|
|
|
|
|
|
|
//! Get warnings.
|
2019-12-16 22:07:12 +01:00
|
|
|
virtual std::string getWarnings() = 0;
|
2017-04-17 19:55:43 +02:00
|
|
|
|
2017-04-18 22:42:30 +02:00
|
|
|
// Get log flags.
|
2020-11-29 18:28:14 +01:00
|
|
|
virtual uint64_t getLogCategories() = 0;
|
2017-04-18 22:42:30 +02:00
|
|
|
|
2017-04-17 19:55:43 +02:00
|
|
|
//! Initialize app dependencies.
|
|
|
|
virtual bool baseInitialize() = 0;
|
|
|
|
|
|
|
|
//! Start node.
|
2022-04-16 08:24:42 +02:00
|
|
|
virtual bool appInitMain(interfaces::BlockAndHeaderTipInfo* tip_info = nullptr) = 0;
|
2017-04-17 19:55:43 +02:00
|
|
|
|
|
|
|
//! Stop node.
|
|
|
|
virtual void appShutdown() = 0;
|
|
|
|
|
2021-06-24 18:07:08 +02:00
|
|
|
//! Prepare shutdown.
|
|
|
|
virtual void appPrepareShutdown() = 0;
|
|
|
|
|
2017-04-17 19:55:43 +02:00
|
|
|
//! Start shutdown.
|
|
|
|
virtual void startShutdown() = 0;
|
|
|
|
|
2017-04-17 20:33:47 +02:00
|
|
|
//! Return whether shutdown was requested.
|
|
|
|
virtual bool shutdownRequested() = 0;
|
|
|
|
|
2021-03-19 16:00:24 +01:00
|
|
|
//! Setup arguments
|
|
|
|
virtual void setupServerArgs() = 0;
|
2017-04-17 20:40:41 +02:00
|
|
|
|
2017-04-17 20:23:14 +02:00
|
|
|
//! Map port.
|
2022-02-26 13:19:13 +01:00
|
|
|
virtual void mapPort(bool use_upnp, bool use_natpmp) = 0;
|
2017-04-17 20:23:14 +02:00
|
|
|
|
|
|
|
//! Get proxy.
|
|
|
|
virtual bool getProxy(Network net, proxyType& proxy_info) = 0;
|
|
|
|
|
2017-04-17 21:37:36 +02:00
|
|
|
//! Get number of connections.
|
|
|
|
virtual size_t getNodeCount(CConnman::NumConnections flags) = 0;
|
|
|
|
|
2017-04-17 21:57:19 +02:00
|
|
|
//! Get stats for connected nodes.
|
|
|
|
using NodesStats = std::vector<std::tuple<CNodeStats, bool, CNodeStateStats>>;
|
|
|
|
virtual bool getNodesStats(NodesStats& stats) = 0;
|
|
|
|
|
2017-04-17 22:02:44 +02:00
|
|
|
//! Get ban map entries.
|
|
|
|
virtual bool getBanned(banmap_t& banmap) = 0;
|
|
|
|
|
2017-04-17 22:38:51 +02:00
|
|
|
//! Ban node.
|
2022-06-10 11:16:05 +02:00
|
|
|
virtual bool ban(const CNetAddr& net_addr, int64_t ban_time_offset) = 0;
|
2017-04-17 22:38:51 +02:00
|
|
|
|
|
|
|
//! Unban node.
|
|
|
|
virtual bool unban(const CSubNet& ip) = 0;
|
|
|
|
|
2019-01-21 18:45:59 +01:00
|
|
|
//! Disconnect node by address.
|
2020-03-23 21:37:44 +01:00
|
|
|
virtual bool disconnectByAddress(const CNetAddr& net_addr) = 0;
|
2019-01-21 18:45:59 +01:00
|
|
|
|
|
|
|
//! Disconnect node by id.
|
2020-03-23 21:37:44 +01:00
|
|
|
virtual bool disconnectById(NodeId id) = 0;
|
2017-04-17 22:38:51 +02:00
|
|
|
|
2017-04-17 21:37:36 +02:00
|
|
|
//! Get total bytes recv.
|
|
|
|
virtual int64_t getTotalBytesRecv() = 0;
|
|
|
|
|
|
|
|
//! Get total bytes sent.
|
|
|
|
virtual int64_t getTotalBytesSent() = 0;
|
|
|
|
|
|
|
|
//! Get mempool size.
|
|
|
|
virtual size_t getMempoolSize() = 0;
|
|
|
|
|
|
|
|
//! Get mempool dynamic usage.
|
|
|
|
virtual size_t getMempoolDynamicUsage() = 0;
|
|
|
|
|
|
|
|
//! Get header tip height and time.
|
|
|
|
virtual bool getHeaderTip(int& height, int64_t& block_time) = 0;
|
|
|
|
|
|
|
|
//! Get num blocks.
|
|
|
|
virtual int getNumBlocks() = 0;
|
|
|
|
|
2023-04-10 21:16:08 +02:00
|
|
|
//! Get best block hash.
|
|
|
|
virtual uint256 getBestBlockHash() = 0;
|
|
|
|
|
2017-04-17 21:37:36 +02:00
|
|
|
//! Get last block time.
|
|
|
|
virtual int64_t getLastBlockTime() = 0;
|
|
|
|
|
|
|
|
//! Get last block hash.
|
|
|
|
virtual std::string getLastBlockHash() = 0;
|
|
|
|
|
|
|
|
//! Get verification progress.
|
|
|
|
virtual double getVerificationProgress() = 0;
|
|
|
|
|
|
|
|
//! Is initial block download.
|
|
|
|
virtual bool isInitialBlockDownload() = 0;
|
|
|
|
|
|
|
|
//! Get reindex.
|
|
|
|
virtual bool getReindex() = 0;
|
|
|
|
|
|
|
|
//! Get importing.
|
|
|
|
virtual bool getImporting() = 0;
|
|
|
|
|
|
|
|
//! Set network active.
|
|
|
|
virtual void setNetworkActive(bool active) = 0;
|
|
|
|
|
|
|
|
//! Get network active.
|
|
|
|
virtual bool getNetworkActive() = 0;
|
|
|
|
|
2017-04-18 01:46:08 +02:00
|
|
|
//! Get dust relay fee.
|
|
|
|
virtual CFeeRate getDustRelayFee() = 0;
|
|
|
|
|
2017-04-17 22:38:51 +02:00
|
|
|
//! Execute rpc command.
|
|
|
|
virtual UniValue executeRpc(const std::string& command, const UniValue& params, const std::string& uri) = 0;
|
|
|
|
|
|
|
|
//! List rpc commands.
|
|
|
|
virtual std::vector<std::string> listRpcCommands() = 0;
|
|
|
|
|
|
|
|
//! Set RPC timer interface if unset.
|
|
|
|
virtual void rpcSetTimerInterfaceIfUnset(RPCTimerInterface* iface) = 0;
|
|
|
|
|
|
|
|
//! Unset RPC timer interface.
|
|
|
|
virtual void rpcUnsetTimerInterface(RPCTimerInterface* iface) = 0;
|
|
|
|
|
2017-04-18 22:42:30 +02:00
|
|
|
//! Get unspent outputs associated with a transaction.
|
|
|
|
virtual bool getUnspentOutput(const COutPoint& output, Coin& coin) = 0;
|
|
|
|
|
2023-08-24 10:10:24 +02:00
|
|
|
//! Get wallet loader.
|
|
|
|
virtual WalletLoader& walletLoader() = 0;
|
2019-02-12 19:19:05 +01:00
|
|
|
|
2020-08-28 02:50:50 +02:00
|
|
|
//! Return interface for accessing evo related handler.
|
|
|
|
virtual EVO& evo() = 0;
|
|
|
|
|
Qt: Adds Governance tab (#4351)
* Qt: Adds settings option to showGovernanceTab
* Qt: Adds not-yet-functional Governance tab to UI
* library: adds hook into governance rom node interface
* Qt: WIP: puts CGovernanceObject hashes on Governance tab
WIP: basically ready to be filled out, most of the infra in place
now.
* Qt: Populates Governance table values
Governance table now contains real values for current columns. Display
columns may potentially change.
- want url in table if right click option opens url?
- What set of cols wanted? Show yes/no votes?
- Decide refresh functionality.
- Do we even want filter func? (checkbox show: proposal, trigger, active coming)
* qt: Shows Voting Status on Governance page
Towards DMT like Governance page, now shows voting status, but needs to
look at super blocks to determine if proposal period has passed and show
final funded or unfunded for past proposals.
* Qt: refactor governance tab to use Model-View arch
Refactors the QT Governance tab to use a Model-View architecture. The
list of Proposals is stored in a QAbstractItemModel, and a QTableView is
used to display.
This makes a much cleaner separation of concerns in the implementation.
Also, can now use the QSortFilterProxyModel to get responsive filtering.
Less internal state inside the GovernanceList, critical sections
removed.
- Needs update loop implemented.
- Needs Proposal detail widget implemented.
* qt: adds periodic update to gov proposal list
Periodically update list of governance related proposals.
* qt: populates governancelist voting status column
* qt: governancelist Porposal shows extra info on doubleClick
* qt: governancelist: reorder .cpp impl to match .h
* qt: governancelist: fixup based on CI
- Adds LOCK(cs_main) for call to pGovObj->IsValidLocally.
- retab, removes trailing whitespace in governancelist.{cpp,h}
* qt: clang-format for governancelist
* Fixes
- drop unused include
- use proper univalue "get_" functions
- shorter/translatable statuses
- shorter dates
- add missing css styles
* qt: addresses governancelist code review items
* qt: use enum to name columns of governancelist
* fix: clear context menu before adding new items
* fix: skip potential nullptr proposals
* improve: show proposal url in context menu
* refactor: tweak enum name, make sure it's int starting from 0, use full name
* fix: column count
* improve: make it sortable, sort by start_date by default
* qt: use full col name in voting status col change signal emit
* better sorting
* use mapToSource to fix data fetching
Co-authored-by: UdjinM6 <UdjinM6@users.noreply.github.com>
2021-10-30 03:14:25 +02:00
|
|
|
//! Return interface for accessing governance related handler.
|
|
|
|
virtual GOV& gov() = 0;
|
|
|
|
|
2020-08-28 02:56:07 +02:00
|
|
|
//! Return interface for accessing llmq related handler.
|
|
|
|
virtual LLMQ& llmq() = 0;
|
|
|
|
|
2020-08-28 01:41:57 +02:00
|
|
|
//! Return interface for accessing masternode related handler.
|
|
|
|
virtual Masternode::Sync& masternodeSync() = 0;
|
|
|
|
|
2021-08-10 07:48:49 +02:00
|
|
|
//! Return interface for accessing coinjoin related handler.
|
2021-03-17 23:36:11 +01:00
|
|
|
virtual CoinJoin::Options& coinJoinOptions() = 0;
|
2020-08-28 11:52:00 +02:00
|
|
|
|
2017-04-17 19:55:43 +02:00
|
|
|
//! Register handler for init messages.
|
|
|
|
using InitMessageFn = std::function<void(const std::string& message)>;
|
|
|
|
virtual std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn) = 0;
|
2017-04-17 20:33:47 +02:00
|
|
|
|
|
|
|
//! Register handler for message box messages.
|
|
|
|
using MessageBoxFn =
|
2020-05-08 18:17:47 +02:00
|
|
|
std::function<bool(const bilingual_str& message, const std::string& caption, unsigned int style)>;
|
2017-04-17 20:33:47 +02:00
|
|
|
virtual std::unique_ptr<Handler> handleMessageBox(MessageBoxFn fn) = 0;
|
|
|
|
|
|
|
|
//! Register handler for question messages.
|
2020-05-08 18:17:47 +02:00
|
|
|
using QuestionFn = std::function<bool(const bilingual_str& message,
|
2017-04-17 20:33:47 +02:00
|
|
|
const std::string& non_interactive_message,
|
|
|
|
const std::string& caption,
|
|
|
|
unsigned int style)>;
|
|
|
|
virtual std::unique_ptr<Handler> handleQuestion(QuestionFn fn) = 0;
|
2017-04-17 21:10:47 +02:00
|
|
|
|
|
|
|
//! Register handler for progress messages.
|
|
|
|
using ShowProgressFn = std::function<void(const std::string& title, int progress, bool resume_possible)>;
|
|
|
|
virtual std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn) = 0;
|
|
|
|
|
2017-04-17 21:37:36 +02:00
|
|
|
//! Register handler for number of connections changed messages.
|
|
|
|
using NotifyNumConnectionsChangedFn = std::function<void(int new_num_connections)>;
|
|
|
|
virtual std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn) = 0;
|
|
|
|
|
|
|
|
//! Register handler for network active messages.
|
|
|
|
using NotifyNetworkActiveChangedFn = std::function<void(bool network_active)>;
|
|
|
|
virtual std::unique_ptr<Handler> handleNotifyNetworkActiveChanged(NotifyNetworkActiveChangedFn fn) = 0;
|
|
|
|
|
|
|
|
//! Register handler for notify alert messages.
|
|
|
|
using NotifyAlertChangedFn = std::function<void()>;
|
|
|
|
virtual std::unique_ptr<Handler> handleNotifyAlertChanged(NotifyAlertChangedFn fn) = 0;
|
|
|
|
|
|
|
|
//! Register handler for ban list messages.
|
|
|
|
using BannedListChangedFn = std::function<void()>;
|
|
|
|
virtual std::unique_ptr<Handler> handleBannedListChanged(BannedListChangedFn fn) = 0;
|
|
|
|
|
|
|
|
//! Register handler for block tip messages.
|
|
|
|
using NotifyBlockTipFn =
|
2023-04-10 21:16:08 +02:00
|
|
|
std::function<void(bool initial_download, interfaces::BlockTip tip, double verification_progress)>;
|
2017-04-17 21:37:36 +02:00
|
|
|
virtual std::unique_ptr<Handler> handleNotifyBlockTip(NotifyBlockTipFn fn) = 0;
|
|
|
|
|
2021-08-10 21:41:00 +02:00
|
|
|
//! Register handler for chainlock messages.
|
|
|
|
using NotifyChainLockFn =
|
|
|
|
std::function<void(const std::string& bestChainLockedHash, int32_t bestChainLockedHeight)>;
|
|
|
|
virtual std::unique_ptr<Handler> handleNotifyChainLock(NotifyChainLockFn fn) = 0;
|
|
|
|
|
2017-04-17 21:37:36 +02:00
|
|
|
//! Register handler for header tip messages.
|
|
|
|
using NotifyHeaderTipFn =
|
2023-04-10 21:16:08 +02:00
|
|
|
std::function<void(bool initial_download, interfaces::BlockTip tip, double verification_progress)>;
|
2017-04-17 21:37:36 +02:00
|
|
|
virtual std::unique_ptr<Handler> handleNotifyHeaderTip(NotifyHeaderTipFn fn) = 0;
|
|
|
|
|
|
|
|
//! Register handler for masternode list update messages.
|
|
|
|
using NotifyMasternodeListChangedFn =
|
fix: possible assert call if nHeight in CDeterministicMNList is higher then Tip (#5590)
## Issue being fixed or feature implemented
fix: possible assert call if nHeight in CDeterministicMNListDiff is
higher than Tip
Example of new log:
```
2023-09-28T17:35:50Z GetProjectedMNPayeesAtChainTip WARNING pindex is nullptr due to height=914160 chain height=914159
```
instead assert call:
```
...
#6 0x00007ffff7a33b86 in __assert_fail (assertion=0x55555783afd2 "pindex", file=0x5555577f2ed8 "llmq/utils.cpp", line=730,
function=0x5555577f2448 "bool llmq::utils::IsMNRewardReallocationActive(const CBlockIndex*)") at ./assert/assert.c:101
#7 0x0000555555ab7daf in llmq::utils::IsMNRewardReallocationActive (pindex=<optimized out>) at llmq/utils.cpp:730
#8 0x00005555559458ad in CDeterministicMNList::GetProjectedMNPayees (this=this@entry=0x7fffffffc690, pindex=0x0, nCount=<optimized out>, nCount@entry=2147483647)
at evo/deterministicmns.cpp:231
#9 0x000055555594614f in CDeterministicMNList::GetProjectedMNPayeesAtChainTip (this=this@entry=0x7fffffffc690, nCount=nCount@entry=2147483647) at evo/deterministicmns.cpp:216
#10 0x00005555558c9f51 in MasternodeList::updateDIP3List (this=this@entry=0x55555908cfd0) at qt/masternodelist.cpp:194
#11 0x00005555558ca9a0 in MasternodeList::updateDIP3ListScheduled (this=0x55555908cfd0) at qt/masternodelist.cpp:157
#12 0x000055555684a60f in void doActivate<false>(QObject*, int, void**) ()
#13 0x00005555568525b1 in QTimer::timerEvent(QTimerEvent*) ()
#14 0x0000555556844ce5 in QObject::event(QEvent*) ()
#15 0x0000555556ac3252 in QApplicationPrivate::notify_helper(QObject*, QEvent*) ()
#16 0x000055555681e6b8 in QCoreApplication::sendEvent(QObject*, QEvent*) ()
#17 0x000055555686de2a in QTimerInfoList::activateTimers() ()
#18 0x000055555686be84 in QEventDispatcherUNIX::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) ()
#19 0x00005555569bf8a2 in QXcbUnixEventDispatcher::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) ()
#20 0x000055555681caf6 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) ()
#21 0x0000555556825f8a in QCoreApplication::exec() ()
...
```
## What was done?
ClientModel returns now a pair: MNList and CBlockIndex; so, we always
know the which one has been used even if current chain is switched.
## How Has This Been Tested?
Run on my localhost from `c034ff0c2606142ba3e8894bc74f693b87374e5c` -
aborted with backtrace like above.
With both of commit - no assert more.
## Breaking Changes
N/A
## Checklist:
- [x] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have added or updated relevant unit/integration/functional/e2e
tests
- [ ] I have made corresponding changes to the documentation
- [x] I have assigned this pull request to a milestone
---------
Co-authored-by: UdjinM6 <UdjinM6@users.noreply.github.com>
2023-10-28 02:53:27 +02:00
|
|
|
std::function<void(const CDeterministicMNList& newList,
|
|
|
|
const CBlockIndex* pindex)>;
|
2017-04-17 21:37:36 +02:00
|
|
|
virtual std::unique_ptr<Handler> handleNotifyMasternodeListChanged(NotifyMasternodeListChangedFn fn) = 0;
|
|
|
|
|
|
|
|
//! Register handler for additional data sync progress update messages.
|
|
|
|
using NotifyAdditionalDataSyncProgressChangedFn =
|
|
|
|
std::function<void(double nSyncProgress)>;
|
|
|
|
virtual std::unique_ptr<Handler> handleNotifyAdditionalDataSyncProgressChanged(NotifyAdditionalDataSyncProgressChangedFn fn) = 0;
|
2022-04-05 11:09:41 +02:00
|
|
|
|
2020-05-28 22:35:15 +02:00
|
|
|
//! Get and set internal node context. Useful for testing, but not
|
|
|
|
//! accessible across processes.
|
2022-04-05 11:09:41 +02:00
|
|
|
virtual NodeContext* context() { return nullptr; }
|
2020-05-28 22:35:15 +02:00
|
|
|
virtual void setContext(NodeContext* context) { }
|
2017-04-17 19:55:43 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
//! Return implementation of Node interface.
|
2020-05-28 22:35:15 +02:00
|
|
|
std::unique_ptr<Node> MakeNode(NodeContext* context = nullptr);
|
2017-04-17 19:55:43 +02:00
|
|
|
|
2023-04-10 21:16:08 +02:00
|
|
|
//! Block tip (could be a header or not, depends on the subscribed signal).
|
|
|
|
struct BlockTip {
|
|
|
|
int block_height;
|
|
|
|
int64_t block_time;
|
|
|
|
uint256 block_hash;
|
|
|
|
};
|
2020-10-01 16:05:57 +02:00
|
|
|
} // namespace interfaces
|
2017-04-17 19:55:43 +02:00
|
|
|
|
2020-10-01 16:05:57 +02:00
|
|
|
#endif // BITCOIN_INTERFACES_NODE_H
|