diff options
| author | Monzero Build System <builds@monzero.org> | 2026-08-15 22:07:17 +0100 |
|---|---|---|
| committer | Monzero Build System <builds@monzero.org> | 2026-08-15 22:07:17 +0100 |
| commit | f4b7631ee2c13c936ca44b658423612ecba16f3c (patch) | |
| tree | fdb95ff45e029bf401fdb701f0f57b5a1bbba298 /src | |
| parent | 24d3d77a21fe6be7db9bde7232af48e8136ec001 (diff) | |
| download | monzero-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.cpp | 30 | ||||
| -rw-r--r-- | src/cryptonote_basic/asset_types.h | 6 |
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_; |
