rippled
Loading...
Searching...
No Matches
LedgerDiff.cpp
1#include <xrpld/rpc/GRPCHandlers.h>
2#include <xrpld/rpc/detail/RPCLedgerHelpers.h>
3
4namespace xrpl {
7{
8 org::xrpl::rpc::v1::GetLedgerDiffRequest const& request = context.params;
9 org::xrpl::rpc::v1::GetLedgerDiffResponse response;
10 grpc::Status const status = grpc::Status::OK;
11
13 std::shared_ptr<ReadView const> desiredLedgerRv;
14
15 if (RPC::ledgerFromSpecifier(baseLedgerRv, request.base_ledger(), context))
16 {
17 grpc::Status const errorStatus{grpc::StatusCode::NOT_FOUND, "base ledger not found"};
18 return {response, errorStatus};
19 }
20
21 if (RPC::ledgerFromSpecifier(desiredLedgerRv, request.desired_ledger(), context))
22 {
23 grpc::Status const errorStatus{grpc::StatusCode::NOT_FOUND, "desired ledger not found"};
24 return {response, errorStatus};
25 }
26
27 std::shared_ptr<Ledger const> const baseLedger =
29 if (!baseLedger)
30 {
31 grpc::Status const errorStatus{grpc::StatusCode::NOT_FOUND, "base ledger not validated"};
32 return {response, errorStatus};
33 }
34
35 std::shared_ptr<Ledger const> const desiredLedger =
37 if (!desiredLedger)
38 {
39 grpc::Status const errorStatus{grpc::StatusCode::NOT_FOUND, "base ledger not validated"};
40 return {response, errorStatus};
41 }
42
43 SHAMap::Delta differences;
44
45 int const maxDifferences = std::numeric_limits<int>::max();
46
47 bool const res =
48 baseLedger->stateMap().compare(desiredLedger->stateMap(), differences, maxDifferences);
49 if (!res)
50 {
51 grpc::Status const errorStatus{
52 grpc::StatusCode::RESOURCE_EXHAUSTED, "too many differences between specified ledgers"};
53 return {response, errorStatus};
54 }
55
56 for (auto& [k, v] : differences)
57 {
58 auto diff = response.mutable_ledger_objects()->add_objects();
59 auto inBase = v.first;
60 auto inDesired = v.second;
61
62 // key does not exist in desired
63 if (!inDesired)
64 {
65 diff->set_key(k.data(), k.size());
66 }
67 else
68 {
69 XRPL_ASSERT(inDesired->size() > 0, "xrpl::doLedgerDiffGrpc : non-empty desired");
70 diff->set_key(k.data(), k.size());
71 if (request.include_blobs())
72 {
73 diff->set_data(inDesired->data(), inDesired->size());
74 }
75 }
76 }
77 return {response, status};
78}
79
80} // namespace xrpl
T is_same_v
T max(T... args)
Status ledgerFromSpecifier(T &ledger, org::xrpl::rpc::v1::LedgerSpecifier const &specifier, Context const &context)
Retrieves a ledger based on a LedgerSpecifier.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
std::pair< org::xrpl::rpc::v1::GetLedgerDiffResponse, grpc::Status > doLedgerDiffGrpc(RPC::GRPCContext< org::xrpl::rpc::v1::GetLedgerDiffRequest > &context)
Definition LedgerDiff.cpp:6
RequestType params
Definition Context.h:51