Files

122 lines
4.4 KiB
C++
Raw Permalink Normal View History

2018-01-15 15:26:12 +00:00
/*
* This file is part of the flowee project
2021-06-20 22:44:44 +02:00
* Copyright (C) 2017-2018 Tom Zander <tom@flowee.org>
2018-01-15 15:26:12 +00:00
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef VALIDATIONSETTINGS_H
#define VALIDATIONSETTINGS_H
#include <string>
class CBlockIndex;
class ValidationSettingsPrivate;
namespace Blocks {
class DB;
}
#include <memory>
namespace Validation {
class Engine;
/**
* @brief The Validation::Settings can be used to set settings and also is a Future for a block being validated.
*
* The Block validation code is entirely a-synchronous. Adding a block will return immediately and processing
* will happen in a separate worker thread.
*
* The method Validation::Engine:addBlock() returns an instance of Settings. This instance allows you
2018-01-15 15:26:12 +00:00
* to set more settings on the block before the actual validation starts and also it allows you to introspect
* information about the validation as it happens in the background.
*
* Notice that this means that should you keep a copy of the Settings, you delay validation until either
* the settings object has its destructor run, or you explicitly call start();
*/
class Settings {
public:
Settings();
Settings(const Validation::Settings &other);
~Settings();
/// Starts the validation of the block.
Validation::Settings start();
/**
* After the header validation has succeded and no errors have been found, a block index will be created.
* A BlockIndex in various cases will not have its ownership moved to the Blocks::DB, for instance
* if no direct line to the genesis was found.
2018-01-15 15:26:12 +00:00
* In such cases the blockIndex is owned by the ValidationSettings instance and the pointer will
* become dangling as soon as the Settings object is deleted!
* Please note that the index may not have a height or parent yet, it is guarenteed to have a blockhash.
2018-01-15 15:26:12 +00:00
*/
CBlockIndex *blockIndex() const;
/// After block validation is finished any validation errors will be stored here.
const std::string &error() const;
/**
* @brief turning off the Proof-of-Work check will skip this check and avoid failing on an incorrect one.
* @see setOnlyCheckValidity()
* @see setCheckMerkleRoot()
*/
void setCheckPoW(bool on);
/**
* @brief turning off the merkle root check will skip this check and avoid failing on an incorrect one.
* @see setOnlyCheckValidity()
* @see setCheckPoW()
*/
void setCheckMerkleRoot(bool on);
/**
* @brief If false, skip general transaction validity checks before reporting header validated.
* Defaults to true.
*/
void setCheckTransactionValidity(bool on);
/**
* @brief only check validity, when enabled, will avoid adding the block to the chain and the index, just do validation.
* Validation includes headers, basic block / transaction well-formed-ness, fees, utxo. But not signatures and mempool updates etc are skipped too.
* Default off.
* @see setCheckPoW()
* @see setCheckMerkleRoot()
*/
void setOnlyCheckValidity(bool on);
/**
* @brief waitUntilFinished returns when the block has finished validation.
* A block that isn't very close to the tip may be finished after only inspecting its header.
* Blocks that are expected to become the new tip will cause this method to block until the
* main chain and mempool etc are updated.
2018-01-15 15:26:12 +00:00
*/
void waitUntilFinished() const;
2018-01-15 15:26:12 +00:00
/**
* @brief waitHeaderFinshed won't return until the header has been validated and a blockIndex() assigned.
* On valid blocks the blockIndex() getter will return an actual index.
* @see blockIndex()
2018-01-15 15:26:12 +00:00
*/
void waitHeaderFinished() const;
2018-01-15 15:26:12 +00:00
Validation::Settings operator=(const Validation::Settings&);
private:
friend class Validation::Engine;
std::shared_ptr<ValidationSettingsPrivate> d;
};
}
#endif