Decentralised Art Server
High-performance C++ backend that exposes HTML interface and a secure REST API for managing Performative Transactions entities
Loading...
Searching...
No Matches
registry.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4#include <list>
5#include <memory>
6#include <optional>
7#include <string>
8#include <vector>
9
10#include <absl/container/flat_hash_map.h>
11#include <absl/container/flat_hash_set.h>
12#include <spdlog/spdlog.h>
13
14#include "async.hpp"
15#include "pt.hpp"
16#include "address.hpp"
17#include "format_hash.hpp"
18#include "registry_store.hpp"
20#include "sqlite/wal_store.hpp"
21
23{
25
26 template<typename KeyT, typename ValueT>
27 struct LruCache
28 {
29 struct Entry
30 {
31 ValueT value;
32 typename std::list<KeyT>::iterator order_it;
33 };
34
35 const char * name = "unnamed-cache";
36 std::size_t capacity = 0;
37 std::list<KeyT> order;
38 absl::flat_hash_map<KeyT, Entry> entries;
39 };
40
42 {
43 public:
44 Registry() = delete;
45 Registry(asio::io_context & io_context, std::string sqlite_path = ":memory:");
46
47 Registry(const Registry&) = delete;
48 Registry& operator=(const Registry&) = delete;
49
50 ~Registry() = default;
51
52 // expected_format_hash, when set, is the chain-emitted format hash. The registry is a
53 // mirror of chain state, so a locally-recomputed hash that disagrees with the chain is a
54 // divergence: addConnector refuses rather than storing a hash the POST response/event
55 // never carried.
56 asio::awaitable<bool> addConnector(chain::Address address, ConnectorRecord connector,
57 std::optional<evmc::bytes32> expected_format_hash = std::nullopt);
58 asio::awaitable<bool> addConnectorsBatch(
59 std::vector<std::pair<chain::Address, ConnectorRecord>> connectors,
60 bool all_or_nothing = true);
61
62 // Deterministically compute a connector's composite-aware format hash from its
63 // definition, without persisting it. Resolves composite dimensions against
64 // already-registered connectors; returns nullopt if resolution/validation fails.
65 asio::awaitable<std::optional<evmc::bytes32>> computeConnectorFormatHash(Connector connector) const;
66
67 asio::awaitable<std::optional<ConnectorRecordHandle>> getConnectorRecordHandle(
68 const std::string & name) const;
69
70 asio::awaitable<bool> hasConnector(const std::string & name) const;
71
72 asio::awaitable<std::optional<evmc::bytes32>> getFormatHash(const std::string& name) const;
73
74 asio::awaitable<std::size_t> getFormatConnectorNamesCount(const evmc::bytes32 & format_hash) const;
75
76 asio::awaitable<NameCursorPage> getFormatConnectorNamesCursor(
77 const evmc::bytes32 & format_hash,
78 const std::optional<NameCursor> & after,
79 std::size_t limit) const;
80
81 asio::awaitable<std::size_t> getFormatsCount() const;
82
83 asio::awaitable<NameCursorPage> getFormatsCursor(
84 const std::optional<evmc::bytes32> & after,
85 std::size_t limit) const;
86
87 asio::awaitable<std::optional<std::vector<ScalarLabel>>> getScalarLabelsByFormatHash(const evmc::bytes32 & format_hash) const;
88
89 asio::awaitable<bool> addTransformation(chain::Address address, TransformationRecord transformation);
90 asio::awaitable<bool> addTransformationsBatch(
91 std::vector<std::pair<chain::Address, TransformationRecord>> transformations,
92 bool all_or_nothing = true);
93
94 asio::awaitable<std::optional<TransformationRecordHandle>> getTransformationRecordHandle(
95 const std::string & name) const;
96
97 asio::awaitable<bool> hasTransformation(const std::string & name) const;
98
99 asio::awaitable<bool> addCondition(chain::Address address, ConditionRecord condition);
100
101 asio::awaitable<bool> addConditionsBatch(
102 std::vector<std::pair<chain::Address, ConditionRecord>> conditions,
103 bool all_or_nothing = true);
104
105 asio::awaitable<std::optional<ConditionRecordHandle>> getConditionRecordHandle(
106 const std::string & name) const;
107
108 asio::awaitable<bool> hasCondition(const std::string & name) const;
109
110 asio::awaitable<NameCursorPage> getOwnedConnectorsCursor(
111 const chain::Address & owner,
112 const std::optional<NameCursor> & after,
113 std::size_t limit) const;
114
115 asio::awaitable<NameCursorPage> getOwnedTransformationsCursor(
116 const chain::Address & owner,
117 const std::optional<NameCursor> & after,
118 std::size_t limit) const;
119
120 asio::awaitable<NameCursorPage> getOwnedConditionsCursor(
121 const chain::Address & owner,
122 const std::optional<NameCursor> & after,
123 std::size_t limit) const;
124
125 asio::awaitable<std::size_t> getAccountsCount() const;
126
127 asio::awaitable<NameCursorPage> getAccountsCursor(
128 const std::optional<chain::Address> & after,
129 std::size_t limit) const;
130
131 asio::awaitable<storage::sqlite::WalCheckpointStats> checkpointWal(storage::sqlite::WalCheckpointMode mode) const override;
132
133 // Materialization cursor, owned by RegistryProjector. getMaterializationCursor
134 // is synchronous because it is read once at construction (pre-start, single
135 // threaded). setMaterializationCursor runs on the Registry strand so the cursor
136 // write serializes with every other access to the registry DB.
137 std::int64_t getMaterializationCursor() const;
138 asio::awaitable<bool> setMaterializationCursor(std::int64_t seq);
139
140 private:
141 static constexpr std::size_t kHotCacheCapacity = 1024;
142
143 asio::strand<asio::io_context::executor_type> _strand;
144 std::unique_ptr<IRegistryStore> _store;
145 mutable LruCache<std::string, std::optional<ConnectorRecordHandle>> _connector_record_cache;
146 mutable LruCache<std::string, std::optional<evmc::bytes32>> _format_hash_cache;
147 mutable LruCache<std::string, std::optional<TransformationRecordHandle>> _transformation_record_cache;
148 mutable LruCache<std::string, std::optional<ConditionRecordHandle>> _condition_record_cache;
149 };
150}
151
152
asio::awaitable< std::size_t > getFormatsCount() const
Definition registry.cpp:1281
asio::awaitable< std::size_t > getFormatConnectorNamesCount(const evmc::bytes32 &format_hash) const
Definition registry.cpp:1266
asio::awaitable< NameCursorPage > getFormatsCursor(const std::optional< evmc::bytes32 > &after, std::size_t limit) const
Definition registry.cpp:1287
asio::awaitable< storage::sqlite::WalCheckpointStats > checkpointWal(storage::sqlite::WalCheckpointMode mode) const override
Definition registry.cpp:1740
asio::awaitable< std::size_t > getAccountsCount() const
Definition registry.cpp:1726
asio::awaitable< std::optional< evmc::bytes32 > > getFormatHash(const std::string &name) const
Definition registry.cpp:1233
asio::awaitable< bool > hasCondition(const std::string &name) const
Definition registry.cpp:1668
asio::awaitable< bool > hasConnector(const std::string &name) const
Definition registry.cpp:1204
asio::awaitable< NameCursorPage > getOwnedConditionsCursor(const chain::Address &owner, const std::optional< NameCursor > &after, std::size_t limit) const
Definition registry.cpp:1717
asio::awaitable< std::optional< evmc::bytes32 > > computeConnectorFormatHash(Connector connector) const
Definition registry.cpp:1247
asio::awaitable< bool > addTransformationsBatch(std::vector< std::pair< chain::Address, TransformationRecord > > transformations, bool all_or_nothing=true)
Definition registry.cpp:1346
asio::awaitable< bool > addConnector(chain::Address address, ConnectorRecord connector, std::optional< evmc::bytes32 > expected_format_hash=std::nullopt)
Definition registry.cpp:848
asio::awaitable< std::optional< std::vector< ScalarLabel > > > getScalarLabelsByFormatHash(const evmc::bytes32 &format_hash) const
Definition registry.cpp:1295
asio::awaitable< bool > addConnectorsBatch(std::vector< std::pair< chain::Address, ConnectorRecord > > connectors, bool all_or_nothing=true)
Definition registry.cpp:973
asio::awaitable< std::optional< ConnectorRecordHandle > > getConnectorRecordHandle(const std::string &name) const
Definition registry.cpp:1175
asio::awaitable< bool > hasTransformation(const std::string &name) const
Definition registry.cpp:1471
asio::awaitable< NameCursorPage > getOwnedTransformationsCursor(const chain::Address &owner, const std::optional< NameCursor > &after, std::size_t limit) const
Definition registry.cpp:1708
asio::awaitable< NameCursorPage > getFormatConnectorNamesCursor(const evmc::bytes32 &format_hash, const std::optional< NameCursor > &after, std::size_t limit) const
Definition registry.cpp:1272
Registry(const Registry &)=delete
asio::awaitable< bool > addTransformation(chain::Address address, TransformationRecord transformation)
Definition registry.cpp:1302
asio::awaitable< std::optional< TransformationRecordHandle > > getTransformationRecordHandle(const std::string &name) const
Definition registry.cpp:1438
asio::awaitable< NameCursorPage > getAccountsCursor(const std::optional< chain::Address > &after, std::size_t limit) const
Definition registry.cpp:1732
asio::awaitable< bool > addConditionsBatch(std::vector< std::pair< chain::Address, ConditionRecord > > conditions, bool all_or_nothing=true)
Definition registry.cpp:1546
asio::awaitable< bool > setMaterializationCursor(std::int64_t seq)
Definition registry.cpp:1755
asio::awaitable< NameCursorPage > getOwnedConnectorsCursor(const chain::Address &owner, const std::optional< NameCursor > &after, std::size_t limit) const
Definition registry.cpp:1699
asio::awaitable< std::optional< ConditionRecordHandle > > getConditionRecordHandle(const std::string &name) const
Definition registry.cpp:1638
std::int64_t getMaterializationCursor() const
Definition registry.cpp:1750
asio::awaitable< bool > addCondition(chain::Address address, ConditionRecord condition)
Definition registry.cpp:1502
Registry & operator=(const Registry &)=delete
Definition wal_store.hpp:10
evmc::address Address
Definition address.hpp:18
Definition registry.hpp:23
dcn::chain::ScalarLabel ScalarLabel
Definition registry.hpp:24
WalCheckpointMode
Definition wal.hpp:9
Definition format_hash.hpp:26
Definition registry.hpp:30
std::list< KeyT >::iterator order_it
Definition registry.hpp:32
ValueT value
Definition registry.hpp:31
Definition registry.hpp:28
std::list< KeyT > order
Definition registry.hpp:37
absl::flat_hash_map< KeyT, Entry > entries
Definition registry.hpp:38
std::size_t capacity
Definition registry.hpp:36
const char * name
Definition registry.hpp:35