Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
wsdb_handlers.cpp
Go to the documentation of this file.
1
24
25#include <optional>
26#include <stdexcept>
27
28namespace bb::wsdb {
29
30using namespace bb::world_state;
31using namespace bb::crypto::merkle_tree;
32
33// ---------------------------------------------------------------------------
34// Tree info / state queries
35// ---------------------------------------------------------------------------
36
38 wire::WsdbGetTreeInfo&& cmd,
39 Responder<wire::WsdbGetTreeInfoResponse> respond)
40{
41 schedule_read(ctx,
42 cmd.revision.forkId,
43 !cmd.revision.includeUncommitted,
44 std::move(respond),
45 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbGetTreeInfoResponse {
46 auto info = ctx.world_state.get_tree_info(revision_from_wire(cmd.revision),
47 tree_id_from_wire(cmd.treeId));
48 return wire::WsdbGetTreeInfoResponse{
49 .treeId = cmd.treeId,
50 .root = fr_to_wire(info.meta.root),
51 .size = info.meta.size,
52 .depth = info.meta.depth,
53 };
54 });
55}
56
58 wire::WsdbGetStateReference&& cmd,
59 Responder<wire::WsdbGetStateReferenceResponse> respond)
60{
61 schedule_read(ctx,
62 cmd.revision.forkId,
63 !cmd.revision.includeUncommitted,
64 std::move(respond),
65 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbGetStateReferenceResponse {
66 auto state = ctx.world_state.get_state_reference(revision_from_wire(cmd.revision));
67 return wire::WsdbGetStateReferenceResponse{ .state = state_reference_to_wire(state) };
68 });
69}
70
72 wire::WsdbGetInitialStateReference&& /*cmd*/,
73 Responder<wire::WsdbGetInitialStateReferenceResponse> respond)
74{
75 // No revision: reads the canonical initial state. Ordered against fork 0
76 // (matches the historical client contract of committedOnly=false).
77 schedule_read(ctx, 0, false, std::move(respond), [&ctx]() -> wire::WsdbGetInitialStateReferenceResponse {
79 return wire::WsdbGetInitialStateReferenceResponse{ .state = state_reference_to_wire(state) };
80 });
81}
82
83// ---------------------------------------------------------------------------
84// Leaf queries
85// ---------------------------------------------------------------------------
86
88 wire::WsdbGetLeafValue&& cmd,
89 Responder<wire::WsdbGetLeafValueResponse> respond)
90{
91 schedule_read(ctx,
92 cmd.revision.forkId,
93 !cmd.revision.includeUncommitted,
94 std::move(respond),
95 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbGetLeafValueResponse {
96 auto revision = revision_from_wire(cmd.revision);
97 auto tree_id = tree_id_from_wire(cmd.treeId);
98 auto leaf_index = static_cast<index_t>(cmd.leafIndex);
99
100 switch (tree_id) {
101 case world_state::MerkleTreeId::NOTE_HASH_TREE:
102 case world_state::MerkleTreeId::L1_TO_L2_MESSAGE_TREE:
103 case world_state::MerkleTreeId::ARCHIVE: {
104 auto leaf = ctx.world_state.get_leaf<bb::fr>(revision, tree_id, leaf_index);
105 return wire::WsdbGetLeafValueResponse{ .value = leaf.has_value()
106 ? std::optional<Fr>(fr_to_wire(*leaf))
107 : std::nullopt };
108 }
109 default:
110 throw std::runtime_error("Unsupported tree type for get_leaf_value");
111 }
112 });
113}
114
116 wire::WsdbGetPublicDataLeafValue&& cmd,
117 Responder<wire::WsdbGetPublicDataLeafValueResponse> respond)
118{
120 ctx,
121 cmd.revision.forkId,
122 !cmd.revision.includeUncommitted,
123 std::move(respond),
124 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbGetPublicDataLeafValueResponse {
125 auto leaf = ctx.world_state.get_leaf<PublicDataLeafValue>(revision_from_wire(cmd.revision),
126 world_state::MerkleTreeId::PUBLIC_DATA_TREE,
127 static_cast<index_t>(cmd.leafIndex));
128 return wire::WsdbGetPublicDataLeafValueResponse{
129 .value = leaf.has_value() ? std::optional<wire::PublicDataLeafValue>(public_data_leaf_to_wire(*leaf))
130 : std::nullopt
131 };
132 });
133}
134
136 wire::WsdbGetNullifierLeafValue&& cmd,
137 Responder<wire::WsdbGetNullifierLeafValueResponse> respond)
138{
140 ctx,
141 cmd.revision.forkId,
142 !cmd.revision.includeUncommitted,
143 std::move(respond),
144 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbGetNullifierLeafValueResponse {
145 auto leaf = ctx.world_state.get_leaf<NullifierLeafValue>(revision_from_wire(cmd.revision),
146 world_state::MerkleTreeId::NULLIFIER_TREE,
147 static_cast<index_t>(cmd.leafIndex));
148 return wire::WsdbGetNullifierLeafValueResponse{
149 .value = leaf.has_value() ? std::optional<wire::NullifierLeafValue>(nullifier_leaf_to_wire(*leaf))
150 : std::nullopt
151 };
152 });
153}
154
156 wire::WsdbGetPublicDataLeafPreimage&& cmd,
157 Responder<wire::WsdbGetPublicDataLeafPreimageResponse> respond)
158{
159 schedule_read(ctx,
160 cmd.revision.forkId,
161 !cmd.revision.includeUncommitted,
162 std::move(respond),
163 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbGetPublicDataLeafPreimageResponse {
164 auto leaf = ctx.world_state.get_indexed_leaf<PublicDataLeafValue>(
165 revision_from_wire(cmd.revision),
166 world_state::MerkleTreeId::PUBLIC_DATA_TREE,
167 static_cast<index_t>(cmd.leafIndex));
168 return wire::WsdbGetPublicDataLeafPreimageResponse{
169 .preimage = leaf.has_value() ? std::optional<wire::IndexedPublicDataLeafValue>(
170 indexed_public_data_leaf_to_wire(*leaf))
171 : std::nullopt
172 };
173 });
174}
175
177 wire::WsdbGetNullifierLeafPreimage&& cmd,
178 Responder<wire::WsdbGetNullifierLeafPreimageResponse> respond)
179{
181 ctx,
182 cmd.revision.forkId,
183 !cmd.revision.includeUncommitted,
184 std::move(respond),
185 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbGetNullifierLeafPreimageResponse {
186 auto leaf = ctx.world_state.get_indexed_leaf<NullifierLeafValue>(revision_from_wire(cmd.revision),
187 world_state::MerkleTreeId::NULLIFIER_TREE,
188 static_cast<index_t>(cmd.leafIndex));
189 return wire::WsdbGetNullifierLeafPreimageResponse{
190 .preimage = leaf.has_value()
191 ? std::optional<wire::IndexedNullifierLeafValue>(indexed_nullifier_leaf_to_wire(*leaf))
192 : std::nullopt
193 };
194 });
195}
196
198 wire::WsdbGetSiblingPath&& cmd,
199 Responder<wire::WsdbGetSiblingPathResponse> respond)
200{
201 schedule_read(ctx,
202 cmd.revision.forkId,
203 !cmd.revision.includeUncommitted,
204 std::move(respond),
205 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbGetSiblingPathResponse {
206 fr_sibling_path path = ctx.world_state.get_sibling_path(revision_from_wire(cmd.revision),
207 tree_id_from_wire(cmd.treeId),
208 static_cast<index_t>(cmd.leafIndex));
209 return wire::WsdbGetSiblingPathResponse{ .path = fr_vec_to_wire(path) };
210 });
211}
212
214 wire::WsdbGetBlockNumbersForLeafIndices&& cmd,
215 Responder<wire::WsdbGetBlockNumbersForLeafIndicesResponse> respond)
216{
217 schedule_read(ctx,
218 cmd.revision.forkId,
219 !cmd.revision.includeUncommitted,
220 std::move(respond),
221 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbGetBlockNumbersForLeafIndicesResponse {
222 std::vector<index_t> leaf_indices;
223 leaf_indices.reserve(cmd.leafIndices.size());
224 for (auto i : cmd.leafIndices) {
225 leaf_indices.push_back(static_cast<index_t>(i));
226 }
227 std::vector<std::optional<block_number_t>> block_numbers;
229 revision_from_wire(cmd.revision), tree_id_from_wire(cmd.treeId), leaf_indices, block_numbers);
230 std::vector<std::optional<uint32_t>> wire_block_numbers;
231 wire_block_numbers.reserve(block_numbers.size());
232 for (const auto& bn : block_numbers) {
233 wire_block_numbers.push_back(bn);
234 }
235 return wire::WsdbGetBlockNumbersForLeafIndicesResponse{ .blockNumbers =
236 std::move(wire_block_numbers) };
237 });
238}
239
240// ---------------------------------------------------------------------------
241// Leaf search operations
242// ---------------------------------------------------------------------------
243
245 wire::WsdbFindLeafIndices&& cmd,
246 Responder<wire::WsdbFindLeafIndicesResponse> respond)
247{
248 schedule_read(ctx,
249 cmd.revision.forkId,
250 !cmd.revision.includeUncommitted,
251 std::move(respond),
252 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbFindLeafIndicesResponse {
253 auto revision = revision_from_wire(cmd.revision);
254 auto tree_id = tree_id_from_wire(cmd.treeId);
255 auto start_index = static_cast<index_t>(cmd.startIndex);
256
257 std::vector<std::optional<index_t>> indices;
258 switch (tree_id) {
259 case world_state::MerkleTreeId::NOTE_HASH_TREE:
260 case world_state::MerkleTreeId::L1_TO_L2_MESSAGE_TREE:
261 case world_state::MerkleTreeId::ARCHIVE: {
262 auto typed_leaves = fr_vec_from_wire(cmd.leaves);
263 ctx.world_state.find_leaf_indices<bb::fr>(
264 revision, tree_id, typed_leaves, indices, start_index);
265 break;
266 }
267 default:
268 throw std::runtime_error("Unsupported tree type for find_leaf_indices");
269 }
270 std::vector<std::optional<uint64_t>> wire_indices;
271 wire_indices.reserve(indices.size());
272 for (const auto& i : indices) {
273 wire_indices.push_back(i.has_value() ? std::optional<uint64_t>(static_cast<uint64_t>(*i))
274 : std::nullopt);
275 }
276 return wire::WsdbFindLeafIndicesResponse{ .indices = std::move(wire_indices) };
277 });
278}
279
281 wire::WsdbFindPublicDataLeafIndices&& cmd,
282 Responder<wire::WsdbFindPublicDataLeafIndicesResponse> respond)
283{
284 schedule_read(ctx,
285 cmd.revision.forkId,
286 !cmd.revision.includeUncommitted,
287 std::move(respond),
288 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbFindPublicDataLeafIndicesResponse {
289 std::vector<std::optional<index_t>> indices;
290 ctx.world_state.find_leaf_indices<PublicDataLeafValue>(
291 revision_from_wire(cmd.revision),
292 world_state::MerkleTreeId::PUBLIC_DATA_TREE,
293 public_data_leaf_vec_from_wire(cmd.leaves),
294 indices,
295 static_cast<index_t>(cmd.startIndex));
296 std::vector<std::optional<uint64_t>> wire_indices;
297 wire_indices.reserve(indices.size());
298 for (const auto& i : indices) {
299 wire_indices.push_back(i.has_value() ? std::optional<uint64_t>(static_cast<uint64_t>(*i))
300 : std::nullopt);
301 }
302 return wire::WsdbFindPublicDataLeafIndicesResponse{ .indices = std::move(wire_indices) };
303 });
304}
305
307 wire::WsdbFindNullifierLeafIndices&& cmd,
308 Responder<wire::WsdbFindNullifierLeafIndicesResponse> respond)
309{
310 schedule_read(ctx,
311 cmd.revision.forkId,
312 !cmd.revision.includeUncommitted,
313 std::move(respond),
314 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbFindNullifierLeafIndicesResponse {
315 std::vector<std::optional<index_t>> indices;
316 ctx.world_state.find_leaf_indices<NullifierLeafValue>(revision_from_wire(cmd.revision),
317 world_state::MerkleTreeId::NULLIFIER_TREE,
318 nullifier_leaf_vec_from_wire(cmd.leaves),
319 indices,
320 static_cast<index_t>(cmd.startIndex));
321 std::vector<std::optional<uint64_t>> wire_indices;
322 wire_indices.reserve(indices.size());
323 for (const auto& i : indices) {
324 wire_indices.push_back(i.has_value() ? std::optional<uint64_t>(static_cast<uint64_t>(*i))
325 : std::nullopt);
326 }
327 return wire::WsdbFindNullifierLeafIndicesResponse{ .indices = std::move(wire_indices) };
328 });
329}
330
332 wire::WsdbFindLowLeaf&& cmd,
333 Responder<wire::WsdbFindLowLeafResponse> respond)
334{
335 schedule_read(ctx,
336 cmd.revision.forkId,
337 !cmd.revision.includeUncommitted,
338 std::move(respond),
339 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbFindLowLeafResponse {
340 auto low_leaf_info = ctx.world_state.find_low_leaf_index(
341 revision_from_wire(cmd.revision), tree_id_from_wire(cmd.treeId), fr_from_wire(cmd.key));
342 return wire::WsdbFindLowLeafResponse{
343 .alreadyPresent = low_leaf_info.is_already_present,
344 .index = static_cast<uint64_t>(low_leaf_info.index),
345 };
346 });
347}
348
350 wire::WsdbFindSiblingPaths&& cmd,
351 Responder<wire::WsdbFindSiblingPathsResponse> respond)
352{
353 schedule_read(ctx,
354 cmd.revision.forkId,
355 !cmd.revision.includeUncommitted,
356 std::move(respond),
357 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbFindSiblingPathsResponse {
358 auto revision = revision_from_wire(cmd.revision);
359 auto tree_id = tree_id_from_wire(cmd.treeId);
360 std::vector<std::optional<SiblingPathAndIndex>> paths;
361 switch (tree_id) {
362 case world_state::MerkleTreeId::NOTE_HASH_TREE:
363 case world_state::MerkleTreeId::L1_TO_L2_MESSAGE_TREE:
364 case world_state::MerkleTreeId::ARCHIVE: {
365 auto typed_leaves = fr_vec_from_wire(cmd.leaves);
366 ctx.world_state.find_sibling_paths<bb::fr>(revision, tree_id, typed_leaves, paths);
367 break;
368 }
369 default:
370 throw std::runtime_error("Unsupported tree type for find_sibling_paths");
371 }
372 std::vector<std::optional<wire::SiblingPathAndIndex>> wire_paths;
373 wire_paths.reserve(paths.size());
374 for (const auto& p : paths) {
375 if (!p.has_value()) {
376 wire_paths.push_back(std::nullopt);
377 continue;
378 }
379 wire_paths.push_back(wire::SiblingPathAndIndex{
380 .index = static_cast<uint64_t>(p->index),
381 .path = fr_vec_to_wire(p->path),
382 });
383 }
384 return wire::WsdbFindSiblingPathsResponse{ .paths = std::move(wire_paths) };
385 });
386}
387
389 wire::WsdbFindPublicDataSiblingPaths&& cmd,
390 Responder<wire::WsdbFindPublicDataSiblingPathsResponse> respond)
391{
393 ctx,
394 cmd.revision.forkId,
395 !cmd.revision.includeUncommitted,
396 std::move(respond),
397 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbFindPublicDataSiblingPathsResponse {
398 std::vector<std::optional<SiblingPathAndIndex>> paths;
399 ctx.world_state.find_sibling_paths<PublicDataLeafValue>(revision_from_wire(cmd.revision),
400 world_state::MerkleTreeId::PUBLIC_DATA_TREE,
401 public_data_leaf_vec_from_wire(cmd.leaves),
402 paths);
403 std::vector<std::optional<wire::SiblingPathAndIndex>> wire_paths;
404 wire_paths.reserve(paths.size());
405 for (const auto& p : paths) {
406 wire_paths.push_back(
407 p.has_value() ? std::optional<wire::SiblingPathAndIndex>(wire::SiblingPathAndIndex{
408 .index = static_cast<uint64_t>(p->index), .path = fr_vec_to_wire(p->path) })
409 : std::nullopt);
410 }
411 return wire::WsdbFindPublicDataSiblingPathsResponse{ .paths = std::move(wire_paths) };
412 });
413}
414
416 wire::WsdbFindNullifierSiblingPaths&& cmd,
417 Responder<wire::WsdbFindNullifierSiblingPathsResponse> respond)
418{
419 schedule_read(ctx,
420 cmd.revision.forkId,
421 !cmd.revision.includeUncommitted,
422 std::move(respond),
423 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbFindNullifierSiblingPathsResponse {
424 std::vector<std::optional<SiblingPathAndIndex>> paths;
425 ctx.world_state.find_sibling_paths<NullifierLeafValue>(revision_from_wire(cmd.revision),
426 world_state::MerkleTreeId::NULLIFIER_TREE,
427 nullifier_leaf_vec_from_wire(cmd.leaves),
428 paths);
429 std::vector<std::optional<wire::SiblingPathAndIndex>> wire_paths;
430 wire_paths.reserve(paths.size());
431 for (const auto& p : paths) {
432 wire_paths.push_back(
433 p.has_value()
434 ? std::optional<wire::SiblingPathAndIndex>(wire::SiblingPathAndIndex{
435 .index = static_cast<uint64_t>(p->index), .path = fr_vec_to_wire(p->path) })
436 : std::nullopt);
437 }
438 return wire::WsdbFindNullifierSiblingPathsResponse{ .paths = std::move(wire_paths) };
439 });
440}
441
442// ---------------------------------------------------------------------------
443// Tree mutation operations
444// ---------------------------------------------------------------------------
445
447 wire::WsdbAppendLeaves&& cmd,
448 Responder<wire::WsdbAppendLeavesResponse> respond)
449{
451 ctx, cmd.forkId, std::move(respond), [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbAppendLeavesResponse {
452 auto tree_id = tree_id_from_wire(cmd.treeId);
453 switch (tree_id) {
454 case world_state::MerkleTreeId::NOTE_HASH_TREE:
455 case world_state::MerkleTreeId::L1_TO_L2_MESSAGE_TREE:
456 case world_state::MerkleTreeId::ARCHIVE: {
457 ctx.world_state.append_leaves<bb::fr>(tree_id, fr_vec_from_wire(cmd.leaves), cmd.forkId);
458 break;
459 }
460 default:
461 throw std::runtime_error("Unsupported tree type for append_leaves");
462 }
463 return wire::WsdbAppendLeavesResponse{};
464 });
465}
466
468 wire::WsdbAppendPublicDataLeaves&& cmd,
469 Responder<wire::WsdbAppendPublicDataLeavesResponse> respond)
470{
471 schedule_write(ctx,
472 cmd.forkId,
473 std::move(respond),
474 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbAppendPublicDataLeavesResponse {
475 ctx.world_state.append_leaves<PublicDataLeafValue>(world_state::MerkleTreeId::PUBLIC_DATA_TREE,
476 public_data_leaf_vec_from_wire(cmd.leaves),
477 cmd.forkId);
478 return wire::WsdbAppendPublicDataLeavesResponse{};
479 });
480}
481
483 wire::WsdbAppendNullifierLeaves&& cmd,
484 Responder<wire::WsdbAppendNullifierLeavesResponse> respond)
485{
486 schedule_write(ctx,
487 cmd.forkId,
488 std::move(respond),
489 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbAppendNullifierLeavesResponse {
490 ctx.world_state.append_leaves<NullifierLeafValue>(world_state::MerkleTreeId::NULLIFIER_TREE,
491 nullifier_leaf_vec_from_wire(cmd.leaves),
492 cmd.forkId);
493 return wire::WsdbAppendNullifierLeavesResponse{};
494 });
495}
496
498 wire::WsdbBatchInsertPublicData&& cmd,
499 Responder<wire::WsdbBatchInsertPublicDataResponse> respond)
500{
501 schedule_write(ctx,
502 cmd.forkId,
503 std::move(respond),
504 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbBatchInsertPublicDataResponse {
505 auto result = ctx.world_state.batch_insert_indexed_leaves<PublicDataLeafValue>(
506 world_state::MerkleTreeId::PUBLIC_DATA_TREE,
507 public_data_leaf_vec_from_wire(cmd.leaves),
508 cmd.subtreeDepth,
509 cmd.forkId);
510 return wire::WsdbBatchInsertPublicDataResponse{ .result = batch_public_data_to_wire(result) };
511 });
512}
513
515 wire::WsdbBatchInsertNullifier&& cmd,
516 Responder<wire::WsdbBatchInsertNullifierResponse> respond)
517{
518 schedule_write(ctx,
519 cmd.forkId,
520 std::move(respond),
521 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbBatchInsertNullifierResponse {
522 auto result = ctx.world_state.batch_insert_indexed_leaves<NullifierLeafValue>(
523 world_state::MerkleTreeId::NULLIFIER_TREE,
524 nullifier_leaf_vec_from_wire(cmd.leaves),
525 cmd.subtreeDepth,
526 cmd.forkId);
527 return wire::WsdbBatchInsertNullifierResponse{ .result = batch_nullifier_to_wire(result) };
528 });
529}
530
532 wire::WsdbSequentialInsertPublicData&& cmd,
533 Responder<wire::WsdbSequentialInsertPublicDataResponse> respond)
534{
536 ctx,
537 cmd.forkId,
538 std::move(respond),
539 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbSequentialInsertPublicDataResponse {
540 auto result = ctx.world_state.insert_indexed_leaves<PublicDataLeafValue>(
541 world_state::MerkleTreeId::PUBLIC_DATA_TREE, public_data_leaf_vec_from_wire(cmd.leaves), cmd.forkId);
542 return wire::WsdbSequentialInsertPublicDataResponse{ .result = sequential_public_data_to_wire(result) };
543 });
544}
545
547 wire::WsdbSequentialInsertNullifier&& cmd,
548 Responder<wire::WsdbSequentialInsertNullifierResponse> respond)
549{
551 ctx,
552 cmd.forkId,
553 std::move(respond),
554 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbSequentialInsertNullifierResponse {
555 auto result = ctx.world_state.insert_indexed_leaves<NullifierLeafValue>(
556 world_state::MerkleTreeId::NULLIFIER_TREE, nullifier_leaf_vec_from_wire(cmd.leaves), cmd.forkId);
557 return wire::WsdbSequentialInsertNullifierResponse{ .result = sequential_nullifier_to_wire(result) };
558 });
559}
560
562 wire::WsdbUpdateArchive&& cmd,
563 Responder<wire::WsdbUpdateArchiveResponse> respond)
564{
566 ctx, cmd.forkId, std::move(respond), [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbUpdateArchiveResponse {
567 ctx.world_state.update_archive(state_reference_from_wire(cmd.blockStateRef),
568 block_header_hash_from_wire(cmd.blockHeaderHash),
569 cmd.forkId);
570 return wire::WsdbUpdateArchiveResponse{};
571 });
572}
573
574// ---------------------------------------------------------------------------
575// Transaction operations (canonical state — fork 0)
576// ---------------------------------------------------------------------------
577
578void handle_commit(WsdbRequest& ctx, wire::WsdbCommit&& /*cmd*/, Responder<wire::WsdbCommitResponse> respond)
579{
580 schedule_write(ctx, 0, std::move(respond), [&ctx]() -> wire::WsdbCommitResponse {
582 ctx.world_state.commit(status);
583 return wire::WsdbCommitResponse{ .status = world_state_status_full_to_wire(status) };
584 });
585}
586
587void handle_rollback(WsdbRequest& ctx, wire::WsdbRollback&& /*cmd*/, Responder<wire::WsdbRollbackResponse> respond)
588{
589 schedule_write(ctx, 0, std::move(respond), [&ctx]() -> wire::WsdbRollbackResponse {
590 ctx.world_state.rollback();
591 return wire::WsdbRollbackResponse{};
592 });
593}
594
595// ---------------------------------------------------------------------------
596// Block synchronization (canonical state — fork 0)
597// ---------------------------------------------------------------------------
598
599void handle_sync_block(WsdbRequest& ctx, wire::WsdbSyncBlock&& cmd, Responder<wire::WsdbSyncBlockResponse> respond)
600{
601 schedule_write(ctx, 0, std::move(respond), [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbSyncBlockResponse {
602 auto block_state_ref = state_reference_from_wire(cmd.blockStateRef);
603 auto block_header_hash = block_header_hash_from_wire(cmd.blockHeaderHash);
604 auto padded_note_hashes = fr_vec_from_wire(cmd.paddedNoteHashes);
605 auto padded_l1_to_l2_messages = fr_vec_from_wire(cmd.paddedL1ToL2Messages);
606
607 std::vector<NullifierLeafValue> padded_nullifiers;
608 padded_nullifiers.reserve(cmd.paddedNullifiers.size());
609 for (const auto& w : cmd.paddedNullifiers) {
610 padded_nullifiers.emplace_back(nullifier_from_wire(w.nullifier));
611 }
612
613 std::vector<PublicDataLeafValue> public_data_writes;
614 public_data_writes.reserve(cmd.publicDataWrites.size());
615 for (const auto& w : cmd.publicDataWrites) {
616 public_data_writes.emplace_back(public_data_slot_from_wire(w.slot), public_data_value_from_wire(w.value));
617 }
618
619 WorldStateStatusFull status = ctx.world_state.sync_block(block_state_ref,
620 block_header_hash,
621 padded_note_hashes,
622 padded_l1_to_l2_messages,
623 padded_nullifiers,
624 public_data_writes);
625 return wire::WsdbSyncBlockResponse{ .status = world_state_status_full_to_wire(status) };
626 });
627}
628
629// ---------------------------------------------------------------------------
630// Fork management
631// ---------------------------------------------------------------------------
632
633void handle_create_fork(WsdbRequest& ctx, wire::WsdbCreateFork&& cmd, Responder<wire::WsdbCreateForkResponse> respond)
634{
635 // Allocating a fork mutates shared fork state; serialize against fork 0.
636 schedule_write(ctx, 0, std::move(respond), [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbCreateForkResponse {
638 cmd.latest ? std::nullopt : std::optional<block_number_t>(cmd.blockNumber);
639 uint64_t id = ctx.world_state.create_fork(block);
640 return wire::WsdbCreateForkResponse{ .forkId = id };
641 });
642}
643
644void handle_delete_fork(WsdbRequest& ctx, wire::WsdbDeleteFork&& cmd, Responder<wire::WsdbDeleteForkResponse> respond)
645{
647 ctx, cmd.forkId, std::move(respond), [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbDeleteForkResponse {
648 ctx.world_state.delete_fork(cmd.forkId);
649 return wire::WsdbDeleteForkResponse{};
650 });
651}
652
653// ---------------------------------------------------------------------------
654// Block management (canonical state — fork 0)
655// ---------------------------------------------------------------------------
656
658 wire::WsdbFinalizeBlocks&& cmd,
659 Responder<wire::WsdbFinalizeBlocksResponse> respond)
660{
662 ctx, 0, std::move(respond), [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbFinalizeBlocksResponse {
663 WorldStateStatusSummary status = ctx.world_state.set_finalized_blocks(cmd.toBlockNumber);
664 return wire::WsdbFinalizeBlocksResponse{ .status = world_state_status_summary_to_wire(status) };
665 });
666}
667
669 wire::WsdbUnwindBlocks&& cmd,
670 Responder<wire::WsdbUnwindBlocksResponse> respond)
671{
673 ctx, 0, std::move(respond), [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbUnwindBlocksResponse {
674 WorldStateStatusFull status = ctx.world_state.unwind_blocks(cmd.toBlockNumber);
675 return wire::WsdbUnwindBlocksResponse{ .status = world_state_status_full_to_wire(status) };
676 });
677}
678
680 wire::WsdbRemoveHistoricalBlocks&& cmd,
681 Responder<wire::WsdbRemoveHistoricalBlocksResponse> respond)
682{
684 ctx, 0, std::move(respond), [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbRemoveHistoricalBlocksResponse {
685 WorldStateStatusFull status = ctx.world_state.remove_historical_blocks(cmd.toBlockNumber);
686 return wire::WsdbRemoveHistoricalBlocksResponse{ .status = world_state_status_full_to_wire(status) };
687 });
688}
689
690// ---------------------------------------------------------------------------
691// Status (read — fork 0)
692// ---------------------------------------------------------------------------
693
694void handle_get_status(WsdbRequest& ctx, wire::WsdbGetStatus&& /*cmd*/, Responder<wire::WsdbGetStatusResponse> respond)
695{
696 schedule_read(ctx, 0, false, std::move(respond), [&ctx]() -> wire::WsdbGetStatusResponse {
699 return wire::WsdbGetStatusResponse{ .status = world_state_status_summary_to_wire(status) };
700 });
701}
702
703// ---------------------------------------------------------------------------
704// Checkpoint operations
705// ---------------------------------------------------------------------------
706
708 wire::WsdbCreateCheckpoint&& cmd,
709 Responder<wire::WsdbCreateCheckpointResponse> respond)
710{
711 schedule_write(ctx,
712 cmd.forkId,
713 std::move(respond),
714 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbCreateCheckpointResponse {
715 ctx.world_state.checkpoint(cmd.forkId);
716 return wire::WsdbCreateCheckpointResponse{};
717 });
718}
719
721 wire::WsdbCommitCheckpoint&& cmd,
722 Responder<wire::WsdbCommitCheckpointResponse> respond)
723{
724 schedule_write(ctx,
725 cmd.forkId,
726 std::move(respond),
727 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbCommitCheckpointResponse {
728 ctx.world_state.commit_checkpoint(cmd.forkId);
729 return wire::WsdbCommitCheckpointResponse{};
730 });
731}
732
734 wire::WsdbRevertCheckpoint&& cmd,
735 Responder<wire::WsdbRevertCheckpointResponse> respond)
736{
737 schedule_write(ctx,
738 cmd.forkId,
739 std::move(respond),
740 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbRevertCheckpointResponse {
741 ctx.world_state.revert_checkpoint(cmd.forkId);
742 return wire::WsdbRevertCheckpointResponse{};
743 });
744}
745
747 wire::WsdbCommitAllCheckpoints&& cmd,
748 Responder<wire::WsdbCommitAllCheckpointsResponse> respond)
749{
750 schedule_write(ctx,
751 cmd.forkId,
752 std::move(respond),
753 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbCommitAllCheckpointsResponse {
754 ctx.world_state.commit_all_checkpoints_to(cmd.forkId, 0);
755 return wire::WsdbCommitAllCheckpointsResponse{};
756 });
757}
758
760 wire::WsdbRevertAllCheckpoints&& cmd,
761 Responder<wire::WsdbRevertAllCheckpointsResponse> respond)
762{
763 schedule_write(ctx,
764 cmd.forkId,
765 std::move(respond),
766 [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbRevertAllCheckpointsResponse {
767 ctx.world_state.revert_all_checkpoints_to(cmd.forkId, 0);
768 return wire::WsdbRevertAllCheckpointsResponse{};
769 });
770}
771
772// ---------------------------------------------------------------------------
773// Database operations (canonical state — fork 0)
774// ---------------------------------------------------------------------------
775
776void handle_copy_stores(WsdbRequest& ctx, wire::WsdbCopyStores&& cmd, Responder<wire::WsdbCopyStoresResponse> respond)
777{
778 schedule_write(ctx, 0, std::move(respond), [&ctx, cmd = std::move(cmd)]() mutable -> wire::WsdbCopyStoresResponse {
779 ctx.world_state.copy_stores(cmd.dstPath, cmd.compact.value_or(false));
780 return wire::WsdbCopyStoresResponse{};
781 });
782}
783
784} // namespace bb::wsdb
WorldStateStatusFull remove_historical_blocks(const block_number_t &toBlockNumber)
StateReference get_initial_state_reference() const
Gets the initial state reference for all the trees in the world state.
std::pair< bool, std::string > commit(WorldStateStatusFull &status)
Commits the current state of the world state.
void get_block_numbers_for_leaf_indices(const WorldStateRevision &revision, MerkleTreeId tree_id, const std::vector< index_t > &leafIndices, std::vector< std::optional< block_number_t > > &blockNumbers) const
WorldStateStatusFull unwind_blocks(const block_number_t &toBlockNumber)
void get_status_summary(WorldStateStatusSummary &status) const
void rollback()
Rolls back any uncommitted changes made to the world state.
WorldStateStatusFull sync_block(const StateReference &block_state_ref, const bb::fr &block_header_hash, const std::vector< bb::fr > &notes, const std::vector< bb::fr > &l1_to_l2_messages, const std::vector< crypto::merkle_tree::NullifierLeafValue > &nullifiers, const std::vector< crypto::merkle_tree::PublicDataLeafValue > &public_writes)
WorldStateStatusSummary set_finalized_blocks(const block_number_t &toBlockNumber)
uint64_t create_fork(const std::optional< block_number_t > &blockNumber)
void copy_stores(const std::string &dstPath, bool compact) const
Copies all underlying LMDB stores to the target directory while acquiring a write lock.
void handle_delete_fork(WsdbRequest &ctx, wire::WsdbDeleteFork &&cmd, Responder< wire::WsdbDeleteForkResponse > respond)
world_state::StateReference state_reference_from_wire(const std::vector< wire::TreeStateReference > &w)
std::vector< bb::fr > fr_vec_from_wire(const std::vector< Fr > &w)
void handle_append_leaves(WsdbRequest &ctx, wire::WsdbAppendLeaves &&cmd, Responder< wire::WsdbAppendLeavesResponse > respond)
void handle_find_sibling_paths(WsdbRequest &ctx, wire::WsdbFindSiblingPaths &&cmd, Responder< wire::WsdbFindSiblingPathsResponse > respond)
void handle_revert_all_checkpoints(WsdbRequest &ctx, wire::WsdbRevertAllCheckpoints &&cmd, Responder< wire::WsdbRevertAllCheckpointsResponse > respond)
std::vector< Fr > fr_vec_to_wire(const std::vector< bb::fr > &d)
void handle_get_nullifier_leaf_preimage(WsdbRequest &ctx, wire::WsdbGetNullifierLeafPreimage &&cmd, Responder< wire::WsdbGetNullifierLeafPreimageResponse > respond)
void handle_get_leaf_value(WsdbRequest &ctx, wire::WsdbGetLeafValue &&cmd, Responder< wire::WsdbGetLeafValueResponse > respond)
void handle_get_public_data_leaf_value(WsdbRequest &ctx, wire::WsdbGetPublicDataLeafValue &&cmd, Responder< wire::WsdbGetPublicDataLeafValueResponse > respond)
void handle_batch_insert_public_data(WsdbRequest &ctx, wire::WsdbBatchInsertPublicData &&cmd, Responder< wire::WsdbBatchInsertPublicDataResponse > respond)
void handle_update_archive(WsdbRequest &ctx, wire::WsdbUpdateArchive &&cmd, Responder< wire::WsdbUpdateArchiveResponse > respond)
void schedule_read(WsdbRequest &ctx, uint64_t fork, bool committed, Responder< Resp > respond, Fn &&logic)
Run a read on fork and respond. committed true => independent snapshot, never ordered; false => waits...
void handle_get_nullifier_leaf_value(WsdbRequest &ctx, wire::WsdbGetNullifierLeafValue &&cmd, Responder< wire::WsdbGetNullifierLeafValueResponse > respond)
world_state::WorldStateRevision revision_from_wire(const wire::WorldStateRevision &w)
bb::fr public_data_slot_from_wire(const PublicDataSlot &w)
void handle_get_state_reference(WsdbRequest &ctx, wire::WsdbGetStateReference &&cmd, Responder< wire::WsdbGetStateReferenceResponse > respond)
world_state::MerkleTreeId tree_id_from_wire(MerkleTreeId w)
void handle_get_initial_state_reference(WsdbRequest &ctx, wire::WsdbGetInitialStateReference &&, Responder< wire::WsdbGetInitialStateReferenceResponse > respond)
void handle_find_public_data_leaf_indices(WsdbRequest &ctx, wire::WsdbFindPublicDataLeafIndices &&cmd, Responder< wire::WsdbFindPublicDataLeafIndicesResponse > respond)
void handle_commit_all_checkpoints(WsdbRequest &ctx, wire::WsdbCommitAllCheckpoints &&cmd, Responder< wire::WsdbCommitAllCheckpointsResponse > respond)
void handle_create_fork(WsdbRequest &ctx, wire::WsdbCreateFork &&cmd, Responder< wire::WsdbCreateForkResponse > respond)
void handle_finalize_blocks(WsdbRequest &ctx, wire::WsdbFinalizeBlocks &&cmd, Responder< wire::WsdbFinalizeBlocksResponse > respond)
void handle_get_status(WsdbRequest &ctx, wire::WsdbGetStatus &&, Responder< wire::WsdbGetStatusResponse > respond)
void handle_unwind_blocks(WsdbRequest &ctx, wire::WsdbUnwindBlocks &&cmd, Responder< wire::WsdbUnwindBlocksResponse > respond)
void handle_append_public_data_leaves(WsdbRequest &ctx, wire::WsdbAppendPublicDataLeaves &&cmd, Responder< wire::WsdbAppendPublicDataLeavesResponse > respond)
void handle_find_leaf_indices(WsdbRequest &ctx, wire::WsdbFindLeafIndices &&cmd, Responder< wire::WsdbFindLeafIndicesResponse > respond)
void handle_find_nullifier_sibling_paths(WsdbRequest &ctx, wire::WsdbFindNullifierSiblingPaths &&cmd, Responder< wire::WsdbFindNullifierSiblingPathsResponse > respond)
void handle_create_checkpoint(WsdbRequest &ctx, wire::WsdbCreateCheckpoint &&cmd, Responder< wire::WsdbCreateCheckpointResponse > respond)
void handle_revert_checkpoint(WsdbRequest &ctx, wire::WsdbRevertCheckpoint &&cmd, Responder< wire::WsdbRevertCheckpointResponse > respond)
wire::WorldStateStatusFull world_state_status_full_to_wire(const bb::world_state::WorldStateStatusFull &d)
void handle_rollback(WsdbRequest &ctx, wire::WsdbRollback &&, Responder< wire::WsdbRollbackResponse > respond)
void handle_sequential_insert_public_data(WsdbRequest &ctx, wire::WsdbSequentialInsertPublicData &&cmd, Responder< wire::WsdbSequentialInsertPublicDataResponse > respond)
void handle_append_nullifier_leaves(WsdbRequest &ctx, wire::WsdbAppendNullifierLeaves &&cmd, Responder< wire::WsdbAppendNullifierLeavesResponse > respond)
bb::fr public_data_value_from_wire(const PublicDataValue &w)
bb::fr nullifier_from_wire(const Nullifier &w)
void handle_get_tree_info(WsdbRequest &ctx, wire::WsdbGetTreeInfo &&cmd, Responder< wire::WsdbGetTreeInfoResponse > respond)
void handle_commit_checkpoint(WsdbRequest &ctx, wire::WsdbCommitCheckpoint &&cmd, Responder< wire::WsdbCommitCheckpointResponse > respond)
bb::fr block_header_hash_from_wire(const BlockHeaderHash &w)
void handle_commit(WsdbRequest &ctx, wire::WsdbCommit &&, Responder< wire::WsdbCommitResponse > respond)
void handle_find_public_data_sibling_paths(WsdbRequest &ctx, wire::WsdbFindPublicDataSiblingPaths &&cmd, Responder< wire::WsdbFindPublicDataSiblingPathsResponse > respond)
void handle_get_sibling_path(WsdbRequest &ctx, wire::WsdbGetSiblingPath &&cmd, Responder< wire::WsdbGetSiblingPathResponse > respond)
void handle_get_block_numbers_for_leaf_indices(WsdbRequest &ctx, wire::WsdbGetBlockNumbersForLeafIndices &&cmd, Responder< wire::WsdbGetBlockNumbersForLeafIndicesResponse > respond)
void handle_sequential_insert_nullifier(WsdbRequest &ctx, wire::WsdbSequentialInsertNullifier &&cmd, Responder< wire::WsdbSequentialInsertNullifierResponse > respond)
void handle_sync_block(WsdbRequest &ctx, wire::WsdbSyncBlock &&cmd, Responder< wire::WsdbSyncBlockResponse > respond)
void handle_get_public_data_leaf_preimage(WsdbRequest &ctx, wire::WsdbGetPublicDataLeafPreimage &&cmd, Responder< wire::WsdbGetPublicDataLeafPreimageResponse > respond)
void handle_copy_stores(WsdbRequest &ctx, wire::WsdbCopyStores &&cmd, Responder< wire::WsdbCopyStoresResponse > respond)
wire::WorldStateStatusSummary world_state_status_summary_to_wire(const bb::world_state::WorldStateStatusSummary &d)
void handle_find_low_leaf(WsdbRequest &ctx, wire::WsdbFindLowLeaf &&cmd, Responder< wire::WsdbFindLowLeafResponse > respond)
void handle_batch_insert_nullifier(WsdbRequest &ctx, wire::WsdbBatchInsertNullifier &&cmd, Responder< wire::WsdbBatchInsertNullifierResponse > respond)
std::vector< wire::TreeStateReference > state_reference_to_wire(const world_state::StateReference &d)
void schedule_write(WsdbRequest &ctx, uint64_t fork, Responder< Resp > respond, Fn &&logic)
Run a write on fork (exclusive on that fork) and respond.
void handle_find_nullifier_leaf_indices(WsdbRequest &ctx, wire::WsdbFindNullifierLeafIndices &&cmd, Responder< wire::WsdbFindNullifierLeafIndicesResponse > respond)
void handle_remove_historical_blocks(WsdbRequest &ctx, wire::WsdbRemoveHistoricalBlocks &&cmd, Responder< wire::WsdbRemoveHistoricalBlocksResponse > respond)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
world_state::WorldState & world_state
Non-template handler declarations for the wsdb service.
Helpers that wrap a handler's work in the per-fork scheduler.
Wire <-> domain conversion helpers for the aztec-wsdb service.