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& request = context.params;
9 org::xrpl::rpc::v1::GetLedgerDiffResponse response;
10 grpc::Status 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 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 errorStatus{grpc::StatusCode::NOT_FOUND, "desired ledger not found"};
24 return {response, errorStatus};
25 }
26
28 if (!baseLedger)
29 {
30 grpc::Status errorStatus{grpc::StatusCode::NOT_FOUND, "base ledger not validated"};
31 return {response, errorStatus};
32 }
33
35 if (!desiredLedger)
36 {
37 grpc::Status errorStatus{grpc::StatusCode::NOT_FOUND, "base ledger not validated"};
38 return {response, errorStatus};
39 }
40
41 SHAMap::Delta differences;
42
43 int maxDifferences = std::numeric_limits<int>::max();
44
45 bool res = baseLedger->stateMap().compare(desiredLedger->stateMap(), differences, maxDifferences);
46 if (!res)
47 {
48 grpc::Status errorStatus{
49 grpc::StatusCode::RESOURCE_EXHAUSTED, "too many differences between specified ledgers"};
50 return {response, errorStatus};
51 }
52
53 for (auto& [k, v] : differences)
54 {
55 auto diff = response.mutable_ledger_objects()->add_objects();
56 auto inBase = v.first;
57 auto inDesired = v.second;
58
59 // key does not exist in desired
60 if (!inDesired)
61 {
62 diff->set_key(k.data(), k.size());
63 }
64 else
65 {
66 XRPL_ASSERT(inDesired->size() > 0, "xrpl::doLedgerDiffGrpc : non-empty desired");
67 diff->set_key(k.data(), k.size());
68 if (request.include_blobs())
69 {
70 diff->set_data(inDesired->data(), inDesired->size());
71 }
72 }
73 }
74 return {response, status};
75}
76
77} // 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:6
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:52