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