This section shows how each block is constructed and what kinds of elements are creating the block.


The below is simple blockchain structure image.

  • Each block has a block_id and refers a previous block_id. And each block has more than one transaction(s).
  • Each transaction has more than one operation(s).
  • Each operation has “fee” and element(s). Each operation has different elements (processes).
BitShares Architecture

Block Header - inheritance


// *Block Header Inheritance* (i.e.)
// graphene::chain

struct block_header
        digest_type         digest()const;
        block_id_type       previous;
        uint32_t            block_num()const { return num_from_id(previous) + 1; }
        fc::time_point_sec  timestamp;
        witness_id_type     witness;
        checksum_type       transaction_merkle_root;
        extensions_type     extensions;

        static uint32_t     num_from_id(const block_id_type& id);


when we need to add data to extensions, remember to review database::_generate_block(). - More info in


// *Block Header Inheritance* (i.e.)
// graphene::chain

struct signed_block_header : public block_header
        block_id_type        id()const;
        fc::ecc::public_key  signee()const;
        void                 sign( const fc::ecc::private_key& signer );
        bool                 validate_signee( const fc::ecc::public_key& expected_signee )const;

        signature_type       witness_signature;


// *Block Header Inheritance* (i.e.)
// graphene::chain

struct signed_block : public signed_block_header
        checksum_type                 calculate_merkle_root()const;
        vector<processed_transaction> transactions;


// *Block Header Inheritance* (i.e.)
// graphene::wallet

struct signed_block_with_info : public signed_block
        signed_block_with_info( const signed_block& block );
        signed_block_with_info( const signed_block_with_info& block ) = default;

        block_id_type                  block_id;
        public_key_type                signing_key;
        vector< transaction_id_type >  transaction_ids;

Block (detail image)

BitShares Architecture



struct index_entry;
class block_database
      void open( const fc::path& dbdir );
      bool is_open()const;
      void flush();
      void close();

      void store( const block_id_type& id, const signed_block& b );
      void remove( const block_id_type& id );

      bool                   contains( const block_id_type& id )const;
      block_id_type          fetch_block_id( uint32_t block_num )const;
      optional<signed_block> fetch_optional( const block_id_type& id )const;
      optional<signed_block> fetch_by_number( uint32_t block_num )const;
      optional<signed_block> last()const;
      optional<block_id_type> last_id()const;
      size_t                 blocks_current_position()const;
      size_t                 total_block_size()const;
      optional<index_entry> last_index_entry()const;
      fc::path _index_filename;
      mutable std::fstream _blocks;
      mutable std::fstream _block_num_to_pos;