aboutsummaryrefslogtreecommitdiff
path: root/src/blockchain_db/asset_db.cpp
diff options
context:
space:
mode:
authorcenobite pinhead <pinhead@pinhead>2026-08-15 23:14:28 +0100
committercenobite pinhead <pinhead@pinhead>2026-08-15 23:14:28 +0100
commit01cd9b0c3b7719ecd6ce45a32192dd1152ebd9ad (patch)
treee43a188ab6b1690b74b785364cb6ea11897c65db /src/blockchain_db/asset_db.cpp
parent2c882e39b3f23e2511f5ba90a31d0a168ff1d8ae (diff)
downloadmonzero-core-01cd9b0c3b7719ecd6ce45a32192dd1152ebd9ad.tar.gz
monzero-core-01cd9b0c3b7719ecd6ce45a32192dd1152ebd9ad.tar.xz
monzero-core-01cd9b0c3b7719ecd6ce45a32192dd1152ebd9ad.zip
persist asset outputs and spent key images
Diffstat (limited to 'src/blockchain_db/asset_db.cpp')
-rw-r--r--src/blockchain_db/asset_db.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/blockchain_db/asset_db.cpp b/src/blockchain_db/asset_db.cpp
index d80b61028..bb2389d24 100644
--- a/src/blockchain_db/asset_db.cpp
+++ b/src/blockchain_db/asset_db.cpp
@@ -3,6 +3,8 @@
#include <algorithm>
#include <cstring>
+#include "ringct/rctOps.h"
+
namespace cryptonote
{
namespace assets
@@ -92,5 +94,28 @@ bool apply_block_extensions_to_db(BlockchainDB& db,
asset_ids = std::move(candidate_ids);
return true;
}
+
+bool verify_asset_ownership_against_db(const BlockchainDB& db,
+ const asset_ownership_proof& proof, network_type expected_network,
+ const crypto::hash& carrier_prefix_hash, std::string* error)
+{
+ if (db.has_asset_key_image(proof.key_image))
+ return fail(error, "asset key image is already spent");
+
+ for (const asset_ring_member& member : proof.ring)
+ {
+ asset_output_data_t stored{};
+ if (!db.get_asset_output(member.output_id, stored))
+ return fail(error, "asset ownership ring references an unknown output");
+ if (stored.asset_id != member.asset_id || member.asset_id != proof.asset_id)
+ return fail(error, "asset ownership ring member has the wrong asset id");
+ if (!rct::equalKeys(stored.destination, member.public_output.dest))
+ return fail(error, "asset ownership ring destination does not match consensus state");
+ if (!rct::equalKeys(stored.commitment, member.public_output.mask))
+ return fail(error, "asset ownership ring commitment does not match consensus state");
+ }
+ return verify_asset_ownership_proof(
+ proof, expected_network, carrier_prefix_hash, error);
+}
}
}