Skip to content

src/storage/changes_trie/impl/changes_trie.cpp

Namespaces

Name
sgns
sgns::storage
sgns::storage::changes_trie

Source code

#include "storage/changes_trie/impl/changes_trie.hpp"

#include "scale/scale.hpp"

namespace sgns::storage::changes_trie {

  outcome::result<std::unique_ptr<ChangesTrie>> ChangesTrie::buildFromChanges(
      const primitives::BlockNumber &parent_number,
      const std::shared_ptr<storage::trie::SuperGeniusTrieFactory> &trie_factory,
      std::shared_ptr<storage::trie::Codec> codec,
      const ExtrinsicsChanges &extinsics_changes,
      const ChangesTrieConfig &config) {
    BOOST_ASSERT(trie_factory != nullptr);
    auto changes_storage = trie_factory->createEmpty();

    for (auto &change : extinsics_changes) {
      auto &key = change.first;
      auto &changers = change.second;
      auto current_number = parent_number + 1;
      KeyIndexVariant keyIndex{ExtrinsicsChangesKey{{current_number, key}}};
      OUTCOME_TRY((auto &&, key_enc), scale::encode(keyIndex));
      OUTCOME_TRY((auto &&, value), scale::encode(changers));
      base::Buffer value_buf {std::move(value)};
      BOOST_OUTCOME_TRYV2(auto &&, changes_storage->put(base::Buffer{std::move(key_enc)},
                                       std::move(value_buf)));
    }

    return std::unique_ptr<ChangesTrie>{
        new ChangesTrie{std::move(changes_storage), std::move(codec)}};
  }

  ChangesTrie::ChangesTrie(std::unique_ptr<storage::trie::SuperGeniusTrie> trie,
                           std::shared_ptr<storage::trie::Codec> codec)
      : changes_trie_{std::move(trie)},
        codec_{std::move(codec)},
        logger_(base::createLogger("ChangesTrie")) {
    BOOST_ASSERT(changes_trie_ != nullptr);
    BOOST_ASSERT(codec_ != nullptr);
  }

  base::Hash256 ChangesTrie::getHash() const {
    if (changes_trie_ == nullptr) {
      return {};
    }

    auto root = changes_trie_->getRoot();
    if (root == nullptr) {
      logger_->warn("Get root of empty changes trie");
      return codec_->hash256({0});
    }
    auto enc_res = codec_->encodeNode(*root);
    if (enc_res.has_error()) {
      logger_->error("Encoding Changes trie failed"
                     + enc_res.error().message());
      return {};
    }
    auto hash_bytes = codec_->hash256(enc_res.value());
    return hash_bytes;
  }

}  // namespace sgns::storage::changes_trie

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