42 std::string& commit_evidence,
44 bool include_reads =
false)
47 throw std::logic_error(
"Transaction not yet committed");
50 throw std::logic_error(
"Transaction aborted");
52 if (claims_digest_.
empty())
53 throw std::logic_error(
"Missing claims");
56 const bool any_changes =
58 return it.second.changeset->has_writes();
66 auto e =
pimpl->store->get_encryptor();
72 auto commit_nonce = e->get_commit_nonce({
pimpl->commit_view,
version});
73 commit_evidence = fmt::format(
77 ccf::ds::to_hex(commit_nonce));
80 commit_evidence_digest = tx_commit_evidence_digest;
93 tx_commit_evidence_digest,
101 const auto&
map = it.second.map;
102 const auto& changeset = it.second.changeset;
103 if (
map->get_security_domain() == domain && changeset->has_writes())
105 map->serialise_changes(
106 changeset.get(), replicated_serialiser, include_reads);
112 return replicated_serialiser.get_raw_data();
133 bool track_read_versions =
false,
134 std::function<std::tuple<Version, Version>(
bool has_new_map)>
135 version_resolver =
nullptr,
137 const std::vector<uint8_t>& write_set,
138 const std::string& commit_evidence)> write_set_observer =
nullptr)
141 throw std::logic_error(
"Transaction already committed");
152 const bool maps_created = !
pimpl->created_maps.empty();
155 this->
pimpl->store->lock_map_set();
160 std::optional<Version> new_maps_conflict_version = std::nullopt;
162 bool track_deletes_on_missing_keys =
false;
163 auto c = apply_changes(
165 version_resolver ==
nullptr ?
166 [&](
bool has_new_map) {
167 return pimpl->store->next_version(has_new_map);
172 new_maps_conflict_version,
174 track_deletes_on_missing_keys);
178 this->
pimpl->store->unlock_map_set();
181 success = c.has_value();
187 LOG_TRACE_FMT(
"Could not commit transaction due to conflict");
197 pimpl->store->set_flag(
207 pimpl->store->set_flag(
224 std::string commit_evidence;
226 serialise(commit_evidence_digest, commit_evidence, claims);
233 if (write_set_observer !=
nullptr)
235 write_set_observer(data, commit_evidence);
238 auto claims_ = claims;
240 return pimpl->store->commit(
242 std::make_unique<MovePendingTx>(
245 std::move(commit_evidence_digest),
249 catch (
const std::exception& e)
273 throw std::logic_error(
"Transaction not yet committed");
276 throw std::logic_error(
"Transaction aborted");
291 throw std::logic_error(
"Transaction not yet committed");
294 throw std::logic_error(
"Transaction aborted");
296 return pimpl->commit_view;
312 throw std::logic_error(
"Transaction not yet committed");
315 if (!
pimpl->read_txid.has_value())
326 return pimpl->read_txid.value();
340 pimpl->commit_view = term_;
345 pimpl->commit_view = view_;
360 if (
pimpl->read_txid.has_value())
362 throw std::logic_error(
"Read TxID already set");
364 pimpl->read_txid = tx_id;
365 pimpl->commit_view = commit_view_;
375 flags |=
static_cast<uint8_t
>(flag);
380 flags &= ~static_cast<uint8_t>(flag);
385 return (
flags &
static_cast<uint8_t
>(f)) != 0;
405 const TxID& reserved_tx_id,
410 pimpl->commit_view = reserved_tx_id.
term;
412 rollback_count = rollback_count_;
419 throw std::logic_error(
"Transaction already committed");
422 throw std::logic_error(
"Reserved transaction cannot be empty");
424 std::vector<ConsensusHookPtr> hooks;
425 bool track_read_versions =
false;
426 bool track_deletes_on_missing_keys =
false;
427 auto c = apply_changes(
434 track_deletes_on_missing_keys,
439 throw std::logic_error(
"Failed to commit reserved transaction");
442 std::string commit_evidence;
447 if (
pimpl->store->must_force_ledger_chunk_unsafe(
version))
451 "Forcing ledger chunk for signature at {}.{}",
457 auto claims = ccf::empty_claims();
458 auto data =
serialise(commit_evidence_digest, commit_evidence, claims);
461 pimpl->store->unset_flag_unsafe(
468 std::move(commit_evidence_digest),
Definition claims_digest.h:10
bool empty() const
Definition claims_digest.h:33
Definition sha256_hash.h:16
Definition kv_types.h:677
@ LEDGER_CHUNK_AT_NEXT_SIGNATURE
@ SNAPSHOT_AT_NEXT_SIGNATURE
OrderedChanges all_changes
Definition tx.h:52
std::optional< ccf::crypto::Sha256Hash > root_at_read_version
Definition tx.h:54
std::unique_ptr< PrivateImpl > pimpl
Definition tx.h:50
Definition committable_tx.h:18
SerialisedEntryFlags entry_flags
Definition committable_tx.h:38
Version get_version()
Definition committable_tx.h:303
std::vector< uint8_t > serialise(ccf::crypto::Sha256Hash &commit_evidence_digest, std::string &commit_evidence, const ccf::ClaimsDigest &claims_digest_, bool include_reads=false)
Definition committable_tx.h:40
bool success
Definition committable_tx.h:31
std::optional< TxID > get_txid()
Definition committable_tx.h:308
Flag
Definition committable_tx.h:23
@ LEDGER_CHUNK_AT_NEXT_SIGNATURE
@ SNAPSHOT_AT_NEXT_SIGNATURE
@ LEDGER_CHUNK_BEFORE_THIS_TX
bool committed
Definition committable_tx.h:30
Version version
Definition committable_tx.h:33
CommitResult commit(const ccf::ClaimsDigest &claims=ccf::empty_claims(), bool track_read_versions=false, std::function< std::tuple< Version, Version >(bool has_new_map)> version_resolver=nullptr, std::function< void(const std::vector< uint8_t > &write_set, const std::string &commit_evidence)> write_set_observer=nullptr)
Definition committable_tx.h:131
void set_read_txid(const TxID &tx_id, Term commit_view_)
Definition committable_tx.h:358
virtual void unset_flag(Flag flag)
Definition committable_tx.h:378
const ccf::kv::TxHistory::RequestID & get_req_id()
Definition committable_tx.h:353
uint8_t TxFlags
Definition committable_tx.h:20
virtual void set_flag(Flag flag)
Definition committable_tx.h:373
void set_root_at_read_version(const ccf::crypto::Sha256Hash &r)
Definition committable_tx.h:368
void set_view(ccf::View view_)
Definition committable_tx.h:343
CommittableTx(AbstractStore *_store)
Definition committable_tx.h:116
TxFlags flags
Definition committable_tx.h:37
ccf::kv::TxHistory::RequestID req_id
Definition committable_tx.h:35
Version commit_version()
Definition committable_tx.h:270
virtual bool flag_enabled(Flag f) const
Definition committable_tx.h:383
void set_change_list(OrderedChanges &&change_list_, Term term_) override
Definition committable_tx.h:335
Version commit_term()
Definition committable_tx.h:288
void set_req_id(const ccf::kv::TxHistory::RequestID &req_id_)
Definition committable_tx.h:348
Definition generic_serialise_wrapper.h:20
Definition kv_types.h:352
Definition committable_tx.h:397
ReservedTx(AbstractStore *_store, Term read_term, const TxID &reserved_tx_id, Version rollback_count_)
Definition committable_tx.h:402
PendingTxInfo commit_reserved()
Definition committable_tx.h:416
std::tuple< size_t, size_t > RequestID
Definition kv_types.h:370
#define LOG_TRACE_FMT
Definition logger.h:378
#define LOG_DEBUG_FMT
Definition logger.h:380
#define LOG_FAIL_FMT
Definition logger.h:396
Definition app_interface.h:20
uint64_t Term
Definition kv_types.h:46
@ PRIVATE
Definition kv_types.h:255
@ PUBLIC
Definition kv_types.h:254
@ WriteSetWithCommitEvidenceAndClaims
uint64_t Version
Definition version.h:8
CommitResult
Definition kv_types.h:246
@ SUCCESS
Definition kv_types.h:247
@ FAIL_CONFLICT
Definition kv_types.h:248
uint8_t SerialisedEntryFlags
Definition serialised_entry_format.h:12
@ FORCE_LEDGER_CHUNK_BEFORE
Definition serialised_entry_format.h:17
@ FORCE_LEDGER_CHUNK_AFTER
Definition serialised_entry_format.h:16
std::map< std::string, MapChanges > OrderedChanges
Definition tx.h:42
std::vector< ConsensusHookPtr > ConsensusHookPtrs
Definition hooks.h:22
uint64_t View
Definition tx_id.h:23
Definition map_serializers.h:11
Definition apply_changes.h:19
Definition kv_types.h:481
Version version
Definition kv_types.h:52
Term term
Definition kv_types.h:51