aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMonzero Build System <builds@monzero.org>2026-08-15 22:07:17 +0100
committerMonzero Build System <builds@monzero.org>2026-08-15 22:07:17 +0100
commitf4b7631ee2c13c936ca44b658423612ecba16f3c (patch)
treefdb95ff45e029bf401fdb701f0f57b5a1bbba298 /src
parent24d3d77a21fe6be7db9bde7232af48e8136ec001 (diff)
downloadmonzero-core-f4b7631ee2c13c936ca44b658423612ecba16f3c.tar.gz
monzero-core-f4b7631ee2c13c936ca44b658423612ecba16f3c.tar.xz
monzero-core-f4b7631ee2c13c936ca44b658423612ecba16f3c.zip
Make block asset issuance atomic and reorg-safe
Diffstat (limited to 'src')
-rw-r--r--src/cryptonote_basic/asset_types.cpp30
-rw-r--r--src/cryptonote_basic/asset_types.h6
2 files changed, 36 insertions, 0 deletions
diff --git a/src/cryptonote_basic/asset_types.cpp b/src/cryptonote_basic/asset_types.cpp
index a4e9d79b3..7ac078415 100644
--- a/src/cryptonote_basic/asset_types.cpp
+++ b/src/cryptonote_basic/asset_types.cpp
@@ -422,6 +422,27 @@ namespace assets
error);
}
+ bool asset_registry::apply_block_issuances(
+ const std::vector<issuance_payload>& payloads,
+ uint64_t height,
+ std::vector<crypto::hash>& asset_ids,
+ std::string* error)
+ {
+ asset_registry candidate = *this;
+ std::vector<crypto::hash> candidate_ids;
+ candidate_ids.reserve(payloads.size());
+ for (const issuance_payload& payload : payloads)
+ {
+ crypto::hash asset_id{};
+ if (!candidate.apply_issuance(payload, height, asset_id, error))
+ return false;
+ candidate_ids.push_back(asset_id);
+ }
+ records_ = std::move(candidate.records_);
+ asset_ids = std::move(candidate_ids);
+ return true;
+ }
+
void asset_registry::detach(uint64_t height)
{
for (auto it = records_.begin(); it != records_.end();)
@@ -569,6 +590,15 @@ namespace assets
return true;
}
+ bool asset_registry::derive_snapshot_hash(network_type network, crypto::hash& snapshot_hash, std::string* error) const
+ {
+ std::vector<uint8_t> snapshot;
+ if (!encode_snapshot(network, snapshot, error))
+ return false;
+ snapshot_hash = crypto::cn_fast_hash(snapshot.data(), snapshot.size());
+ return true;
+ }
+
bool validate_transparent_balance_statement(
const transparent_balance_statement& statement,
const std::set<crypto::hash>& known_assets,
diff --git a/src/cryptonote_basic/asset_types.h b/src/cryptonote_basic/asset_types.h
index 70d1d39bd..2b0e01890 100644
--- a/src/cryptonote_basic/asset_types.h
+++ b/src/cryptonote_basic/asset_types.h
@@ -97,6 +97,11 @@ namespace assets
crypto::hash& asset_id,
std::string* error = nullptr);
bool apply_issuance(const issuance_payload& payload, uint64_t height, crypto::hash& asset_id, std::string* error = nullptr);
+ bool apply_block_issuances(
+ const std::vector<issuance_payload>& payloads,
+ uint64_t height,
+ std::vector<crypto::hash>& asset_ids,
+ std::string* error = nullptr);
void detach(uint64_t height);
bool contains(const crypto::hash& asset_id) const;
const asset_record* find(const crypto::hash& asset_id) const;
@@ -104,6 +109,7 @@ namespace assets
std::set<crypto::hash> known_assets() const;
bool encode_snapshot(network_type network, std::vector<uint8_t>& encoded, std::string* error = nullptr) const;
bool decode_snapshot(const std::vector<uint8_t>& encoded, network_type expected_network, std::string* error = nullptr);
+ bool derive_snapshot_hash(network_type network, crypto::hash& snapshot_hash, std::string* error = nullptr) const;
private:
std::map<crypto::hash, asset_record> records_;