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.
|
|
|
|
|
*
|
2018-01-29 17:35:19 +00:00
|
|
|
* 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
|
2018-01-29 17:35:19 +00:00
|
|
|
* 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!
|
2018-01-29 17:35:19 +00:00
|
|
|
* 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.
|
2018-01-29 17:35:19 +00:00
|
|
|
* 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
|
|
|
*/
|
2018-01-29 17:35:19 +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.
|
2018-01-29 17:35:19 +00:00
|
|
|
* @see blockIndex()
|
2018-01-15 15:26:12 +00:00
|
|
|
*/
|
2018-01-29 17:35:19 +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
|