Skip to content

src/blockchain/block_tree.hpp

Namespaces

Name
sgns
sgns::blockchain

Classes

Name
struct sgns::blockchain::BlockTree

Source code

#ifndef SUPERGENIUS_BLOCK_TREE_HPP
#define SUPERGENIUS_BLOCK_TREE_HPP

#include <cstdint>
#include <vector>

#include <boost/optional.hpp>
#include "outcome/outcome.hpp"
#include "primitives/block.hpp"
#include "primitives/block_id.hpp"
#include "primitives/common.hpp"
#include "primitives/justification.hpp"
#include "singleton/IComponent.hpp"

namespace sgns::blockchain {
  struct BlockTree : public IComponent {
    using BlockHashVecRes = outcome::result<std::vector<primitives::BlockHash>>;

    ~BlockTree() override = default;

    virtual outcome::result<primitives::BlockHeader> getBlockHeader(
        const primitives::BlockId &block) const = 0;

    virtual outcome::result<primitives::BlockBody> getBlockBody(
        const primitives::BlockId &block) const = 0;

    virtual outcome::result<primitives::Justification> getBlockJustification(
        const primitives::BlockId &block) const = 0;

    virtual outcome::result<void> addBlockHeader(
        const primitives::BlockHeader &header) = 0;

    virtual outcome::result<void> addBlockBody(
        primitives::BlockNumber block_number,
        const primitives::BlockHash &block_hash,
        const primitives::BlockBody &block_body) = 0;

    virtual outcome::result<void> addBlock(const primitives::Block &block) = 0;

    virtual outcome::result<void> finalize(
        const primitives::BlockHash &block,
        const primitives::Justification &justification) = 0;

    virtual BlockHashVecRes getChainByBlock(
        const primitives::BlockHash &block) = 0;

    virtual BlockHashVecRes getChainByBlock(const primitives::BlockHash &block,
                                            bool ascending,
                                            uint64_t maximum) = 0;

    virtual BlockHashVecRes getChainByBlocks(
        const primitives::BlockHash &top_block,
        const primitives::BlockHash &bottom_block) = 0;

    virtual bool hasDirectChain(const primitives::BlockHash &ancestor,
                                const primitives::BlockHash &descendant) = 0;

    virtual BlockHashVecRes longestPath() = 0;

    [[nodiscard]] virtual primitives::BlockInfo deepestLeaf() const = 0;

    [[nodiscard]] virtual outcome::result<primitives::BlockInfo> getBestContaining(
        const primitives::BlockHash                    &target_hash,
        const boost::optional<primitives::BlockNumber> &max_number ) const = 0;

    [[nodiscard]] virtual std::vector<primitives::BlockHash> getLeaves() const = 0;

    virtual BlockHashVecRes getChildren(const primitives::BlockHash &block) = 0;

    [[nodiscard]] virtual primitives::BlockInfo getLastFinalized() const = 0;
  };
}  // namespace sgns::blockchain

#endif  // SUPERGENIUS_BLOCK_TREE_HPP

Updated on 2026-03-04 at 13:10:44 -0800