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/nonstd.h"
9#include "ccf/entity_id.h"
10#include "ccf/kv/get_name.h"
11#include "ccf/kv/hooks.h"
12#include "ccf/kv/version.h"
16#include "ccf/tx_id.h"
19#include "serialiser_declare.h"
20
21#include <array>
22#include <chrono>
23#include <functional>
24#include <limits>
25#include <list>
26#include <memory>
27#include <set>
28#include <string>
29#include <unordered_set>
30#include <vector>
31
32namespace ccf
33{
34 struct PrimarySignature;
35}
36
37namespace aft
38{
39 struct Request;
40}
41
42namespace ccf::kv
43{
44 // Term describes an epoch of Versions. It is incremented when global kv's
45 // writer(s) changes. Term and Version combined give a unique identifier for
46 // all accepted kv modifications. Terms are handled by Consensus via the
47 // TermHistory
48 using Term = uint64_t;
50
51 struct TxID
52 {
55
56 TxID() = default;
57 TxID(Term t, Version v) : term(t), version(v) {}
58
59 // Would like to remove these duplicate types, but for now we just do free
60 // conversion
61 TxID(const ccf::TxID& other) : term(other.view), version(other.seqno) {}
62
63 operator ccf::TxID() const
64 {
65 return {term, version};
66 }
67
68 bool operator==(const TxID& other) const
69 {
70 return term == other.term && version == other.version;
71 }
72
73 std::string str() const
74 {
75 return fmt::format("{}.{}", term, version);
76 }
77 };
80
81 using ReconfigurationId = uint64_t;
82
84 {
85 struct NodeInfo
86 {
87 std::string hostname;
88 std::string port;
89
90 NodeInfo() = default;
91
92 NodeInfo(const std::string& hostname_, const std::string& port_) :
93 hostname(hostname_),
94 port(port_)
95 {}
96
97 bool operator==(const NodeInfo& other) const
98 {
99 return hostname == other.hostname && port == other.port;
100 }
101 };
102
103 using Nodes = std::map<NodeId, NodeInfo>;
104
108 };
109
110 inline void to_json(nlohmann::json& j, const Configuration::NodeInfo& ni)
111 {
112 j["address"] = fmt::format("{}:{}", ni.hostname, ni.port);
113 }
114
115 inline void from_json(const nlohmann::json& j, Configuration::NodeInfo& ni)
116 {
117 const std::string addr(j["address"]);
118 const auto& [h, p] = ccf::nonstd::split_1(addr, ":");
119 ni.hostname = h;
120 ni.port = p;
121 }
122
123 inline std::string schema_name(const Configuration::NodeInfo*)
124 {
125 return "Configuration__NodeInfo";
126 }
127
128 inline void fill_json_schema(
129 nlohmann::json& schema, const Configuration::NodeInfo*)
130 {
131 schema["type"] = "object";
132 schema["required"] = nlohmann::json::array();
133 schema["required"].push_back("address");
134 schema["properties"] = nlohmann::json::object();
135 schema["properties"]["address"] = nlohmann::json::object();
136 schema["properties"]["address"]["$ref"] = "#/components/schemas/string";
137 }
138
140 {
141 None,
142 Leader,
143 Follower,
144 Candidate,
145 };
146
149 {{LeadershipState::None, "None"},
150 {LeadershipState::Leader, "Leader"},
151 {LeadershipState::Follower, "Follower"},
152 {LeadershipState::Candidate, "Candidate"}});
153
155 {
156 Active,
157 Retired
158 };
159
162 {{MembershipState::Active, "Active"},
163 {MembershipState::Retired, "Retired"}});
164
166 {
167 Ordered = 1,
168 Signed = 2,
169 Completed = 3,
171 };
172
175 {{RetirementPhase::Ordered, "Ordered"},
176 {RetirementPhase::Signed, "Signed"},
177 {RetirementPhase::Completed, "Completed"},
178 {RetirementPhase::RetiredCommitted, "RetiredCommitted"}});
179
182
184 {
185 struct Ack
186 {
189 };
190
191 std::vector<Configuration> configs = {};
192 std::unordered_map<ccf::NodeId, Ack> acks = {};
194 std::optional<LeadershipState> leadership_state = std::nullopt;
195 std::optional<RetirementPhase> retirement_phase = std::nullopt;
196 std::optional<std::unordered_map<ccf::NodeId, ccf::SeqNo>> learners =
197 std::nullopt;
198 std::optional<ccf::ReconfigurationType> reconfiguration_type = std::nullopt;
199 std::optional<ccf::NodeId> primary_id = std::nullopt;
201 bool ticking = false;
202 };
203
206
210 configs,
211 acks,
212 membership_state,
213 primary_id,
214 current_view,
215 ticking);
218 reconfiguration_type,
219 learners,
220 leadership_state,
221 retirement_phase);
222
227
229 {
230 public:
231 virtual void add_configuration(
233 const Configuration::Nodes& conf,
234 const std::unordered_set<NodeId>& learners = {},
235 const std::unordered_set<NodeId>& retired_nodes = {}) = 0;
239 };
240
241 using BatchVector = std::vector<std::tuple<
242 Version,
243 std::shared_ptr<std::vector<uint8_t>>,
244 bool,
245 std::shared_ptr<ConsensusHookPtrs>>>;
246
253
255 {
256 PUBLIC, // Public domain indicates the version and always appears first
259 };
260
267
277
278 static bool has_claims(const EntryType& et)
279 {
280 return et == EntryType::WriteSetWithClaims ||
282 }
283
284 static bool has_commit_evidence(const EntryType& et)
285 {
288 }
289
290 // EntryType must be backwards compatible with the older
291 // bool is_snapshot field
292 static_assert(sizeof(EntryType) == sizeof(bool));
293
294 constexpr auto public_domain_prefix = "public:";
295
296 static inline SecurityDomain get_security_domain(const std::string& name)
297 {
298 if (name.starts_with(public_domain_prefix))
299 {
301 }
302
304 }
305
306 static inline std::pair<SecurityDomain, AccessCategory> parse_map_name(
307 std::string_view name)
308 {
309 constexpr auto internal_category_prefix = "ccf.internal.";
310 constexpr auto governance_category_prefix = "ccf.gov.";
311 constexpr auto reserved_category_prefix = "ccf.";
312
313 auto security_domain = SecurityDomain::PRIVATE;
314 if (name.starts_with(public_domain_prefix))
315 {
316 name.remove_prefix(strlen(public_domain_prefix));
317 security_domain = SecurityDomain::PUBLIC;
318 }
319
320 auto access_category = AccessCategory::APPLICATION;
321 if (name.starts_with(internal_category_prefix))
322 {
323 access_category = AccessCategory::INTERNAL;
324 }
325 else if (name.starts_with(governance_category_prefix))
326 {
327 access_category = AccessCategory::GOVERNANCE;
328 }
329 else if (name.starts_with(reserved_category_prefix))
330 {
331 throw std::logic_error(fmt::format(
332 "Map name '{}' includes disallowed reserved prefix '{}'",
333 name,
334 reserved_category_prefix));
335 }
336
337 return {security_domain, access_category};
338 }
339
352
353 class KvSerialiserException : public std::exception
354 {
355 private:
356 std::string msg;
357
358 public:
359 KvSerialiserException(const std::string& msg_) : msg(msg_) {}
360
361 virtual const char* what() const throw()
362 {
363 return msg.c_str();
364 }
365 };
366
368 {
369 public:
370 using RequestID = std::tuple<
371 size_t /* Client Session ID */,
372 size_t /* Request sequence number */>;
373
375 {
377 std::vector<uint8_t> request;
378 std::vector<uint8_t> caller_cert;
380 };
381
388
390 {
392 std::vector<uint8_t> response;
393 };
394
395 enum class Result
396 {
397 FAIL = 0,
398 OK,
401 };
402
403 virtual ~TxHistory() {}
404 virtual bool verify_root_signatures(ccf::kv::Version version) = 0;
405 virtual void try_emit_signature() = 0;
406 virtual void emit_signature() = 0;
408 virtual std::tuple<
409 ccf::kv::TxID /* TxID of last transaction seen by history */,
410 ccf::crypto::Sha256Hash /* root as of TxID */,
411 ccf::kv::Term /* term_of_next_version */>
413 virtual std::vector<uint8_t> get_proof(Version v) = 0;
414 virtual bool verify_proof(const std::vector<uint8_t>& proof) = 0;
415 virtual bool init_from_snapshot(
416 const std::vector<uint8_t>& hash_at_snapshot) = 0;
417 virtual std::vector<uint8_t> get_raw_leaf(uint64_t index) = 0;
418 virtual void append(const std::vector<uint8_t>& data) = 0;
419 virtual void append_entry(
420 const ccf::crypto::Sha256Hash& digest,
421 std::optional<ccf::kv::Term> expected_term = std::nullopt) = 0;
422 virtual void rollback(
423 const ccf::kv::TxID& tx_id, ccf::kv::Term term_of_next_version_) = 0;
424 virtual void compact(Version v) = 0;
425 virtual void set_term(ccf::kv::Term) = 0;
426 virtual std::vector<uint8_t> serialise_tree(size_t to) = 0;
427 virtual void set_endorsed_certificate(const ccf::crypto::Pem& cert) = 0;
428 virtual void start_signature_emit_timer() = 0;
430 std::shared_ptr<ccf::crypto::KeyPair_OpenSSL> keypair,
431 const COSESignaturesConfig& cose_signatures) = 0;
433 };
434
436 {
437 public:
438 virtual ~Consensus() {}
439
440 virtual NodeId id() = 0;
441 virtual bool is_primary() = 0;
442 virtual bool is_backup() = 0;
443 virtual bool is_candidate() = 0;
444 virtual bool can_replicate() = 0;
445 virtual bool is_at_max_capacity() = 0;
446
448 {
450 CAN_SIGN,
452 };
454
455 virtual void force_become_primary() = 0;
457 ccf::SeqNo, ccf::View, const std::vector<ccf::SeqNo>&, ccf::SeqNo) = 0;
458 virtual void init_as_backup(
459 ccf::SeqNo, ccf::View, const std::vector<ccf::SeqNo>&, ccf::SeqNo) = 0;
460
461 virtual bool replicate(const BatchVector& entries, ccf::View view) = 0;
462 virtual std::pair<ccf::View, ccf::SeqNo> get_committed_txid() = 0;
463
465 virtual ccf::View get_view() = 0;
466 virtual std::vector<ccf::SeqNo> get_view_history(
467 ccf::SeqNo seqno = std::numeric_limits<ccf::SeqNo>::max()) = 0;
468 virtual std::vector<ccf::SeqNo> get_view_history_since(
469 ccf::SeqNo seqno) = 0;
471 virtual std::optional<NodeId> primary() = 0;
472
473 virtual void recv_message(
474 const NodeId& from, const uint8_t* data, size_t size) = 0;
475
476 virtual void periodic(std::chrono::milliseconds) {}
477 virtual void periodic_end() {}
478
479 virtual void enable_all_domains() {}
480
482 ccf::SeqNo, const std::vector<NodeId>& node_ids)
483 {}
484 };
485
487 {
489 std::vector<uint8_t> data;
492 std::vector<ConsensusHookPtr> hooks;
493
495 CommitResult success_,
496 std::vector<uint8_t>&& data_,
497 ccf::ClaimsDigest&& claims_digest_,
498 ccf::crypto::Sha256Hash&& commit_evidence_digest_,
499 std::vector<ConsensusHookPtr>&& hooks_) :
500 success(success_),
501 data(std::move(data_)),
502 claims_digest(claims_digest_),
503 commit_evidence_digest(commit_evidence_digest_),
504 hooks(std::move(hooks_))
505 {}
506 };
507
509 {
510 public:
511 virtual PendingTxInfo call() = 0;
512 virtual ~PendingTx() = default;
513 };
514
516 {
517 private:
518 std::vector<uint8_t> data;
519 ccf::ClaimsDigest claims_digest;
520 ccf::crypto::Sha256Hash commit_evidence_digest;
521 ConsensusHookPtrs hooks;
522
523 public:
525 std::vector<uint8_t>&& data_,
526 ccf::ClaimsDigest&& claims_digest_,
527 ccf::crypto::Sha256Hash&& commit_evidence_digest_,
528 ConsensusHookPtrs&& hooks_) :
529 data(std::move(data_)),
530 claims_digest(std::move(claims_digest_)),
531 commit_evidence_digest(std::move(commit_evidence_digest_)),
532 hooks(std::move(hooks_))
533 {}
534
536 {
537 return PendingTxInfo(
539 std::move(data),
540 std::move(claims_digest),
541 std::move(commit_evidence_digest),
542 std::move(hooks));
543 }
544 };
545
547 {
548 public:
550
551 virtual bool encrypt(
552 const std::vector<uint8_t>& plain,
553 const std::vector<uint8_t>& additional_data,
554 std::vector<uint8_t>& serialised_header,
555 std::vector<uint8_t>& cipher,
556 const TxID& tx_id,
557 EntryType entry_type = EntryType::WriteSet,
558 bool historical_hint = false) = 0;
559 virtual bool decrypt(
560 const std::vector<uint8_t>& cipher,
561 const std::vector<uint8_t>& additional_data,
562 const std::vector<uint8_t>& serialised_header,
563 std::vector<uint8_t>& plain,
564 Version version,
565 Term& term,
566 bool historical_hint = false) = 0;
567
568 virtual void rollback(Version version) = 0;
569
570 virtual size_t get_header_length() = 0;
571 virtual uint64_t get_term(const uint8_t* data, size_t size) = 0;
572
574 const TxID& tx_id, bool historical_hint = false) = 0;
575 };
576 using EncryptorPtr = std::shared_ptr<AbstractTxEncryptor>;
577
579 {
580 public:
581 virtual ~AbstractSnapshotter() = default;
582
584 virtual void commit(ccf::kv::Version v, bool generate_snapshot) = 0;
585 virtual void rollback(ccf::kv::Version v) = 0;
586 };
587 using SnapshotterPtr = std::shared_ptr<AbstractSnapshotter>;
588
590 {
591 public:
592 virtual ~AbstractChangeSet() = default;
593
594 virtual bool has_writes() const = 0;
595 };
596
598 {
599 public:
600 virtual ~AbstractCommitter() = default;
601
602 virtual bool has_writes() = 0;
603 virtual bool prepare() = 0;
604 virtual void commit(Version v, bool track_deletes_on_missing_keys) = 0;
606 };
607
608 class AbstractStore;
609 class AbstractMap : public std::enable_shared_from_this<AbstractMap>,
610 public GetName
611 {
612 public:
614 {
615 public:
616 virtual ~Snapshot() = default;
617 virtual void serialise(KvStoreSerialiser& s) = 0;
619 };
620
621 using GetName::GetName;
622 virtual ~AbstractMap() {}
623
624 virtual std::unique_ptr<AbstractCommitter> create_committer(
625 AbstractChangeSet* changes) = 0;
626
627 virtual AbstractStore* get_store() = 0;
628 virtual void serialise_changes(
629 const AbstractChangeSet* changes,
631 bool include_reads) = 0;
632 virtual void compact(Version v) = 0;
633 virtual std::unique_ptr<Snapshot> snapshot(Version v) = 0;
634 virtual void post_compact() = 0;
635 virtual void rollback(Version v) = 0;
636 virtual void lock() = 0;
637 virtual void unlock() = 0;
639 virtual void clear() = 0;
640
641 virtual AbstractMap* clone(AbstractStore* store) = 0;
642 virtual void swap(AbstractMap* map) = 0;
643 };
644
645 class Tx;
646
648 {
649 public:
650 virtual ~AbstractExecutionWrapper() = default;
652 bool track_deletes_on_missing_keys = false) = 0;
654 virtual const std::vector<uint8_t>& get_entry() = 0;
655 virtual ccf::kv::Term get_term() = 0;
657 virtual bool support_async_execution() = 0;
658 virtual bool is_public_only() = 0;
660 virtual std::optional<ccf::crypto::Sha256Hash>&&
662
663 // Setting a short rollback is a work around that should be fixed
664 // shortly. In BFT mode when we deserialize and realize we need to
665 // create a new map we remember this. If we need to create the same
666 // map multiple times (for tx in the same group of append entries) the
667 // first create successes but the second fails because the map is
668 // already there. This works around the problem by stopping just
669 // before the 2nd create (which failed at this point) and when the
670 // primary resends the append entries we will succeed as the map is
671 // already there. This will only occur on BFT startup so not a perf
672 // problem but still need to be resolved.
673 //
674 // Thus, a large rollback is one which did not result from the map creating
675 // issue. https://github.com/microsoft/CCF/issues/2799
677 };
678
680 {
681 public:
683 {
684 public:
685 virtual ~AbstractSnapshot() = default;
686 virtual Version get_version() const = 0;
687 virtual std::vector<uint8_t> serialise(
688 const std::shared_ptr<AbstractTxEncryptor>& encryptor) = 0;
689 };
690
691 virtual ~AbstractStore() {}
692
693 virtual void lock_map_set() = 0;
694 virtual void unlock_map_set() = 0;
695
696 virtual Version next_version() = 0;
697 virtual std::tuple<Version, Version> next_version(bool commit_new_map) = 0;
698 virtual TxID next_txid() = 0;
699
701 virtual TxID current_txid() = 0;
702 virtual std::pair<TxID, Term> current_txid_and_commit_term() = 0;
703
705 virtual Term commit_view() = 0;
706
707 virtual std::shared_ptr<AbstractMap> get_map(
708 Version v, const std::string& map_name) = 0;
709 virtual std::shared_ptr<AbstractMap> get_map_unsafe(
710 Version v, const std::string& map_name) = 0;
711 virtual void add_dynamic_map(
712 Version v, const std::shared_ptr<AbstractMap>& map) = 0;
713
714 virtual std::shared_ptr<Consensus> get_consensus() = 0;
715 virtual std::shared_ptr<TxHistory> get_history() = 0;
716 virtual std::shared_ptr<ILedgerChunker> get_chunker() = 0;
718 virtual std::unique_ptr<AbstractExecutionWrapper> deserialize(
719 const std::vector<uint8_t>& data,
720 bool public_only = false,
721 const std::optional<TxID>& expected_txid = std::nullopt) = 0;
722 virtual void compact(Version v) = 0;
723 virtual void rollback(const TxID& tx_id, Term write_term_) = 0;
724 virtual void initialise_term(Term t) = 0;
726 const TxID& txid,
727 std::unique_ptr<PendingTx> pending_tx,
728 bool globally_committable) = 0;
729 virtual bool check_rollback_count(Version count) = 0;
730
731 virtual std::unique_ptr<AbstractSnapshot> snapshot_unsafe_maps(
732 Version v) = 0;
733 virtual void lock_maps() = 0;
734 virtual void unlock_maps() = 0;
735 virtual std::vector<uint8_t> serialise_snapshot(
736 std::unique_ptr<AbstractSnapshot> snapshot) = 0;
738 const uint8_t* data,
739 size_t size,
740 ConsensusHookPtrs& hooks,
741 std::vector<Version>* view_history = nullptr,
742 bool public_only = false) = 0;
743 virtual bool should_create_ledger_chunk(Version version) = 0;
745
746 virtual size_t committable_gap() = 0;
747
748 enum class StoreFlag : uint8_t
749 {
751 };
752
753 virtual void set_flag(StoreFlag f) = 0;
754 virtual void unset_flag(StoreFlag f) = 0;
755 virtual bool flag_enabled(StoreFlag f) = 0;
756 virtual void set_flag_unsafe(StoreFlag f) = 0;
757 virtual void unset_flag_unsafe(StoreFlag f) = 0;
758 virtual bool flag_enabled_unsafe(StoreFlag f) const = 0;
759 };
760
761 template <class StorePointer>
763 {
764 public:
766 ScopedStoreMapsLock(StorePointer _store) : store(_store)
767 {
768 store->lock_maps();
769 }
771 {
772 store->unlock_maps();
773 }
774
775 private:
776 StorePointer store;
777 };
778
779}
780
781FMT_BEGIN_NAMESPACE
782
783template <>
784struct formatter<ccf::kv::Configuration::Nodes>
785{
786 template <typename ParseContext>
787 constexpr auto parse(ParseContext& ctx)
788 {
789 return ctx.begin();
790 }
791
792 template <typename FormatContext>
793 auto format(const ccf::kv::Configuration::Nodes& nodes, FormatContext& ctx)
794 const -> decltype(ctx.out())
795 {
796 std::set<ccf::NodeId> node_ids;
797 for (auto& [nid, _] : nodes)
798 {
799 node_ids.insert(nid);
800 }
801 return fmt::format_to(ctx.out(), "{{{}}}", fmt::join(node_ids, " "));
802 }
803};
804
805template <>
806struct formatter<ccf::kv::MembershipState>
807{
808 template <typename ParseContext>
809 constexpr auto parse(ParseContext& ctx)
810 {
811 return ctx.begin();
812 }
813
814 template <typename FormatContext>
815 auto format(const ccf::kv::MembershipState& state, FormatContext& ctx) const
816 -> decltype(ctx.out())
817 {
818 const auto s = nlohmann::json(state).get<std::string>();
819 return format_to(ctx.out(), "{}", s);
820 }
821};
822
823template <>
824struct formatter<ccf::kv::LeadershipState>
825{
826 template <typename ParseContext>
827 constexpr auto parse(ParseContext& ctx)
828 {
829 return ctx.begin();
830 }
831
832 template <typename FormatContext>
833 auto format(const ccf::kv::LeadershipState& state, FormatContext& ctx) const
834 -> decltype(ctx.out())
835 {
836 const auto s = nlohmann::json(state).get<std::string>();
837 return format_to(ctx.out(), "{}", s);
838 }
839};
840
841FMT_END_NAMESPACE
Definition claims_digest.h:10
Definition pem.h:18
Definition sha256_hash.h:16
Definition kv_types.h:590
virtual bool has_writes() const =0
virtual ~AbstractChangeSet()=default
Definition kv_types.h:598
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:648
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:614
virtual void serialise(KvStoreSerialiser &s)=0
virtual SecurityDomain get_security_domain() const =0
Definition kv_types.h:611
virtual void clear()=0
virtual std::unique_ptr< Snapshot > snapshot(Version v)=0
virtual SecurityDomain get_security_domain()=0
virtual AbstractStore * get_store()=0
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
virtual ~AbstractMap()
Definition kv_types.h:622
Definition kv_types.h:579
virtual void rollback(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:680
virtual std::unique_ptr< AbstractSnapshot > snapshot_unsafe_maps(Version v)=0
virtual bool flag_enabled_unsafe(StoreFlag f) const =0
StoreFlag
Definition kv_types.h:749
virtual std::shared_ptr< TxHistory > get_history()=0
virtual ~AbstractStore()
Definition kv_types.h:691
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 rollback(const TxID &tx_id, Term write_term_)=0
virtual void set_flag_unsafe(StoreFlag f)=0
virtual void compact(Version v)=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::pair< TxID, Term > current_txid_and_commit_term()=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 CommitResult commit(const TxID &txid, std::unique_ptr< PendingTx > pending_tx, bool globally_committable)=0
virtual void unlock_map_set()=0
virtual size_t committable_gap()=0
virtual void unset_flag(StoreFlag f)=0
virtual TxID next_txid()=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 unlock_maps()=0
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 TxID current_txid()=0
virtual std::unique_ptr< AbstractExecutionWrapper > deserialize(const std::vector< uint8_t > &data, bool public_only=false, const std::optional< TxID > &expected_txid=std::nullopt)=0
virtual std::tuple< Version, Version > next_version(bool commit_new_map)=0
Definition kv_types.h:547
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 TxID &tx_id, EntryType entry_type=EntryType::WriteSet, bool historical_hint=false)=0
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 void rollback(Version version)=0
virtual uint64_t get_term(const uint8_t *data, size_t size)=0
virtual ~AbstractTxEncryptor()
Definition kv_types.h:549
virtual ccf::crypto::HashBytes get_commit_nonce(const TxID &tx_id, bool historical_hint=false)=0
Definition kv_types.h:229
virtual void add_configuration(ccf::SeqNo seqno, const Configuration::Nodes &conf, const std::unordered_set< NodeId > &learners={}, const std::unordered_set< NodeId > &retired_nodes={})=0
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:436
virtual void enable_all_domains()
Definition kv_types.h:479
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:477
SignatureDisposition
Definition kv_types.h:448
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
virtual void set_retired_committed(ccf::SeqNo, const std::vector< NodeId > &node_ids)
Definition kv_types.h:481
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:476
virtual ccf::View get_view(ccf::SeqNo seqno)=0
virtual ~Consensus()
Definition kv_types.h:438
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:20
Definition kv_types.h:354
virtual const char * what() const
Definition kv_types.h:361
KvSerialiserException(const std::string &msg_)
Definition kv_types.h:359
Definition kv_types.h:516
MovePendingTx(std::vector< uint8_t > &&data_, ccf::ClaimsDigest &&claims_digest_, ccf::crypto::Sha256Hash &&commit_evidence_digest_, ConsensusHookPtrs &&hooks_)
Definition kv_types.h:524
PendingTxInfo call() override
Definition kv_types.h:535
Definition kv_types.h:509
virtual ~PendingTx()=default
virtual PendingTxInfo call()=0
Definition kv_types.h:763
ScopedStoreMapsLock(StorePointer _store)
Definition kv_types.h:766
~ScopedStoreMapsLock()
Definition kv_types.h:770
Definition kv_types.h:368
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
std::tuple< size_t, size_t > RequestID
Definition kv_types.h:372
virtual void set_service_signing_identity(std::shared_ptr< ccf::crypto::KeyPair_OpenSSL > keypair, const COSESignaturesConfig &cose_signatures)=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 try_emit_signature()=0
virtual void rollback(const ccf::kv::TxID &tx_id, ccf::kv::Term term_of_next_version_)=0
Result
Definition kv_types.h:396
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 ~TxHistory()
Definition kv_types.h:403
virtual bool verify_proof(const std::vector< uint8_t > &proof)=0
virtual void set_endorsed_certificate(const ccf::crypto::Pem &cert)=0
virtual std::tuple< ccf::kv::TxID, ccf::crypto::Sha256Hash, ccf::kv::Term > get_replicated_state_txid_and_root()=0
Definition tx.h:201
#define DECLARE_JSON_REQUIRED_FIELDS(TYPE,...)
Definition json.h:714
#define DECLARE_JSON_TYPE(TYPE)
Definition json.h:663
#define DECLARE_JSON_TYPE_WITH_OPTIONAL_FIELDS(TYPE)
Definition json.h:690
#define DECLARE_JSON_OPTIONAL_FIELDS(TYPE,...)
Definition json.h:786
#define DECLARE_JSON_ENUM(TYPE,...)
Definition json.h:837
Definition state.h:18
std::vector< uint8_t > HashBytes
Definition hash_bytes.h:10
Definition app_interface.h:19
std::shared_ptr< AbstractTxEncryptor > EncryptorPtr
Definition kv_types.h:576
RetirementPhase
Definition kv_types.h:166
std::string schema_name(const Configuration::NodeInfo *)
Definition kv_types.h:123
uint64_t Term
Definition kv_types.h:48
SecurityDomain
Definition kv_types.h:255
@ SECURITY_DOMAIN_MAX
Definition kv_types.h:258
@ PRIVATE
Definition kv_types.h:257
@ PUBLIC
Definition kv_types.h:256
std::unique_ptr< ConsensusHook > ConsensusHookPtr
Definition hooks.h:21
EntryType
Definition kv_types.h:269
@ WriteSetWithCommitEvidenceAndClaims
std::vector< std::tuple< Version, std::shared_ptr< std::vector< uint8_t > >, bool, std::shared_ptr< ConsensusHookPtrs > > > BatchVector
Definition kv_types.h:245
uint64_t Version
Definition version.h:8
LeadershipState
Definition kv_types.h:140
CommitResult
Definition kv_types.h:248
@ FAIL_NO_REPLICATE
Definition kv_types.h:251
@ SUCCESS
Definition kv_types.h:249
@ FAIL_CONFLICT
Definition kv_types.h:250
std::shared_ptr< AbstractSnapshotter > SnapshotterPtr
Definition kv_types.h:587
void fill_json_schema(nlohmann::json &schema, const Configuration::NodeInfo *)
Definition kv_types.h:128
uint64_t ReconfigurationId
Definition kv_types.h:81
constexpr auto public_domain_prefix
Definition kv_types.h:294
ApplyResult
Definition kv_types.h:341
@ PASS_NONCES
Definition kv_types.h:346
@ PASS_SIGNATURE
Definition kv_types.h:343
@ PASS_BACKUP_SIGNATURE
Definition kv_types.h:344
@ PASS_BACKUP_SIGNATURE_SEND_ACK
Definition kv_types.h:345
@ FAIL
Definition kv_types.h:350
@ PASS
Definition kv_types.h:342
@ PASS_APPLY
Definition kv_types.h:349
@ PASS_ENCRYPTED_PAST_LEDGER_SECRET
Definition kv_types.h:348
@ PASS_NEW_VIEW
Definition kv_types.h:347
AccessCategory
Definition kv_types.h:262
@ INTERNAL
Definition kv_types.h:263
@ APPLICATION
Definition kv_types.h:265
@ GOVERNANCE
Definition kv_types.h:264
MembershipState
Definition kv_types.h:155
void to_json(nlohmann::json &j, const Configuration::NodeInfo &ni)
Definition kv_types.h:110
std::vector< ConsensusHookPtr > ConsensusHookPtrs
Definition hooks.h:22
void from_json(const nlohmann::json &j, Configuration::NodeInfo &ni)
Definition kv_types.h:115
Definition app_interface.h:14
EntityId< NodeIdFormatter > NodeId
Definition entity_id.h:155
view
Definition signatures.h:54
ReconfigurationType
Definition reconfiguration_type.h:10
seqno
Definition signatures.h:54
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
Definition kv_types.h:86
std::string hostname
Definition kv_types.h:87
bool operator==(const NodeInfo &other) const
Definition kv_types.h:97
NodeInfo(const std::string &hostname_, const std::string &port_)
Definition kv_types.h:92
std::string port
Definition kv_types.h:88
Definition kv_types.h:84
ccf::SeqNo idx
Definition kv_types.h:105
std::map< NodeId, NodeInfo > Nodes
Definition kv_types.h:103
ReconfigurationId rid
Definition kv_types.h:107
Nodes nodes
Definition kv_types.h:106
Definition kv_types.h:186
size_t last_received_ms
Definition kv_types.h:188
ccf::SeqNo seqno
Definition kv_types.h:187
Definition kv_types.h:184
bool ticking
Definition kv_types.h:201
std::optional< std::unordered_map< ccf::NodeId, ccf::SeqNo > > learners
Definition kv_types.h:196
std::optional< ccf::ReconfigurationType > reconfiguration_type
Definition kv_types.h:198
std::optional< RetirementPhase > retirement_phase
Definition kv_types.h:195
ccf::View current_view
Definition kv_types.h:200
std::optional< LeadershipState > leadership_state
Definition kv_types.h:194
MembershipState membership_state
Definition kv_types.h:193
std::unordered_map< ccf::NodeId, Ack > acks
Definition kv_types.h:192
std::optional< ccf::NodeId > primary_id
Definition kv_types.h:199
std::vector< Configuration > configs
Definition kv_types.h:191
Definition kv_types.h:224
ccf::ReconfigurationType reconfiguration_type
Definition kv_types.h:225
Definition get_name.h:10
GetName(const std::string &s)
Definition get_name.h:15
Definition kv_types.h:487
ccf::crypto::Sha256Hash commit_evidence_digest
Definition kv_types.h:491
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:494
std::vector< ConsensusHookPtr > hooks
Definition kv_types.h:492
ccf::ClaimsDigest claims_digest
Definition kv_types.h:490
std::vector< uint8_t > data
Definition kv_types.h:489
CommitResult success
Definition kv_types.h:488
uint8_t frame_format
Definition kv_types.h:379
std::vector< uint8_t > caller_cert
Definition kv_types.h:378
RequestID rid
Definition kv_types.h:376
std::vector< uint8_t > request
Definition kv_types.h:377
RequestID rid
Definition kv_types.h:391
std::vector< uint8_t > response
Definition kv_types.h:392
Version version
Definition kv_types.h:385
RequestID rid
Definition kv_types.h:384
ccf::crypto::Sha256Hash replicated_state_merkle_root
Definition kv_types.h:386
Definition kv_types.h:52
bool operator==(const TxID &other) const
Definition kv_types.h:68
TxID(const ccf::TxID &other)
Definition kv_types.h:61
TxID()=default
std::string str() const
Definition kv_types.h:73
Version version
Definition kv_types.h:54
TxID(Term t, Version v)
Definition kv_types.h:57
Term term
Definition kv_types.h:53
constexpr auto parse(ParseContext &ctx)
Definition kv_types.h:787
auto format(const ccf::kv::Configuration::Nodes &nodes, FormatContext &ctx) const -> decltype(ctx.out())
Definition kv_types.h:793
constexpr auto parse(ParseContext &ctx)
Definition kv_types.h:827
auto format(const ccf::kv::LeadershipState &state, FormatContext &ctx) const -> decltype(ctx.out())
Definition kv_types.h:833
auto format(const ccf::kv::MembershipState &state, FormatContext &ctx) const -> decltype(ctx.out())
Definition kv_types.h:815
constexpr auto parse(ParseContext &ctx)
Definition kv_types.h:809