CCF
Loading...
Searching...
No Matches
kv_types.h
Go to the documentation of this file.
1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the Apache 2.0 License.
3#pragma once
4
5#include "ccf/claims_digest.h"
7#include "ccf/crypto/pem.h"
8#include "ccf/ds/hex.h"
9#include "ccf/ds/nonstd.h"
10#include "ccf/entity_id.h"
11#include "ccf/kv/get_name.h"
12#include "ccf/kv/hooks.h"
13#include "ccf/kv/version.h"
18#include "ccf/tx_id.h"
19#include "ccf/tx_status.h"
22#include "serialiser_declare.h"
23
24#include <array>
25#include <chrono>
26#include <functional>
27#include <limits>
28#include <list>
29#include <memory>
30#include <set>
31#include <string>
32#include <unordered_set>
33#include <vector>
34
35namespace ccf
36{
37 struct PrimarySignature;
38}
39
40namespace ccf::kv
41{
42 // Term describes an epoch of Versions. It is incremented when global kv's
43 // writer(s) changes. Term and Version combined give a unique identifier for
44 // all accepted kv modifications. Terms are handled by Consensus via the
45 // TermHistory
46 using Term = uint64_t;
48
49 using ReconfigurationId = uint64_t;
50
52 {
53 struct NodeInfo
54 {
55 std::string hostname;
56 std::string port;
57
58 NodeInfo() = default;
59
60 NodeInfo(std::string hostname_, std::string port_) :
61 hostname(std::move(hostname_)),
62 port(std::move(port_))
63 {}
64
65 bool operator==(const NodeInfo& other) const
66 {
67 return hostname == other.hostname && port == other.port;
68 }
69 };
70
71 using Nodes = std::map<NodeId, NodeInfo>;
72
76 };
77
78 inline void to_json(nlohmann::json& j, const Configuration::NodeInfo& ni)
79 {
80 j["address"] = fmt::format("{}:{}", ni.hostname, ni.port);
81 }
82
83 inline void from_json(const nlohmann::json& j, Configuration::NodeInfo& ni)
84 {
85 const std::string addr(j["address"]);
86 const auto& [h, p] = ccf::nonstd::split_1(addr, ":");
87 ni.hostname = h;
88 ni.port = p;
89 }
90
91 inline std::string schema_name(const Configuration::NodeInfo* /*unused*/)
92 {
93 return "Configuration__NodeInfo";
94 }
95
96 inline void fill_json_schema(
97 nlohmann::json& schema, const Configuration::NodeInfo* /*unused*/)
98 {
99 schema["type"] = "object";
100 schema["required"] = nlohmann::json::array();
101 schema["required"].push_back("address");
102 schema["properties"] = nlohmann::json::object();
103 schema["properties"]["address"] = nlohmann::json::object();
104 schema["properties"]["address"]["$ref"] = "#/components/schemas/string";
105 }
106
107 enum class LeadershipState : uint8_t
108 {
109 None,
110 Leader,
111 Follower,
113 Candidate,
114 };
115
118 {{LeadershipState::None, "None"},
119 {LeadershipState::Leader, "Leader"},
120 {LeadershipState::Follower, "Follower"},
121 {LeadershipState::PreVoteCandidate, "PreVoteCandidate"},
122 {LeadershipState::Candidate, "Candidate"}});
123
124 enum class MembershipState : uint8_t
125 {
126 Active,
127 Retired
128 };
129
132 {{MembershipState::Active, "Active"},
133 {MembershipState::Retired, "Retired"}});
134
135 enum class RetirementPhase : uint8_t
136 {
137 Ordered = 1,
138 Signed = 2,
139 Completed = 3,
141 };
142
145 {{RetirementPhase::Ordered, "Ordered"},
146 {RetirementPhase::Signed, "Signed"},
147 {RetirementPhase::Completed, "Completed"},
148 {RetirementPhase::RetiredCommitted, "RetiredCommitted"}});
149
152
154 {
155 struct Ack
156 {
159 };
160
161 std::vector<Configuration> configs;
162 std::unordered_map<ccf::NodeId, Ack> acks;
164 std::optional<LeadershipState> leadership_state = std::nullopt;
165 std::optional<RetirementPhase> retirement_phase = std::nullopt;
166 std::optional<std::unordered_map<ccf::NodeId, ccf::SeqNo>> learners =
167 std::nullopt;
168 std::optional<ccf::ReconfigurationType> reconfiguration_type = std::nullopt;
169 std::optional<ccf::NodeId> primary_id = std::nullopt;
171 bool ticking = false;
172 };
173
176
180 configs,
181 acks,
182 membership_state,
183 primary_id,
184 current_view,
185 ticking);
188 reconfiguration_type,
189 learners,
190 leadership_state,
191 retirement_phase);
192
194 {
195 public:
196 virtual ~ConfigurableConsensus() = default;
197 virtual void add_configuration(
198 ccf::SeqNo seqno, const Configuration::Nodes& conf) = 0;
199 virtual Configuration::Nodes get_latest_configuration() = 0;
200 [[nodiscard]] virtual Configuration::Nodes get_latest_configuration_unsafe()
201 const = 0;
203 };
204
205 using BatchVector = std::vector<std::tuple<
206 Version,
207 std::shared_ptr<std::vector<uint8_t>>,
208 bool,
209 std::shared_ptr<ConsensusHookPtrs>>>;
210
211 enum CommitResult : uint8_t
212 {
216 };
217
218 enum SecurityDomain : uint8_t
219 {
220 PUBLIC, // Public domain indicates the version and always appears first
223 };
224
231
241
242 static bool has_claims(const EntryType& et)
243 {
244 return et == EntryType::WriteSetWithClaims ||
246 }
247
248 static bool has_commit_evidence(const EntryType& et)
249 {
252 }
253
254 // EntryType must be backwards compatible with the older
255 // bool is_snapshot field
256 static_assert(sizeof(EntryType) == sizeof(bool));
257
258 constexpr auto public_domain_prefix = "public:";
259
260 static inline SecurityDomain get_security_domain(const std::string& name)
261 {
262 if (name.starts_with(public_domain_prefix))
263 {
265 }
266
268 }
269
270 static inline std::pair<SecurityDomain, AccessCategory> parse_map_name(
271 std::string_view name)
272 {
273 constexpr auto internal_category_prefix = "ccf.internal.";
274 constexpr auto governance_category_prefix = "ccf.gov.";
275 constexpr auto reserved_category_prefix = "ccf.";
276
277 auto security_domain = SecurityDomain::PRIVATE;
278 if (name.starts_with(public_domain_prefix))
279 {
280 name.remove_prefix(strlen(public_domain_prefix));
281 security_domain = SecurityDomain::PUBLIC;
282 }
283
284 auto access_category = AccessCategory::APPLICATION;
285 if (name.starts_with(internal_category_prefix))
286 {
287 access_category = AccessCategory::INTERNAL;
288 }
289 else if (name.starts_with(governance_category_prefix))
290 {
291 access_category = AccessCategory::GOVERNANCE;
292 }
293 else if (name.starts_with(reserved_category_prefix))
294 {
295 throw std::logic_error(fmt::format(
296 "Map name '{}' includes disallowed reserved prefix '{}'",
297 name,
298 reserved_category_prefix));
299 }
300
301 return {security_domain, access_category};
302 }
303
316
317 class KvSerialiserException : public std::exception
318 {
319 private:
320 std::string msg;
321
322 public:
323 KvSerialiserException(std::string msg_) : msg(std::move(msg_)) {}
324
325 [[nodiscard]] const char* what() const noexcept override
326 {
327 return msg.c_str();
328 }
329 };
330
332 {
333 public:
334 virtual ~TxHistory() = default;
335 virtual bool verify_root_signatures(ccf::kv::Version version) = 0;
336 virtual void try_emit_signature() = 0;
337 virtual void emit_signature() = 0;
339 virtual std::tuple<
340 ccf::TxID /* TxID of last transaction seen by history */,
341 ccf::crypto::Sha256Hash /* root as of TxID */,
342 ccf::kv::Term /* term_of_next_version */>
344 virtual std::vector<uint8_t> get_proof(Version v) = 0;
345 virtual bool verify_proof(const std::vector<uint8_t>& proof) = 0;
346 virtual bool init_from_snapshot(
347 const std::vector<uint8_t>& hash_at_snapshot) = 0;
348 virtual std::vector<uint8_t> get_raw_leaf(uint64_t index) = 0;
349 virtual void append(const std::vector<uint8_t>& data) = 0;
350 virtual void append_entry(
351 const ccf::crypto::Sha256Hash& digest,
352 std::optional<ccf::kv::Term> expected_term = std::nullopt) = 0;
353 virtual void rollback(
354 const ccf::TxID& tx_id, ccf::kv::Term term_of_next_version_) = 0;
355 virtual void compact(Version v) = 0;
356 virtual void set_term(ccf::kv::Term) = 0;
357 virtual std::vector<uint8_t> serialise_tree(size_t to) = 0;
358 virtual void set_endorsed_certificate(const ccf::crypto::Pem& cert) = 0;
359 virtual void start_signature_emit_timer() = 0;
361 std::shared_ptr<ccf::crypto::ECKeyPair_OpenSSL> keypair,
362 const COSESignaturesConfig& cose_signatures) = 0;
364 };
365
367 {
368 public:
369 ~Consensus() override = default;
370
371 virtual NodeId id() = 0;
372 virtual bool is_primary() = 0;
373 virtual bool is_backup() = 0;
374 virtual bool is_candidate() = 0;
375 virtual bool can_replicate() = 0;
376 virtual bool is_at_max_capacity() = 0;
377
378 enum class SignatureDisposition : uint8_t
379 {
381 CAN_SIGN,
383 };
385
386 virtual void force_become_primary() = 0;
388 ccf::SeqNo, ccf::View, const std::vector<ccf::SeqNo>&, ccf::SeqNo) = 0;
389 virtual void init_as_backup(
390 ccf::SeqNo, ccf::View, const std::vector<ccf::SeqNo>&, ccf::SeqNo) = 0;
391
392 virtual bool replicate(const BatchVector& entries, ccf::View view) = 0;
393 virtual std::pair<ccf::View, ccf::SeqNo> get_committed_txid() = 0;
394
395 virtual ccf::View get_view(ccf::SeqNo seqno) = 0;
396 virtual ccf::View get_view() = 0;
397 virtual std::vector<ccf::SeqNo> get_view_history(
398 ccf::SeqNo seqno = std::numeric_limits<ccf::SeqNo>::max()) = 0;
399 virtual std::vector<ccf::SeqNo> get_view_history_since(
400 ccf::SeqNo seqno) = 0;
402 virtual std::optional<NodeId> primary() = 0;
403
404 virtual void recv_message(
405 const NodeId& from, const uint8_t* data, size_t size) = 0;
406
407 virtual void periodic(std::chrono::milliseconds /*elapsed*/) {}
408 virtual void periodic_end() {}
409
410 virtual void enable_all_domains() {}
411
413 ccf::SeqNo /*seqno*/, const std::vector<NodeId>& node_ids)
414 {}
415
416 virtual void nominate_successor() {}
417
419 ccf::View target_view, ccf::SeqNo target_seqno)
420 {
421 const auto local_view = get_view(target_seqno);
422 const auto [committed_view, committed_seqno] = get_committed_txid();
423
424 return ccf::evaluate_tx_status(
425 target_view, target_seqno, local_view, committed_view, committed_seqno);
426 }
427 };
428
430 {
432 std::vector<uint8_t> data;
435 std::vector<ConsensusHookPtr> hooks;
436
438 CommitResult success_,
439 std::vector<uint8_t>&& data_,
440 ccf::ClaimsDigest&& claims_digest_,
441 ccf::crypto::Sha256Hash&& commit_evidence_digest_,
442 std::vector<ConsensusHookPtr>&& hooks_) :
443 success(success_),
444 data(std::move(data_)),
445 claims_digest(claims_digest_),
446 commit_evidence_digest(commit_evidence_digest_),
447 hooks(std::move(hooks_))
448 {}
449 };
450
452 {
453 public:
454 virtual PendingTxInfo call() = 0;
455 virtual ~PendingTx() = default;
456 };
457
459 {
460 private:
461 std::vector<uint8_t> data;
462 ccf::ClaimsDigest claims_digest;
463 ccf::crypto::Sha256Hash commit_evidence_digest;
464 ConsensusHookPtrs hooks;
465
466 public:
468 std::vector<uint8_t>&& data_,
469 ccf::ClaimsDigest&& claims_digest_,
470 ccf::crypto::Sha256Hash&& commit_evidence_digest_,
471 ConsensusHookPtrs&& hooks_) :
472 data(std::move(data_)),
473 claims_digest(std::move(claims_digest_)),
474 commit_evidence_digest(std::move(commit_evidence_digest_)),
475 hooks(std::move(hooks_))
476 {}
477
479 {
480 return {
482 std::move(data),
483 std::move(claims_digest),
484 std::move(commit_evidence_digest),
485 std::move(hooks)};
486 }
487 };
488
490 {
491 public:
492 virtual ~AbstractTxEncryptor() = default;
493
494 virtual bool encrypt(
495 const std::vector<uint8_t>& plain,
496 const std::vector<uint8_t>& additional_data,
497 std::vector<uint8_t>& serialised_header,
498 std::vector<uint8_t>& cipher,
499 const ccf::TxID& tx_id,
500 EntryType entry_type = EntryType::WriteSet,
501 bool historical_hint = false) = 0;
502 virtual bool decrypt(
503 const std::vector<uint8_t>& cipher,
504 const std::vector<uint8_t>& additional_data,
505 const std::vector<uint8_t>& serialised_header,
506 std::vector<uint8_t>& plain,
507 Version version,
508 Term& term,
509 bool historical_hint = false) = 0;
510
511 virtual void rollback(Version version) = 0;
512
513 virtual size_t get_header_length() = 0;
514 virtual uint64_t get_term(const uint8_t* data, size_t size) = 0;
515
517 const ccf::TxID& tx_id, bool historical_hint = false) = 0;
518
520 const ccf::TxID& tx_id, bool historical_hint = false)
521 {
522 auto nonce = get_commit_nonce(tx_id, historical_hint);
523 return fmt::format(
524 "ce:{}.{}:{}", tx_id.view, tx_id.seqno, ccf::ds::to_hex(nonce));
525 }
526 };
527 using EncryptorPtr = std::shared_ptr<AbstractTxEncryptor>;
528
530 {
531 public:
532 virtual ~AbstractSnapshotter() = default;
533
536 virtual void commit(ccf::kv::Version v, bool generate_snapshot) = 0;
537 virtual void rollback(ccf::kv::Version v) = 0;
538 };
539 using SnapshotterPtr = std::shared_ptr<AbstractSnapshotter>;
540
542 {
543 public:
544 virtual ~AbstractChangeSet() = default;
545
546 [[nodiscard]] virtual bool has_writes() const = 0;
547 };
548
550 {
551 public:
552 virtual ~AbstractCommitter() = default;
553
554 virtual bool has_writes() = 0;
555 virtual bool prepare() = 0;
556 virtual void commit(Version v, bool track_deletes_on_missing_keys) = 0;
558 };
559
560 class AbstractStore;
561 class AbstractMap : public std::enable_shared_from_this<AbstractMap>,
562 public GetName
563 {
564 public:
566 {
567 public:
568 virtual ~Snapshot() = default;
569 virtual void serialise(KvStoreSerialiser& s) = 0;
570 [[nodiscard]] virtual SecurityDomain get_security_domain() const = 0;
571 };
572
573 using GetName::GetName;
574 ~AbstractMap() override = default;
575
576 virtual std::unique_ptr<AbstractCommitter> create_committer(
577 AbstractChangeSet* changes) = 0;
578
579 virtual AbstractStore* get_store() = 0;
580 virtual void serialise_changes(
581 const AbstractChangeSet* changes,
583 bool include_reads) = 0;
584 virtual void compact(Version v) = 0;
585 virtual std::unique_ptr<Snapshot> snapshot(Version v) = 0;
586 virtual void post_compact() = 0;
587 virtual void rollback(Version v) = 0;
588 virtual void lock() = 0;
589 virtual void unlock() = 0;
591 virtual void clear() = 0;
592
593 virtual AbstractMap* clone(AbstractStore* store) = 0;
594 virtual void swap(AbstractMap* map) = 0;
595 };
596
597 class Tx;
598
600 {
601 public:
602 virtual ~AbstractExecutionWrapper() = default;
604 bool track_deletes_on_missing_keys = false) = 0;
606 virtual const std::vector<uint8_t>& get_entry() = 0;
607 virtual ccf::kv::Term get_term() = 0;
609 virtual bool support_async_execution() = 0;
610 virtual bool is_public_only() = 0;
612 virtual std::optional<ccf::crypto::Sha256Hash>&&
614
615 // Setting a short rollback is a work around that should be fixed
616 // shortly. In BFT mode when we deserialize and realize we need to
617 // create a new map we remember this. If we need to create the same
618 // map multiple times (for tx in the same group of append entries) the
619 // first create successes but the second fails because the map is
620 // already there. This works around the problem by stopping just
621 // before the 2nd create (which failed at this point) and when the
622 // primary resends the append entries we will succeed as the map is
623 // already there. This will only occur on BFT startup so not a perf
624 // problem but still need to be resolved.
625 //
626 // Thus, a large rollback is one which did not result from the map creating
627 // issue. https://github.com/microsoft/CCF/issues/2799
629 };
630
632 {
633 public:
635 {
636 public:
637 virtual ~AbstractSnapshot() = default;
638 [[nodiscard]] virtual Version get_version() const = 0;
639 virtual std::vector<uint8_t> serialise(
640 const std::shared_ptr<AbstractTxEncryptor>& encryptor) = 0;
641 };
642
643 virtual ~AbstractStore() = default;
644
645 virtual void lock_map_set() = 0;
646 virtual void unlock_map_set() = 0;
647
648 virtual Version next_version() = 0;
649 virtual std::tuple<Version, Version> next_version(bool commit_new_map) = 0;
650 virtual ccf::TxID next_txid() = 0;
651
653 virtual ccf::TxID current_txid() = 0;
654 virtual std::pair<ccf::TxID, Term> current_txid_and_commit_term() = 0;
655
657 virtual Term commit_view() = 0;
658
659 virtual std::shared_ptr<AbstractMap> get_map(
660 Version v, const std::string& map_name) = 0;
661 virtual std::shared_ptr<AbstractMap> get_map_unsafe(
662 Version v, const std::string& map_name) = 0;
663 virtual void add_dynamic_map(
664 Version v, const std::shared_ptr<AbstractMap>& map) = 0;
665
666 virtual std::shared_ptr<Consensus> get_consensus() = 0;
667 virtual std::shared_ptr<TxHistory> get_history() = 0;
668 virtual std::shared_ptr<ILedgerChunker> get_chunker() = 0;
670 virtual std::unique_ptr<AbstractExecutionWrapper> deserialize(
671 const std::vector<uint8_t>& data,
672 bool public_only = false,
673 const std::optional<ccf::TxID>& expected_txid = std::nullopt) = 0;
674 virtual void compact(Version v) = 0;
675 virtual void rollback(const ccf::TxID& tx_id, Term write_term_) = 0;
676 virtual void initialise_term(Term t) = 0;
678 const ccf::TxID& txid,
679 std::unique_ptr<PendingTx> pending_tx,
680 bool globally_committable) = 0;
681 virtual bool check_rollback_count(Version count) = 0;
682
683 virtual std::unique_ptr<AbstractSnapshot> snapshot_unsafe_maps(
684 Version v) = 0;
685 virtual void lock_maps() = 0;
686 virtual void unlock_maps() = 0;
687 virtual std::vector<uint8_t> serialise_snapshot(
688 std::unique_ptr<AbstractSnapshot> snapshot) = 0;
690 const uint8_t* data,
691 size_t size,
692 ConsensusHookPtrs& hooks,
693 std::vector<Version>* view_history = nullptr,
694 bool public_only = false) = 0;
695 virtual bool should_create_ledger_chunk(Version version) = 0;
697
698 virtual size_t committable_gap() = 0;
699
700 enum class StoreFlag : uint8_t
701 {
703 };
704
705 virtual void set_flag(StoreFlag f) = 0;
706 virtual void unset_flag(StoreFlag f) = 0;
707 virtual bool flag_enabled(StoreFlag f) = 0;
708 virtual void set_flag_unsafe(StoreFlag f) = 0;
709 virtual void unset_flag_unsafe(StoreFlag f) = 0;
710 [[nodiscard]] virtual bool flag_enabled_unsafe(StoreFlag f) const = 0;
711 };
712
713 template <class StorePointer>
715 {
716 public:
718 ScopedStoreMapsLock(StorePointer _store) : store(std::move(_store))
719 {
720 store->lock_maps();
721 }
723 {
724 store->unlock_maps();
725 }
726
727 private:
728 StorePointer store;
729 };
730
731}
732
733FMT_BEGIN_NAMESPACE
734
735template <>
736struct formatter<ccf::kv::Configuration::Nodes>
737{
738 template <typename ParseContext>
739 constexpr auto parse(ParseContext& ctx)
740 {
741 return ctx.begin();
742 }
743
744 template <typename FormatContext>
745 auto format(const ccf::kv::Configuration::Nodes& nodes, FormatContext& ctx)
746 const -> decltype(ctx.out())
747 {
748 std::set<ccf::NodeId> node_ids;
749 for (const auto& [nid, _] : nodes)
750 {
751 node_ids.insert(nid);
752 }
753 return fmt::format_to(ctx.out(), "{{{}}}", fmt::join(node_ids, " "));
754 }
755};
756
757template <>
758struct formatter<ccf::kv::MembershipState>
759{
760 template <typename ParseContext>
761 constexpr auto parse(ParseContext& ctx)
762 {
763 return ctx.begin();
764 }
765
766 template <typename FormatContext>
767 auto format(const ccf::kv::MembershipState& state, FormatContext& ctx) const
768 -> decltype(ctx.out())
769 {
770 const auto s = nlohmann::json(state).get<std::string>();
771 return format_to(ctx.out(), "{}", s);
772 }
773};
774
775template <>
776struct formatter<ccf::kv::LeadershipState>
777{
778 template <typename ParseContext>
779 constexpr auto parse(ParseContext& ctx)
780 {
781 return ctx.begin();
782 }
783
784 template <typename FormatContext>
785 auto format(const ccf::kv::LeadershipState& state, FormatContext& ctx) const
786 -> decltype(ctx.out())
787 {
788 const auto s = nlohmann::json(state).get<std::string>();
789 return format_to(ctx.out(), "{}", s);
790 }
791};
792
793FMT_END_NAMESPACE
Definition claims_digest.h:10
Definition pem.h:18
Definition sha256_hash.h:16
Definition kv_types.h:542
virtual bool has_writes() const =0
virtual ~AbstractChangeSet()=default
Definition kv_types.h:550
virtual bool prepare()=0
virtual void commit(Version v, bool track_deletes_on_missing_keys)=0
virtual ConsensusHookPtr post_commit()=0
virtual ~AbstractCommitter()=default
virtual bool has_writes()=0
Definition kv_types.h:600
virtual ccf::kv::ConsensusHookPtrs & get_hooks()=0
virtual ccf::kv::ApplyResult apply(bool track_deletes_on_missing_keys=false)=0
virtual ~AbstractExecutionWrapper()=default
virtual bool should_rollback_to_last_committed()=0
virtual std::optional< ccf::crypto::Sha256Hash > && consume_commit_evidence_digest()=0
virtual const std::vector< uint8_t > & get_entry()=0
virtual ccf::kv::Term get_term()=0
virtual bool support_async_execution()=0
virtual ccf::ClaimsDigest && consume_claims_digest()=0
virtual ccf::kv::Version get_index()=0
Definition kv_types.h:566
virtual void serialise(KvStoreSerialiser &s)=0
virtual SecurityDomain get_security_domain() const =0
Definition kv_types.h:563
virtual void clear()=0
virtual std::unique_ptr< Snapshot > snapshot(Version v)=0
virtual SecurityDomain get_security_domain()=0
virtual AbstractStore * get_store()=0
~AbstractMap() override=default
virtual std::unique_ptr< AbstractCommitter > create_committer(AbstractChangeSet *changes)=0
virtual AbstractMap * clone(AbstractStore *store)=0
virtual void post_compact()=0
virtual void lock()=0
virtual void serialise_changes(const AbstractChangeSet *changes, KvStoreSerialiser &s, bool include_reads)=0
virtual void compact(Version v)=0
virtual void rollback(Version v)=0
virtual void swap(AbstractMap *map)=0
virtual void unlock()=0
Definition kv_types.h:530
virtual void rollback(ccf::kv::Version v)=0
virtual bool should_schedule_snapshot(ccf::kv::Version v)=0
virtual bool record_committable(ccf::kv::Version v)=0
virtual void commit(ccf::kv::Version v, bool generate_snapshot)=0
virtual ~AbstractSnapshotter()=default
virtual std::vector< uint8_t > serialise(const std::shared_ptr< AbstractTxEncryptor > &encryptor)=0
virtual Version get_version() const =0
Definition kv_types.h:632
virtual std::unique_ptr< AbstractSnapshot > snapshot_unsafe_maps(Version v)=0
virtual CommitResult commit(const ccf::TxID &txid, std::unique_ptr< PendingTx > pending_tx, bool globally_committable)=0
virtual bool flag_enabled_unsafe(StoreFlag f) const =0
virtual ccf::TxID next_txid()=0
StoreFlag
Definition kv_types.h:701
virtual std::shared_ptr< TxHistory > get_history()=0
virtual std::shared_ptr< AbstractMap > get_map(Version v, const std::string &map_name)=0
virtual EncryptorPtr get_encryptor()=0
virtual void add_dynamic_map(Version v, const std::shared_ptr< AbstractMap > &map)=0
virtual bool should_create_ledger_chunk_unsafe(Version version)=0
virtual void set_flag_unsafe(StoreFlag f)=0
virtual void compact(Version v)=0
virtual std::pair< ccf::TxID, Term > current_txid_and_commit_term()=0
virtual bool should_create_ledger_chunk(Version version)=0
virtual std::shared_ptr< Consensus > get_consensus()=0
virtual void lock_map_set()=0
virtual std::shared_ptr< AbstractMap > get_map_unsafe(Version v, const std::string &map_name)=0
virtual bool flag_enabled(StoreFlag f)=0
virtual void unlock_map_set()=0
virtual std::unique_ptr< AbstractExecutionWrapper > deserialize(const std::vector< uint8_t > &data, bool public_only=false, const std::optional< ccf::TxID > &expected_txid=std::nullopt)=0
virtual size_t committable_gap()=0
virtual void unset_flag(StoreFlag f)=0
virtual void lock_maps()=0
virtual Version current_version()=0
virtual Term commit_view()=0
virtual Version next_version()=0
virtual void set_flag(StoreFlag f)=0
virtual bool check_rollback_count(Version count)=0
virtual std::shared_ptr< ILedgerChunker > get_chunker()=0
virtual std::vector< uint8_t > serialise_snapshot(std::unique_ptr< AbstractSnapshot > snapshot)=0
virtual Version compacted_version()=0
virtual void rollback(const ccf::TxID &tx_id, Term write_term_)=0
virtual void unlock_maps()=0
virtual ~AbstractStore()=default
virtual ApplyResult deserialise_snapshot(const uint8_t *data, size_t size, ConsensusHookPtrs &hooks, std::vector< Version > *view_history=nullptr, bool public_only=false)=0
virtual void initialise_term(Term t)=0
virtual void unset_flag_unsafe(StoreFlag f)=0
virtual std::tuple< Version, Version > next_version(bool commit_new_map)=0
virtual ccf::TxID current_txid()=0
Definition kv_types.h:490
virtual ~AbstractTxEncryptor()=default
std::string get_commit_evidence(const ccf::TxID &tx_id, bool historical_hint=false)
Definition kv_types.h:519
virtual bool decrypt(const std::vector< uint8_t > &cipher, const std::vector< uint8_t > &additional_data, const std::vector< uint8_t > &serialised_header, std::vector< uint8_t > &plain, Version version, Term &term, bool historical_hint=false)=0
virtual size_t get_header_length()=0
virtual bool encrypt(const std::vector< uint8_t > &plain, const std::vector< uint8_t > &additional_data, std::vector< uint8_t > &serialised_header, std::vector< uint8_t > &cipher, const ccf::TxID &tx_id, EntryType entry_type=EntryType::WriteSet, bool historical_hint=false)=0
virtual void rollback(Version version)=0
virtual uint64_t get_term(const uint8_t *data, size_t size)=0
virtual ccf::crypto::HashBytes get_commit_nonce(const ccf::TxID &tx_id, bool historical_hint=false)=0
Definition kv_types.h:194
virtual void add_configuration(ccf::SeqNo seqno, const Configuration::Nodes &conf)=0
virtual ~ConfigurableConsensus()=default
virtual ConsensusDetails get_details()=0
virtual Configuration::Nodes get_latest_configuration()=0
virtual Configuration::Nodes get_latest_configuration_unsafe() const =0
Definition kv_types.h:367
virtual void enable_all_domains()
Definition kv_types.h:410
virtual void nominate_successor()
Definition kv_types.h:416
virtual std::pair< ccf::View, ccf::SeqNo > get_committed_txid()=0
virtual bool is_candidate()=0
virtual ccf::SeqNo get_committed_seqno()=0
virtual bool can_replicate()=0
virtual void periodic_end()
Definition kv_types.h:408
~Consensus() override=default
virtual void init_as_backup(ccf::SeqNo, ccf::View, const std::vector< ccf::SeqNo > &, ccf::SeqNo)=0
virtual std::vector< ccf::SeqNo > get_view_history(ccf::SeqNo seqno=std::numeric_limits< ccf::SeqNo >::max())=0
virtual void recv_message(const NodeId &from, const uint8_t *data, size_t size)=0
virtual bool is_primary()=0
virtual NodeId id()=0
virtual std::optional< NodeId > primary()=0
virtual void force_become_primary(ccf::SeqNo, ccf::View, const std::vector< ccf::SeqNo > &, ccf::SeqNo)=0
virtual bool replicate(const BatchVector &entries, ccf::View view)=0
ccf::TxStatus evaluate_tx_status(ccf::View target_view, ccf::SeqNo target_seqno)
Definition kv_types.h:418
virtual void set_retired_committed(ccf::SeqNo, const std::vector< NodeId > &node_ids)
Definition kv_types.h:412
virtual void force_become_primary()=0
virtual bool is_at_max_capacity()=0
virtual SignatureDisposition get_signature_disposition()=0
virtual void periodic(std::chrono::milliseconds)
Definition kv_types.h:407
SignatureDisposition
Definition kv_types.h:379
virtual ccf::View get_view(ccf::SeqNo seqno)=0
virtual std::vector< ccf::SeqNo > get_view_history_since(ccf::SeqNo seqno)=0
virtual ccf::View get_view()=0
virtual bool is_backup()=0
Definition generic_serialise_wrapper.h:21
Definition kv_types.h:318
KvSerialiserException(std::string msg_)
Definition kv_types.h:323
const char * what() const noexcept override
Definition kv_types.h:325
Definition kv_types.h:459
MovePendingTx(std::vector< uint8_t > &&data_, ccf::ClaimsDigest &&claims_digest_, ccf::crypto::Sha256Hash &&commit_evidence_digest_, ConsensusHookPtrs &&hooks_)
Definition kv_types.h:467
PendingTxInfo call() override
Definition kv_types.h:478
Definition kv_types.h:452
virtual ~PendingTx()=default
virtual PendingTxInfo call()=0
Definition kv_types.h:715
ScopedStoreMapsLock(StorePointer _store)
Definition kv_types.h:718
~ScopedStoreMapsLock()
Definition kv_types.h:722
Definition kv_types.h:332
virtual void compact(Version v)=0
virtual void set_term(ccf::kv::Term)=0
virtual std::vector< uint8_t > get_proof(Version v)=0
virtual void emit_signature()=0
virtual const ccf::COSESignaturesConfig & get_cose_signatures_config()=0
virtual bool verify_root_signatures(ccf::kv::Version version)=0
virtual bool init_from_snapshot(const std::vector< uint8_t > &hash_at_snapshot)=0
virtual std::vector< uint8_t > serialise_tree(size_t to)=0
virtual std::vector< uint8_t > get_raw_leaf(uint64_t index)=0
virtual void set_service_signing_identity(std::shared_ptr< ccf::crypto::ECKeyPair_OpenSSL > keypair, const COSESignaturesConfig &cose_signatures)=0
virtual void try_emit_signature()=0
virtual ccf::crypto::Sha256Hash get_replicated_state_root()=0
virtual void append_entry(const ccf::crypto::Sha256Hash &digest, std::optional< ccf::kv::Term > expected_term=std::nullopt)=0
virtual void append(const std::vector< uint8_t > &data)=0
virtual void start_signature_emit_timer()=0
virtual bool verify_proof(const std::vector< uint8_t > &proof)=0
virtual void rollback(const ccf::TxID &tx_id, ccf::kv::Term term_of_next_version_)=0
virtual std::tuple< ccf::TxID, ccf::crypto::Sha256Hash, ccf::kv::Term > get_replicated_state_txid_and_root()=0
virtual ~TxHistory()=default
virtual void set_endorsed_certificate(const ccf::crypto::Pem &cert)=0
Definition tx.h:200
#define DECLARE_JSON_REQUIRED_FIELDS(TYPE,...)
Definition json.h:736
#define DECLARE_JSON_TYPE(TYPE)
Definition json.h:685
#define DECLARE_JSON_TYPE_WITH_OPTIONAL_FIELDS(TYPE)
Definition json.h:712
#define DECLARE_JSON_OPTIONAL_FIELDS(TYPE,...)
Definition json.h:811
#define DECLARE_JSON_ENUM(TYPE,...)
Definition json.h:864
std::vector< uint8_t > HashBytes
Definition hash_bytes.h:10
Definition app_interface.h:18
std::shared_ptr< AbstractTxEncryptor > EncryptorPtr
Definition kv_types.h:527
std::string schema_name(const Configuration::NodeInfo *)
Definition kv_types.h:91
AccessCategory
Definition kv_types.h:226
@ INTERNAL
Definition kv_types.h:227
@ APPLICATION
Definition kv_types.h:229
@ GOVERNANCE
Definition kv_types.h:228
uint64_t Term
Definition kv_types.h:46
std::unique_ptr< ConsensusHook > ConsensusHookPtr
Definition hooks.h:21
EntryType
Definition kv_types.h:233
@ WriteSetWithCommitEvidenceAndClaims
std::vector< std::tuple< Version, std::shared_ptr< std::vector< uint8_t > >, bool, std::shared_ptr< ConsensusHookPtrs > > > BatchVector
Definition kv_types.h:209
CommitResult
Definition kv_types.h:212
@ FAIL_NO_REPLICATE
Definition kv_types.h:215
@ SUCCESS
Definition kv_types.h:213
@ FAIL_CONFLICT
Definition kv_types.h:214
SecurityDomain
Definition kv_types.h:219
@ SECURITY_DOMAIN_MAX
Definition kv_types.h:222
@ PRIVATE
Definition kv_types.h:221
@ PUBLIC
Definition kv_types.h:220
uint64_t Version
Definition version.h:10
MembershipState
Definition kv_types.h:125
std::shared_ptr< AbstractSnapshotter > SnapshotterPtr
Definition kv_types.h:539
RetirementPhase
Definition kv_types.h:136
void fill_json_schema(nlohmann::json &schema, const Configuration::NodeInfo *)
Definition kv_types.h:96
uint64_t ReconfigurationId
Definition kv_types.h:49
LeadershipState
Definition kv_types.h:108
constexpr auto public_domain_prefix
Definition kv_types.h:258
void to_json(nlohmann::json &j, const Configuration::NodeInfo &ni)
Definition kv_types.h:78
ApplyResult
Definition kv_types.h:305
@ PASS_NONCES
Definition kv_types.h:310
@ PASS_SIGNATURE
Definition kv_types.h:307
@ PASS_BACKUP_SIGNATURE
Definition kv_types.h:308
@ PASS_BACKUP_SIGNATURE_SEND_ACK
Definition kv_types.h:309
@ FAIL
Definition kv_types.h:314
@ PASS
Definition kv_types.h:306
@ PASS_APPLY
Definition kv_types.h:313
@ PASS_ENCRYPTED_PAST_LEDGER_SECRET
Definition kv_types.h:312
@ PASS_NEW_VIEW
Definition kv_types.h:311
std::vector< ConsensusHookPtr > ConsensusHookPtrs
Definition hooks.h:22
void from_json(const nlohmann::json &j, Configuration::NodeInfo &ni)
Definition kv_types.h:83
Definition app_interface.h:13
EntityId< NodeIdFormatter > NodeId
Definition entity_id.h:164
TxStatus
Definition tx_status.h:13
uint64_t View
Definition tx_id.h:23
uint64_t SeqNo
Definition tx_id.h:36
Definition map_serializers.h:11
STL namespace.
Definition cose_signatures_config.h:12
Definition tx_id.h:44
SeqNo seqno
Definition tx_id.h:46
View view
Definition tx_id.h:45
Definition kv_types.h:54
std::string hostname
Definition kv_types.h:55
bool operator==(const NodeInfo &other) const
Definition kv_types.h:65
NodeInfo(std::string hostname_, std::string port_)
Definition kv_types.h:60
std::string port
Definition kv_types.h:56
Definition kv_types.h:52
ccf::SeqNo idx
Definition kv_types.h:73
std::map< NodeId, NodeInfo > Nodes
Definition kv_types.h:71
ReconfigurationId rid
Definition kv_types.h:75
Nodes nodes
Definition kv_types.h:74
Definition kv_types.h:156
size_t last_received_ms
Definition kv_types.h:158
ccf::SeqNo seqno
Definition kv_types.h:157
Definition kv_types.h:154
bool ticking
Definition kv_types.h:171
std::optional< std::unordered_map< ccf::NodeId, ccf::SeqNo > > learners
Definition kv_types.h:166
std::optional< ccf::ReconfigurationType > reconfiguration_type
Definition kv_types.h:168
std::optional< RetirementPhase > retirement_phase
Definition kv_types.h:165
ccf::View current_view
Definition kv_types.h:170
std::optional< LeadershipState > leadership_state
Definition kv_types.h:164
MembershipState membership_state
Definition kv_types.h:163
std::unordered_map< ccf::NodeId, Ack > acks
Definition kv_types.h:162
std::optional< ccf::NodeId > primary_id
Definition kv_types.h:169
std::vector< Configuration > configs
Definition kv_types.h:161
Definition get_name.h:10
GetName(std::string s)
Definition get_name.h:15
Definition kv_types.h:430
ccf::crypto::Sha256Hash commit_evidence_digest
Definition kv_types.h:434
PendingTxInfo(CommitResult success_, std::vector< uint8_t > &&data_, ccf::ClaimsDigest &&claims_digest_, ccf::crypto::Sha256Hash &&commit_evidence_digest_, std::vector< ConsensusHookPtr > &&hooks_)
Definition kv_types.h:437
std::vector< ConsensusHookPtr > hooks
Definition kv_types.h:435
ccf::ClaimsDigest claims_digest
Definition kv_types.h:433
std::vector< uint8_t > data
Definition kv_types.h:432
CommitResult success
Definition kv_types.h:431
constexpr auto parse(ParseContext &ctx)
Definition kv_types.h:739
auto format(const ccf::kv::Configuration::Nodes &nodes, FormatContext &ctx) const -> decltype(ctx.out())
Definition kv_types.h:745
constexpr auto parse(ParseContext &ctx)
Definition kv_types.h:779
auto format(const ccf::kv::LeadershipState &state, FormatContext &ctx) const -> decltype(ctx.out())
Definition kv_types.h:785
auto format(const ccf::kv::MembershipState &state, FormatContext &ctx) const -> decltype(ctx.out())
Definition kv_types.h:767
constexpr auto parse(ParseContext &ctx)
Definition kv_types.h:761