rippled
LedgerDiff.cpp
1 #include <ripple/rpc/GRPCHandlers.h>
2 #include <ripple/rpc/impl/RPCHelpers.h>
3 
4 namespace 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 
32  std::dynamic_pointer_cast<Ledger const>(baseLedgerRv);
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 =
41  std::dynamic_pointer_cast<Ledger const>(desiredLedgerRv);
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  assert(inDesired->size() > 0);
77  diff->set_key(k.data(), k.size());
78  if (request.include_blobs())
79  {
80  diff->set_data(inDesired->data(), inDesired->size());
81  }
82  }
83  }
84  return {response, status};
85 }
86 
87 } // namespace ripple
std::shared_ptr
STL class.
std::pair
ripple::doLedgerDiffGrpc
std::pair< org::xrpl::rpc::v1::GetLedgerDiffResponse, grpc::Status > doLedgerDiffGrpc(RPC::GRPCContext< org::xrpl::rpc::v1::GetLedgerDiffRequest > &context)
Definition: LedgerDiff.cpp:6
ripple::Ledger::stateMap
SHAMap const & stateMap() const
Definition: Ledger.h:310
ripple::RPC::GRPCContext
Definition: Context.h:70
std::map
STL class.
ripple::RPC::GRPCContext::params
RequestType params
Definition: Context.h:72
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::RPC::ledgerFromSpecifier
Status ledgerFromSpecifier(T &ledger, org::xrpl::rpc::v1::LedgerSpecifier const &specifier, Context &context)
Definition: RPCHelpers.cpp:420
ripple::SHAMap::compare
bool compare(SHAMap const &otherMap, Delta &differences, int maxCount) const
Definition: SHAMapDelta.cpp:124
std::numeric_limits::max
T max(T... args)