27#include <unordered_set>
32 struct PrimarySignature;
71 std::string
str()
const
90 NodeInfo(
const std::string& hostname_,
const std::string& port_) :
101 using Nodes = std::map<NodeId, NodeInfo>;
110 j[
"address"] = fmt::format(
"{}:{}", ni.
hostname, ni.
port);
115 const std::string addr(j[
"address"]);
116 const auto& [h, p] = ccf::nonstd::split_1(addr,
":");
123 return "Configuration__NodeInfo";
129 schema[
"type"] =
"object";
130 schema[
"required"] = nlohmann::json::array();
131 schema[
"required"].push_back(
"address");
132 schema[
"properties"] = nlohmann::json::object();
133 schema[
"properties"][
"address"] = nlohmann::json::object();
134 schema[
"properties"][
"address"][
"$ref"] =
"#/components/schemas/string";
190 std::unordered_map<ccf::NodeId, Ack>
acks = {};
194 std::optional<std::unordered_map<ccf::NodeId, ccf::SeqNo>>
learners =
216 reconfiguration_type,
232 const std::unordered_set<NodeId>& learners = {},
233 const std::unordered_set<NodeId>& retired_nodes = {}) = 0;
241 std::shared_ptr<std::vector<uint8_t>>,
243 std::shared_ptr<ConsensusHookPtrs>>>;
276 static bool has_claims(
const EntryType& et)
282 static bool has_commit_evidence(
const EntryType& et)
290 static_assert(
sizeof(
EntryType) ==
sizeof(
bool));
294 static inline SecurityDomain get_security_domain(
const std::string& name)
304 static inline std::pair<SecurityDomain, AccessCategory> parse_map_name(
305 std::string_view name)
307 constexpr auto internal_category_prefix =
"ccf.internal.";
308 constexpr auto governance_category_prefix =
"ccf.gov.";
309 constexpr auto reserved_category_prefix =
"ccf.";
319 if (name.starts_with(internal_category_prefix))
323 else if (name.starts_with(governance_category_prefix))
327 else if (name.starts_with(reserved_category_prefix))
329 throw std::logic_error(fmt::format(
330 "Map name '{}' includes disallowed reserved prefix '{}'",
332 reserved_category_prefix));
335 return {security_domain, access_category};
359 virtual const char*
what()
const throw()
414 const std::vector<uint8_t>& hash_at_snapshot) = 0;
416 virtual void append(
const std::vector<uint8_t>& data) = 0;
419 std::optional<ccf::kv::Term> expected_term = std::nullopt) = 0;
468 const NodeId& from,
const uint8_t* data,
size_t size) = 0;
470 virtual void periodic(std::chrono::milliseconds) {}
476 ccf::SeqNo,
const std::vector<NodeId>& node_ids)
486 std::vector<ConsensusHookPtr>
hooks;
490 std::vector<uint8_t>&& data_,
493 std::vector<ConsensusHookPtr>&& hooks_) :
512 std::vector<uint8_t> data;
519 std::vector<uint8_t>&& data_,
523 data(
std::move(data_)),
524 claims_digest(
std::move(claims_digest_)),
525 commit_evidence_digest(
std::move(commit_evidence_digest_)),
526 hooks(
std::move(hooks_))
534 std::move(claims_digest),
535 std::move(commit_evidence_digest),
546 const std::vector<uint8_t>& plain,
547 const std::vector<uint8_t>& additional_data,
548 std::vector<uint8_t>& serialised_header,
549 std::vector<uint8_t>& cipher,
552 bool historical_hint =
false) = 0;
554 const std::vector<uint8_t>& cipher,
555 const std::vector<uint8_t>& additional_data,
556 const std::vector<uint8_t>& serialised_header,
557 std::vector<uint8_t>& plain,
560 bool historical_hint =
false) = 0;
565 virtual uint64_t
get_term(
const uint8_t* data,
size_t size) = 0;
568 const TxID& tx_id,
bool historical_hint =
false) = 0;
600 bool track_read_versions,
601 bool track_deletes_on_missing_keys) = 0;
606 class AbstractMap :
public std::enable_shared_from_this<AbstractMap>,
628 bool include_reads) = 0;
649 bool track_deletes_on_missing_keys =
false) = 0;
657 virtual std::optional<ccf::crypto::Sha256Hash>&&
685 const std::shared_ptr<AbstractTxEncryptor>& encryptor) = 0;
694 virtual std::tuple<Version, Version>
next_version(
bool commit_new_map) = 0;
705 Version v,
const std::string& map_name) = 0;
707 Version v,
const std::string& map_name) = 0;
709 Version v,
const std::shared_ptr<AbstractMap>&
map) = 0;
715 const std::vector<uint8_t>& data,
716 bool public_only =
false,
717 const std::optional<TxID>& expected_txid = std::nullopt) = 0;
723 std::unique_ptr<PendingTx> pending_tx,
724 bool globally_committable) = 0;
732 std::unique_ptr<AbstractSnapshot> snapshot) = 0;
737 std::vector<Version>* view_history =
nullptr,
738 bool public_only =
false) = 0;
758 template <
class StorePo
inter>
769 store->unlock_maps();
781struct formatter<
ccf::kv::Configuration::Nodes>
783 template <
typename ParseContext>
784 constexpr auto parse(ParseContext& ctx)
789 template <
typename FormatContext>
791 const ->
decltype(ctx.out())
793 std::set<ccf::NodeId> node_ids;
794 for (
auto& [nid, _] : nodes)
796 node_ids.insert(nid);
798 return format_to(ctx.out(),
"{{{}}}", fmt::join(node_ids,
" "));
803struct formatter<
ccf::kv::MembershipState>
805 template <
typename ParseContext>
806 constexpr auto parse(ParseContext& ctx)
811 template <
typename FormatContext>
813 ->
decltype(ctx.out())
815 const auto s = nlohmann::json(state).get<std::string>();
816 return format_to(ctx.out(),
"{}", s);
821struct formatter<
ccf::kv::LeadershipState>
823 template <
typename ParseContext>
824 constexpr auto parse(ParseContext& ctx)
829 template <
typename FormatContext>
831 ->
decltype(ctx.out())
833 const auto s = nlohmann::json(state).get<std::string>();
834 return format_to(ctx.out(),
"{}", s);
Definition claims_digest.h:10
Definition sha256_hash.h:16
Definition kv_types.h:584
virtual bool has_writes() const =0
virtual ~AbstractChangeSet()=default
Definition kv_types.h:592
virtual void commit(Version v, bool track_read_versions, bool track_deletes_on_missing_keys)=0
virtual bool prepare(bool track_commits)=0
virtual ConsensusHookPtr post_commit()=0
virtual ~AbstractCommitter()=default
virtual bool has_writes()=0
Definition kv_types.h:645
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 bool is_public_only()=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:611
virtual void serialise(KvStoreSerialiser &s)=0
virtual SecurityDomain get_security_domain() const =0
virtual ~Snapshot()=default
Definition kv_types.h:608
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 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 ~AbstractMap()
Definition kv_types.h:619
Definition kv_types.h:573
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()
Definition kv_types.h:575
Definition kv_types.h:680
virtual std::vector< uint8_t > serialise(const std::shared_ptr< AbstractTxEncryptor > &encryptor)=0
virtual ~AbstractSnapshot()=default
virtual Version get_version() const =0
Definition kv_types.h:677
virtual void unset_flag(Flag f)=0
virtual std::unique_ptr< AbstractSnapshot > snapshot_unsafe_maps(Version v)=0
virtual std::shared_ptr< TxHistory > get_history()=0
virtual ~AbstractStore()
Definition kv_types.h:688
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 void rollback(const TxID &tx_id, Term write_term_)=0
virtual void compact(Version v)=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 void unset_flag_unsafe(Flag 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 TxID next_txid()=0
virtual void lock_maps()=0
virtual Version current_version()=0
virtual bool must_force_ledger_chunk_unsafe(Version version)=0
Flag
Definition kv_types.h:745
@ LEDGER_CHUNK_AT_NEXT_SIGNATURE
@ SNAPSHOT_AT_NEXT_SIGNATURE
virtual Term commit_view()=0
virtual Version next_version()=0
virtual void set_flag(Flag f)=0
virtual bool check_rollback_count(Version count)=0
virtual bool flag_enabled(Flag f)=0
virtual std::vector< uint8_t > serialise_snapshot(std::unique_ptr< AbstractSnapshot > snapshot)=0
virtual bool flag_enabled_unsafe(Flag f) const =0
virtual Version compacted_version()=0
virtual bool must_force_ledger_chunk(Version version)=0
virtual void unlock_maps()=0
virtual void set_flag_unsafe(Flag f)=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 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:541
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:543
virtual ccf::crypto::HashBytes get_commit_nonce(const TxID &tx_id, bool historical_hint=false)=0
Definition kv_types.h:227
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:430
virtual void enable_all_domains()
Definition kv_types.h:473
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:471
SignatureDisposition
Definition kv_types.h:442
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 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:475
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:470
virtual ccf::View get_view(ccf::SeqNo seqno)=0
virtual ~Consensus()
Definition kv_types.h:432
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:352
virtual const char * what() const
Definition kv_types.h:359
KvSerialiserException(const std::string &msg_)
Definition kv_types.h:357
Definition kv_types.h:510
MovePendingTx(std::vector< uint8_t > &&data_, ccf::ClaimsDigest &&claims_digest_, ccf::crypto::Sha256Hash &&commit_evidence_digest_, ConsensusHookPtrs &&hooks_)
Definition kv_types.h:518
PendingTxInfo call() override
Definition kv_types.h:529
Definition kv_types.h:503
virtual ~PendingTx()=default
virtual PendingTxInfo call()=0
Definition kv_types.h:760
ScopedStoreMapsLock()=delete
ScopedStoreMapsLock(StorePointer _store)
Definition kv_types.h:763
~ScopedStoreMapsLock()
Definition kv_types.h:767
Definition kv_types.h:366
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:370
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 bool verify_root_signatures(bool has_cose)=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:394
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:401
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
ReconfigurationType
Definition reconfiguration_type.h:6
#define DECLARE_JSON_REQUIRED_FIELDS(TYPE,...)
Definition json.h:712
#define DECLARE_JSON_TYPE(TYPE)
Definition json.h:661
#define DECLARE_JSON_TYPE_WITH_OPTIONAL_FIELDS(TYPE)
Definition json.h:688
#define DECLARE_JSON_OPTIONAL_FIELDS(TYPE,...)
Definition json.h:784
#define DECLARE_JSON_ENUM(TYPE,...)
Definition json.h:835
std::vector< uint8_t > HashBytes
Definition hash_bytes.h:10
Definition app_interface.h:20
std::shared_ptr< AbstractTxEncryptor > EncryptorPtr
Definition kv_types.h:570
RetirementPhase
Definition kv_types.h:164
std::string schema_name(const Configuration::NodeInfo *)
Definition kv_types.h:121
uint64_t Term
Definition kv_types.h:46
SecurityDomain
Definition kv_types.h:253
@ SECURITY_DOMAIN_MAX
Definition kv_types.h:256
@ PRIVATE
Definition kv_types.h:255
@ PUBLIC
Definition kv_types.h:254
std::unique_ptr< ConsensusHook > ConsensusHookPtr
Definition hooks.h:21
EntryType
Definition kv_types.h:267
@ WriteSetWithCommitEvidenceAndClaims
@ WriteSetWithCommitEvidence
std::vector< std::tuple< Version, std::shared_ptr< std::vector< uint8_t > >, bool, std::shared_ptr< ConsensusHookPtrs > > > BatchVector
Definition kv_types.h:243
uint64_t Version
Definition version.h:8
LeadershipState
Definition kv_types.h:138
CommitResult
Definition kv_types.h:246
@ FAIL_NO_REPLICATE
Definition kv_types.h:249
@ SUCCESS
Definition kv_types.h:247
@ FAIL_CONFLICT
Definition kv_types.h:248
std::shared_ptr< AbstractSnapshotter > SnapshotterPtr
Definition kv_types.h:581
void fill_json_schema(nlohmann::json &schema, const Configuration::NodeInfo *)
Definition kv_types.h:126
uint64_t ReconfigurationId
Definition kv_types.h:79
constexpr auto public_domain_prefix
Definition kv_types.h:292
ApplyResult
Definition kv_types.h:339
@ PASS_NONCES
Definition kv_types.h:344
@ PASS_SIGNATURE
Definition kv_types.h:341
@ PASS_BACKUP_SIGNATURE
Definition kv_types.h:342
@ PASS_BACKUP_SIGNATURE_SEND_ACK
Definition kv_types.h:343
@ FAIL
Definition kv_types.h:348
@ PASS
Definition kv_types.h:340
@ PASS_APPLY
Definition kv_types.h:347
@ PASS_ENCRYPTED_PAST_LEDGER_SECRET
Definition kv_types.h:346
@ PASS_NEW_VIEW
Definition kv_types.h:345
AccessCategory
Definition kv_types.h:260
@ INTERNAL
Definition kv_types.h:261
@ APPLICATION
Definition kv_types.h:263
@ GOVERNANCE
Definition kv_types.h:262
MembershipState
Definition kv_types.h:153
void to_json(nlohmann::json &j, const Configuration::NodeInfo &ni)
Definition kv_types.h:108
std::vector< ConsensusHookPtr > ConsensusHookPtrs
Definition hooks.h:22
void from_json(const nlohmann::json &j, Configuration::NodeInfo &ni)
Definition kv_types.h:113
Definition app_interface.h:15
EntityId< NodeIdFormatter > NodeId
Definition entity_id.h:155
view
Definition signatures.h:54
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
std::string hostname
Definition kv_types.h:85
bool operator==(const NodeInfo &other) const
Definition kv_types.h:95
NodeInfo(const std::string &hostname_, const std::string &port_)
Definition kv_types.h:90
std::string port
Definition kv_types.h:86
ccf::SeqNo idx
Definition kv_types.h:103
std::map< NodeId, NodeInfo > Nodes
Definition kv_types.h:101
ReconfigurationId rid
Definition kv_types.h:105
Nodes nodes
Definition kv_types.h:104
Definition kv_types.h:184
size_t last_received_ms
Definition kv_types.h:186
ccf::SeqNo seqno
Definition kv_types.h:185
Definition kv_types.h:182
bool ticking
Definition kv_types.h:199
std::optional< std::unordered_map< ccf::NodeId, ccf::SeqNo > > learners
Definition kv_types.h:194
std::optional< RetirementPhase > retirement_phase
Definition kv_types.h:193
ccf::View current_view
Definition kv_types.h:198
std::optional< LeadershipState > leadership_state
Definition kv_types.h:192
MembershipState membership_state
Definition kv_types.h:191
std::optional< ReconfigurationType > reconfiguration_type
Definition kv_types.h:196
std::unordered_map< ccf::NodeId, Ack > acks
Definition kv_types.h:190
std::optional< ccf::NodeId > primary_id
Definition kv_types.h:197
std::vector< Configuration > configs
Definition kv_types.h:189
Definition kv_types.h:222
ReconfigurationType reconfiguration_type
Definition kv_types.h:223
GetName(const std::string &s)
Definition get_name.h:15
Definition kv_types.h:481
ccf::crypto::Sha256Hash commit_evidence_digest
Definition kv_types.h:485
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:488
std::vector< ConsensusHookPtr > hooks
Definition kv_types.h:486
ccf::ClaimsDigest claims_digest
Definition kv_types.h:484
std::vector< uint8_t > data
Definition kv_types.h:483
CommitResult success
Definition kv_types.h:482
Definition kv_types.h:373
uint8_t frame_format
Definition kv_types.h:377
std::vector< uint8_t > caller_cert
Definition kv_types.h:376
RequestID rid
Definition kv_types.h:374
std::vector< uint8_t > request
Definition kv_types.h:375
Definition kv_types.h:388
RequestID rid
Definition kv_types.h:389
std::vector< uint8_t > response
Definition kv_types.h:390
Definition kv_types.h:381
Version version
Definition kv_types.h:383
RequestID rid
Definition kv_types.h:382
ccf::crypto::Sha256Hash replicated_state_merkle_root
Definition kv_types.h:384
bool operator==(const TxID &other) const
Definition kv_types.h:66
TxID(const ccf::TxID &other)
Definition kv_types.h:59
std::string str() const
Definition kv_types.h:71
Version version
Definition kv_types.h:52
TxID(Term t, Version v)
Definition kv_types.h:55
Term term
Definition kv_types.h:51