rippled
compression_test.cpp
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright 2020 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #include <ripple/app/ledger/Ledger.h>
21 #include <ripple/app/ledger/LedgerMaster.h>
22 #include <ripple/app/misc/Manifest.h>
23 #include <ripple/beast/unit_test.h>
24 #include <ripple/beast/utility/Journal.h>
25 #include <ripple/core/TimeKeeper.h>
26 #include <ripple/overlay/Compression.h>
27 #include <ripple/overlay/Message.h>
28 #include <ripple/overlay/impl/ProtocolMessage.h>
29 #include <ripple/overlay/impl/ZeroCopyStream.h>
30 #include <ripple/protocol/HashPrefix.h>
31 #include <ripple/protocol/PublicKey.h>
32 #include <ripple/protocol/SecretKey.h>
33 #include <ripple/protocol/Sign.h>
34 #include <ripple/protocol/digest.h>
35 #include <ripple/protocol/jss.h>
36 #include <ripple/shamap/SHAMapNodeID.h>
37 #include <boost/asio/ip/address_v4.hpp>
38 #include <boost/beast/core/multi_buffer.hpp>
39 #include <boost/endian/conversion.hpp>
40 #include <algorithm>
41 #include <ripple.pb.h>
42 #include <test/jtx/Account.h>
43 #include <test/jtx/Env.h>
44 #include <test/jtx/WSClient.h>
45 #include <test/jtx/amount.h>
46 #include <test/jtx/pay.h>
47 
48 namespace ripple {
49 
50 namespace test {
51 
52 using namespace ripple::test;
53 using namespace ripple::test::jtx;
54 
55 static uint256
56 ledgerHash(LedgerInfo const& info)
57 {
58  return ripple::sha512Half(
60  std::uint32_t(info.seq),
61  std::uint64_t(info.drops.drops()),
62  info.parentHash,
63  info.txHash,
64  info.accountHash,
68  std::uint8_t(info.closeFlags));
69 }
70 
71 class compression_test : public beast::unit_test::suite
72 {
75 
76 public:
78  {
79  }
80 
81  template <typename T>
82  void
84  std::shared_ptr<T> proto,
85  protocol::MessageType mt,
86  uint16_t nbuffers,
87  std::string msg)
88  {
89  testcase("Compress/Decompress: " + msg);
90 
91  Message m(*proto, mt);
92 
93  auto& buffer = m.getBuffer(Compressed::On);
94 
95  boost::beast::multi_buffer buffers;
96 
97  // simulate multi-buffer
98  auto sz = buffer.size() / nbuffers;
99  for (int i = 0; i < nbuffers; i++)
100  {
101  auto start = buffer.begin() + sz * i;
102  auto end = i < nbuffers - 1 ? (buffer.begin() + sz * (i + 1))
103  : buffer.end();
104  std::vector<std::uint8_t> slice(start, end);
105  buffers.commit(boost::asio::buffer_copy(
106  buffers.prepare(slice.size()), boost::asio::buffer(slice)));
107  }
108 
109  boost::system::error_code ec;
111  ec, buffers.data(), buffer.size());
112 
113  BEAST_EXPECT(header);
114 
115  if (header->algorithm == Algorithm::None)
116  return;
117 
118  std::vector<std::uint8_t> decompressed;
119  decompressed.resize(header->uncompressed_size);
120 
121  BEAST_EXPECT(
122  header->payload_wire_size == buffer.size() - header->header_size);
123 
124  ZeroCopyInputStream stream(buffers.data());
125  stream.Skip(header->header_size);
126 
127  auto decompressedSize = ripple::compression::decompress(
128  stream,
129  header->payload_wire_size,
130  decompressed.data(),
131  header->uncompressed_size);
132  BEAST_EXPECT(decompressedSize == header->uncompressed_size);
133  auto const proto1 = std::make_shared<T>();
134 
135  BEAST_EXPECT(
136  proto1->ParseFromArray(decompressed.data(), decompressedSize));
137  auto uncompressed = m.getBuffer(Compressed::Off);
138  BEAST_EXPECT(std::equal(
139  uncompressed.begin() + ripple::compression::headerBytes,
140  uncompressed.end(),
141  decompressed.begin()));
142  }
143 
146  {
147  auto manifests = std::make_shared<protocol::TMManifests>();
148  manifests->mutable_list()->Reserve(n);
149  for (int i = 0; i < n; i++)
150  {
151  auto master = randomKeyPair(KeyType::ed25519);
152  auto signing = randomKeyPair(KeyType::ed25519);
153  STObject st(sfGeneric);
154  st[sfSequence] = i;
155  st[sfPublicKey] = std::get<0>(master);
156  st[sfSigningPubKey] = std::get<0>(signing);
157  st[sfDomain] = makeSlice(
158  std::string("example") + std::to_string(i) +
159  std::string(".com"));
160  sign(
161  st,
164  std::get<1>(master),
166  sign(
167  st,
170  std::get<1>(signing));
171  Serializer s;
172  st.add(s);
173  auto* manifest = manifests->add_list();
174  manifest->set_stobject(s.data(), s.size());
175  }
176  return manifests;
177  }
178 
181  {
182  auto endpoints = std::make_shared<protocol::TMEndpoints>();
183  endpoints->mutable_endpoints()->Reserve(n);
184  for (int i = 0; i < n; i++)
185  {
186  auto* endpoint = endpoints->add_endpoints();
187  endpoint->set_hops(i);
188  std::string addr = std::string("10.0.1.") + std::to_string(i);
189  endpoint->mutable_ipv4()->set_ipv4(boost::endian::native_to_big(
190  boost::asio::ip::address_v4::from_string(addr).to_uint()));
191  endpoint->mutable_ipv4()->set_ipv4port(i);
192  }
193  endpoints->set_version(2);
194 
195  return endpoints;
196  }
197 
200  {
201  Env env(*this, envconfig());
202  int fund = 10000;
203  auto const alice = Account("alice");
204  auto const bob = Account("bob");
205  env.fund(XRP(fund), "alice", "bob");
206  env.trust(bob["USD"](fund), alice);
207  env.close();
208 
209  auto toBinary = [](std::string const& text) {
210  std::string binary;
211  for (size_t i = 0; i < text.size(); ++i)
212  {
213  unsigned int c = charUnHex(text[i]);
214  c = c << 4;
215  ++i;
216  c = c | charUnHex(text[i]);
217  binary.push_back(c);
218  }
219 
220  return binary;
221  };
222 
223  std::string usdTxBlob = "";
224  auto wsc = makeWSClient(env.app().config());
225  {
226  Json::Value jrequestUsd;
227  jrequestUsd[jss::secret] = toBase58(generateSeed("bob"));
228  jrequestUsd[jss::tx_json] =
229  pay("bob", "alice", bob["USD"](fund / 2));
230  Json::Value jreply_usd = wsc->invoke("sign", jrequestUsd);
231 
232  usdTxBlob =
233  toBinary(jreply_usd[jss::result][jss::tx_blob].asString());
234  }
235 
236  auto transaction = std::make_shared<protocol::TMTransaction>();
237  transaction->set_rawtransaction(usdTxBlob);
238  transaction->set_status(protocol::tsNEW);
239  auto tk = make_TimeKeeper(logs.journal("TimeKeeper"));
240  transaction->set_receivetimestamp(tk->now().time_since_epoch().count());
241  transaction->set_deferred(true);
242 
243  return transaction;
244  }
245 
248  {
249  auto getLedger = std::make_shared<protocol::TMGetLedger>();
250  getLedger->set_itype(protocol::liTS_CANDIDATE);
251  getLedger->set_ltype(protocol::TMLedgerType::ltACCEPTED);
252  uint256 const hash(ripple::sha512Half(123456789));
253  getLedger->set_ledgerhash(hash.begin(), hash.size());
254  getLedger->set_ledgerseq(123456789);
255  ripple::SHAMapNodeID sha(hash.data(), hash.size());
256  getLedger->add_nodeids(sha.getRawString());
257  getLedger->set_requestcookie(123456789);
258  getLedger->set_querytype(protocol::qtINDIRECT);
259  getLedger->set_querydepth(3);
260  return getLedger;
261  }
262 
264  buildLedgerData(uint32_t n, Logs& logs)
265  {
266  auto ledgerData = std::make_shared<protocol::TMLedgerData>();
267  uint256 const hash(ripple::sha512Half(12356789));
268  ledgerData->set_ledgerhash(hash.data(), hash.size());
269  ledgerData->set_ledgerseq(123456789);
270  ledgerData->set_type(protocol::TMLedgerInfoType::liAS_NODE);
271  ledgerData->set_requestcookie(123456789);
272  ledgerData->set_error(protocol::TMReplyError::reNO_LEDGER);
273  ledgerData->mutable_nodes()->Reserve(n);
274  uint256 parentHash(0);
275  for (int i = 0; i < n; i++)
276  {
277  LedgerInfo info;
278  auto tk = make_TimeKeeper(logs.journal("TimeKeeper"));
279  info.seq = i;
280  info.parentCloseTime = tk->now();
281  info.hash = ripple::sha512Half(i);
282  info.txHash = ripple::sha512Half(i + 1);
283  info.accountHash = ripple::sha512Half(i + 2);
284  info.parentHash = parentHash;
285  info.drops = XRPAmount(10);
286  info.closeTimeResolution = tk->now().time_since_epoch();
287  info.closeTime = tk->now();
288  parentHash = ledgerHash(info);
289  Serializer nData;
290  ripple::addRaw(info, nData);
291  ledgerData->add_nodes()->set_nodedata(
292  nData.getDataPtr(), nData.getLength());
293  }
294 
295  return ledgerData;
296  }
297 
300  {
301  auto getObject = std::make_shared<protocol::TMGetObjectByHash>();
302 
303  getObject->set_type(protocol::TMGetObjectByHash_ObjectType::
304  TMGetObjectByHash_ObjectType_otTRANSACTION);
305  getObject->set_query(true);
306  getObject->set_seq(123456789);
307  uint256 hash(ripple::sha512Half(123456789));
308  getObject->set_ledgerhash(hash.data(), hash.size());
309  getObject->set_fat(true);
310  for (int i = 0; i < 100; i++)
311  {
312  uint256 hash(ripple::sha512Half(i));
313  auto object = getObject->add_objects();
314  object->set_hash(hash.data(), hash.size());
315  ripple::SHAMapNodeID sha(hash.data(), hash.size());
316  object->set_nodeid(sha.getRawString());
317  object->set_index("");
318  object->set_data("");
319  object->set_ledgerseq(i);
320  }
321  return getObject;
322  }
323 
326  {
327  auto list = std::make_shared<protocol::TMValidatorList>();
328 
329  auto master = randomKeyPair(KeyType::ed25519);
330  auto signing = randomKeyPair(KeyType::ed25519);
331  STObject st(sfGeneric);
332  st[sfSequence] = 0;
333  st[sfPublicKey] = std::get<0>(master);
334  st[sfSigningPubKey] = std::get<0>(signing);
335  st[sfDomain] = makeSlice(std::string("example.com"));
336  sign(
337  st,
340  std::get<1>(master),
342  sign(st, HashPrefix::manifest, KeyType::ed25519, std::get<1>(signing));
343  Serializer s;
344  st.add(s);
345  list->set_manifest(s.data(), s.size());
346  list->set_version(3);
347  STObject signature(sfSignature);
348  ripple::sign(
349  st, HashPrefix::manifest, KeyType::ed25519, std::get<1>(signing));
350  Serializer s1;
351  st.add(s1);
352  list->set_signature(s1.data(), s1.size());
353  list->set_blob(strHex(s.getString()));
354  return list;
355  }
356 
357  void
359  {
360  testcase("Message Compression");
361 
362  auto thresh = beast::severities::Severity::kInfo;
363  auto logs = std::make_unique<Logs>(thresh);
364 
365  protocol::TMManifests manifests;
366  protocol::TMEndpoints endpoints;
367  protocol::TMTransaction transaction;
368  protocol::TMGetLedger get_ledger;
369  protocol::TMLedgerData ledger_data;
370  protocol::TMGetObjectByHash get_object;
371  protocol::TMValidatorList validator_list;
372 
373  // 4.5KB
374  doTest(buildManifests(20), protocol::mtMANIFESTS, 4, "TMManifests20");
375  // 22KB
376  doTest(buildManifests(100), protocol::mtMANIFESTS, 4, "TMManifests100");
377  // 131B
378  doTest(buildEndpoints(10), protocol::mtENDPOINTS, 4, "TMEndpoints10");
379  // 1.3KB
380  doTest(buildEndpoints(100), protocol::mtENDPOINTS, 4, "TMEndpoints100");
381  // 242B
382  doTest(
383  buildTransaction(*logs),
384  protocol::mtTRANSACTION,
385  1,
386  "TMTransaction");
387  // 87B
388  doTest(buildGetLedger(), protocol::mtGET_LEDGER, 1, "TMGetLedger");
389  // 61KB
390  doTest(
391  buildLedgerData(500, *logs),
392  protocol::mtLEDGER_DATA,
393  10,
394  "TMLedgerData500");
395  // 122 KB
396  doTest(
397  buildLedgerData(1000, *logs),
398  protocol::mtLEDGER_DATA,
399  20,
400  "TMLedgerData1000");
401  // 1.2MB
402  doTest(
403  buildLedgerData(10000, *logs),
404  protocol::mtLEDGER_DATA,
405  50,
406  "TMLedgerData10000");
407  // 12MB
408  doTest(
409  buildLedgerData(100000, *logs),
410  protocol::mtLEDGER_DATA,
411  100,
412  "TMLedgerData100000");
413  // 61MB
414  doTest(
415  buildLedgerData(500000, *logs),
416  protocol::mtLEDGER_DATA,
417  100,
418  "TMLedgerData500000");
419  // 7.7KB
420  doTest(
421  buildGetObjectByHash(),
422  protocol::mtGET_OBJECTS,
423  4,
424  "TMGetObjectByHash");
425  // 895B
426  doTest(
427  buildValidatorList(),
428  protocol::mtVALIDATORLIST,
429  4,
430  "TMValidatorList");
431  }
432 
433  void
434  run() override
435  {
436  testProtocol();
437  }
438 };
439 
440 BEAST_DEFINE_TESTSUITE_MANUAL_PRIO(compression, ripple_data, ripple, 20);
441 
442 } // namespace test
443 } // namespace ripple
ripple::test::ledgerHash
static uint256 ledgerHash(LedgerInfo const &info)
Definition: compression_test.cpp:56
std::vector::resize
T resize(T... args)
ripple::HashPrefix::ledgerMaster
@ ledgerMaster
ledger master data for signing
ripple::test::jtx::XRP
const XRP_t XRP
Converts to XRP Issue or STAmount.
Definition: amount.cpp:105
ripple::Message::getBuffer
std::vector< uint8_t > const & getBuffer(Compressed tryCompressed)
Retrieve the packed message data.
Definition: Message.cpp:177
ripple::makeSlice
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
Definition: Slice.h:240
std::string
STL class.
std::equal
T equal(T... args)
std::shared_ptr
STL class.
ripple::LedgerInfo::parentHash
uint256 parentHash
Definition: ReadView.h:99
ripple::test::compression_test::doTest
void doTest(std::shared_ptr< T > proto, protocol::MessageType mt, uint16_t nbuffers, std::string msg)
Definition: compression_test.cpp:83
ripple::Logs
Manages partitions for logging.
Definition: Log.h:48
ripple::test::compression_test::buildEndpoints
std::shared_ptr< protocol::TMEndpoints > buildEndpoints(int n)
Definition: compression_test.cpp:180
ripple::charUnHex
int charUnHex(unsigned char c)
Converts a hex digit to the corresponding integer.
Definition: strHex.cpp:27
ripple::sfGeneric
const SField sfGeneric(access, 0)
Definition: SField.h:332
ripple::test::compression_test::testProtocol
void testProtocol()
Definition: compression_test.cpp:358
ripple::test::compression_test::buildLedgerData
std::shared_ptr< protocol::TMLedgerData > buildLedgerData(uint32_t n, Logs &logs)
Definition: compression_test.cpp:264
ripple::LedgerInfo::hash
uint256 hash
Definition: ReadView.h:96
ripple::XRPAmount::drops
constexpr value_type drops() const
Returns the number of drops.
Definition: XRPAmount.h:172
ripple::HashPrefix::manifest
@ manifest
Manifest.
ripple::sfSigningPubKey
const SF_Blob sfSigningPubKey(access, STI_VL, 3, "SigningPubKey")
Definition: SField.h:459
std::vector
STL class.
std::vector::size
T size(T... args)
ripple::Serializer::getString
std::string getString() const
Definition: Serializer.h:202
ripple::sfSequence
const SF_U32 sfSequence(access, STI_UINT32, 4, "Sequence")
Definition: SField.h:356
ripple::compression::headerBytes
constexpr std::size_t headerBytes
Definition: Compression.h:31
ripple::sfMasterSignature
const SF_Blob sfMasterSignature(access, STI_VL, 18, "MasterSignature", SField::sMD_Default, SField::notSigning)
Definition: SField.h:474
ripple::toBase58
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
Definition: AccountID.cpp:29
ripple::test::compression_test::buildValidatorList
std::shared_ptr< protocol::TMValidatorList > buildValidatorList()
Definition: compression_test.cpp:325
ripple::test::compression_test::compression_test
compression_test()
Definition: compression_test.cpp:77
ripple::addRaw
void addRaw(LedgerInfo const &info, Serializer &s)
Definition: View.cpp:43
ripple::ZeroCopyInputStream
Implements ZeroCopyInputStream around a buffer sequence.
Definition: ZeroCopyStream.h:35
ripple::test::jtx::Env::app
Application & app()
Definition: Env.h:240
ripple::LedgerInfo::seq
LedgerIndex seq
Definition: ReadView.h:88
ripple::test::compression_test::buildGetObjectByHash
std::shared_ptr< protocol::TMGetObjectByHash > buildGetObjectByHash()
Definition: compression_test.cpp:299
ripple::SHAMapNodeID
Definition: SHAMapNodeID.h:33
ripple::test::jtx::envconfig
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
Definition: envconfig.h:49
ripple::test::jtx::sign
void sign(Json::Value &jv, Account const &account)
Sign automatically.
Definition: utility.cpp:44
ripple::test::compression_test
Definition: compression_test.cpp:71
ripple::LedgerInfo::txHash
uint256 txHash
Definition: ReadView.h:97
ripple::base_uint::data
pointer data()
Definition: base_uint.h:103
ripple::test::jtx::Env::trust
void trust(STAmount const &amount, Account const &account)
Establish trust lines.
Definition: Env.cpp:250
ripple::sfSignature
const SF_Blob sfSignature(access, STI_VL, 6, "Signature", SField::sMD_Default, SField::notSigning)
Definition: SField.h:461
algorithm
ripple::base_uint::size
constexpr static std::size_t size()
Definition: base_uint.h:462
ripple::Serializer::data
void const * data() const noexcept
Definition: Serializer.h:75
ripple::uint256
base_uint< 256 > uint256
Definition: base_uint.h:493
std::string::push_back
T push_back(T... args)
ripple::LedgerInfo::closeTime
NetClock::time_point closeTime
Definition: ReadView.h:119
ripple::KeyType::ed25519
@ ed25519
ripple::base_uint< 256 >
ripple::test::compression_test::run
void run() override
Definition: compression_test.cpp:434
std::chrono::time_point::time_since_epoch
T time_since_epoch(T... args)
ripple::test::BEAST_DEFINE_TESTSUITE_MANUAL_PRIO
BEAST_DEFINE_TESTSUITE_MANUAL_PRIO(CrossingLimits, tx, ripple, 10)
ripple::Serializer::getDataPtr
const void * getDataPtr() const
Definition: Serializer.h:187
ripple::Application::config
virtual Config & config()=0
ripple::detail::parseMessageHeader
boost::optional< MessageHeader > parseMessageHeader(boost::system::error_code &ec, BufferSequence const &bufs, std::size_t size)
Parse a message header.
Definition: ProtocolMessage.h:132
ripple::SHAMapNodeID::getRawString
std::string getRawString() const
Definition: SHAMapNodeID.cpp:92
ripple::LedgerInfo::closeFlags
int closeFlags
Definition: ReadView.h:110
std::to_string
T to_string(T... args)
ripple::compression::Compressed
Compressed
Definition: Compression.h:38
std::uint32_t
ripple::compression::Algorithm
Algorithm
Definition: Compression.h:36
ripple::test::compression_test::buildTransaction
std::shared_ptr< protocol::TMTransaction > buildTransaction(Logs &logs)
Definition: compression_test.cpp:199
ripple::LedgerInfo::drops
XRPAmount drops
Definition: ReadView.h:101
ripple::Serializer
Definition: Serializer.h:39
ripple::Message
Definition: overlay/Message.h:49
ripple::randomKeyPair
std::pair< PublicKey, SecretKey > randomKeyPair(KeyType type)
Create a key pair using secure random numbers.
Definition: SecretKey.cpp:260
ripple::generateSeed
Seed generateSeed(std::string const &passPhrase)
Generate a seed deterministically.
Definition: Seed.cpp:69
ripple::test::compression_test::buildGetLedger
std::shared_ptr< protocol::TMGetLedger > buildGetLedger()
Definition: compression_test.cpp:247
ripple::STObject
Definition: STObject.h:51
ripple::sfPublicKey
const SF_Blob sfPublicKey(access, STI_VL, 1, "PublicKey")
Definition: SField.h:457
ripple::compression::decompress
std::size_t decompress(InputStream &in, std::size_t inSize, std::uint8_t *decompressed, std::size_t decompressedSize, Algorithm algorithm=Algorithm::LZ4)
Decompress input stream.
Definition: Compression.h:50
ripple::test::jtx
Definition: Check_test.cpp:26
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::test
Definition: NegativeUNLVote.h:38
ripple::Serializer::size
std::size_t size() const noexcept
Definition: Serializer.h:69
ripple::Logs::journal
beast::Journal journal(std::string const &name)
Definition: Log.cpp:144
ripple::STObject::add
virtual void add(Serializer &s) const override
Definition: STObject.h:351
ripple::base_uint::begin
iterator begin()
Definition: base_uint.h:114
ripple::test::jtx::pay
Json::Value pay(Account const &account, Account const &to, AnyAmount amount)
Create a payment.
Definition: pay.cpp:29
ripple::sign
Buffer sign(PublicKey const &pk, SecretKey const &sk, Slice const &m)
Generate a signature for a message.
Definition: SecretKey.cpp:124
ripple::test::jtx::Env::close
bool close(NetClock::time_point closeTime, boost::optional< std::chrono::milliseconds > consensusDelay=boost::none)
Close and advance the ledger.
Definition: Env.cpp:121
std::vector::begin
T begin(T... args)
ripple::LedgerInfo::closeTimeResolution
NetClock::duration closeTimeResolution
Definition: ReadView.h:113
ripple::sha512Half
sha512_half_hasher::result_type sha512Half(Args const &... args)
Returns the SHA512-Half of a series of objects.
Definition: digest.h:227
ripple::test::jtx::Env::fund
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
Definition: Env.cpp:219
ripple::make_TimeKeeper
std::unique_ptr< TimeKeeper > make_TimeKeeper(beast::Journal j)
Definition: TimeKeeper.cpp:119
std::chrono::duration::count
T count(T... args)
ripple::test::compression_test::buildManifests
std::shared_ptr< protocol::TMManifests > buildManifests(int n)
Definition: compression_test.cpp:145
ripple::test::makeWSClient
std::unique_ptr< WSClient > makeWSClient(Config const &cfg, bool v2, unsigned rpc_version, std::unordered_map< std::string, std::string > const &headers)
Returns a client operating through WebSockets/S.
Definition: WSClient.cpp:300
ripple::test::jtx::Account
Immutable cryptographic account descriptor.
Definition: Account.h:37
ripple::LedgerInfo
Information about the notional ledger backing the view.
Definition: ReadView.h:80
ripple::strHex
std::string strHex(FwdIt begin, FwdIt end)
Definition: strHex.h:67
ripple::Serializer::getLength
int getLength() const
Definition: Serializer.h:197
std::vector::data
T data(T... args)
ripple::LedgerInfo::accountHash
uint256 accountHash
Definition: ReadView.h:98
ripple::test::jtx::Env
A transaction testing environment.
Definition: Env.h:115
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::XRPAmount
Definition: XRPAmount.h:46
ripple::LedgerInfo::parentCloseTime
NetClock::time_point parentCloseTime
Definition: ReadView.h:89
ripple::sfDomain
const SF_Blob sfDomain(access, STI_VL, 7, "Domain")
Definition: SField.h:462