Skip to content

src/primitives/block_header.hpp

Namespaces

Name
sgns
sgns::primitives

Classes

Name
struct sgns::primitives::BlockHeader
Header of a block in the chain.

Functions

Name
template <class Stream ,typename =std::enable_if_t>
Stream &
operator<<(Stream & s, const BlockHeader & bh)
Outputs a BlockHeader to an encoding stream.
template <class Stream ,typename =std::enable_if_t>
Stream &
operator>>(Stream & s, BlockHeader & bh)
Decodes a BlockHeader from a decoding stream.

Functions Documentation

function operator<<

template <class Stream ,
typename  =std::enable_if_t<Stream::is_encoder_stream>>
Stream & operator<<(
    Stream & s,
    const BlockHeader & bh
)

Outputs a BlockHeader to an encoding stream.

Parameters:

  • s Stream reference.
  • bh Header to output.

Template Parameters:

  • Stream Output stream type.

Return: Reference to stream.

function operator>>

template <class Stream ,
typename  =std::enable_if_t<Stream::is_decoder_stream>>
Stream & operator>>(
    Stream & s,
    BlockHeader & bh
)

Decodes a BlockHeader from a decoding stream.

Parameters:

  • s Stream reference.
  • bh Header to populate.

Template Parameters:

  • Stream Input stream type.

Return: Reference to stream.

Source code

#ifndef SUPERGENIUS_PRIMITIVES_BLOCK_HEADER_HPP
#define SUPERGENIUS_PRIMITIVES_BLOCK_HEADER_HPP

#include <type_traits>

#include <boost/multiprecision/cpp_int.hpp>
#include "base/blob.hpp"
#include "primitives/common.hpp"
#include "primitives/compact_integer.hpp"
#include "primitives/digest.hpp"

namespace sgns::primitives
{
    struct BlockHeader
    {
        BlockHash     parent_hash;     
        BlockNumber   number = 0U;     
        base::Hash256 state_root;      
        base::Hash256 extrinsics_root; 
        Digest        digest;          

        bool operator==( const BlockHeader &rhs ) const
        {
            return std::tie( parent_hash, number, state_root, extrinsics_root, digest ) ==
                   std::tie( rhs.parent_hash, rhs.number, rhs.state_root, rhs.extrinsics_root, rhs.digest );
        }

        bool operator!=( const BlockHeader &rhs ) const
        {
            return !operator==( rhs );
        }

        //added to fix link error in test mode
        friend std::ostream &operator<<( std::ostream &out, const BlockHeader &bh )
        {
            out << bh.parent_hash << CompactInteger( bh.number ) << bh.state_root << bh.extrinsics_root;

            out << bh.digest.size();
            for ( const auto &it : bh.digest )
            {
                out << it.which();
            }
            return out;
        }

        //end
    };

    template <class Stream, typename = std::enable_if_t<Stream::is_encoder_stream>>
    Stream &operator<<( Stream &s, const BlockHeader &bh )
    {
        return s << bh.parent_hash << CompactInteger( bh.number ) << bh.state_root << bh.extrinsics_root << bh.digest;
    }

    template <class Stream, typename = std::enable_if_t<Stream::is_decoder_stream>>
    Stream &operator>>( Stream &s, BlockHeader &bh )
    {
        CompactInteger number_compact;
        s >> bh.parent_hash >> number_compact >> bh.state_root >> bh.extrinsics_root >> bh.digest;
        bh.number = number_compact.convert_to<BlockNumber>();
        return s;
    }
}

#endif

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