41 std::string& commit_evidence,
43 bool include_reads =
false)
47 throw std::logic_error(
"Transaction not yet committed");
52 throw std::logic_error(
"Transaction aborted");
55 if (claims_digest_.
empty())
57 throw std::logic_error(
"Missing claims");
61 const bool any_changes =
63 return it.second.changeset->has_writes();
71 auto e =
pimpl->store->get_encryptor();
77 auto commit_nonce = e->get_commit_nonce({
pimpl->commit_view,
version});
78 commit_evidence = fmt::format(
82 ccf::ds::to_hex(commit_nonce));
85 commit_evidence_digest = tx_commit_evidence_digest;
98 tx_commit_evidence_digest,
106 const auto&
map = it.second.map;
107 const auto& changeset = it.second.changeset;
108 if (
map->get_security_domain() == domain && changeset->has_writes())
110 map->serialise_changes(
111 changeset.get(), replicated_serialiser, include_reads);
117 return replicated_serialiser.get_raw_data();
138 std::function<std::tuple<Version, Version>(
bool has_new_map)>
139 version_resolver =
nullptr,
141 const std::vector<uint8_t>& write_set,
142 const std::string& commit_evidence)> write_set_observer =
nullptr)
146 throw std::logic_error(
"Transaction already committed");
158 const bool maps_created = !
pimpl->created_maps.empty();
161 this->
pimpl->store->lock_map_set();
166 std::optional<Version> new_maps_conflict_version = std::nullopt;
168 bool track_deletes_on_missing_keys =
false;
169 auto c = apply_changes(
171 version_resolver ==
nullptr ?
172 [&](
bool has_new_map) {
173 return pimpl->store->next_version(has_new_map);
178 new_maps_conflict_version,
179 track_deletes_on_missing_keys);
183 this->
pimpl->store->unlock_map_set();
186 success = c.has_value();
192 LOG_TRACE_FMT(
"Could not commit transaction due to conflict");
201 auto chunker =
pimpl->store->get_chunker();
204 chunker->force_end_of_chunk(
version);
210 pimpl->store->set_flag(
227 std::string commit_evidence;
228 auto data =
serialise(commit_evidence_digest, commit_evidence, claims);
235 if (write_set_observer !=
nullptr)
237 write_set_observer(data, commit_evidence);
240 auto claims_ = claims;
242 return pimpl->store->commit(
244 std::make_unique<MovePendingTx>(
247 std::move(commit_evidence_digest),
251 catch (
const std::exception& e)
275 throw std::logic_error(
"Transaction not yet committed");
280 throw std::logic_error(
"Transaction aborted");
297 throw std::logic_error(
"Transaction not yet committed");
302 throw std::logic_error(
"Transaction aborted");
305 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;
335 if (
pimpl->read_txid.has_value())
337 throw std::logic_error(
"Read TxID already set");
339 pimpl->read_txid = tx_id;
340 pimpl->commit_view = commit_view_;
355 flags &= ~static_cast<TxFlags>(flag);
380 const TxID& reserved_tx_id,
383 rollback_count(rollback_count_)
386 pimpl->commit_view = reserved_tx_id.
view;
395 throw std::logic_error(
"Transaction already committed");
400 throw std::logic_error(
"Reserved transaction cannot be empty");
403 std::vector<ConsensusHookPtr> hooks;
404 bool track_deletes_on_missing_keys =
false;
405 auto c = apply_changes(
411 track_deletes_on_missing_keys,
417 throw std::logic_error(
"Failed to commit reserved transaction");
421 std::string commit_evidence;
426 if (
pimpl->store->should_create_ledger_chunk_unsafe(
version))
430 "Ending ledger chunk with signature at {}.{}",
434 auto chunker =
pimpl->store->get_chunker();
437 chunker->produced_chunk_at(
version);
442 auto claims = ccf::empty_claims();
443 auto data =
serialise(commit_evidence_digest, commit_evidence, claims);
449 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:610
@ SNAPSHOT_AT_NEXT_SIGNATURE
OrderedChanges all_changes
Definition tx.h:51
std::optional< ccf::crypto::Sha256Hash > root_at_read_version
Definition tx.h:53
std::unique_ptr< PrivateImpl > pimpl
Definition tx.h:49
Definition committable_tx.h:19
SerialisedEntryFlags entry_flags
Definition committable_tx.h:37
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:39
bool success
Definition committable_tx.h:32
bool committed
Definition committable_tx.h:31
Version version
Definition committable_tx.h:34
virtual void unset_tx_flag(TxFlag flag)
Definition committable_tx.h:353
Version commit_term() const
Definition committable_tx.h:293
void set_read_txid(const TxID &tx_id, Term commit_view_)
Definition committable_tx.h:333
TxFlag
Definition committable_tx.h:24
@ LEDGER_CHUNK_AT_NEXT_SIGNATURE
@ SNAPSHOT_AT_NEXT_SIGNATURE
@ LEDGER_CHUNK_BEFORE_THIS_TX
virtual bool tx_flag_enabled(TxFlag f) const
Definition committable_tx.h:358
CommitResult commit(const ccf::ClaimsDigest &claims=ccf::empty_claims(), 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:136
Version commit_version() const
Definition committable_tx.h:271
uint8_t TxFlags
Definition committable_tx.h:21
void set_root_at_read_version(const ccf::crypto::Sha256Hash &r)
Definition committable_tx.h:343
CommittableTx(AbstractStore *_store)
Definition committable_tx.h:121
TxFlags flags
Definition committable_tx.h:36
std::optional< TxID > get_txid() const
Definition committable_tx.h:308
virtual void set_tx_flag(TxFlag flag)
Definition committable_tx.h:348
Definition generic_serialise_wrapper.h:20
Definition kv_types.h:315
Definition committable_tx.h:372
ReservedTx(AbstractStore *_store, Term read_term, const TxID &reserved_tx_id, Version rollback_count_)
Definition committable_tx.h:377
PendingTxInfo commit_reserved()
Definition committable_tx.h:391
#define LOG_TRACE_FMT
Definition internal_logger.h:13
#define LOG_DEBUG_FMT
Definition internal_logger.h:14
#define LOG_FAIL_FMT
Definition internal_logger.h:16
Definition app_interface.h:19
uint64_t Term
Definition kv_types.h:43
@ WriteSetWithCommitEvidenceAndClaims
CommitResult
Definition kv_types.h:209
@ SUCCESS
Definition kv_types.h:210
@ FAIL_CONFLICT
Definition kv_types.h:211
@ PRIVATE
Definition kv_types.h:218
@ PUBLIC
Definition kv_types.h:217
uint64_t Version
Definition version.h:8
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::vector< ConsensusHookPtr > ConsensusHookPtrs
Definition hooks.h:22
Definition map_serializers.h:11
SeqNo seqno
Definition tx_id.h:46
View view
Definition tx_id.h:45
Definition kv_types.h:417